This repository has been archived on 2026-06-26. You can view files and clone it, but cannot push or open issues or pull requests.
Set-OPS/scripts/domaines.py
Daniel Allaire d7938d4c5a Poser le registre des domaines publics (primaire cache)
Registre declaratif docs/domaines.yml pour la publication externe des
hostnames, symetrique de docs/bases-donnees.yml. Modele d'autorite :
primaire cache + secondaires. Le bloc « exposition » est le binding
nom public -> service interne (cible) -> edge, destine a trois
consommateurs (zone publique, vhosts nginx, ACME).

- inventory_rules.py : charger_domaines, valider_domaines,
  fqdn_exposition, expositions_du_groupe, AUTORITES_DNS.
- scripts/domaines.py : CLI miroir (lister / verifier).
- Makefile : cibles domaines / domaines-verifier + validation dans
  inventaire-verifier.

Premiere entree reelle : forge.alliance-boreale.ca -> serveurs_forgejo.
Secondaires, mail et DNSSEC laisses a renseigner (structurel, pas
encore operationnel ; l'interne chezlepro.internal n'est pas touche).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 20:29:29 -04:00

52 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Lit et valide le registre des domaines publics Set-OPS (docs/domaines.yml)."""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from inventory_rules import charger_domaines, fqdn_exposition, valider_domaines
RACINE = Path(__file__).resolve().parents[1]
FICHIER = RACINE / "docs/domaines.yml"
def lister(registre: dict) -> None:
domaines = registre.get("domaines_publics", {})
if not domaines:
print("Aucun domaine public declare.")
return
for nom_domaine, conf in domaines.items():
secondaires = conf.get("secondaires") or []
dnssec = "oui" if conf.get("dnssec") else "non"
print(f"{nom_domaine} [autorite {conf.get('autorite', '?')}, edge {conf.get('edge', '-')}, dnssec {dnssec}]")
print(f" secondaires: {', '.join(secondaires) if secondaires else '(aucun)'}")
for entree in conf.get("exposition") or []:
fqdn = fqdn_exposition(nom_domaine, entree.get("nom", ""))
print(f" exposition: {fqdn} -> {entree.get('cible', '?')} ({entree.get('type', 'web')})")
def main() -> int:
parser = argparse.ArgumentParser(description="Registre des domaines publics Set-OPS.")
sub = parser.add_subparsers(dest="commande", required=True)
sub.add_parser("lister", help="Affiche domaines, autorite et expositions.")
sub.add_parser("verifier", help="Valide la coherence du registre.")
args = parser.parse_args()
try:
registre = charger_domaines(FICHIER)
if args.commande == "lister":
lister(registre)
elif args.commande == "verifier":
valider_domaines(registre)
print("Registre des domaines valide.")
except Exception as exc:
print(f"erreur: {exc}", file=sys.stderr)
return 2
return 0
if __name__ == "__main__":
raise SystemExit(main())