"""APScheduler setup for periodic checks.""" from apscheduler.schedulers.background import BackgroundScheduler from app.checker import run_check from app.models import get_all_services_for_scheduler def _run_all_checks(): """Run checks for all registered services.""" services = get_all_services_for_scheduler() for svc in services: run_check(svc["id"], svc["target"], svc["protocol"]) def start_scheduler(): """Start the background scheduler. Uses interval jobs per service.""" scheduler = BackgroundScheduler() _scheduled_ids = set() def sync_jobs(): """Only add/remove jobs when the service list changes.""" nonlocal _scheduled_ids services = get_all_services_for_scheduler() current_ids = {svc["id"] for svc in services} svc_by_id = {svc["id"]: svc for svc in services} # Remove jobs for deleted services for sid in _scheduled_ids - current_ids: job_id = f"service_{sid}" if scheduler.get_job(job_id): scheduler.remove_job(job_id) _scheduled_ids.discard(sid) # Add jobs only for services that don't have one yet for sid in current_ids: if sid in _scheduled_ids: continue svc = svc_by_id[sid] job_id = f"service_{sid}" interval = max(10, svc["interval_seconds"]) scheduler.add_job( run_check, "interval", seconds=interval, id=job_id, args=[svc["id"], svc["target"], svc["protocol"]], ) _scheduled_ids.add(sid) # Run checks immediately on startup, then schedule _run_all_checks() sync_jobs() # Sync job list every 60 seconds (only adds/removes when services change) scheduler.add_job(sync_jobs, "interval", seconds=60, id="sync_jobs") scheduler.start()