\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82
| Path : /var/www/html/yedekledb24/DatabaseBackupMasterv6/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv6/scheduler.py |
import logging
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.interval import IntervalTrigger
from app import db
from models import BackupJob
from backup_utils import run_backup
logger = logging.getLogger(__name__)
def init_scheduler(scheduler):
"""
Initialize the scheduler with existing backup jobs.
Args:
scheduler: APScheduler instance
"""
# Load all enabled backup jobs from the database
try:
jobs = BackupJob.query.filter_by(enabled=True).all()
for job in jobs:
schedule_backup_job(job, scheduler)
logger.info(f"Initialized scheduler with {len(jobs)} backup jobs")
except Exception as e:
logger.error(f"Error initializing scheduler: {str(e)}")
def schedule_backup_job(job, scheduler=None):
"""
Schedule a backup job with APScheduler.
Args:
job (BackupJob): Backup job to schedule
scheduler: APScheduler instance (optional)
"""
from app import scheduler as app_scheduler
# Use provided scheduler or default to app scheduler
scheduler = scheduler or app_scheduler
# Create a job ID
job_id = f"backup_job_{job.id}"
# Remove existing job if it exists
if scheduler.get_job(job_id):
scheduler.remove_job(job_id)
# Parse schedule type and value
if job.schedule_type == 'daily':
# Time in HH:MM format
hour, minute = job.schedule_value.split(':')
trigger = CronTrigger(hour=hour, minute=minute)
elif job.schedule_type == 'weekly':
# day_of_week:HH:MM format (e.g., mon:12:00)
day, time = job.schedule_value.split(':')
hour, minute = time.split(':')
trigger = CronTrigger(day_of_week=day, hour=hour, minute=minute)
elif job.schedule_type == 'monthly':
# day:HH:MM format (e.g., 1:12:00 for 1st day of month)
day, time = job.schedule_value.split(':')
hour, minute = time.split(':')
trigger = CronTrigger(day=day, hour=hour, minute=minute)
elif job.schedule_type == 'custom':
# Custom cron expression
trigger = CronTrigger.from_crontab(job.schedule_value)
else:
# Default to hourly backup if schedule type is not recognized
logger.warning(f"Unknown schedule type: {job.schedule_type}, defaulting to hourly")
trigger = IntervalTrigger(hours=1)
# Add the job to the scheduler
scheduler.add_job(
func=_run_backup_job,
trigger=trigger,
args=[job.id],
id=job_id,
replace_existing=True,
name=f"Backup: {job.name}"
)
logger.info(f"Scheduled backup job: {job.name} (ID: {job.id})")
def remove_scheduled_job(job_id, scheduler=None):
"""
Remove a scheduled backup job.
Args:
job_id (int): ID of the backup job
scheduler: APScheduler instance (optional)
"""
from app import scheduler as app_scheduler
# Use provided scheduler or default to app scheduler
scheduler = scheduler or app_scheduler
# Create a job ID
scheduler_job_id = f"backup_job_{job_id}"
# Remove the job if it exists
if scheduler.get_job(scheduler_job_id):
scheduler.remove_job(scheduler_job_id)
logger.info(f"Removed scheduled backup job ID: {job_id}")
else:
logger.warning(f"Backup job ID: {job_id} not found in scheduler")
def _run_backup_job(job_id):
"""
Internal function to run a backup job by ID.
Called by the scheduler.
Args:
job_id (int): ID of the backup job
"""
from app import app
# Use application context
with app.app_context():
try:
# Get the job from the database
job = BackupJob.query.get(job_id)
if not job:
logger.error(f"Backup job ID {job_id} not found in database")
return
# Run the backup with email notifications
logger.info(f"Running scheduled backup job: {job.name} (ID: {job_id})")
result = run_backup(job, send_email=True)
if result:
logger.info(f"Scheduled backup job completed successfully: {job.name} (ID: {job_id})")
else:
logger.error(f"Scheduled backup job failed: {job.name} (ID: {job_id})")
except Exception as e:
logger.error(f"Error running scheduled backup job ID {job_id}: {str(e)}")