""" 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