@@ -14,32 +14,79 @@ import (
1414// runCmd represents the run command
1515var runCmd = & cobra.Command {
1616 Use : "run" ,
17- Short : "Run the backup schedule " ,
18- Long : `Run the backup schedule defined in the configuration file.` ,
17+ Short : "Run the backup and restore schedules " ,
18+ Long : `Run the backup and restore schedules defined in the configuration file.` ,
1919 Run : func (_ * cobra.Command , _ []string ) {
2020 logger := log .Logger .With ().Str ("caller" , "schedule_runner" ).Logger ()
2121
22- if len (config .Loaded .Schedule ) == 0 {
23- logger .Fatal ().Msg ("no backup schedules configured - cannot start scheduler" )
22+ backupCount := len (config .Loaded .Schedule )
23+ restoreCount := len (config .Loaded .RestoreSchedule )
24+ totalSchedules := backupCount + restoreCount
25+
26+ if totalSchedules == 0 {
27+ logger .Fatal ().Msg ("no schedules configured - cannot start scheduler" )
2428 }
2529
26- logger .Info ().Int ("schedule_count" , len (config .Loaded .Schedule )).Msg ("initializing backup scheduler" )
30+ logger .Info ().
31+ Int ("backup_schedules" , backupCount ).
32+ Int ("restore_schedules" , restoreCount ).
33+ Int ("total_schedules" , totalSchedules ).
34+ Msg ("initializing scheduler" )
2735
2836 c := cron .New ()
37+
38+ // Register backup schedules
2939 for _ , schedule := range config .Loaded .Schedule {
3040 if id , err := c .AddFunc (schedule , func () { internal .Backup (context .Background ()) }); err != nil {
3141 logger .Fatal ().Err (err ).
3242 Str ("cron_expression" , schedule ).
3343 Msg ("failed to register backup schedule - invalid cron expression" )
3444 } else {
3545 logger .Info ().
46+ Str ("type" , "backup" ).
3647 Str ("cron_expression" , schedule ).
3748 Str ("next_run" , c .Entry (id ).Next .String ()).
38- Msg ("backup schedule registered successfully" )
49+ Msg ("schedule registered successfully" )
50+ }
51+ }
52+
53+ // Register restore schedules
54+ for _ , restoreSchedule := range config .Loaded .RestoreSchedule {
55+ if ! restoreSchedule .IsEnabled () {
56+ logger .Info ().
57+ Str ("type" , "restore" ).
58+ Str ("cron_expression" , restoreSchedule .Cron ).
59+ Str ("target_database" , restoreSchedule .TargetDatabase ).
60+ Msg ("restore schedule disabled, skipping" )
61+ continue
62+ }
63+
64+ // Create a closure to capture the restore schedule config
65+ scheduleConfig := restoreSchedule // Important: capture the value, not the reference
66+ if id , err := c .AddFunc (restoreSchedule .Cron , func () {
67+ if err := internal .ScheduledRestore (context .Background (), scheduleConfig ); err != nil {
68+ log .Error ().Err (err ).
69+ Str ("cron_expression" , scheduleConfig .Cron ).
70+ Str ("target_database" , scheduleConfig .TargetDatabase ).
71+ Msg ("scheduled restore failed" )
72+ }
73+ }); err != nil {
74+ logger .Fatal ().Err (err ).
75+ Str ("cron_expression" , restoreSchedule .Cron ).
76+ Str ("target_database" , restoreSchedule .TargetDatabase ).
77+ Msg ("failed to register restore schedule - invalid cron expression" )
78+ } else {
79+ logger .Info ().
80+ Str ("type" , "restore" ).
81+ Str ("cron_expression" , restoreSchedule .Cron ).
82+ Str ("target_database" , restoreSchedule .TargetDatabase ).
83+ Str ("backup_selection" , restoreSchedule .BackupSelection ).
84+ Str ("next_run" , c .Entry (id ).Next .String ()).
85+ Msg ("schedule registered successfully" )
3986 }
4087 }
4188
42- logger .Info ().Msg ("starting backup scheduler - waiting for scheduled backup jobs" )
89+ logger .Info ().Msg ("starting scheduler - waiting for scheduled jobs" )
4390 c .Run ()
4491 },
4592}
0 commit comments