diff --git a/api.go b/api.go index e70c743..990500d 100644 --- a/api.go +++ b/api.go @@ -50,6 +50,24 @@ func ApiSnapshotDel(c *gin.Context) { } func ApiSnapshotList(c *gin.Context) { + if app, ok := cfg.apps[c.Param("app")]; ok { + if snapshots, err := app.Snapshots(); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": "error", + "error": err, + }) + } else { + c.JSON(http.StatusOK, gin.H{ + "message": "done", + "snapshots": snapshots, + }) + } + } else { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": "error", + "error": "no app found", + }) + } c.JSON(http.StatusInternalServerError, gin.H{ "message": "error", "error": "not implemented", diff --git a/app.go b/app.go index 1b81616..d78dcf9 100644 --- a/app.go +++ b/app.go @@ -503,7 +503,7 @@ func (a *App) Transfer() error { return nil } -func (a *App) Boxes() []*Box { +func (a *App) AllBoxes() []*Box { log.WithFields(log.Fields{"app": a.name}).Debugf("starting") defer log.WithFields(log.Fields{"app": a.name}).Debugf("done") @@ -534,6 +534,33 @@ func (a *App) Boxes() []*Box { return bx } +func (a *App) SourceBoxes() []*Box { + log.WithFields(log.Fields{"app": a.name}).Debugf("starting") + defer log.WithFields(log.Fields{"app": a.name}).Debugf("done") + + bm := make(map[string]struct{}) + + for _, s := range a.sources { + bm[s.Box()] = struct{}{} + } + + for _, b := range a.before { + bm[b.Box()] = struct{}{} + } + + for _, af := range a.after { + bm[af.Box()] = struct{}{} + } + + bx := make([]*Box, 0) + + for n := range bm { + bx = append(bx, cfg.box[n]) + } + + return bx +} + 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") @@ -548,7 +575,7 @@ func (a *App) RunStandaloneTime(now time.Time) error { cfgRun = true defer func() { cfgRun = false }() - boxes := a.Boxes() + boxes := a.AllBoxes() var wg sync.WaitGroup @@ -593,7 +620,7 @@ func (a *App) RunStandaloneSchedule(name string) error { cfgRun = true defer func() { cfgRun = false }() - boxes := a.Boxes() + boxes := a.AllBoxes() var wg sync.WaitGroup @@ -614,3 +641,48 @@ func (a *App) RunStandaloneSchedule(name string) error { return a.RunSchedule(name, time.Now()) } + +func (a *App) Snapshots() ([]string, error) { + log.WithFields(log.Fields{"app": a.name}).Debugf("starting") + defer log.WithFields(log.Fields{"app": a.name}).Debugf("done") + + CfgLock() + defer CfgUnlock() + + cfgRun = true + defer func() { cfgRun = false }() + + boxes := a.SourceBoxes() + + 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() + + names := make([]string, 0) + + for _, src := range a.sources { + if snapshots, err := src.ValidSnapshots(); err != nil { + log.WithFields(log.Fields{"call": "ValidSnapshots", "attr": src, "error": err}).Errorf("") + return names, err + } else { + for _, snapshot := range snapshots { + names = append(names, snapshot.name) + } + } + } + + return names, nil +} diff --git a/version.go b/version.go index 443503a..09c0704 100644 --- a/version.go +++ b/version.go @@ -1,7 +1,7 @@ // Code generated by version.sh (@generated) DO NOT EDIT. package main -var githash = "73f9551" +var githash = "05054be" var branch = "master" -var buildstamp = "2025-10-19_19:40:05" -var commits = "115" -var version = "73f9551-b115 - 2025-10-19_19:40:05" +var buildstamp = "2025-10-26_09:32:26" +var commits = "116" +var version = "05054be-b116 - 2025-10-26_09:32:26"