Desi_clans_booking_alert/main.py
2026-09-30 15:48:03 +05:30

104 lines
2.7 KiB
Python

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