From 9e9a6124ba806bbf273afe96dadd004fbdcc97aa Mon Sep 17 00:00:00 2001 From: Giorgio Ravera Date: Fri, 29 May 2026 17:27:34 +0200 Subject: [PATCH] Added new configuration parameters to db --- backend/bootstrap.py | 12 ++++++++--- backend/db/config.py | 42 ++++++++++++++++++++++++++++++++++++++- backend/routes/devices.py | 4 ++-- backend/server.py | 2 +- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/backend/bootstrap.py b/backend/bootstrap.py index b1e95a1..d2683be 100644 --- a/backend/bootstrap.py +++ b/backend/bootstrap.py @@ -38,7 +38,7 @@ def print_welcome(logger): ) logger.info( "Log: level=%s, to_file=%s, file=%s", - settings.LOG_LEVEL, settings.LOG_TO_FILE, str(settings.LOG_FILE) + get_config("LOG_LEVEL"), get_config("LOG_TO_FILE"), str(settings.LOG_FILE) ) logger.info( "Users: admin=%s | password=%s | hash=%s | hash_file=%s", @@ -58,7 +58,7 @@ def print_welcome(logger): ) logger.info( "App features: ping_workers=%d", - settings.PING_WORKERS + get_config("PING_WORKERS") ) # ------------------------------------------------------------------------------ @@ -80,7 +80,13 @@ def bootstrap(): created = create_db(settings.DB_FILE, settings.DB_RESET) # Log Setup - setup_logging(level=settings.LOG_LEVEL, to_file=settings.LOG_TO_FILE, log_file=settings.LOG_FILE, log_access_file=settings.LOG_ACCESS_FILE) + setup_logging( + level=get_config("LOG_LEVEL"), + to_file=get_config("LOG_TO_FILE"), + log_file=settings.LOG_FILE, + log_access_file=settings.LOG_ACCESS_FILE + ) + logger = get_logger(__name__) print_welcome(logger) diff --git a/backend/db/config.py b/backend/db/config.py index 75b97d2..1de99ac 100644 --- a/backend/db/config.py +++ b/backend/db/config.py @@ -15,18 +15,24 @@ logger = get_logger(__name__) # Type mapping for config keys # --------------------------------------------------------- CONFIG_TYPES = { + "LOG_LEVEL": str, + "LOG_TO_FILE": lambda v: v.lower() in ("1", "true", "yes"), "EXTERNAL_NAME": str, "LOGIN_MAX_ATTEMPTS": int, "LOGIN_WINDOW_SECONDS": int, + "PING_WORKERS": int, } # --------------------------------------------------------- # Default Values # --------------------------------------------------------- CONFIG_DEFAULTS = { + "LOG_LEVEL": settings.LOG_LEVEL, + "LOG_TO_FILE": settings.LOG_TO_FILE, "EXTERNAL_NAME": settings.EXTERNAL_NAME, "LOGIN_MAX_ATTEMPTS": settings.LOGIN_MAX_ATTEMPTS, "LOGIN_WINDOW_SECONDS": settings.LOGIN_WINDOW_SECONDS, + "PING_WORKERS": settings.PING_WORKERS, } # --------------------------------------------------------- @@ -44,10 +50,34 @@ def clear_cache(key=None): else: _config_cache.clear() +# --------------------------------------------------------- +# Return a specific config value (with cache + type casting) +# --------------------------------------------------------- +def set_config(key, value): + if key not in CONFIG_TYPES: + logger.warning("Config key not typed: %s", key) + + # salva sempre come stringa + str_value = str(value) + + conn = get_db() + conn.execute( + "INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)", + (key, str_value), + ) + conn.commit() + + # invalida cache + clear_cache(key) + # --------------------------------------------------------- # Return a specific config value (with cache + type casting) # --------------------------------------------------------- def get_config(key): + + if key not in CONFIG_TYPES: + logger.warning("Invalid config key: %s", key) + # ---- Cache hit ---- if key in _config_cache: return _config_cache[key] @@ -58,7 +88,10 @@ def get_config(key): row = cur.fetchone() if not row: - return None + value = getattr(settings, key, None) + logger.warning("Config key not found in database: %s (using default: %s)", key, value) + _config_cache[key] = value + return value raw_value = row["value"] @@ -73,6 +106,13 @@ def get_config(key): _config_cache[key] = value return value +# --------------------------------------------------------- +# Return a specific config value or default +# --------------------------------------------------------- +def get_config_or(key, default): + value = get_config(key) + return value if value is not None else default + # --------------------------------------------------------- # Create Config DB Tables # --------------------------------------------------------- diff --git a/backend/routes/devices.py b/backend/routes/devices.py index d1f866c..684afb7 100644 --- a/backend/routes/devices.py +++ b/backend/routes/devices.py @@ -49,14 +49,14 @@ def api_get_devices(request: Request): try: hosts = get_hosts(filter_devices=True) - with ThreadPoolExecutor(max_workers=settings.PING_WORKERS) as executor: + with ThreadPoolExecutor(max_workers=get_config("PING_WORKERS")) as executor: futures = [executor.submit(is_host_active, host["ipv4"]) for host in hosts] for i, future in enumerate(futures): hosts[i]["dhcp_state"] = "static" hosts[i]["active"] = future.result() leases = get_leases(filter_devices=True) - with ThreadPoolExecutor(max_workers=settings.PING_WORKERS) as executor: + with ThreadPoolExecutor(max_workers=get_config("PING_WORKERS")) as executor: futures = [executor.submit(is_host_active, lease["ipv4"]) for lease in leases] for i, future in enumerate(futures): leases[i]["description"] = None diff --git a/backend/server.py b/backend/server.py index e63a024..cbd7048 100644 --- a/backend/server.py +++ b/backend/server.py @@ -20,7 +20,7 @@ def run_server(app): # Uvicorn config da settings with fallback host=(settings.HTTP_HOST or "0.0.0.0") port=(settings.HTTP_PORT or 8000) - log_level=(settings.LOG_LEVEL or "info").lower() + log_level=(get_config("LOG_LEVEL") or "info").lower() workers = 1 # GRGR in prod valuta gunicorn+uvicorn workers #reload = os.getenv("UVICORN_RELOAD", "false").lower() == "true" reload = bool(getattr(settings, "DEV_RELOAD", False)) -- 2.47.3