b4i%xdZddlZddlZddlZddlmZddlmZddlm Z ddl m Z m Z m Z ddlmZGd d Zy) zScheduler daemon module for DaemonControl. This module provides the main SchedulerDaemon class that orchestrates job scheduling using APScheduler and manages the daemon lifecycle. N)Optional)BackgroundScheduler) CronTrigger) ConfigManagerDatabaseManager setup_logger) JobExecutorcfeZdZdZdZddZddZddZdeddfd Z dd Z d eddfd Z dd Z ddZ y)SchedulerDaemonz'Main daemon process for job scheduling.cFt|_t|_|jj dd}|jj ddd}t d|||_|j jd|j jd|j jdt|j|j|j |_ tdd d d  |_ d |_ |j jdy)zInitialize daemon. Creates: - ConfigManager instance - DatabaseManager instance - Logger instance - JobExecutor instance - APScheduler BackgroundScheduler loggingdaemon_log_filelevelINFOdaemonF======================================================================z$Initializing DaemonControl SchedulerTr i,)coalesce max_instancesmisfire_grace_time) job_defaultsFzDaemon initialized successfullyN) rconfigrdbgetrloggerinfor job_executorr schedulerrunning)selflog_file log_levels daemon/scheduler_daemon.py__init__zSchedulerDaemon.__init__s$o !#;;??9.?@KKOOIw? "8XyA  " ?@ "(dkkJ- !"&)   :;returnNc |jjd|j|jj |jjd|j d|_|jjd|jjd|jy#t$r&}|jjd|dd}~wwxYw) zStart the daemon. Steps: 1. Load jobs from database 2. Create APScheduler triggers for each job 3. Start APScheduler 4. Setup signal handlers (SIGTERM, SIGINT) 5. Run forever (until stopped) zStarting daemon...zAPScheduler startedTzDaemon started successfullyzPress Ctrl+C to stopzFailed to start daemon: exc_infoN) rr _load_jobsrstart_setup_signal_handlersr _run_forever Exceptionerror)r es r#r+zSchedulerDaemon.start<s  KK  1 2 OO  NN " KK  2 3  ' ' ) DL KK  : ; KK  3 4      KK   8> ! ! KK  ; < NN # # # /((CCE !  KK  |n-&'     * *2 * 6 67 "r%c "|jjd|jj}|s|jj dy|jjdt |dd}t }|D]}|d|vr |j|d|jj5}|jd|d f}|j}ddds#|jj d |dd |D]}|d } tj| } |jj|j| |d gd |d d|d |dd| d|dz }|jjd|dd| |jjd|dy#1swYxYw#t $r0} |jj#d|dd| dYd} ~ d} ~ wwxYw)aLoad enabled jobs from database and schedule them. For each enabled job: 1. Get job details 2. Get schedule (cron expression) 3. Create CronTrigger from cron expression 4. Add job to APScheduler with trigger zLoading jobs from database...z!No enabled jobs found in databaseNzFound z enabled job(s)rnamezJSELECT id, cron_expression FROM schedules WHERE job_id = ? AND enabled = 1idJob 'z$' has no enabled schedules, skippingcron_expressionjob_ _schedule_z ())functriggerargsr<r;r u ✓ Scheduled 'z ' with cron: u ✗ Failed to schedule 'z': Tr(zSuccessfully scheduled z job(s))rrrget_enabled_jobswarninglensetaddget_connectionexecutefetchallr from_crontabradd_job_execute_job_callbackr.r/) r jobsscheduled_count job_namesjobconncursor schedulesschedule cron_exprrCr0s r#r*zSchedulerDaemon._load_jobss= 89ww'') KK   C D  6#d)O<=E - C6{i' MM#f+ &'') .T7YL #OO-  . ##CK=(LM& $%67 )66yAGNN**!77 '!$i[!#d)Jx~6FG #F }Byk; +$q(OKK$$+CK= i[Q -- ^ 2?2C7KLQ . .D!KK%%4S[MQCH!%&s%'G #BG G  H&H  Hjob_idc |jj5}|jd|f}|j}ddds |jj d|dyt |}|jjddd}|jj}||k\r&|jj d|d |d d y|jjd |d d |d|jj|}|jjd|d d|dy#1swYxYw#t$r-} |jjd|d| dYd} ~ yd} ~ wwxYw)z~Callback executed by APScheduler when trigger fires. Args: job_id: Database ID of job to execute z/SELECT * FROM jobs WHERE id = ? AND enabled = 1NzJob z* not found or disabled, skipping executionrmax_concurrent_jobszMax concurrent jobs (z#) reached, deferring execution of 'r;'zTriggering execution of 'z ' (job_id: rAr=z' queued (execution_id: z!Error in job callback for job_id z: Tr()rrJrKfetchonerrFdictrrrr6r execute_jobdebugr.r/) r rYrTrUrSjob_dictmax_concurrentr8 execution_idr0s r#rOz%SchedulerDaemon._execute_job_callbacks + '') (TEIoo'  ( ##6("LMCyH"[[__X7LaPN,,GGIL~- ##+N+;rs3  A1==%[7[7r%