Files
phpipam-outline-sync/app/scheduler.py
T
2026-07-24 08:38:28 +00:00

55 lines
1.6 KiB
Python

"""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)