fix: make scan stop interrupt in-flight nmap range
Stop button had no effect: run_scan only checked the cancel flag between CIDR ranges and between hosts, never inside the per-range nmap call. For a single /24 the whole scan is one blocking call, so cancel was ignored for minutes and the run status stayed 'running'. - thread run_id into _nmap_scan/_ping_sweep/_nmap_port_scan; check cancel before each phase and skip queued hosts once cancelled - flip ScanRun status to 'cancelled' eagerly in the stop endpoint so the UI reacts immediately instead of waiting for a checkpoint Fixes #218 ha-relevant: yes
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import ipaddress
|
||||
import logging
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from typing import Any
|
||||
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
|
||||
@@ -191,6 +191,12 @@ async def stop_scan(
|
||||
if run.status != "running":
|
||||
raise HTTPException(status_code=409, detail="Scan is not running")
|
||||
request_cancel(run_id)
|
||||
# Flip status eagerly so the UI reflects the stop immediately, instead of
|
||||
# waiting for run_scan to reach its next cancellation checkpoint (which may
|
||||
# be blocked inside a long nmap call). run_scan converges to the same state.
|
||||
run.status = "cancelled"
|
||||
run.finished_at = datetime.now(timezone.utc)
|
||||
await db.commit()
|
||||
return {"stopping": True}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user