Files
Lucas/config_loader.py
Debian 24dbc7cd6a Initial commit — Serveur Lucas SmartEye
API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash),
gestion alertes avec escalade (watchdog), notifications Firebase,
dashboard web, documentation MkDocs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 21:26:06 +01:00

98 lines
2.7 KiB
Python

"""
config_loader.py — Chargement centralisé de la configuration Lucas
Usage:
from config_loader import get_config, get_client_info
cfg = get_config()
api_key = cfg.get("gemini", "api_key")
client = get_client_info("Demo_01")
senior_name = client.get("senior_name", "Senior")
"""
import configparser
import json
import os
_config = None
_config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lucas_config.ini")
_db_path = None
def get_config():
"""Charge et cache la configuration globale depuis lucas_config.ini"""
global _config, _db_path
if _config is None:
_config = configparser.ConfigParser()
_config.read(_config_path)
_db_path = _config.get("database", "clients_db", fallback="/var/www/lucas/database.json")
return _config
def get_db():
"""Charge la base de données clients"""
cfg = get_config()
try:
with open(_db_path, 'r') as f:
return json.load(f)
except Exception:
return {"clients": {}}
def get_client_info(client_id):
"""Charge les infos d'un client par son name (client_id)
Cherche dans database.json un client dont le champ 'name' correspond.
Retourne le dict du client ou {} si non trouvé.
"""
db = get_db()
clients = db.get("clients", {})
# Recherche par clé directe
if client_id in clients:
return clients[client_id]
# Recherche par champ 'name' (compatibilité avec les clients indexés numériquement)
for key, client in clients.items():
if client.get("name", "").lower() == client_id.lower():
return client
return {}
def get_client_fcm_tokens(client_id):
"""Retourne la liste des tokens FCM d'un client"""
client = get_client_info(client_id)
return client.get("fcm_tokens", [])
def get_site_ports(site_number):
"""Calcule les ports pour un numéro de site donné
Returns: dict avec base_port, rtsp_ports (list), audio_port, webui_port
"""
cfg = get_config()
base_start = cfg.getint("ports", "base_start", fallback=8550)
ports_per_site = cfg.getint("ports", "ports_per_site", fallback=10)
base_port = base_start + (site_number - 1) * ports_per_site
return {
"base_port": base_port,
"rtsp_ports": list(range(base_port, base_port + 6)),
"audio_port": base_port + 6,
"webui_port": base_port + 7,
}
def get_next_site_number():
"""Retourne le prochain numéro de site disponible"""
db = get_db()
clients = db.get("clients", {})
max_site = 0
for client in clients.values():
sn = client.get("site_number", 0)
if isinstance(sn, int) and sn > max_site:
max_site = sn
return max_site + 1