3x-ui/web/job/backup_job.go

69 lines
1.5 KiB
Go

package job
import (
"time"
"github.com/mhsanaei/3x-ui/v2/logger"
"github.com/mhsanaei/3x-ui/v2/web/service"
)
// BackupJob handles scheduled database backups.
type BackupJob struct {
settingService service.SettingService
backupService service.BackupService
}
// NewBackupJob creates a new BackupJob instance.
func NewBackupJob() *BackupJob {
return &BackupJob{}
}
// Run executes the scheduled backup if enabled and time matches the configured frequency.
func (j *BackupJob) Run() {
enabled, err := j.settingService.GetBackupEnabled()
if err != nil || !enabled {
return
}
frequency, err := j.settingService.GetBackupFrequency()
if err != nil {
return
}
if !j.shouldRun(frequency) {
return
}
if err := j.backupService.CreateSnapshot(j.settingService); err != nil {
logger.Warning("scheduled backup failed:", err)
}
}
// shouldRun checks if the backup should run based on the configured frequency.
func (j *BackupJob) shouldRun(frequency string) bool {
now := time.Now()
switch frequency {
case "hourly":
return now.Minute() == 0
case "every12h":
return (now.Hour() == 0 || now.Hour() == 12) && now.Minute() == 0
case "daily":
hour, err := j.settingService.GetBackupHour()
if err != nil {
hour = 3
}
return now.Hour() == hour && now.Minute() == 0
case "weekly":
if now.Weekday() != time.Sunday {
return false
}
hour, err := j.settingService.GetBackupHour()
if err != nil {
hour = 3
}
return now.Hour() == hour && now.Minute() == 0
default:
return false
}
}