feat(qualys/agents): bloque troubleshooting pour Windows (route + bouton 'Non gere' dans table)

This commit is contained in:
Pierre & Lumière 2026-04-28 01:48:32 +02:00
parent eecb61c720
commit 767b33095a
3 changed files with 36 additions and 2 deletions

View File

@ -1356,13 +1356,28 @@ async def qualys_asset_delete(request: Request, asset_id: int, db=Depends(get_db
@router.get("/qualys/agents/{hostname}/audit-qualys", response_class=HTMLResponse) @router.get("/qualys/agents/{hostname}/audit-qualys", response_class=HTMLResponse)
def qualys_agent_audit_page(hostname: str, request: Request, db=Depends(get_db), def qualys_agent_audit_page(hostname: str, request: Request, db=Depends(get_db),
refresh: int = 0): refresh: int = 0):
"""Audit cible Qualys Agent (async). Background thread + page auto-refresh.""" """Audit cible Qualys Agent (async). Background thread + page auto-refresh.
Bloque l'audit pour Windows (commandes shell Linux uniquement)."""
user = get_current_user(request) user = get_current_user(request)
if not user: if not user:
return RedirectResponse(url="/login") return RedirectResponse(url="/login")
perms = get_user_perms(db, user) perms = get_user_perms(db, user)
if not can_view(perms, "qualys"): if not can_view(perms, "qualys"):
return RedirectResponse(url="/dashboard") return RedirectResponse(url="/dashboard")
# Garde-fou : audit non disponible pour Windows
asset_os = db.execute(text(
"SELECT os FROM qualys_assets WHERE LOWER(hostname)=LOWER(:h) LIMIT 1"
), {"h": hostname}).scalar()
if asset_os and "windows" in asset_os.lower():
ctx = base_context(request, db, user)
ctx.update({
"hostname": hostname, "asset_os": asset_os,
"audit_status": "unsupported", "audit": None,
"audit_error": None, "audit_started_at": None, "audit_finished_at": None,
})
return templates.TemplateResponse("qualys_agent_audit.html", ctx)
from app.services.realtime_audit_service import ( from app.services.realtime_audit_service import (
start_qualys_audit_async, get_qualys_audit_state start_qualys_audit_async, get_qualys_audit_state
) )

View File

@ -6,6 +6,17 @@
<meta http-equiv="refresh" content="3"> <meta http-equiv="refresh" content="3">
{% endif %} {% endif %}
{% if audit_status == 'unsupported' %}
<div class="card p-6 mb-4 text-center" style="border:1px solid #6b7280;background:rgba(107,114,128,0.08)">
<div class="text-cyber-yellow font-bold text-sm mb-2">⚠ Audit non géré</div>
<p class="text-xs text-gray-400">
L'audit SSH ciblé n'est disponible que pour les serveurs <strong>Linux</strong>.<br>
Ce serveur est détecté comme <strong>Windows</strong> ({{ asset_os or '?' }}).
</p>
<a href="/qualys/agents#inactive-list" class="btn-sm bg-cyber-border text-gray-300 px-3 py-2 text-xs mt-3 inline-block">← Retour</a>
</div>
{% else %}
<div class="flex justify-between items-center mb-4"> <div class="flex justify-between items-center mb-4">
<div> <div>
<h2 class="text-xl font-bold text-cyber-accent">Audit Qualys Agent</h2> <h2 class="text-xl font-bold text-cyber-accent">Audit Qualys Agent</h2>
@ -181,4 +192,6 @@
{% endif %} {% endif %}
{% endif %}
{% endblock %} {% endblock %}

View File

@ -300,7 +300,13 @@ function refreshAgents(mode) {
<td class="p-2 text-center font-mono">{{ a.agent_version or '-' }}</td> <td class="p-2 text-center font-mono">{{ a.agent_version or '-' }}</td>
<td class="p-2 text-center text-cyber-yellow">{% if a.last_checkin %}{{ (a.last_checkin|string)[:10] }}{% else %}-{% endif %}</td> <td class="p-2 text-center text-cyber-yellow">{% if a.last_checkin %}{{ (a.last_checkin|string)[:10] }}{% else %}-{% endif %}</td>
<td class="p-2 text-center">{{ a.etat or '-' }}</td> <td class="p-2 text-center">{{ a.etat or '-' }}</td>
<td class="p-2 text-center"><a href="/qualys/agents/{{ a.hostname }}/audit-qualys" class="btn-sm bg-cyber-border text-cyber-accent px-2 py-1 text-xs hover:bg-cyber-hover" title="Audit SSH ciblé : status agent, version, disque, connectivité, logs">Troubleshooting</a></td> <td class="p-2 text-center">
{% if 'Windows' in (a.os or '') %}
<span class="text-gray-500 text-xs italic" title="Audit SSH non disponible pour Windows">Non géré</span>
{% else %}
<a href="/qualys/agents/{{ a.hostname }}/audit-qualys" class="btn-sm bg-cyber-border text-cyber-accent px-2 py-1 text-xs hover:bg-cyber-hover" title="Audit SSH ciblé : status agent, version, disque, connectivité, logs">Troubleshooting</a>
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>