Qualys: cancel button for ongoing refresh
This commit is contained in:
parent
69aeb0e77a
commit
67287b8256
@ -539,6 +539,21 @@ def qualys_agents_refresh(request: Request, db=Depends(get_db)):
|
|||||||
return JSONResponse({"ok": False, "msg": str(e)[:200]}, status_code=500)
|
return JSONResponse({"ok": False, "msg": str(e)[:200]}, status_code=500)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/qualys/agents/cancel")
|
||||||
|
def qualys_agents_cancel(request: Request, db=Depends(get_db)):
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
user = get_current_user(request)
|
||||||
|
if not user:
|
||||||
|
return JSONResponse({"ok": False}, status_code=401)
|
||||||
|
perms = get_user_perms(db, user)
|
||||||
|
if not can_edit(perms, "qualys"):
|
||||||
|
return JSONResponse({"ok": False}, status_code=403)
|
||||||
|
from ..services.qualys_service import cancel_refresh, is_refresh_running
|
||||||
|
if not is_refresh_running():
|
||||||
|
return JSONResponse({"ok": False, "msg": "Aucun refresh en cours"}, status_code=404)
|
||||||
|
return JSONResponse(cancel_refresh())
|
||||||
|
|
||||||
|
|
||||||
@router.get("/qualys/agents/export-no-agent")
|
@router.get("/qualys/agents/export-no-agent")
|
||||||
async def export_no_agent_csv(request: Request, db=Depends(get_db)):
|
async def export_no_agent_csv(request: Request, db=Depends(get_db)):
|
||||||
user = get_current_user(request)
|
user = get_current_user(request)
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import threading
|
|||||||
|
|
||||||
_refresh_lock = threading.Lock()
|
_refresh_lock = threading.Lock()
|
||||||
_refresh_running = False
|
_refresh_running = False
|
||||||
|
_refresh_cancel = threading.Event()
|
||||||
import urllib3
|
import urllib3
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
from .secrets_service import get_secret
|
from .secrets_service import get_secret
|
||||||
@ -544,6 +545,7 @@ def refresh_all_agents(db):
|
|||||||
if not _refresh_lock.acquire(blocking=False):
|
if not _refresh_lock.acquire(blocking=False):
|
||||||
return {"ok": False, "msg": "Une synchronisation Qualys est déjà en cours", "busy": True}
|
return {"ok": False, "msg": "Une synchronisation Qualys est déjà en cours", "busy": True}
|
||||||
_refresh_running = True
|
_refresh_running = True
|
||||||
|
_refresh_cancel.clear()
|
||||||
try:
|
try:
|
||||||
return _refresh_all_agents_impl(db)
|
return _refresh_all_agents_impl(db)
|
||||||
finally:
|
finally:
|
||||||
@ -576,6 +578,11 @@ def _refresh_all_agents_impl(db):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
while stats["pages"] < max_pages:
|
while stats["pages"] < max_pages:
|
||||||
|
if _refresh_cancel.is_set():
|
||||||
|
stats["ok"] = True
|
||||||
|
stats["cancelled"] = True
|
||||||
|
stats["msg"] = f"Annulé après {stats['pages']} pages: {stats['created']} créés, {stats['updated']} mis à jour"
|
||||||
|
return stats
|
||||||
stats["pages"] += 1
|
stats["pages"] += 1
|
||||||
criteria = [{"field": "tagName", "operator": "CONTAINS", "value": "server"}]
|
criteria = [{"field": "tagName", "operator": "CONTAINS", "value": "server"}]
|
||||||
if last_id:
|
if last_id:
|
||||||
@ -693,3 +700,13 @@ def _refresh_all_agents_impl(db):
|
|||||||
stats["ok"] = True
|
stats["ok"] = True
|
||||||
stats["msg"] = f"{stats['created']} créés, {stats['updated']} mis à jour ({stats['pages']} pages, {stats['errors']} erreurs)"
|
stats["msg"] = f"{stats['created']} créés, {stats['updated']} mis à jour ({stats['pages']} pages, {stats['errors']} erreurs)"
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
|
|
||||||
|
def cancel_refresh():
|
||||||
|
"""Demande l'annulation du refresh Qualys en cours"""
|
||||||
|
_refresh_cancel.set()
|
||||||
|
return {"ok": True, "msg": "Annulation demandée"}
|
||||||
|
|
||||||
|
|
||||||
|
def is_refresh_running():
|
||||||
|
return _refresh_running
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
<div class="text-cyber-accent font-bold text-sm" id="refresh-title">Rafraîchissement en cours...</div>
|
<div class="text-cyber-accent font-bold text-sm" id="refresh-title">Rafraîchissement en cours...</div>
|
||||||
<div class="text-gray-400 text-xs mt-2" id="refresh-detail">Synchronisation des agents depuis l'API Qualys</div>
|
<div class="text-gray-400 text-xs mt-2" id="refresh-detail">Synchronisation des agents depuis l'API Qualys</div>
|
||||||
<div class="text-gray-500 text-xs mt-3" id="refresh-timer">0s</div>
|
<div class="text-gray-500 text-xs mt-3" id="refresh-timer">0s</div>
|
||||||
|
<button id="btn-cancel" class="btn-secondary px-3 py-1 text-xs mt-4" onclick="cancelRefresh()">Annuler</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<style>@keyframes spin{to{transform:rotate(360deg)}}</style>
|
<style>@keyframes spin{to{transform:rotate(360deg)}}</style>
|
||||||
@ -32,6 +33,16 @@
|
|||||||
<div id="refresh-msg" style="display:none;padding:8px 16px;border-radius:6px;margin-bottom:12px;font-size:0.85rem"></div>
|
<div id="refresh-msg" style="display:none;padding:8px 16px;border-radius:6px;margin-bottom:12px;font-size:0.85rem"></div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
function cancelRefresh() {
|
||||||
|
fetch('/qualys/agents/cancel', {method: 'POST'})
|
||||||
|
.then(function(r){ return r.json(); })
|
||||||
|
.then(function(d){
|
||||||
|
var title = document.getElementById('refresh-title');
|
||||||
|
if (title) title.textContent = 'Annulation en cours...';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function refreshAgents() {
|
function refreshAgents() {
|
||||||
var btn = document.getElementById('btn-refresh');
|
var btn = document.getElementById('btn-refresh');
|
||||||
var overlay = document.getElementById('refresh-overlay');
|
var overlay = document.getElementById('refresh-overlay');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user