first commit
This commit is contained in:
commit
dc1245f164
22 changed files with 1666 additions and 0 deletions
104
main.py
Normal file
104
main.py
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Browser Monitoring & Notification Agent — CLI entry point."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import logging
|
||||
import signal
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from monitor.browser import BrowserManager
|
||||
from monitor.config import load_config, load_env_file
|
||||
from monitor.scheduler import MonitorScheduler
|
||||
from storage.snapshots import SnapshotStore
|
||||
|
||||
|
||||
def setup_logging(debug: bool = False) -> None:
|
||||
"""Configure standard logging."""
|
||||
level = logging.DEBUG if debug else logging.INFO
|
||||
logging.basicConfig(
|
||||
level=level,
|
||||
format="%(asctime)s %(levelname)-5s %(message)s",
|
||||
datefmt="%H:%M:%S",
|
||||
)
|
||||
logging.getLogger("playwright").setLevel(logging.WARNING)
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Browser Monitoring & Notification Agent",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--config",
|
||||
default="config.yaml",
|
||||
help="Path to configuration file (default: config.yaml)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--debug",
|
||||
action="store_true",
|
||||
help="Enable debug logging",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--test-browser",
|
||||
action="store_true",
|
||||
help="Open browser and visit a test URL, then exit",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--test-url",
|
||||
default="https://example.com",
|
||||
help="URL for --test-browser (default: https://example.com)",
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
args = parse_args()
|
||||
setup_logging(debug=args.debug)
|
||||
load_env_file()
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
config = load_config(args.config)
|
||||
except FileNotFoundError as exc:
|
||||
logger.error("%s", exc)
|
||||
return 1
|
||||
|
||||
snapshot_store = SnapshotStore(
|
||||
base_directory=config.monitor.snapshot_directory,
|
||||
retention_count=config.monitor.snapshot_retention_count,
|
||||
)
|
||||
browser_manager = BrowserManager(config=config, snapshot_store=snapshot_store)
|
||||
|
||||
if args.test_browser:
|
||||
success = browser_manager.test_browser(test_url=args.test_url)
|
||||
return 0 if success else 1
|
||||
|
||||
scheduler = MonitorScheduler(
|
||||
config=config,
|
||||
browser_manager=browser_manager,
|
||||
)
|
||||
|
||||
def shutdown_handler(signum: int, frame: object) -> None:
|
||||
logger.info("Shutdown signal received (%s)", signum)
|
||||
scheduler.stop()
|
||||
|
||||
signal.signal(signal.SIGINT, shutdown_handler)
|
||||
signal.signal(signal.SIGTERM, shutdown_handler)
|
||||
|
||||
try:
|
||||
scheduler.start()
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Interrupted by user")
|
||||
finally:
|
||||
scheduler.stop()
|
||||
browser_manager.stop()
|
||||
logging.shutdown()
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Loading…
Add table
Add a link
Reference in a new issue