109 lines
3.8 KiB
Python
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()
|