package main import ( "fmt" "os" "time" "git.ohea.xyz/spaceman/snapzd/configuration" "github.com/go-co-op/gocron" "github.com/mistifyio/go-zfs" "go.uber.org/zap" ) func CreateSnapshotJob(job_info *configuration.JobConfig) func() { return func() { fs, err := zfs.Filesystems(job_info.Dataset) if err != nil { zap.S().Errorf("failed to start job %v: %v", job_info.Name, err) return } if len(fs) != 1 { zap.S().Errorf("dataset path returned %v datasets. Expected 1", len(fs)) return } to_snapshot := fs[0] snaptime := time.Now() snapname := fmt.Sprintf("snapz.%s.%s", job_info.Name, snaptime.Format(time.RFC3339)) snapshot, err := to_snapshot.Snapshot(snapname, job_info.Recursive) if err != nil { zap.S().Errorf("failed to create snapshot: %v: ", snapname, err) return } zap.S().Infof("created snapshot: %v", snapshot.Name) } } func configureLogging() error { logger, err := zap.NewDevelopment() if err != nil { return err } zap.ReplaceGlobals(logger) return nil } func main() { err := configureLogging() if err != nil { fmt.Fprintf(os.Stderr, "failed to initalize logging, can't continue: %v", err) return } zap.S().Info("begining conifg scan") jobs, err := configuration.GetJobs() if err != nil { zap.S().Fatalf("failed to read configuration: %v", err) } scheduler := gocron.NewScheduler(time.Local) for _, job := range jobs { zap.S().Infof("discovered job: %v", job.Name) zap.S().Infof("adding job. Name: %v, Dataset: %v, Cron: %v", job.Name, job.Dataset, job.Cron) scheduler.Cron(job.Cron).SingletonMode().Tag(job.Name).Do(CreateSnapshotJob(&job)) } scheduler.StartBlocking() }