package bsdaily import ( "errors" "fmt" "log/slog" "os" "path/filepath" "sort" "time" ) var errNoSnapshots = errors.New("no daily snapshots found") // FindLatestDailySnapshot locates the newest daily ZFS snapshot that // contains the firehose database and returns its directory and date. func FindLatestDailySnapshot() (string, time.Time, error) { entries, err := os.ReadDir(SnapshotBase) if err != nil { return "", time.Time{}, fmt.Errorf( "reading snapshot directory %s: %w", SnapshotBase, err) } type snapshot struct { name string date time.Time } var snapshots []snapshot for _, e := range entries { if !e.IsDir() { continue } m := snapshotPattern.FindStringSubmatch(e.Name()) if m == nil { continue } d, perr := time.Parse("2006-01-02", m[1]) if perr != nil { slog.Warn("skipping snapshot with unparseable date", "name", e.Name(), "error", perr) continue } snapshots = append(snapshots, snapshot{name: e.Name(), date: d}) } if len(snapshots) == 0 { return "", time.Time{}, fmt.Errorf("%w in %s", errNoSnapshots, SnapshotBase) } sort.Slice(snapshots, func(i, j int) bool { return snapshots[i].date.After(snapshots[j].date) }) latest := snapshots[0] dir := filepath.Join(SnapshotBase, latest.name) dbPath := filepath.Join(dir, DBFilename) _, err = os.Stat(dbPath) if err != nil { return "", time.Time{}, fmt.Errorf( "database not found in snapshot %s: %w", dir, err) } return dir, latest.date, nil }