#!/usr/bin/env python3 """Une exposition SANS PORT n'est jamais attribuee a l'edge du domaine. POURQUOI (2026-09-29). Un edge ne publie que ce qui a un port : nginx n'ecrit un vhost que pour une exposition qui en porte un. Le site expose aussi `sauvegarde` (SFTP), `pki` et `dns` sans port web. Quand `genese.internal` a recu un edge, la derivation lui a attribue ces trois noms ; la zone et le plancher les ont fait pointer vers `site-edge-01`, et les sauvegardes des deux locataires y seraient allees frapper un sshd qui n'est pas le leur. """ from __future__ import annotations import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from inventory_rules import expositions_des_applications # noqa: E402 APPS = {"applications": { "forge": {"groupe": "serveur_forgejo", "hote": "forge-01", "port": 443, "expose": ["forge.ex.internal"]}, "backup": {"groupe": "serveur_backup_site", "hote": "backup-01", "expose": ["sauvegarde.ex.internal"]}, "pki": {"groupe": "serveur_step_ca", "hote": "pki-01", "port": None, "expose": ["pki.ex.internal"]}, }} DOMS = {"domaines_publics": {"ex.internal": {"edge": "serveur_nginx"}}} def main() -> int: edges = {e["fqdn"]: e["edge"] for e in expositions_des_applications(APPS, DOMS)} attendu = {"forge.ex.internal": "serveur_nginx", "sauvegarde.ex.internal": "serveur_backup_site", "pki.ex.internal": "serveur_step_ca"} if edges != attendu: print(f"ECHEC attendu {attendu}, obtenu {edges}") return 1 sans_edge = {e["fqdn"]: e["edge"] for e in expositions_des_applications(APPS, {"domaines_publics": {}})} if sans_edge["forge.ex.internal"] != "serveur_forgejo": print(f"ECHEC sans edge declare, le service doit se servir lui-meme : {sans_edge}") return 1 vues = {e["fqdn"]: e["resout_vers"] for e in expositions_des_applications(APPS, DOMS)} if vues != {"forge.ex.internal": "edge", "sauvegarde.ex.internal": "service", "pki.ex.internal": "service"}: print(f"ECHEC resolution par defaut : attendu l'edge pour ce qu'il sert, obtenu {vues}") return 1 service = {"domaines_publics": {"ex.internal": {"edge": "serveur_nginx", "resolution_interne": "service"}}} vues = {e["fqdn"]: e["resout_vers"] for e in expositions_des_applications(APPS, service)} if set(vues.values()) != {"service"}: print(f"ECHEC `resolution_interne: service` : tout nom doit mener au service ({vues})") return 1 print("OK — avec port : l'edge du domaine ; sans port : le service lui-meme ; " "`resolution_interne: service` : chaque nom mene a son service.") return 0 if __name__ == "__main__": sys.exit(main())