Fix audit exclusion: match sur servers.domaine OR d.name OR d.code, NULL = non-exclu

Les serveurs sans domain_env_id (majorite) etaient exclus a tort car
d.code=NULL et 'NULL NOT IN (...)' = NULL. Utilise COALESCE avec la
colonne plain-text s.domaine en priorite.
This commit is contained in:
Pierre & Lumière 2026-04-14 23:59:36 +02:00
parent 596276441b
commit 69cedff0fe

View File

@ -136,16 +136,20 @@ async def audit_global(request: Request, db=Depends(get_db)):
# Construire la requete
where = ["s.os_family = 'linux'", "s.etat = 'Production'"]
params = {}
# Matche sur domaine plain-text (via d.name) ou via d.code legacy
# et accepte les serveurs sans domaine attribue (ne pas penaliser le NULL)
if exclude_domains:
where.append("d.code NOT IN :ed")
where.append(
"(COALESCE(s.domaine, d.name, d.code, '') NOT IN :ed "
"OR COALESCE(s.domaine, d.name, d.code, '') = '')"
)
params["ed"] = tuple(exclude_domains)
if exclude_zones:
where.append("z.name NOT IN :ez")
where.append("(z.name NOT IN :ez OR z.name IS NULL)")
params["ez"] = tuple(exclude_zones)
wc = " AND ".join(where)
# Utiliser du SQL direct avec parametres corrects
query = f"""
SELECT s.hostname FROM servers s
LEFT JOIN domain_environments de ON s.domain_env_id = de.id
@ -153,16 +157,16 @@ async def audit_global(request: Request, db=Depends(get_db)):
LEFT JOIN zones z ON s.zone_id = z.id
WHERE {wc} ORDER BY s.hostname
"""
# Gerer les tuples pour IN
# Expand IN tuples
if exclude_domains:
placeholders = ",".join([f":ed{i}" for i in range(len(exclude_domains))])
query = query.replace("d.code NOT IN :ed", f"d.code NOT IN ({placeholders})")
query = query.replace("NOT IN :ed", f"NOT IN ({placeholders})")
for i, v in enumerate(exclude_domains):
params[f"ed{i}"] = v
del params["ed"]
if exclude_zones:
placeholders = ",".join([f":ez{i}" for i in range(len(exclude_zones))])
query = query.replace("z.name NOT IN :ez", f"z.name NOT IN ({placeholders})")
query = query.replace("NOT IN :ez", f"NOT IN ({placeholders})")
for i, v in enumerate(exclude_zones):
params[f"ez{i}"] = v
del params["ez"]