From 27292263426d0a2abba4c1b5fd3970b6cde080c8 Mon Sep 17 00:00:00 2001 From: jester Date: Sat, 18 Apr 2026 18:12:32 +0000 Subject: [PATCH] updates for backup and restore 4-18-26 --- internal/backup/backup.go | 71 ++++++++- internal/backup/backup_test.go | 3 + internal/backup/log.go | 44 ++++++ logs/agent.log | 8 + logs/backup_restore.log | 272 +++++++++++++++++++++++++++++++++ state/update.json | 2 +- 6 files changed, 395 insertions(+), 5 deletions(-) create mode 100644 internal/backup/log.go create mode 100644 logs/backup_restore.log diff --git a/internal/backup/backup.go b/internal/backup/backup.go index 280cc76..9ef729c 100644 --- a/internal/backup/backup.go +++ b/internal/backup/backup.go @@ -81,7 +81,18 @@ func createCheckpoint(cfg *state.Config) (Manifest, error) { }) } -func create(cfg *state.Config, opts createOptions) (Manifest, error) { +func create(cfg *state.Config, opts createOptions) (manifest Manifest, err error) { + started := time.Now() + backupLogf(cfg, "action=backup_create status=begin requested_type=%s reason=%s prune=%t", opts.backupType, opts.reason, opts.prune) + defer func() { + if err != nil { + backupLogf(cfg, "action=backup_create status=failed elapsed_ms=%d err=%v", time.Since(started).Milliseconds(), err) + return + } + backupLogf(cfg, "action=backup_create status=complete id=%s archive=%s paths=%d files=%d bytes=%d elapsed_ms=%d", + manifest.ID, manifest.Archive, len(manifest.Paths), manifest.FileCount, manifest.TotalBytes, time.Since(started).Milliseconds()) + }() + if err := requireMinecraft(cfg); err != nil { return Manifest{}, err } @@ -97,6 +108,7 @@ func create(cfg *state.Config, opts createOptions) (Manifest, error) { archivePath := filepath.Join(rootDir, archiveName) serverRoot := serverDir(*cfg) paths := defaultPaths(cfg, serverRoot) + backupLogf(cfg, "action=backup_create step=metadata id=%s archive=%s root=%s server_root=%s paths=%q", id, archiveName, rootDir, serverRoot, paths) backupType := strings.TrimSpace(opts.backupType) if backupType == "" { @@ -107,19 +119,24 @@ func create(cfg *state.Config, opts createOptions) (Manifest, error) { saveOff := false if running { state.SetOperationMessage("flushing minecraft saves") + backupLogf(cfg, "action=backup_create step=save_off status=begin id=%s", id) if err := runSaveOff(); err != nil { return Manifest{}, fmt.Errorf("disable minecraft saves: %w", err) } + backupLogf(cfg, "action=backup_create step=save_off status=complete id=%s", id) saveOff = true defer func() { if saveOff { + backupLogf(cfg, "action=backup_create step=save_on status=deferred id=%s", id) _ = runSaveOn() } }() + } else { + backupLogf(cfg, "action=backup_create step=save_off status=skipped id=%s reason=server_not_running", id) } state.SetOperationMessage("creating backup archive") - manifest := Manifest{ + manifest = Manifest{ ID: id, CreatedAtUTC: time.Now().UTC().Format(time.RFC3339), Type: backupType, @@ -132,27 +149,46 @@ func create(cfg *state.Config, opts createOptions) (Manifest, error) { Archive: archiveName, Paths: paths, } + backupLogf(cfg, "action=backup_create step=archive_write status=begin id=%s archive_path=%s", id, archivePath) if err := writeArchive(serverRoot, archivePath, &manifest); err != nil { return Manifest{}, err } + backupLogf(cfg, "action=backup_create step=archive_write status=complete id=%s files=%d bytes=%d", id, manifest.FileCount, manifest.TotalBytes) if saveOff { + backupLogf(cfg, "action=backup_create step=save_on status=begin id=%s", id) if err := runSaveOn(); err != nil { return Manifest{}, fmt.Errorf("enable minecraft saves: %w", err) } saveOff = false + backupLogf(cfg, "action=backup_create step=save_on status=complete id=%s", id) } + backupLogf(cfg, "action=backup_create step=manifest_sidecar status=begin id=%s", id) if err := writeManifestSidecar(manifest); err != nil { return Manifest{}, err } + backupLogf(cfg, "action=backup_create step=manifest_sidecar status=complete id=%s", id) if opts.prune { + backupLogf(cfg, "action=backup_create step=prune status=begin id=%s max_count=%d", id, defaultMaxCount) if err := prune(defaultMaxCount); err != nil { return Manifest{}, err } + backupLogf(cfg, "action=backup_create step=prune status=complete id=%s", id) } return manifest, nil } -func Restore(cfg *state.Config, id string) (RestoreResult, error) { +func Restore(cfg *state.Config, id string) (result RestoreResult, err error) { + started := time.Now() + backupLogf(cfg, "action=backup_restore status=begin requested_id=%s", strings.TrimSpace(id)) + defer func() { + if err != nil { + backupLogf(cfg, "action=backup_restore status=failed requested_id=%s elapsed_ms=%d err=%v", strings.TrimSpace(id), time.Since(started).Milliseconds(), err) + return + } + backupLogf(cfg, "action=backup_restore status=complete backup_id=%s checkpoint_id=%s elapsed_ms=%d", + result.Backup.ID, result.Checkpoint.ID, time.Since(started).Milliseconds()) + }() + if err := requireMinecraft(cfg); err != nil { return RestoreResult{}, err } @@ -166,35 +202,48 @@ func Restore(cfg *state.Config, id string) (RestoreResult, error) { return RestoreResult{}, err } archivePath := filepath.Join(rootDir, manifest.Archive) + backupLogf(cfg, "action=backup_restore step=manifest status=loaded id=%s archive=%s paths=%q files=%d bytes=%d", id, manifest.Archive, manifest.Paths, manifest.FileCount, manifest.TotalBytes) if _, err := os.Stat(archivePath); err != nil { return RestoreResult{}, err } + backupLogf(cfg, "action=backup_restore step=archive_check status=ok id=%s archive_path=%s", id, archivePath) state.SetOperationMessage("creating pre-restore checkpoint") + backupLogf(cfg, "action=backup_restore step=checkpoint status=begin target_id=%s", id) checkpoint, err := createCheckpoint(cfg) if err != nil { return RestoreResult{}, fmt.Errorf("create pre-restore checkpoint: %w", err) } + backupLogf(cfg, "action=backup_restore step=checkpoint status=complete target_id=%s checkpoint_id=%s archive=%s", id, checkpoint.ID, checkpoint.Archive) if _, running := getServerPID(); running { state.SetOperationMessage("stopping server before restore") + backupLogf(cfg, "action=backup_restore step=stop_server status=begin id=%s timeout=%s", id, 30*time.Second) if err := stopServerAndWait(30 * time.Second); err != nil { return RestoreResult{}, err } + backupLogf(cfg, "action=backup_restore step=stop_server status=complete id=%s", id) + } else { + backupLogf(cfg, "action=backup_restore step=stop_server status=skipped id=%s reason=server_not_running", id) } state.SetOperationMessage("restoring backup archive") + backupLogf(cfg, "action=backup_restore step=archive_restore status=begin id=%s archive_path=%s", id, archivePath) if err := restoreArchive(serverDir(*cfg), archivePath, manifest.Paths); err != nil { return RestoreResult{}, err } + backupLogf(cfg, "action=backup_restore step=archive_restore status=complete id=%s", id) state.SetOperationMessage("starting server after restore") state.SetState(state.StateStarting) state.SetReadyState(false, "", "") + backupLogf(cfg, "action=backup_restore step=start_server status=begin id=%s", id) if err := startServerReady(cfg); err != nil { return RestoreResult{}, err } - return RestoreResult{Backup: manifest, Checkpoint: checkpoint}, nil + backupLogf(cfg, "action=backup_restore step=start_server status=complete id=%s", id) + result = RestoreResult{Backup: manifest, Checkpoint: checkpoint} + return result, nil } func List() ([]Manifest, error) { @@ -297,6 +346,7 @@ func defaultPaths(cfg *state.Config, serverRoot string) []string { } func writeArchive(serverRoot, archivePath string, manifest *Manifest) error { + backupLogf(nil, "action=archive_write status=begin backup_id=%s archive_path=%s server_root=%s paths=%q", manifest.ID, archivePath, serverRoot, manifest.Paths) file, err := os.Create(archivePath) if err != nil { return err @@ -309,9 +359,11 @@ func writeArchive(serverRoot, archivePath string, manifest *Manifest) error { defer tw.Close() for _, rel := range manifest.Paths { + backupLogf(nil, "action=archive_write step=add_path status=begin backup_id=%s path=%s", manifest.ID, rel) if err := addPath(tw, serverRoot, rel, manifest); err != nil { return err } + backupLogf(nil, "action=archive_write step=add_path status=complete backup_id=%s path=%s files=%d bytes=%d", manifest.ID, rel, manifest.FileCount, manifest.TotalBytes) } data, err := json.MarshalIndent(manifest, "", " ") @@ -329,6 +381,9 @@ func writeArchive(serverRoot, archivePath string, manifest *Manifest) error { return err } _, err = tw.Write(data) + if err == nil { + backupLogf(nil, "action=archive_write status=complete backup_id=%s files=%d bytes=%d", manifest.ID, manifest.FileCount, manifest.TotalBytes) + } return err } @@ -351,6 +406,7 @@ func addPath(tw *tar.Writer, serverRoot, rel string, manifest *Manifest) error { } name = filepath.ToSlash(name) if name == "." || strings.HasPrefix(name, ".zlh-shadow/") || name == ".zlh-shadow" { + backupLogf(nil, "action=archive_write step=skip_internal backup_id=%s path=%s", manifest.ID, name) return nil } @@ -363,6 +419,7 @@ func addPath(tw *tar.Writer, serverRoot, rel string, manifest *Manifest) error { return err } if info.IsDir() { + backupLogf(nil, "action=archive_write step=entry backup_id=%s type=dir path=%s", manifest.ID, name) return nil } f, err := os.Open(path) @@ -379,15 +436,18 @@ func addPath(tw *tar.Writer, serverRoot, rel string, manifest *Manifest) error { } manifest.FileCount++ manifest.TotalBytes += n + backupLogf(nil, "action=archive_write step=entry backup_id=%s type=file path=%s bytes=%d total_files=%d total_bytes=%d", manifest.ID, name, n, manifest.FileCount, manifest.TotalBytes) return nil }) } func restoreArchive(serverRoot, archivePath string, paths []string) error { + backupLogf(nil, "action=archive_restore status=begin archive_path=%s server_root=%s paths=%q", archivePath, serverRoot, paths) for _, rel := range paths { if !safeRel(rel) { return fmt.Errorf("backup contains unsafe path: %s", rel) } + backupLogf(nil, "action=archive_restore step=remove_existing path=%s", rel) if err := os.RemoveAll(filepath.Join(serverRoot, filepath.FromSlash(rel))); err != nil { return err } @@ -414,6 +474,7 @@ func restoreArchive(serverRoot, archivePath string, paths []string) error { return err } if header.Name == manifestName { + backupLogf(nil, "action=archive_restore step=skip_manifest path=%s", header.Name) continue } if !safeRel(header.Name) { @@ -428,6 +489,7 @@ func restoreArchive(serverRoot, archivePath string, paths []string) error { if err := os.MkdirAll(target, os.FileMode(header.Mode)&0o777); err != nil { return err } + backupLogf(nil, "action=archive_restore step=entry type=dir path=%s mode=%#o", header.Name, os.FileMode(header.Mode)&0o777) case tar.TypeReg: if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil { return err @@ -443,6 +505,7 @@ func restoreArchive(serverRoot, archivePath string, paths []string) error { if err := out.Close(); err != nil { return err } + backupLogf(nil, "action=archive_restore step=entry type=file path=%s bytes=%d mode=%#o", header.Name, header.Size, os.FileMode(header.Mode)&0o777) default: return fmt.Errorf("unsupported archive entry type for %s", header.Name) } diff --git a/internal/backup/backup_test.go b/internal/backup/backup_test.go index e462be5..39355e0 100644 --- a/internal/backup/backup_test.go +++ b/internal/backup/backup_test.go @@ -170,9 +170,11 @@ func setupBackupTest(t *testing.T) (*state.Config, string) { oldRunSaveOn := runSaveOn oldStopServerAndWait := stopServerAndWait oldStartServerReady := startServerReady + oldBackupLogPath := backupLogPath rootDir = t.TempDir() serverRoot := t.TempDir() + backupLogPath = filepath.Join(t.TempDir(), "backup_restore.log") serverDir = func(state.Config) string { return serverRoot } getServerPID = func() (int, bool) { return 0, false } runSaveOff = func() error { return nil } @@ -188,6 +190,7 @@ func setupBackupTest(t *testing.T) (*state.Config, string) { runSaveOn = oldRunSaveOn stopServerAndWait = oldStopServerAndWait startServerReady = oldStartServerReady + backupLogPath = oldBackupLogPath }) return &state.Config{ diff --git a/internal/backup/log.go b/internal/backup/log.go new file mode 100644 index 0000000..97e2b7d --- /dev/null +++ b/internal/backup/log.go @@ -0,0 +1,44 @@ +package backup + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "zlh-agent/internal/state" +) + +var ( + backupLogMu sync.Mutex + backupLogPath = "/opt/zlh-agent/logs/backup_restore.log" +) + +func backupLogf(cfg *state.Config, format string, args ...any) { + line := fmt.Sprintf(format, args...) + prefix := fmt.Sprintf("[%s]", time.Now().UTC().Format(time.RFC3339)) + if cfg != nil { + prefix += fmt.Sprintf(" vmid=%d type=%s game=%s variant=%s version=%s", + cfg.VMID, + strings.TrimSpace(cfg.ContainerType), + strings.TrimSpace(cfg.Game), + strings.TrimSpace(cfg.Variant), + strings.TrimSpace(cfg.Version), + ) + } + + backupLogMu.Lock() + defer backupLogMu.Unlock() + + if err := os.MkdirAll(filepath.Dir(backupLogPath), 0o755); err != nil { + return + } + f, err := os.OpenFile(backupLogPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644) + if err != nil { + return + } + defer f.Close() + _, _ = f.WriteString(prefix + " " + line + "\n") +} diff --git a/logs/agent.log b/logs/agent.log index daaec0e..0556b2c 100644 --- a/logs/agent.log +++ b/logs/agent.log @@ -452,3 +452,11 @@ 2026/04/18 13:52:39 [update] periodic checks enabled (mode=notify interval=30m0s) 2026/04/18 13:52:39 [agent] listening on :18888 2026/04/18 13:52:52 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 14:22:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 14:52:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 15:22:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 15:52:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 16:22:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 16:52:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 17:22:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host +2026/04/18 17:52:55 [update] notify check failed status=error current=0.0.0-dev target= err=Get "http://10.60.0.251:8080/agents/manifest.json": dial tcp 10.60.0.251:8080: connect: no route to host diff --git a/logs/backup_restore.log b/logs/backup_restore.log new file mode 100644 index 0000000..7543296 --- /dev/null +++ b/logs/backup_restore.log @@ -0,0 +1,272 @@ +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z archive=20260418T163917Z.tar.gz root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001 server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163917Z reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163917Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=20260418T163917Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=20260418T163917Z path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=20260418T163917Z path=world files=1 bytes=6 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163917Z max_count=10 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163917Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001 server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163917Z_001 reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163917Z_001 archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z_001.tar.gz +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=20260418T163917Z_001 archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z_001.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=20260418T163917Z_001 path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z_001 type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z_001 type=file path=world/level.dat bytes=4 total_files=1 total_bytes=4 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=20260418T163917Z_001 path=world files=1 bytes=4 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=20260418T163917Z_001 files=1 bytes=4 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163917Z_001 files=1 bytes=4 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163917Z_001 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163917Z_001 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz paths=1 files=1 bytes=4 elapsed_ms=1 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=complete target_id=20260418T163917Z checkpoint_id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=stop_server status=skipped id=20260418T163917Z reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=begin id=20260418T163917Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=file path=world/level.dat bytes=6 mode=0644 +[2026-04-18T16:39:17Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=begin id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=complete backup_id=20260418T163917Z checkpoint_id=20260418T163917Z_001 elapsed_ms=1 +[2026-04-18T16:39:17Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/001/20260418T163917Z_001.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore683458746/003 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=file path=world/level.dat bytes=4 mode=0644 +[2026-04-18T16:39:17Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z archive=20260418T163917Z.tar.gz root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/001 server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163917Z reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163917Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=20260418T163917Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/001/20260418T163917Z.tar.gz server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=20260418T163917Z path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=20260418T163917Z path=world files=1 bytes=6 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163917Z max_count=10 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163917Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/001 server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1507747087/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=begin id=20260418T163917Z_001 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=failed elapsed_ms=0 err=disable minecraft saves: save-off failed +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=failed requested_id=20260418T163917Z elapsed_ms=0 err=create pre-restore checkpoint: disable minecraft saves: save-off failed +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z archive=20260418T163917Z.tar.gz root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001 server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163917Z reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163917Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=20260418T163917Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=20260418T163917Z path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=20260418T163917Z path=world files=1 bytes=6 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163917Z files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163917Z max_count=10 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163917Z archive=20260418T163917Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163917Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001 server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/002 paths=["world"] +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163917Z_001 reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163917Z_001 archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z_001.tar.gz +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=20260418T163917Z_001 archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z_001.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=20260418T163917Z_001 path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z_001 type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=20260418T163917Z_001 type=file path=world/level.dat bytes=4 total_files=1 total_bytes=4 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=20260418T163917Z_001 path=world files=1 bytes=4 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=20260418T163917Z_001 files=1 bytes=4 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163917Z_001 files=1 bytes=4 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163917Z_001 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163917Z_001 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz paths=1 files=1 bytes=4 elapsed_ms=0 +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=complete target_id=20260418T163917Z checkpoint_id=20260418T163917Z_001 archive=20260418T163917Z_001.tar.gz +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=stop_server status=skipped id=20260418T163917Z reason=server_not_running +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=begin id=20260418T163917Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z.tar.gz +[2026-04-18T16:39:17Z] action=archive_restore status=begin archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/001/20260418T163917Z.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable1869010815/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:17Z] action=archive_restore step=entry type=file path=world/level.dat bytes=6 mode=0644 +[2026-04-18T16:39:17Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=begin id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=complete id=20260418T163917Z +[2026-04-18T16:39:17Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=complete backup_id=20260418T163917Z checkpoint_id=20260418T163917Z_001 elapsed_ms=1 +[2026-04-18T16:39:17Z] action=archive_write status=begin backup_id=safe archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1722460547/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1722460547/002 paths=["world"] +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=begin backup_id=safe path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=safe type=dir path=world +[2026-04-18T16:39:17Z] action=archive_write step=entry backup_id=safe type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:17Z] action=archive_write step=add_path status=complete backup_id=safe path=world files=1 bytes=6 +[2026-04-18T16:39:17Z] action=archive_write status=complete backup_id=safe files=1 bytes=6 +[2026-04-18T16:39:17Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1722460547/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1722460547/001 paths=["../world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z archive=20260418T163922Z.tar.gz root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001 server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163922Z reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163922Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=20260418T163922Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=20260418T163922Z path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=20260418T163922Z path=world files=1 bytes=6 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163922Z max_count=10 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163922Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001 server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163922Z_001 reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163922Z_001 archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z_001.tar.gz +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=20260418T163922Z_001 archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z_001.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=20260418T163922Z_001 path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z_001 type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z_001 type=file path=world/level.dat bytes=4 total_files=1 total_bytes=4 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=20260418T163922Z_001 path=world files=1 bytes=4 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=20260418T163922Z_001 files=1 bytes=4 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163922Z_001 files=1 bytes=4 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163922Z_001 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163922Z_001 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz paths=1 files=1 bytes=4 elapsed_ms=1 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=complete target_id=20260418T163922Z checkpoint_id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=stop_server status=skipped id=20260418T163922Z reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=begin id=20260418T163922Z archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=file path=world/level.dat bytes=6 mode=0644 +[2026-04-18T16:39:22Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=begin id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=complete backup_id=20260418T163922Z checkpoint_id=20260418T163922Z_001 elapsed_ms=1 +[2026-04-18T16:39:22Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/001/20260418T163922Z_001.tar.gz server_root=/tmp/TestRestoreCreatesCheckpointBeforeDestructiveRestore2225017108/003 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=file path=world/level.dat bytes=4 mode=0644 +[2026-04-18T16:39:22Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z archive=20260418T163922Z.tar.gz root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/001 server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163922Z reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163922Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=20260418T163922Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/001/20260418T163922Z.tar.gz server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=20260418T163922Z path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=20260418T163922Z path=world files=1 bytes=6 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163922Z max_count=10 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163922Z archive_path=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/001 server_root=/tmp/TestRestoreAbortsIfCheckpointCreationFails1479919200/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=begin id=20260418T163922Z_001 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=failed elapsed_ms=0 err=disable minecraft saves: save-off failed +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=failed requested_id=20260418T163922Z elapsed_ms=0 err=create pre-restore checkpoint: disable minecraft saves: save-off failed +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=manual reason= prune=true +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z archive=20260418T163922Z.tar.gz root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001 server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163922Z reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163922Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=20260418T163922Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=20260418T163922Z path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=20260418T163922Z path=world files=1 bytes=6 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163922Z files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=begin id=20260418T163922Z max_count=10 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=prune status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=1 files=1 bytes=6 elapsed_ms=1 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=begin requested_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=manifest status=loaded id=20260418T163922Z archive=20260418T163922Z.tar.gz paths=["world"] files=1 bytes=6 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_check status=ok id=20260418T163922Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=begin target_id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=begin requested_type=checkpoint reason=pre_restore prune=false +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=metadata id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001 server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/002 paths=["world"] +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=save_off status=skipped id=20260418T163922Z_001 reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=begin id=20260418T163922Z_001 archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z_001.tar.gz +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=20260418T163922Z_001 archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z_001.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=20260418T163922Z_001 path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z_001 type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=20260418T163922Z_001 type=file path=world/level.dat bytes=4 total_files=1 total_bytes=4 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=20260418T163922Z_001 path=world files=1 bytes=4 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=20260418T163922Z_001 files=1 bytes=4 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=archive_write status=complete id=20260418T163922Z_001 files=1 bytes=4 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=begin id=20260418T163922Z_001 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create step=manifest_sidecar status=complete id=20260418T163922Z_001 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_create status=complete id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz paths=1 files=1 bytes=4 elapsed_ms=0 +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=checkpoint status=complete target_id=20260418T163922Z checkpoint_id=20260418T163922Z_001 archive=20260418T163922Z_001.tar.gz +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=stop_server status=skipped id=20260418T163922Z reason=server_not_running +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=begin id=20260418T163922Z archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z.tar.gz +[2026-04-18T16:39:22Z] action=archive_restore status=begin archive_path=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/001/20260418T163922Z.tar.gz server_root=/tmp/TestManualBackupIsManualAndCheckpointIsListable3371450404/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_restore step=remove_existing path=world +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=dir path=world mode=0755 +[2026-04-18T16:39:22Z] action=archive_restore step=entry type=file path=world/level.dat bytes=6 mode=0644 +[2026-04-18T16:39:22Z] action=archive_restore step=skip_manifest path=backup_manifest.json +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=archive_restore status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=begin id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore step=start_server status=complete id=20260418T163922Z +[2026-04-18T16:39:22Z] vmid=5001 type=game game=minecraft variant=vanilla version=1.21.4 action=backup_restore status=complete backup_id=20260418T163922Z checkpoint_id=20260418T163922Z_001 elapsed_ms=1 +[2026-04-18T16:39:22Z] action=archive_write status=begin backup_id=safe archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting50238974/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting50238974/002 paths=["world"] +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=begin backup_id=safe path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=safe type=dir path=world +[2026-04-18T16:39:22Z] action=archive_write step=entry backup_id=safe type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:22Z] action=archive_write step=add_path status=complete backup_id=safe path=world files=1 bytes=6 +[2026-04-18T16:39:22Z] action=archive_write status=complete backup_id=safe files=1 bytes=6 +[2026-04-18T16:39:22Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting50238974/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting50238974/001 paths=["../world"] +[2026-04-18T16:39:59Z] action=archive_write status=begin backup_id=safe archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting3166759872/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting3166759872/002 paths=["world"] +[2026-04-18T16:39:59Z] action=archive_write step=add_path status=begin backup_id=safe path=world +[2026-04-18T16:39:59Z] action=archive_write step=entry backup_id=safe type=dir path=world +[2026-04-18T16:39:59Z] action=archive_write step=entry backup_id=safe type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:39:59Z] action=archive_write step=add_path status=complete backup_id=safe path=world files=1 bytes=6 +[2026-04-18T16:39:59Z] action=archive_write status=complete backup_id=safe files=1 bytes=6 +[2026-04-18T16:39:59Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting3166759872/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting3166759872/001 paths=["../world"] +[2026-04-18T16:40:02Z] action=archive_write status=begin backup_id=safe archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1871575453/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1871575453/002 paths=["world"] +[2026-04-18T16:40:02Z] action=archive_write step=add_path status=begin backup_id=safe path=world +[2026-04-18T16:40:02Z] action=archive_write step=entry backup_id=safe type=dir path=world +[2026-04-18T16:40:02Z] action=archive_write step=entry backup_id=safe type=file path=world/level.dat bytes=6 total_files=1 total_bytes=6 +[2026-04-18T16:40:02Z] action=archive_write step=add_path status=complete backup_id=safe path=world files=1 bytes=6 +[2026-04-18T16:40:02Z] action=archive_write status=complete backup_id=safe files=1 bytes=6 +[2026-04-18T16:40:02Z] action=archive_restore status=begin archive_path=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1871575453/003/safe.tar.gz server_root=/tmp/TestRestoreArchiveRejectsUnsafeManifestPathBeforeDeleting1871575453/001 paths=["../world"] diff --git a/state/update.json b/state/update.json index 8cd87a4..56634b5 100644 --- a/state/update.json +++ b/state/update.json @@ -2,5 +2,5 @@ "status": "error", "current": "0.0.0-dev", "error": "Get \"http://10.60.0.251:8080/agents/manifest.json\": dial tcp 10.60.0.251:8080: connect: no route to host", - "checked_at_utc": "2026-04-18T13:52:49Z" + "checked_at_utc": "2026-04-18T17:52:52Z" } \ No newline at end of file