diff --git a/app/services/realtime_audit_service.py b/app/services/realtime_audit_service.py index 90b9de7..fe87a50 100644 --- a/app/services/realtime_audit_service.py +++ b/app/services/realtime_audit_service.py @@ -77,13 +77,17 @@ BANNER_FILTERS = [ def _ordered_suffixes(hostname): """Ordre des suffixes selon la 2e lettre du hostname (convention SANEF). - r=recette, p=prod, i=infra. Les autres suffixes sont tentés en fallback.""" + Recette : v[rtdv]* → .sanef-rec.fr en priorité. + Prod : v[pls]* / sp / lp → .sanef.groupe puis .sanef.fr en priorité. + Inconnu : ordre par défaut.""" all_suffixes = _get_dns_suffixes() second = hostname[1].lower() if len(hostname) > 1 else "" - if second == "r": + # Recette / Test / Dev / Qualif (vr/vt/vd/vv) + if second in ("r", "t", "d", "v"): priority = [".sanef-rec.fr", ".sanef.groupe", ".sanef.fr"] - elif second in ("p", "i"): - priority = [".sanef.groupe", ".sanef-rec.fr", ".sanef.fr"] + # Prod ou infra (vp/sp/lp/i) + elif second in ("p", "i", "l", "s"): + priority = [".sanef.groupe", ".sanef.fr", ".sanef-rec.fr"] else: priority = [".sanef.groupe", ".sanef-rec.fr", ".sanef.fr"] ordered = [] @@ -96,8 +100,26 @@ def _ordered_suffixes(hostname): return ordered +def _fqdn_is_consistent(hostname, fqdn): + """Vérifie que le FQDN BDD respecte la convention SANEF par préfixe. + Évite d'utiliser un FQDN incohérent (ex: vrameased1.sanef.groupe alors + que vr* doit être .sanef-rec.fr).""" + if not fqdn or not hostname or len(hostname) < 2: + return True + fqdn_lc = fqdn.lower() + second = hostname[1].lower() + # vr/vt/vd/vv → .sanef-rec.fr obligatoire + if second in ("r", "t", "d", "v"): + return ".sanef-rec.fr" in fqdn_lc + # vp/sp/lp → .sanef.groupe ou .sanef.fr + if second in ("p", "l"): + return (".sanef.groupe" in fqdn_lc) or (".sanef.fr" in fqdn_lc) + # Préfixe inconnu : on accepte le FQDN tel quel + return True + + def _resolve(hostname): - # 1. FQDN stocke en base - retour direct sans check port (rapide) + # 1. FQDN stocke en base — utilisé uniquement s'il respecte la convention SANEF try: from ..database import SessionLocal db = SessionLocal() @@ -107,7 +129,12 @@ def _resolve(hostname): ), {"h": hostname}).fetchone() db.close() if row and row.fqdn: - return row.fqdn + if _fqdn_is_consistent(hostname, row.fqdn): + return row.fqdn + log.warning( + f"FQDN BDD '{row.fqdn}' incohérent avec hostname '{hostname}' " + f"(convention SANEF) → fallback sur suffixes ordonnés" + ) except Exception: pass # 2. Fallback : boucle suffixes DNS (si FQDN manquant en base)