"""Hintergrund-Scheduler: führt den Sync automatisch nach Zeitplan aus.""" from __future__ import annotations import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from .config import settings from .sync import run_sync logger = logging.getLogger("phpipam_outline_sync.scheduler") scheduler = AsyncIOScheduler() JOB_ID = "phpipam-outline-sync" def _run_scheduled_sync() -> None: """Wird vom Scheduler aufgerufen (läuft in einem Thread, blockiert den Event-Loop also nicht).""" try: results = run_sync() created = sum(1 for r in results if r.get("action") == "created") updated = sum(1 for r in results if r.get("action") == "updated") logger.info( "Geplanter Sync abgeschlossen: %d Subnetze (%d neu, %d aktualisiert)", len(results), created, updated, ) except Exception: # noqa: BLE001 logger.exception("Geplanter Sync fehlgeschlagen") def start_scheduler() -> None: if not settings.sync_schedule_enabled: logger.info("Scheduler deaktiviert (SYNC_SCHEDULE_ENABLED=false)") return trigger = CronTrigger.from_crontab(settings.sync_schedule_cron) scheduler.add_job( _run_scheduled_sync, trigger=trigger, id=JOB_ID, replace_existing=True, max_instances=1, coalesce=True, ) scheduler.start() logger.info("Scheduler gestartet, Zeitplan: '%s'", settings.sync_schedule_cron) def stop_scheduler() -> None: if scheduler.running: scheduler.shutdown(wait=False)