add custom snapshot

This commit is contained in:
shoopea
2025-10-19 21:40:30 +02:00
parent 73f9551c8f
commit 05054be795
5 changed files with 140 additions and 39 deletions

95
app.go
View File

@@ -260,6 +260,11 @@ func (a *App) RunSchedule(schedule string, now time.Time) error {
log.WithFields(log.Fields{"app": a.name, "schedule": schedule, "now": now}).Debugf("starting")
defer log.WithFields(log.Fields{"app": a.name, "schedule": schedule, "now": now}).Debugf("done")
if err := a.SanityCheck(); err != nil {
log.WithFields(log.Fields{"app": a.name, "now": now, "call": "SanityCheck", "error": err}).Errorf("")
return err
}
snapshotName := SnapshotName(schedule, now)
log.WithFields(log.Fields{"app": a.name, "schedule": schedule, "now": now, "snapshot": snapshotName}).Debugf("snapshot name")
@@ -279,19 +284,31 @@ func (a *App) RunSchedule(schedule string, now time.Time) error {
log.WithFields(log.Fields{"app": a.name, "schedule": schedule, "now": now, "call": "RunAfter", "attr": schedule, "error": err}).Errorf("")
}
for _, src := range a.sources {
if err := src.SetManaged(true); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "src.SetManaged", "error": err}).Errorf("")
return err
}
}
if err := a.Transfer(); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "Transfer", "error": err}).Errorf("")
return err
}
if err := a.Cleanup(now); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "Cleanup", "error": err}).Errorf("")
return err
}
return nil
}
func (a *App) Run(now time.Time) (string, error) {
func (a *App) RunTime(now time.Time) (string, error) {
log.WithFields(log.Fields{"app": a.name, "now": now}).Debugf("starting")
defer log.WithFields(log.Fields{"app": a.name, "now": now}).Debugf("done")
if err := a.SanityCheck(); err != nil {
log.WithFields(log.Fields{"app": a.name, "now": now, "call": "SanityCheck", "error": err}).Errorf("")
return "", err
}
schedule, err := a.NextSchedule(now)
if err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "NextSchedule", "error": err}).Errorf("")
@@ -299,31 +316,7 @@ func (a *App) Run(now time.Time) (string, error) {
}
log.WithFields(log.Fields{"app": a.name, "now": now, "schedule": schedule}).Debugf("schedule")
if schedule != "" {
if err := a.RunSchedule(schedule, now); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "NextSchedule", "error": err}).Errorf("")
return "", err
}
}
for _, src := range a.sources {
if err := src.SetManaged(true); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "src.SetManaged", "error": err}).Errorf("")
return "", err
}
}
if err := a.Transfer(); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "Transfer", "error": err}).Errorf("")
return "", err
}
if err := a.Cleanup(now); err != nil {
log.WithFields(log.Fields{"app": a.name, "call": "Cleanup", "error": err}).Errorf("")
return "", err
}
return schedule, nil
return schedule, a.RunSchedule(schedule, now)
}
func (a *App) NextSchedule(now time.Time) (string, error) {
@@ -541,7 +534,7 @@ func (a *App) Boxes() []*Box {
return bx
}
func (a *App) RunFull() error {
func (a *App) RunStandaloneTime(now time.Time) error {
log.WithFields(log.Fields{"app": a.name}).Debugf("starting")
defer log.WithFields(log.Fields{"app": a.name}).Debugf("done")
@@ -574,7 +567,7 @@ func (a *App) RunFull() error {
wg.Wait()
if sched, err := a.Run(time.Now()); err != nil {
if sched, err := a.RunTime(now); err != nil {
log.WithFields(log.Fields{"call": "Run", "error": err}).Errorf("")
return err
} else {
@@ -585,3 +578,39 @@ func (a *App) RunFull() error {
return nil
}
func (a *App) RunStandaloneSchedule(name string) error {
log.WithFields(log.Fields{"app": a.name, "name": name}).Debugf("starting")
defer log.WithFields(log.Fields{"app": a.name, "name": name}).Debugf("done")
if cfgRun {
return fmt.Errorf("backup already running")
}
CfgLock()
defer CfgUnlock()
cfgRun = true
defer func() { cfgRun = false }()
boxes := a.Boxes()
var wg sync.WaitGroup
// Open boxes
for _, b := range boxes {
wg.Add(1)
go func(box *Box) {
defer wg.Done()
if err := box.Open(); err != nil {
log.WithFields(log.Fields{"name": box.name, "call": "Open", "error": err}).Errorf("")
return
}
}(b)
defer b.Close()
}
wg.Wait()
return a.RunSchedule(name, time.Now())
}