)
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",
)
logger.info(
"App features: ping_workers=%d",
- settings.PING_WORKERS
+ get_config("PING_WORKERS")
)
# ------------------------------------------------------------------------------
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)
# 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,
}
# ---------------------------------------------------------
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]
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"]
_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
# ---------------------------------------------------------
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
# 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))