75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"git.nyne.dev/nyne/backup/backup"
|
|
"git.nyne.dev/nyne/backup/config"
|
|
)
|
|
|
|
// Scheduler handles the backup scheduling
|
|
type Scheduler struct {
|
|
config *config.Config
|
|
backupManager *backup.BackupManager
|
|
ticker *time.Ticker
|
|
quit chan struct{}
|
|
}
|
|
|
|
// NewScheduler creates a new scheduler
|
|
func NewScheduler(cfg *config.Config) (*Scheduler, error) {
|
|
bm, err := backup.NewBackupManager(cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create backup manager: %w", err)
|
|
}
|
|
|
|
return &Scheduler{
|
|
config: cfg,
|
|
backupManager: bm,
|
|
quit: make(chan struct{}),
|
|
}, nil
|
|
}
|
|
|
|
// Start starts the scheduler
|
|
func (s *Scheduler) Start() error {
|
|
interval, err := s.config.Options.ParseInterval()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse interval: %w", err)
|
|
}
|
|
|
|
log.Printf("Starting scheduler with interval: %s\n", interval)
|
|
|
|
// Run backup immediately on start
|
|
log.Println("Running initial backup...")
|
|
if err := s.backupManager.RunBackup(); err != nil {
|
|
log.Printf("Initial backup failed: %v\n", err)
|
|
}
|
|
|
|
s.ticker = time.NewTicker(interval)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-s.ticker.C:
|
|
log.Println("Starting scheduled backup...")
|
|
if err := s.backupManager.RunBackup(); err != nil {
|
|
log.Printf("Backup failed: %v\n", err)
|
|
}
|
|
case <-s.quit:
|
|
s.ticker.Stop()
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
log.Println("Scheduler started successfully")
|
|
|
|
return nil
|
|
}
|
|
|
|
// Stop stops the scheduler
|
|
func (s *Scheduler) Stop() {
|
|
close(s.quit)
|
|
}
|