LOGIN_MAX_ATTEMPTS=5
LOGIN_WINDOW_SECONDS=600
# --- Log ---
-LOG_LEVEL=INFO
+LOG_LEVEL=info
LOG_TO_FILE=false
# --- Session secret (optional but recommended in production) ---
# SESSION_SECRET=****ReplaceWithYourSecret*****
DB_FILE: "/data/database.db"
DB_RESET: "${DB_RESET:-false}"
# Log
- LOG_LEVEL: "${LOG_LEVEL:-INFO}"
+ LOG_LEVEL: "${LOG_LEVEL:-info}"
LOG_TO_FILE: "${LOG_TO_FILE:-false}"
LOG_FILE: "/data/app.log"
LOG_ACCESS_FILE: "/data/access.log"
# Import Security
from backend.security import is_logged_in, apply_session
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
from backend.db.hosts import get_hosts, add_host, reset_hosts_db
from backend.db.aliases import get_aliases, add_alias, reset_aliases_db
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
-from backend.settings import config
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
# Backup files to include in the archive (must match metadata structure)
backup_files = [
- config.BACKUP_METADATA_FILE,
- config.BACKUP_HOSTS_FILE,
- config.BACKUP_ALIASES_FILE,
+ settings.BACKUP_METADATA_FILE,
+ settings.BACKUP_HOSTS_FILE,
+ settings.BACKUP_ALIASES_FILE,
]
# Set to True to remove individual backup files after creating the archive (optional, can be set to False for debugging)
# Initialization
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
- filename = filename or config.BACKUP_HOSTS_FILE
+ filename = filename or settings.BACKUP_HOSTS_FILE
file = filepath / filename
filepath.mkdir(parents=True, exist_ok=True)
count_stored = 0
# Initialization
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
- filename = filename or config.BACKUP_HOSTS_FILE
+ filename = filename or settings.BACKUP_HOSTS_FILE
file = filepath / filename
count_restored = 0
count_loaded = 0
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
filepath.mkdir(parents=True, exist_ok=True)
- filename = filename or config.BACKUP_ALIASES_FILE
+ filename = filename or settings.BACKUP_ALIASES_FILE
file = filepath / filename
count_stored = 0
count_loaded = 0
# Initialization
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
- filename = filename or config.BACKUP_ALIASES_FILE
+ filename = filename or settings.BACKUP_ALIASES_FILE
file = filepath / filename
count_restored = 0
count_loaded = 0
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
filepath.mkdir(parents=True, exist_ok=True)
- filename = filename or config.BACKUP_METADATA_FILE
+ filename = filename or settings.BACKUP_METADATA_FILE
file = filepath / filename
errors: List[str] = []
with open(file, "w", encoding="utf-8") as f:
data = {
"generated_at": timestamp,
- "backup_version": config.BACKUP_VERSION,
- "db_structure_version": config.BACKUP_DB_STRUCTURE_VERSION,
+ "backup_version": settings.BACKUP_VERSION,
+ "db_structure_version": settings.BACKUP_DB_STRUCTURE_VERSION,
"file_count": 2,
"files": [
{
"name": "hosts",
- "file": config.BACKUP_HOSTS_FILE,
- "sha256": file_checksum(filepath / config.BACKUP_HOSTS_FILE),
+ "file": settings.BACKUP_HOSTS_FILE,
+ "sha256": file_checksum(filepath / settings.BACKUP_HOSTS_FILE),
},
{
"name": "aliases",
- "file": config.BACKUP_ALIASES_FILE,
- "sha256": file_checksum(filepath / config.BACKUP_ALIASES_FILE),
+ "file": settings.BACKUP_ALIASES_FILE,
+ "sha256": file_checksum(filepath / settings.BACKUP_ALIASES_FILE),
},
]
}
result: Dict[str, Any] = {
"status": "failure",
"file": str(file),
- "version": config.BACKUP_VERSION,
- "db_structure_version": config.BACKUP_DB_STRUCTURE_VERSION,
+ "version": settings.BACKUP_VERSION,
+ "db_structure_version": settings.BACKUP_DB_STRUCTURE_VERSION,
"errors": errors,
"took_ms": took_ms,
}
result: Dict[str, Any] = {
"status": "success",
"file": str(file),
- "version": config.BACKUP_VERSION,
- "db_structure_version": config.BACKUP_DB_STRUCTURE_VERSION,
+ "version": settings.BACKUP_VERSION,
+ "db_structure_version": settings.BACKUP_DB_STRUCTURE_VERSION,
"file_count": 2,
"took_ms": took_ms,
}
# Initialization
start_ns = time.monotonic_ns()
filepath = Path(filepath or settings.BACKUP_PATH)
- filename = filename or config.BACKUP_METADATA_FILE
+ filename = filename or settings.BACKUP_METADATA_FILE
file = filepath / filename
try:
raise ValueError("Invalid metadata: missing or invalid 'files'")
# Validate versions
- if metadata.get("backup_version") != config.BACKUP_VERSION:
+ if metadata.get("backup_version") != settings.BACKUP_VERSION:
raise ValueError("Backup version mismatch")
- if metadata.get("db_structure_version") != config.BACKUP_DB_STRUCTURE_VERSION:
+ if metadata.get("db_structure_version") != settings.BACKUP_DB_STRUCTURE_VERSION:
raise ValueError("DB structure not compatible")
# Validate files
import backend.db.hosts
import backend.db.aliases
-# Import Settings & Logging
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
+# Import Logging
from backend.log.log import setup_logging, get_logger
# ------------------------------------------------------------------------------
# Import local modules
from backend.db.db import get_db, register_init
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
# Type mapping for config keys
# ---------------------------------------------------------
CONFIG_TYPES = {
- "external_name": str,
- "login_max_attempts": int,
- "login_window_seconds": int,
+ "EXTERNAL_NAME": str,
+ "LOGIN_MAX_ATTEMPTS": int,
+ "LOGIN_WINDOW_SECONDS": int,
}
# ---------------------------------------------------------
# ---------------------------------------------------------
_config_cache = {}
-def invalidate_config(key=None):
+# ---------------------------------------------------------
+# Clear cache
+# ---------------------------------------------------------
+def clear_cache(key=None):
"""Clear cached config entry (or full cache)."""
if key:
_config_cache.pop(key, None)
from pathlib import Path
from typing import Any, Dict, List, Optional
-# Import Settings & Logging
+# Import local modules
+from backend.utils import to_bool, to_int
+
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
-from backend.utils import to_bool, to_int
# -----------------------------
# Normalizes column names to expected keys
# Import local modules
from backend.db.db import get_db, register_init
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
from fastapi import APIRouter
from datetime import datetime, timezone
-# Import local modules
-from backend.db.config import get_config
-
-# Import Settings
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
# Create Router
router = APIRouter()
delete_alias
)
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
from backend.db.hosts import get_hosts_certificates
from backend.db.aliases import get_aliases_certificates
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
from backend.db.hosts import get_hosts
from backend.db.leases import get_leases
-# Import Settings & Logging
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
+# Import Logging
from backend.log.log import get_logger
from backend.utils import is_host_active
from backend.db.hosts import get_hosts
from backend.db.leases import get_leases, get_lease, delete_lease
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
import time
# Import local modules
-from backend.db.config import get_config
from backend.db.hosts import get_hosts
from backend.db.aliases import get_aliases
-# Import Settings & Logging
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
f.write(line)
# Get Ext_Cname
- ext_cname = get_config("external_name")
+ ext_cname = get_config("EXTERNAL_NAME")
# Save DNS Host and Aliases for the EXT DNS
path = settings.DNS_HOST_FILE.with_name(
import time
import os
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
delete_host
)
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
import time
# Import local modules
-from backend.db.config import get_config
from backend.security import verify_login, apply_session, close_session
-# Import Settings & Logging
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
# Create Router
router = APIRouter()
now = time.time()
attempts = login_attempts.get(ip, [])
# tieni solo tentativi negli ultimi LOGIN_WINDOW_SECONDS secondi
- attempts = [t for t in attempts if now - t < int(get_config("login_window_seconds"))]
+ attempts = [t for t in attempts if now - t < get_config("LOGIN_WINDOW_SECONDS")]
- if len(attempts) >= int(get_config("login_max_attempts")):
+ if len(attempts) >= get_config("LOGIN_MAX_ATTEMPTS"):
raise HTTPException(
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
detail={
# Import local modules
from backend.db.users import get_user_by_username
-# Import Settings & Logging
+# Import Settings
from backend.settings.settings import settings
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
# import standard modules
import uvicorn
-# Import Settings & Logging
+# Import Settings & Config
from backend.settings.settings import settings
+from backend.db.config import get_config
+# Import Logging
from backend.log.log import get_logger
# Logger initialization
# ---------------------------------------------------------
# Log
# ---------------------------------------------------------
-LOG_LEVEL = "INFO"
+LOG_LEVEL = "info"
LOG_TO_FILE = False
LOG_FILE = "app.log"
LOG_ACCESS_FILE = "access.log"
# Backup
BACKUP_PATH: Path = Field(default_factory=lambda: Path(os.getenv("BACKUP_PATH", default.BACKUP_PATH)))
+ BACKUP_VERSION: str = Field(default_factory=lambda: config.BACKUP_VERSION)
+ BACKUP_DB_STRUCTURE_VERSION: str = Field(default_factory=lambda: config.BACKUP_DB_STRUCTURE_VERSION)
+ BACKUP_METADATA_FILE: str = Field(default_factory=lambda: config.BACKUP_METADATA_FILE)
+ BACKUP_HOSTS_FILE: str = Field(default_factory=lambda: config.BACKUP_HOSTS_FILE)
+ BACKUP_ALIASES_FILE: str = Field(default_factory=lambda: config.BACKUP_ALIASES_FILE)
# APP Features
PING_WORKERS: int = Field(default_factory=lambda: to_int(os.getenv("PING_WORKERS"), default.PING_WORKERS))