[settings] fuck it, rework the settings again

this time using pydantic-settings as a base
- removed all os.getenv calls
- removed the secret_key default option
- reworked database loading, creating tables
- prob. something else also but its 4:30 and i have to sleep
This commit is contained in:
2026-07-31 04:33:18 +02:00
parent bad4e8dd1b
commit 158b430235
11 changed files with 100 additions and 89 deletions
+56 -38
View File
@@ -1,52 +1,70 @@
import logging
import os
from functools import lru_cache
from pydantic_settings import BaseSettings, SettingsConfigDict
logger = logging.getLogger(__name__)
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env")
secret_key: str
sqlalchemy_database_url: str = "sqlite:///./gatekeeper.db"
lock_pin: int = 17
unlock_pin: int = 18
mock_gpio: bool = True
alembic_config: str = "./alembic.ini"
disable_cards: bool = False
mifare_app_master_key: str | None = None
mifare_acl_read_base_key: str | None = None
mifare_acl_write_base_key: str | None = None
@lru_cache(1)
def disable_cards_check():
if os.environ.get("DISABLE_CARDS", "").lower() in ("1", "true"):
return True
for env in (
"MIFARE_APP_MASTER_KEY",
"MIFARE_ACL_READ_BASE_KEY",
"MIFARE_ACL_WRITE_BASE_KEY",
):
if not os.getenv(env):
def _create_settings():
settings = Settings()
if not settings.disable_cards:
missing = [
name.upper()
for name in (
"mifare_app_master_key",
"mifare_acl_read_base_key",
"mifare_acl_write_base_key",
)
if not getattr(settings, name)
]
if missing:
logger.critical(
f"Missing environment variable for scanner start: {env} \n Card scanner and related funcionality is disabled!" # noqa: E501
"Missing environment variable for scanner start: %s"
"Card scanner and related funcionality is disabled!",
", ".join(missing),
)
return True
return False
settings.disable_cards = True
return settings
disable_cards = disable_cards_check()
class _SettingsProxy:
_instance: Settings | None = None
if not disable_cards:
mifare_app_master_key = os.getenv("MIFARE_APP_MASTER_KEY")
mifare_acl_read_base_key = os.getenv("MIFARE_ACL_READ_BASE_KEY")
mifare_acl_write_base_key = os.getenv("MIFARE_ACL_WRITE_BASE_KEY")
def _load(self) -> Settings:
if self._instance is None:
self._instance = _create_settings()
return self._instance
def __getattr__(self, name: str):
return getattr(self._load(), name)
def __setattr__(self, name: str, value):
if name == "_instance":
super().__setattr__(name, value)
else:
setattr(self._load(), name, value)
def reset(self) -> None:
self._instance = None
_create_settings.cache_clear()
def verify_settings():
important_envs = ["SECRET_KEY"]
other_envs = ["SQLALCHEMY_DATABASE_PATH", "LOCK_PIN", "UNLOCK_PIN", "MOCK_GPIO"]
for setting in important_envs:
if not os.getenv(setting):
raise ValueError(
f"Missing critical environment variable {setting}. Stopping..."
)
for setting in other_envs:
if setting not in os.environ:
logger.warning(f"Env var {setting} not set. Continuing with defaults.")
verify_settings()
secret_key = os.getenv("SECRET_KEY")
sqlalchemy_database_path = os.getenv("SQLALCHEMY_DATABASE_PATH")
lock_pin = os.getenv("LOCK_PIN")
unlock_pin = os.getenv("UNLOCK_PIN")
mock_gpio = os.getenv("MOCK_GPIO")
settings = _SettingsProxy()