From 69cedff0fe717ef840b2df440b34a9da4c9da347 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Tue, 14 Apr 2026 23:59:36 +0200 Subject: [PATCH] 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. --- app/routers/audit.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/routers/audit.py b/app/routers/audit.py index ab5e690..fd017ad 100644 --- a/app/routers/audit.py +++ b/app/routers/audit.py @@ -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"]