diff --git a/settings.yaml b/goosebit.yaml similarity index 100% rename from settings.yaml rename to goosebit.yaml diff --git a/goosebit/settings/__init__.py b/goosebit/settings/__init__.py index d63285d0..997de9f2 100644 --- a/goosebit/settings/__init__.py +++ b/goosebit/settings/__init__.py @@ -1,4 +1,4 @@ -from .const import BASE_DIR, PWD_CXT # noqa: F401 +from .const import PWD_CXT # noqa: F401 from .schema import GooseBitSettings config = GooseBitSettings() diff --git a/goosebit/settings/const.py b/goosebit/settings/const.py index e1c8ea55..13c73c5e 100644 --- a/goosebit/settings/const.py +++ b/goosebit/settings/const.py @@ -1,8 +1,11 @@ +import os from pathlib import Path from argon2 import PasswordHasher -BASE_DIR = Path(__file__).resolve().parent.parent.parent +GOOSEBIT_ROOT_DIR = Path(__file__).resolve().parent.parent.parent +CURRENT_DIR = Path(os.getcwd()) +ETC_SETTINGS_DIR = Path("/etc/goosebit") PWD_CXT = PasswordHasher() diff --git a/goosebit/settings/schema.py b/goosebit/settings/schema.py index 6ea04dde..a7076b4a 100644 --- a/goosebit/settings/schema.py +++ b/goosebit/settings/schema.py @@ -1,3 +1,4 @@ +import os import secrets from pathlib import Path from typing import Annotated @@ -11,7 +12,13 @@ YamlConfigSettingsSource, ) -from .const import BASE_DIR, LOGGING_DEFAULT, PWD_CXT +from .const import ( + CURRENT_DIR, + ETC_SETTINGS_DIR, + GOOSEBIT_ROOT_DIR, + LOGGING_DEFAULT, + PWD_CXT, +) class User(BaseModel): @@ -36,8 +43,6 @@ class GooseBitSettings(BaseSettings): port: int = 60053 # GOOSE - artifacts_dir: Path = BASE_DIR.joinpath("artifacts") - poll_time_default: str = "00:01:00" poll_time_updating: str = "00:00:05" poll_time_registration: str = "00:00:10" @@ -46,7 +51,8 @@ class GooseBitSettings(BaseSettings): users: list[User] = [] - db_uri: str = f"sqlite:///{BASE_DIR.joinpath('db.sqlite3')}" + db_uri: str = f"sqlite:///{GOOSEBIT_ROOT_DIR.joinpath('db.sqlite3')}" + artifacts_dir: Path = GOOSEBIT_ROOT_DIR.joinpath("artifacts") metrics: MetricsSettings = MetricsSettings() @@ -61,9 +67,23 @@ def settings_customise_sources( dotenv_settings: PydanticBaseSettingsSource, file_secret_settings: PydanticBaseSettingsSource, ) -> tuple[PydanticBaseSettingsSource, ...]: - return ( + settings_sources = [ init_settings, - YamlConfigSettingsSource(settings_cls, BASE_DIR.joinpath("settings.yaml")), - env_settings, - file_secret_settings, + YamlConfigSettingsSource(settings_cls, GOOSEBIT_ROOT_DIR.joinpath("goosebit.yaml")), + YamlConfigSettingsSource(settings_cls, CURRENT_DIR.joinpath("goosebit.yaml")), + ] + if ETC_SETTINGS_DIR.exists(): + settings_sources.append( + YamlConfigSettingsSource(settings_cls, ETC_SETTINGS_DIR.joinpath("goosebit.yaml")), + ) + if os.getenv("GOOSEBIT_SETTINGS"): + settings_sources.append( + YamlConfigSettingsSource(settings_cls, os.getenv("GOOSEBIT_SETTINGS")), + ) + settings_sources.extend( + [ + env_settings, + file_secret_settings, + ] ) + return tuple(settings_sources)