diff --git a/app/routers/dashboard.py b/app/routers/dashboard.py index 0c674f2..665bd01 100644 --- a/app/routers/dashboard.py +++ b/app/routers/dashboard.py @@ -25,6 +25,9 @@ async def dashboard(request: Request, db=Depends(get_db)): stats["eol"] = db.execute(text("SELECT COUNT(*) FROM servers WHERE licence_support='eol'")).scalar() stats["qualys_assets"] = db.execute(text("SELECT COUNT(*) FROM qualys_assets")).scalar() stats["qualys_tags"] = db.execute(text("SELECT COUNT(*) FROM qualys_tags")).scalar() + 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='en_production' AND NOT EXISTS (SELECT 1 FROM qualys_assets qa WHERE LOWER(qa.hostname) = LOWER(servers.hostname))")).scalar() # Par domaine domains = db.execute(text(""" diff --git a/app/routers/qualys.py b/app/routers/qualys.py index fd266ad..71f4fcc 100644 --- a/app/routers/qualys.py +++ b/app/routers/qualys.py @@ -450,9 +450,23 @@ async def qualys_agents_page(request: Request, db=Depends(get_db)): keys = get_activation_keys(db) summary = get_agents_summary(db) + # Serveurs en prod sans agent Qualys + no_agent = db.execute(text(""" + SELECT s.hostname, s.os_family, d.name as domain, e.name as env, z.name as zone + FROM servers s + LEFT JOIN domain_environments de ON s.domain_env_id = de.id + LEFT JOIN domains d ON de.domain_id = d.id + LEFT JOIN environments e ON de.environment_id = e.id + LEFT JOIN zones z ON s.zone_id = z.id + WHERE s.etat = 'en_production' + AND NOT EXISTS (SELECT 1 FROM qualys_assets qa WHERE LOWER(qa.hostname) = LOWER(s.hostname)) + ORDER BY s.hostname + """)).fetchall() + ctx = base_context(request, db, user) ctx.update({ "app_name": APP_NAME, "keys": keys, "summary": summary, + "no_agent_servers": no_agent, }) return templates.TemplateResponse("qualys_agents.html", ctx) diff --git a/app/services/qualys_service.py b/app/services/qualys_service.py index 7bc7e5f..f772158 100644 --- a/app/services/qualys_service.py +++ b/app/services/qualys_service.py @@ -516,7 +516,11 @@ def get_agents_summary(db): GROUP BY agent_version ORDER BY cnt DESC LIMIT 20 """)).fetchall() - return {"statuses": rows, "versions": versions} + total = db.execute(text("SELECT COUNT(*) FROM qualys_assets")).scalar() + active = db.execute(text("SELECT COUNT(*) FROM qualys_assets WHERE agent_status ILIKE '%%active%%' AND agent_status NOT ILIKE '%%inactive%%'")).scalar() + inactive = db.execute(text("SELECT COUNT(*) FROM qualys_assets WHERE agent_status ILIKE '%%inactive%%'")).scalar() + + return {"statuses": rows, "versions": versions, "total_assets": total, "active": active, "inactive": inactive} def invalidate_search_cache(): diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 0371fd8..5cecd5b 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -8,7 +8,8 @@
| Hostname | +OS | +Domaine | +Env | +Zone | +
|---|---|---|---|---|
| {{ s.hostname }} | +{{ s.os_family or '-' }} | +{{ s.domain or '-' }} | +{{ s.env or '-' }} | +{% if s.zone == 'DMZ' %}DMZ{% else %}{{ s.zone or '-' }}{% endif %} | +