fix(offsite): fetch-db latest 跳过新装机器的空库包,取包后显示包内账号和服务器数

This commit is contained in:
Lemon-miaow committed 2026-09-27 06:52:09 +08:00
1 parent aa73a8ca28
commit fa46733859
11 files changed
+720 -34

No files matched your search

+35 -9
View File
@@ -68,6 +68,39 @@ func Verify(path string) (Manifest, error) {
return readBundle(path, nil)
}
var errNotBundle = fmt.Errorf("not a felis database bundle (no %s)", manifestEntry)
// ReadManifest reads the manifest off the front of a bundle stream and stops
// there, so a bundle can be described before all of it is downloaded. The
// members it lists are not checked; Verify does that. An error from r itself
// is returned as is.
func ReadManifest(r io.Reader) (Manifest, error) {
return readManifest(tar.NewReader(r))
}
func readManifest(tr *tar.Reader) (Manifest, error) {
var m Manifest
first, err := tr.Next()
switch {
case err == nil && first.Name == manifestEntry:
case err == nil, errors.Is(err, io.EOF), errors.Is(err, io.ErrUnexpectedEOF), errors.Is(err, tar.ErrHeader):
return m, errNotBundle
default:
return m, err
}
raw, err := io.ReadAll(io.LimitReader(tr, 1<<20))
if err != nil {
return m, err
}
if err := json.Unmarshal(raw, &m); err != nil {
return m, fmt.Errorf("read %s: %w", manifestEntry, err)
}
if m.Format != formatV1 {
return m, fmt.Errorf("bundle format %d is not one this felis reads (want %d)", m.Format, formatV1)
}
return m, nil
}
// readBundle is Verify that also copies db.dump to dumpTo when non-nil.
func readBundle(path string, dumpTo io.Writer) (Manifest, error) {
var m Manifest
@@ -79,20 +112,13 @@ func readBundle(path string, dumpTo io.Writer) (Manifest, error) {
whole := sha256.New()
tr := tar.NewReader(io.TeeReader(f, whole))
first, err := tr.Next()
if err != nil || first.Name != manifestEntry {
m, err = readManifest(tr)
if errors.Is(err, errNotBundle) {
return m, fmt.Errorf("%s is not a felis database bundle (no %s)", filepath.Base(path), manifestEntry)
}
raw, err := io.ReadAll(io.LimitReader(tr, 1<<20))
if err != nil {
return m, err
}
if err := json.Unmarshal(raw, &m); err != nil {
return m, fmt.Errorf("read %s: %w", manifestEntry, err)
}
if m.Format != formatV1 {
return m, fmt.Errorf("bundle format %d is not one this felis reads (want %d)", m.Format, formatV1)
}
want := map[string]ManifestEntry{}
for _, e := range m.Files {
want[e.Name] = e