feat(qualys/agents): colonne Version OS dans table sans-agent

This commit is contained in:
Pierre & Lumière 2026-04-24 22:30:39 +00:00
parent c57ef61adb
commit 3c00f05263
2 changed files with 6 additions and 4 deletions

View File

@ -511,7 +511,7 @@ def qualys_agents_page(request: Request, db=Depends(get_db)):
# Serveurs sans agent Qualys (match via server_id pour gerer alias/IP) # Serveurs sans agent Qualys (match via server_id pour gerer alias/IP)
# Exclut les workstations Win10/11 = portables/postes dev # Exclut les workstations Win10/11 = portables/postes dev
no_agent_rows = db.execute(text(""" no_agent_rows = db.execute(text("""
SELECT s.hostname, s.os_family, s.etat, d.name as domain, e.name as env, z.name as zone SELECT s.hostname, s.os_family, s.os_version, s.etat, d.name as domain, e.name as env, z.name as zone
FROM servers s 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
LEFT JOIN domains d ON de.domain_id = d.id LEFT JOIN domains d ON de.domain_id = d.id
@ -528,7 +528,7 @@ def qualys_agents_page(request: Request, db=Depends(get_db)):
AND COALESCE(s.os_version, '') NOT ILIKE '%Workstation%' AND COALESCE(s.os_version, '') NOT ILIKE '%Workstation%'
ORDER BY s.hostname ORDER BY s.hostname
""")).fetchall() """)).fetchall()
no_agent = [{"hostname": r.hostname, "os_family": r.os_family, "etat": r.etat, no_agent = [{"hostname": r.hostname, "os_family": r.os_family, "os_version": r.os_version or "", "etat": r.etat,
"domain": r.domain or "", "env": r.env or "", "zone": r.zone or ""} for r in no_agent_rows] "domain": r.domain or "", "env": r.env or "", "zone": r.zone or ""} for r in no_agent_rows]
# Agents inactifs # Agents inactifs
@ -603,7 +603,7 @@ async def export_no_agent_csv(request: Request, db=Depends(get_db)):
return RedirectResponse(url="/qualys/agents") return RedirectResponse(url="/qualys/agents")
import io, csv as _csv import io, csv as _csv
rows = db.execute(text(""" rows = db.execute(text("""
SELECT s.hostname, s.os_family, s.etat, d.name as domain, e.name as env, z.name as zone SELECT s.hostname, s.os_family, s.os_version, s.etat, d.name as domain, e.name as env, z.name as zone
FROM servers s 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
LEFT JOIN domains d ON de.domain_id = d.id LEFT JOIN domains d ON de.domain_id = d.id
@ -616,7 +616,7 @@ async def export_no_agent_csv(request: Request, db=Depends(get_db)):
w = _csv.writer(output, delimiter=";") w = _csv.writer(output, delimiter=";")
w.writerow(["Hostname", "OS", "Domaine", "Environnement", "Zone", "Etat"]) w.writerow(["Hostname", "OS", "Domaine", "Environnement", "Zone", "Etat"])
for r in rows: for r in rows:
w.writerow([r.hostname, r.os_family or "", r.domain or "", r.env or "", r.zone or "", r.etat or ""]) w.writerow([r.hostname, r.os_family or "", r.os_version or "", r.domain or "", r.env or "", r.zone or "", r.etat or ""])
output.seek(0) output.seek(0)
return StreamingResponse( return StreamingResponse(
iter(["\ufeff" + output.getvalue()]), iter(["\ufeff" + output.getvalue()]),

View File

@ -215,6 +215,7 @@ function refreshAgents(mode) {
<thead><tr> <thead><tr>
<th class="text-left p-2">Hostname</th> <th class="text-left p-2">Hostname</th>
<th class="p-2">OS</th> <th class="p-2">OS</th>
<th class="p-2">Version OS</th>
<th class="p-2">Domaine</th> <th class="p-2">Domaine</th>
<th class="p-2">Env</th> <th class="p-2">Env</th>
<th class="p-2">Zone</th> <th class="p-2">Zone</th>
@ -231,6 +232,7 @@ function refreshAgents(mode) {
"> ">
<td class="p-2 font-mono text-cyber-accent">{{ s.hostname }}</td> <td class="p-2 font-mono text-cyber-accent">{{ s.hostname }}</td>
<td class="p-2 text-center">{{ s.os_family or '-' }}</td> <td class="p-2 text-center">{{ s.os_family or '-' }}</td>
<td class="p-2 text-center text-xs text-gray-300">{{ s.os_version or '-' }}</td>
<td class="p-2 text-center text-gray-400">{{ s.domain or '-' }}</td> <td class="p-2 text-center text-gray-400">{{ s.domain or '-' }}</td>
<td class="p-2 text-center">{{ s.env or '-' }}</td> <td class="p-2 text-center">{{ s.env or '-' }}</td>
<td class="p-2 text-center">{% if s.zone == 'DMZ' %}<span class="badge badge-red">DMZ</span>{% else %}{{ s.zone or '-' }}{% endif %}</td> <td class="p-2 text-center">{% if s.zone == 'DMZ' %}<span class="badge badge-red">DMZ</span>{% else %}{{ s.zone or '-' }}{% endif %}</td>