55 lines
1.6 KiB
Python
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)
|