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:
parent
596276441b
commit
69cedff0fe
@ -136,16 +136,20 @@ async def audit_global(request: Request, db=Depends(get_db)):
|
|||||||
# Construire la requete
|
# Construire la requete
|
||||||
where = ["s.os_family = 'linux'", "s.etat = 'Production'"]
|
where = ["s.os_family = 'linux'", "s.etat = 'Production'"]
|
||||||
params = {}
|
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:
|
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)
|
params["ed"] = tuple(exclude_domains)
|
||||||
if exclude_zones:
|
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)
|
params["ez"] = tuple(exclude_zones)
|
||||||
|
|
||||||
wc = " AND ".join(where)
|
wc = " AND ".join(where)
|
||||||
|
|
||||||
# Utiliser du SQL direct avec parametres corrects
|
|
||||||
query = f"""
|
query = f"""
|
||||||
SELECT s.hostname FROM servers s
|
SELECT s.hostname FROM servers s
|
||||||
LEFT JOIN domain_environments de ON s.domain_env_id = de.id
|
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
|
LEFT JOIN zones z ON s.zone_id = z.id
|
||||||
WHERE {wc} ORDER BY s.hostname
|
WHERE {wc} ORDER BY s.hostname
|
||||||
"""
|
"""
|
||||||
# Gerer les tuples pour IN
|
# Expand IN tuples
|
||||||
if exclude_domains:
|
if exclude_domains:
|
||||||
placeholders = ",".join([f":ed{i}" for i in range(len(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):
|
for i, v in enumerate(exclude_domains):
|
||||||
params[f"ed{i}"] = v
|
params[f"ed{i}"] = v
|
||||||
del params["ed"]
|
del params["ed"]
|
||||||
if exclude_zones:
|
if exclude_zones:
|
||||||
placeholders = ",".join([f":ez{i}" for i in range(len(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):
|
for i, v in enumerate(exclude_zones):
|
||||||
params[f"ez{i}"] = v
|
params[f"ez{i}"] = v
|
||||||
del params["ez"]
|
del params["ez"]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user