#!/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())