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