- Implemented a new utility for querying WHOIS information and consolidating IP addresses by subnet. - Added caching mechanism for WHOIS responses to improve performance. - Introduced functions for loading and saving the WHOIS cache, querying subnets, and consolidating IPs based on a threshold. feat: create Flask web UI for intrusion detection system - Developed a Flask web application to manage the intrusion detection system. - Implemented routes for scanning, reports, blocklist management, and firewall configuration. - Added helper functions for reading files and handling requests. feat: define routes for web UI - Registered routes for various web pages and API endpoints in the Flask application. - Implemented functionality for scanning, reporting, blocklist management, and firewall state retrieval. feat: implement background scan runner for web UI - Created a background scan runner to handle scan jobs in a separate thread. - Managed an in-memory job store for tracking scan jobs and their statuses. - Added persistence for scan jobs to maintain state across application restarts. chore: update start script for Flask application - Enhanced the PowerShell start script to check for the existence of the virtual environment. - Added comments and structured the script for better readability and usability.
34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Persistent state for incremental log scanning.
|
|
|
|
Tracks the last processed byte offset per absolute log file path so a scan
|
|
only reads new entries instead of re-reading the whole file. The state file
|
|
is written atomically (temp file + rename) to avoid corruption.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
|
|
from ..utils.constants import SCAN_STATE_PATH
|
|
|
|
|
|
def load_state() -> dict[str, int]:
|
|
"""Return ``{absolute log path: byte offset}`` from the scan-state file."""
|
|
try:
|
|
with open(SCAN_STATE_PATH, "r", encoding="utf-8") as f:
|
|
data = json.load(f)
|
|
return {k: int(v) for k, v in data.items()}
|
|
except (OSError, ValueError, TypeError):
|
|
return {}
|
|
|
|
|
|
def save_state(state: dict[str, int]) -> None:
|
|
"""Write the scan-state file atomically (temp file + rename)."""
|
|
os.makedirs(os.path.dirname(SCAN_STATE_PATH), exist_ok=True)
|
|
tmp = SCAN_STATE_PATH + ".tmp"
|
|
with open(tmp, "w", encoding="utf-8") as f:
|
|
json.dump(state, f, indent=2, sort_keys=True)
|
|
os.replace(tmp, SCAN_STATE_PATH)
|