Files
PangolinSentinel/backend/scheduler.py
T

109 lines
3.8 KiB
Python

import asyncio
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.interval import IntervalTrigger
from backend.config import get_setting, load_settings
from backend.backup import run_backup_task
from backend.system import check_upgradable_packages
from backend.notifier import send_notification
scheduler = AsyncIOScheduler()
async def scheduled_backup_job():
print("[SCHEDULER] Triggering scheduled automated backup...")
settings = load_settings()
scope = settings.get("scheduled_backup_scope", "pangolin")
try:
res = await run_backup_task(
scope=scope,
description="Automated scheduled backup",
auto_created=True
)
if settings.get("notify_on_backup"):
await send_notification(
title=f"Automated Backup Started ({scope.upper()})",
message=f"A scheduled backup job has been initiated.",
status="info"
)
except Exception as e:
print(f"[SCHEDULER] Error during scheduled backup: {e}")
if settings.get("notify_on_backup"):
await send_notification(
title="Automated Backup Failed",
message=f"Scheduled backup failed to start: {str(e)}",
status="error"
)
async def scheduled_update_check_job():
print("[SCHEDULER] Checking for available updates...")
settings = load_settings()
if not settings.get("scheduled_update_check_enabled", True):
return
try:
pkgs = await check_upgradable_packages()
total = pkgs.get("total", 0)
sec = pkgs.get("security_count", 0)
if total > 0 and settings.get("notify_on_update"):
await send_notification(
title=f"📦 VPS Updates Available ({total} packages)",
message=f"There are {total} upgradable package(s) available, including {sec} security update(s).",
status="warning" if sec > 0 else "info",
details={
"total_upgrades": total,
"security_updates": sec
}
)
except Exception as e:
print(f"[SCHEDULER] Error during update check: {e}")
def reload_scheduler():
settings = load_settings()
# Remove existing jobs if any
for job_id in ["scheduled_backup", "scheduled_update_check"]:
if scheduler.get_job(job_id):
scheduler.remove_job(job_id)
# 1. Scheduled Backup
if settings.get("scheduled_backup_enabled", True):
cron_expr = settings.get("scheduled_backup_cron", "0 3 * * *")
parts = cron_expr.strip().split()
if len(parts) == 5:
trigger = CronTrigger(
minute=parts[0],
hour=parts[1],
day=parts[2],
month=parts[3],
day_of_week=parts[4]
)
scheduler.add_job(
scheduled_backup_job,
trigger=trigger,
id="scheduled_backup",
replace_existing=True
)
print(f"[SCHEDULER] Scheduled backup registered with cron: {cron_expr}")
# 2. Scheduled Update Check (every 12 hours)
if settings.get("scheduled_update_check_enabled", True):
scheduler.add_job(
scheduled_update_check_job,
trigger=IntervalTrigger(hours=12),
id="scheduled_update_check",
replace_existing=True
)
print("[SCHEDULER] Scheduled update checks registered (every 12 hours).")
def start_scheduler():
if not scheduler.running:
reload_scheduler()
scheduler.start()
print("[SCHEDULER] Scheduler started.")
def shutdown_scheduler():
if scheduler.running:
scheduler.shutdown()