]> git.giorgioravera.it Git - network-manager.git/commitdiff
Added new configuration parameters to db
authorGiorgio Ravera <giorgio.ravera@gmail.com>
Fri, 29 May 2026 15:27:34 +0000 (17:27 +0200)
committerGiorgio Ravera <giorgio.ravera@gmail.com>
Fri, 29 May 2026 15:27:34 +0000 (17:27 +0200)
backend/bootstrap.py
backend/db/config.py
backend/routes/devices.py
backend/server.py

index b1e95a12cd881d9d1759e0947f0816d2047bb1b7..d2683be40b95fd42d8780076371e640d82ef10df 100644 (file)
@@ -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)
index 75b97d23b4390025144b56475494fc7a8861f8fb..1de99ac480cdf30d60ff0a3468c610916838b3b2 100644 (file)
@@ -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
 # ---------------------------------------------------------
index d1f866cc82e391e5f48aa4d5dc3c0ef08af78191..684afb7d270a2a16c43f2435d60278e0001e2471 100644 (file)
@@ -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
index e63a02480623f11c5ab6aed5a1872e345e78467c..cbd7048b2cf5279885b591b78bece8aa521e1893 100644 (file)
@@ -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))