Files
snapz/main.go
T

70 lines
1.6 KiB
Go

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()
}