1iISrSSKrSSKrSSKrSSKJrJrJr SSKJr SSK J r SSK J r SSK Jr SSKJr SS KJr SS KJr SS KJr SS KJr SS KJr SSKJr SSKJr SSKJ r "SS5r!Sr"\#S:Xa\""5 gg)z Automation Daemon - Unified daemon for multiple automation modules Manages scheduling and execution for Scheduler, Backup, and future modules N)OptionalDictAny)datetime)BackgroundScheduler) CronTrigger)IntervalTrigger) DateTrigger)logger)Database)SchedulerConfig) setup_logging)convert_unix_to_iso_dayofweek) JobExecutor)NotificationManager)DependencyManagerc\rSrSrSrSrSrSrSrSr Sr S \ 4S jr S \ S \ 4S jrS\4SjrS\4SjrS\S\4SjrS\S\4SjrSrS\4SjrS\4SjrS\S\\4SjrS\S\\ \44SjrS\S\\ \44SjrS\ 4SjrSrg) AutomationDaemonz3Unified daemon managing multiple automation modulesc[S5 [R"S5 [5Ul[ URR 5Ul[URUR5Ul [URURUR5Ul [URUR5Ul 0UlUR5 [!SSSSS.S9UlS Ul[&R&"[&R(UR*5 [&R&"[&R,UR*5 [R"S 5 g) NdaemonzInitializing Automation Daemonz Europe/RomeTi,)coalesce max_instancesmisfire_grace_time)timezone job_defaultsFzAutomation Daemon initialized)rr infor configr database_pathdbrnotification_managerrexecutorrdependency_managermodules _load_modulesr schedulerrunningsignalSIGINT_signal_handlerSIGTERM)selfs /c:\PYTHON\Scheduler\daemon\automation_daemon.py__init__AutomationDaemon.__init__sh 45&' 4;;445%8$M!$DGGT[[$:S:ST "3DGGT]]"K(*  -" !"&)    fmmT%9%9: fnnd&:&:; 34c[R"S5 SURURS.URS'[R"S5 SSKJn SU"UR5S .URS '[R"S 5 SSK J n SU"UR5S .URS'[R"S5 [R"S[UR5S35 g ![a#n[R"S U35 S nANS nAff=f![a#n[R"SU35 S nANS nAff=f)z&Load and initialize automation moduleszLoading automation modules... Scheduler)namer#r$r'u ✓ Scheduler module loadedr) BackupModuleBackup)r4instancebackupu ✓ Backup module loadedu# ✗ Backup module not available: N) SyncModuleSyncsyncu ✓ Sync module loadedu! ✗ Sync module not available: Loaded z module(s)) r rr#r$r%modules.backupr5r! Exceptionwarning modules.syncr9len)r-r5er9s r.r&AutomationDaemon._load_modulesFs' 34  "&"9"9%  [!  34 F 3 (1&DLL " KK4 5  D /&tww/$DLL  KK2 3  gc$,,/0 ;<+ F NN@D E E F D NN>qcB C C Ds0>D>D0 D- D((D-0 E:EEcX[R"SUS35 UR5 g)zHandle shutdown signalszReceived signal z, shutting down...N)r rshutdown)r-signumframes r.r+ AutomationDaemon._signal_handlerqs" &vh.@AB r1c[R"S5 UR5 URR 5 SUl[R"S5 [R"S[ URR55S35 UR (aS[R"URRSS55 UR5 UR (aMSUR!5 g ![a [R"S5 N3f=f![an[R"S U35 eS nAff=f!UR!5 f=f) zStart the automation daemonzStarting Automation DaemonTz&Automation Daemon started successfullyr<z schedule(s)zdaemon.check_interval_secondszKeyboard interrupt receivedzError starting daemon: N)r r_load_schedulesr'startr(rAget_jobstimesleeprget _health_checkKeyboardInterruptr> exceptionrE)r-rBs r.rLAutomationDaemon.startvs 01   " NN "DL KK@ A KK'#dnn&=&=&?"@!AN O ;llJJt{{/NPRST&&( lll MMO% ; 9: ;    6qc: ;   MMOsIBD6A"D D30D61E"2D33D66 EEEE""E4c`UR(dg[R"S5 SUlURR(a/URR SS9 [R"S5 UR R 5nU(a[R"S[U5S35 S n[R"5nU(aq[R"5U- U:aU[R"S 5 UR R 5nU(a[R"5U- U:aMUU(a"[R"[U5S 35 URR5HQupES U;dM [US S 5(dM#US R5 [R"SUS35 MS [R"S5 g![a'n[R "SUSU35 SnAMSnAff=f)zShutdown the daemon gracefullyNzShutting down Automation DaemonFT)waitzAPScheduler stoppedz Waiting for z active jobs to complete...<rz! jobs still running after timeoutr7cleanupzModule 'z' cleanup completedzError cleaning up module '': zAutomation Daemon stopped)r(r rr'rEr#get_active_executionsrArNrOr?r%itemshasattrrXr>error)r-activetimeoutrL module_name module_datarBs r.rEAutomationDaemon.shutdowns||  56  >> ! ! NN # # # . KK- .446  KK,s6{m3NO PGIIKEdiikE1W< 1 <<>diikE1W<#f+.OPQ)- (:(:(< $K[(W[5Li-X-XS +335KK(;-7J KL )=  /0!SLL#=k]#aS!QRRSs4-G<< H-H((H-c URRSS9n[R"S[ U5S35 UHnUR U5 M g![ a*n[R"SUSSU35 SnAMISnAff=f) z:Load all enabled schedules from database and schedule themT) enabled_onlyzLoading z enabled schedule(s)zError scheduling 'r4rYN)r!get_all_schedulesr rrA_schedule_itemr>r])r- schedulesschedulerBs r.rK AutomationDaemon._load_schedulessGG--4-@  hs9~..BCD!H L##H-" L 1(62B1C3qcJKK LsA B #BB rhc >SSKnUSnUSnUSnUSnUSnURUS5nUS :Xa[R"S US 35 gUR Xx5n U (d[R "S US 35 gUS:XaUR n U/n OUS:XaURn U/n OUS:Xa7SUR;a[R"S5 gURn X6/n O[US:Xa7SUR;a[R"S5 gURn X6/n O[R"SUSUS 35 gURRU U U SU3USS9 [R"SUSUSUSUSU3 5 g! USnGNi=f) zZ Schedule an item with APScheduler Args: schedule: Schedule definition from database rNidr4 target_type target_id schedule_typeschedule_configmanualzSkipping manual schedule ''z&Could not build trigger for schedule 'z ', skippingjobgroupbackup_profiler8z0Cannot schedule backup: backup module not loaded sync_profiler;z,Cannot schedule sync: sync module not loadedzUnknown target_type 'z' in schedule ' schedule_T)functriggerargsrkr4replace_existingz Scheduled 'z' (ID z):  z with )jsonloadsr debug_build_triggerr?_execute_scheduled_job_execute_scheduled_groupr%r]_execute_scheduled_backup_execute_scheduled_syncr'add_jobr) r-rhr| schedule_id schedule_namerlrmrnrorx exec_func exec_argss r.rfAutomationDaemon._schedule_items tn  ( }- [)  1  :"jj2C)DEO H $ LL5m_AF G %%mE NNCM?R]^ _  % 33I" I G #55I" I , ,t||+ OQ66I$0I N *T\\) KM44I$0I LL0 _]O[\] ^  ;-(!    k-{m3{mSTU^T__efsetuvi :&'89Os FFrnrocUS:Xa;URS5nU(a![U5n[R"U5$gUS:Xa [ S0UD6$US:Xa!URS5nU(a [ US9$g)z Build APScheduler trigger from schedule configuration Args: schedule_type: 'cron', 'interval', or 'date' schedule_config: Configuration dict Returns: APScheduler trigger object cronintervaldaterun_date)rN)rPrr from_crontabr r )r-rnro cron_expr cron_expr_isors r.rAutomationDaemon._build_triggers F "'++F3I =i H "// >>j ("5_5 5 f $&**:6H"H55r1job_idcP[R"SU35 URRUSS9nU(a[R"SUSUS35 g [R"SUS35 g ![ a&n[R "SUS U35 S nAg S nAff=f) zV Execute a scheduled job (called by APScheduler) Args: job_id: Job ID to execute z(Triggered scheduled execution of job ID r' triggered_byzJob ID z$ queued for execution (execution ID )z could not be queuedzError executing scheduled job : N)r rr# execute_jobr?r>rS)r-r execution_idrBs r.r'AutomationDaemon._execute_scheduled_job/s  >vhGH M==44V+4VL gfX-QR^Q__`ab0DEF M   =fXRsK L L Ms>A5A55 B%?B  B%group_idc[R"SU35 URRUSS9nUR S5(a"SUS35 g [ UR S/55n[R "SUSUS 35 g ![a&n[R"S US U35 S nAg S nAff=f) z\ Execute a scheduled group (called by APScheduler) Args: group_id: Group ID to execute z*Triggered scheduled execution of group ID r'rsuccessz Group ID  completed successfully failed_jobsz completed with z failed job(s)z Error executing scheduled group rN) r rr$execute_job_grouprPrAr?r>rS)r-rresult failed_countrBs r.r)AutomationDaemon._execute_scheduled_groupCs  @ KL Q,,>>(?F zz)$$ iz1HIJ"6::mR#@A 8*4D\NR`ab Q   ?zA3O P P QsA B&8B C)C  Cr profile_idc[R"SU35 URSSnURX5nUR S5(a"SUS35 g UR SS5n[R "SUS U35 g ![ a&n[R"S US U35 S nAg S nAff=f) z Execute a scheduled backup (called by APScheduler) Args: schedule_id: Schedule ID that triggered profile_id: Backup profile ID to execute z3Triggered scheduled execution of backup profile ID r8r7rzBackup profile ID rr] Unknown error failed: z!Error executing scheduled backup rNr rr% schedule_itemrPr]r>rS)r-rr backup_modulerr]rBs r.r*AutomationDaemon._execute_scheduled_backup\s  I*VW T LL2:>M"00IFzz)$$ 0 zl"QCP Q Q RrcURR5nUHn[R"US5n[R"5U- R 5nURR US5nU(dMiXESS-:dMv[R"SUSS35 URRUSS[R"5S S 9 M g ) z!Periodic health check and cleanup start_timertimeout_secondsz Execution rkz! appears stuck, marking as failedfailedz@Execution exceeded 2x timeout - marked as failed by health check)statusend_time error_messageN) r!rZr fromisoformatnow total_secondsget_jobr r?update_execution)r-r^ executionr running_timerrs r.rQAutomationDaemon._health_checks..0I!// ,0GHJ$LLNZ7FFHL''//)H"56Cs|+<'='ABIdO+<<]^_((dO#%\\^"d ) r1cURRU5nU(a:US(a/URU5 [R"SUSS35 ggg)z] Add or update a schedule in the scheduler Args: schedule_id: Schedule ID to add/update enabledzAdded/updated schedule 'r4z' in schedulerN)r! get_schedulerfr r)r-rrhs r. add_scheduleAutomationDaemon.add_schedulesS77'' 4 +    ) KK28F3C2DNS T,8r1cURRSU35 [R"SUS35 g![a&n[R "SUSU35 SnAgSnAff=f)zT Remove a schedule from the scheduler Args: schedule_id: Schedule ID to remove rvzRemoved schedule ID z from schedulerzCould not remove schedule z from scheduler: N)r' remove_jobr rr>r?)r-rrBs r.remove_schedule AutomationDaemon.remove_schedulesi [ NN % % +&? @ KK.{m?K L [ NN7 }DUVWUXY Z Z [s8; A+A&&A+returnch[R"SU35 URRUSS9$)zn Execute a job manually (outside of schedule) Args: job_id: Job ID to execute Returns: Execution ID z&Manual execution requested for job ID rpr)r rr#r)r-rs r.execute_job_manually%AutomationDaemon.execute_job_manuallys2  MSM(QQ2TSTcT.R3RCR.* U U [3 [ H3 H8C= H8#8$sCx.8(44S#X4( 4 r1rc[R"S5 [R"S5 [R"S5 [5nUR5 [R"S5 g![a [R"S5 N9[ a9n[R "SU35 [R"S5 SnANvSnAff=f)zMain entry point for daemonz<============================================================z#Python Automation Daemon - StartingzReceived KeyboardInterruptzFatal error in daemon: rNr) r rrrLrRr>rSsysexit)rrBs r.mainrs KK KK56 KK  F HHQK 2 01 21#67  sA55 C C /CC__main__)$rrNr)rtypingrrrr!apscheduler.schedulers.backgroundrapscheduler.triggers.cronrapscheduler.triggers.intervalr apscheduler.triggers.dater logurur core.databaser core.configr core.loggerrcore.cron_utilsrdaemon.job_executorrdaemon.notification_managerrdaemon.dependency_managerrrrrrr1r.rsh  &&A191"'%9+;7f f R& zFr1