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 @@
{{ stats.total_servers }}
Serveurs
{{ stats.patchable }}
Patchables SecOps
{{ stats.linux }} / {{ stats.windows }}
Linux / Windows
-
{{ stats.qualys_tags }}
Tags Qualys
+
{{ stats.qualys_active }}
Agents actifs
+
{{ stats.qualys_no_agent }}
Sans agent
{{ stats.eol }}
EOL
diff --git a/app/templates/qualys_agents.html b/app/templates/qualys_agents.html index 2c195fc..55a7618 100644 --- a/app/templates/qualys_agents.html +++ b/app/templates/qualys_agents.html @@ -9,6 +9,14 @@ Recherche + +
+
{{ summary.total_assets or 0 }}
Total assets
+
{{ summary.active or 0 }}
Agents actifs
+
{{ summary.inactive or 0 }}
Agents inactifs
+
{{ no_agent_servers|length }}
Sans agent (prod)
+
+

Activation Keys

@@ -74,4 +82,31 @@ {% endif %}
+ + +{% if no_agent_servers %} +
+

Serveurs en production sans agent Qualys ({{ no_agent_servers|length }})

+ + + + + + + + + + {% for s in no_agent_servers %} + + + + + + + + {% endfor %} + +
HostnameOSDomaineEnvZone
{{ s.hostname }}{{ s.os_family or '-' }}{{ s.domain or '-' }}{{ s.env or '-' }}{% if s.zone == 'DMZ' %}DMZ{% else %}{{ s.zone or '-' }}{% endif %}
+
+{% endif %} {% endblock %}