Reads the persisted SQLite store to print a detailed analysis: latest scans, top IPs, cross-source IPs, active blocklist ledger, and a per-IP request history drill-down (--ip). Supports --since, --top, --json. No scan is run.
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Intrusion Detection System — unified entry point.
|
|
|
|
By default this starts the localhost-only Flask web UI. Pass ``scan`` to
|
|
run the consolidated CLI scan instead.
|
|
|
|
Usage:
|
|
python app.py # start the web UI (default)
|
|
python app.py --web-port 54666 # web UI with a custom port
|
|
python app.py scan [options] # run the consolidated CLI scan
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
from app.utils.constants import WEB_HOST, WEB_PORT
|
|
|
|
|
|
def _web_parser() -> argparse.ArgumentParser:
|
|
parser = argparse.ArgumentParser(
|
|
prog="app.py",
|
|
description="Intrusion Detection System: web UI (default) or 'scan' subcommand.",
|
|
)
|
|
parser.add_argument("--web-host", default=WEB_HOST,
|
|
help=f"web UI bind host (default: {WEB_HOST})")
|
|
parser.add_argument("--web-port", type=int, default=WEB_PORT,
|
|
help=f"web UI port (default: {WEB_PORT})")
|
|
return parser
|
|
|
|
|
|
def _run_web(host: str, port: int) -> None:
|
|
from app.web import serve
|
|
serve(host=host, port=port)
|
|
|
|
|
|
def _run_scan(argv: list[str]) -> None:
|
|
from app.scan import main as scan_main
|
|
scan_main(argv)
|
|
|
|
|
|
def _run_analyze(argv: list[str]) -> None:
|
|
from app.analyze import main as analyze_main
|
|
analyze_main(argv)
|
|
|
|
|
|
def main() -> None:
|
|
# `python app.py scan ...` runs the consolidated CLI scan.
|
|
if len(sys.argv) > 1 and sys.argv[1] == "scan":
|
|
_run_scan(sys.argv[2:])
|
|
return
|
|
|
|
# `python app.py analyze ...` prints a detailed report from the SQLite store.
|
|
if len(sys.argv) > 1 and sys.argv[1] == "analyze":
|
|
_run_analyze(sys.argv[2:])
|
|
return
|
|
|
|
# Default: start the web UI (parse_known_args tolerates stray flags).
|
|
args, _ = _web_parser().parse_known_args()
|
|
_run_web(args.web_host, args.web_port)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|