Dashboard: try/except autour KPIs DMZ/patch_history (resilient si table absente)

This commit is contained in:
Pierre & Lumière 2026-04-14 21:47:41 +02:00
parent 6ec1c4575d
commit 5e9625764a

View File

@ -28,27 +28,34 @@ async def dashboard(request: Request, db=Depends(get_db)):
stats["qualys_active"] = db.execute(text("SELECT COUNT(*) FROM qualys_assets WHERE agent_status ILIKE '%active%' AND agent_status NOT ILIKE '%inactive%'")).scalar()
stats["qualys_inactive"] = db.execute(text("SELECT COUNT(*) FROM qualys_assets WHERE agent_status ILIKE '%inactive%'")).scalar()
stats["qualys_no_agent"] = db.execute(text("SELECT COUNT(*) FROM servers WHERE etat='Production' AND NOT EXISTS (SELECT 1 FROM qualys_assets qa WHERE LOWER(qa.hostname) = LOWER(servers.hostname))")).scalar()
# Alias : template utilise stats.eol
stats["eol"] = stats["obsolete"]
# Zone DMZ
stats["dmz"] = db.execute(text("SELECT COUNT(*) FROM servers WHERE zone_id = (SELECT id FROM zones WHERE is_dmz=true LIMIT 1)")).scalar()
# Patching depuis patch_history (Excel 2026)
try:
stats["dmz"] = db.execute(text("SELECT COUNT(*) FROM servers WHERE zone_id IN (SELECT id FROM zones WHERE is_dmz=true)")).scalar() or 0
except Exception:
db.rollback()
stats["dmz"] = 0
try:
stats["patched_history_2026"] = db.execute(text(
"SELECT COUNT(DISTINCT server_id) FROM patch_history WHERE EXTRACT(YEAR FROM date_patch)=2026"
)).scalar()
)).scalar() or 0
stats["patch_events_2026"] = db.execute(text(
"SELECT COUNT(*) FROM patch_history WHERE EXTRACT(YEAR FROM date_patch)=2026"
)).scalar()
)).scalar() or 0
stats["never_patched_2026"] = db.execute(text("""
SELECT COUNT(*) FROM servers s
WHERE s.etat='Production' AND s.patch_os_owner='secops'
AND NOT EXISTS (SELECT 1 FROM patch_history ph
WHERE ph.server_id=s.id AND EXTRACT(YEAR FROM ph.date_patch)=2026)
""")).scalar()
# Semaine la plus recente
""")).scalar() or 0
stats["last_patch_week"] = db.execute(text(
"SELECT MAX(TO_CHAR(date_patch, 'IW')) FROM patch_history WHERE EXTRACT(YEAR FROM date_patch)=2026"
)).scalar()
)).scalar() or "-"
except Exception:
db.rollback()
stats["patched_history_2026"] = 0
stats["patch_events_2026"] = 0
stats["never_patched_2026"] = 0
stats["last_patch_week"] = "-"
# Par domaine
domains = db.execute(text("""