"""Configuration du serveur Noxely, lue de l'environnement. Aucune valeur sensible n'est écrite dans le dépôt : le jeton et les chemins viennent d'un fichier .env local, à l'image des autres services de la maison. """ from __future__ import annotations import os import secrets from dataclasses import dataclass from pathlib import Path def _persisted_token(data_dir: Path) -> str: """Jeton auto-généré, conservé entre deux démarrages. Un jeton tiré à chaque lancement obligerait à reconfigurer le téléphone après le moindre redémarrage : il est donc écrit une fois, en lecture seule pour son propriétaire. """ path = data_dir / "token" if path.exists(): existing = path.read_text().strip() if existing: return existing token = secrets.token_urlsafe(24) data_dir.mkdir(parents=True, exist_ok=True) path.write_text(token + "\n") path.chmod(0o600) print(f"[noxely] jeton généré et conservé dans {path}") return token @dataclass(frozen=True) class Config: data_dir: Path token: str host: str port: int #: Nombre de stations balayées à chaque passage du guet. watch_stations: int #: Pause entre deux balayages, en secondes. Le balayage est continu : cette pause n'est #: qu'un garde-fou pour ne pas marteler l'annuaire si un tour échoue instantanément. watch_interval: int #: Stations sondées en parallèle. Plus il est haut, plus un tour complet est bref. watch_concurrency: int @property def media_dir(self) -> Path: return self.data_dir / "media" @property def db_path(self) -> Path: return self.data_dir / "noxely.sqlite3" def load() -> Config: data_dir = Path(os.environ.get("NOXELY_DATA", "./data")).expanduser().resolve() token = os.environ.get("NOXELY_TOKEN", "").strip() or _persisted_token(data_dir) return Config( data_dir=data_dir, token=token, host=os.environ.get("NOXELY_HOST", "0.0.0.0"), port=int(os.environ.get("NOXELY_PORT", "8710")), watch_stations=int(os.environ.get("NOXELY_WATCH_STATIONS", "40")), watch_interval=int(os.environ.get("NOXELY_WATCH_INTERVAL", "5")), watch_concurrency=int(os.environ.get("NOXELY_WATCH_CONCURRENCY", "8")), )