v0.6.0: slice 6 Phase B — PBS offsite tier (verify + PBS-API client + reporting)
Spike-proven that backup/restore-to-PBS reuse Phase A unchanged; the only new code is the verify capability, a small PBS-API client, and PBSSnapshot reporting. - internal/pbs: fingerprint-pinned, token-authed PBS-API client (Verify/Snapshots/ TaskStatus, node-from-UPID; secret read from /etc/pve/priv/storage/<id>.pw at runtime, never logged) + the verify maintenance loop (own cadence, default 6h, NOT gated/journaled, like the watchdog) + SnapshotStore. - hub: PBSSnapshot filled (namespace/type/id/time/size/owner/protected/encrypted/ verify_state/verify_upid); PBSReporter collector seam; cross-repo golden + bidirectional key-set tests; hub handler parses pbs_snapshots + logs a failed-verify WARN. - backup: report the ACTUAL vzdump mode (parsed from the task log; PVE may downgrade snapshot->stop). proxmox.Storage.Username. config PBSVerifyCadence/secret-dir. --selftest=pbs-verify. Backup/restore-to-PBS unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+26
-8
@@ -172,15 +172,15 @@ const (
|
||||
// (the bulk-backup mechanism is slice 10). Cross-repo contract: keep byte-identical with
|
||||
// felhom.eu/hub and the bidirectional golden key-set test.
|
||||
type Backup struct {
|
||||
TargetID string `json:"target_id"` // backup storage name (e.g. "local")
|
||||
VMID int `json:"vmid"` // source guest
|
||||
Archive string `json:"archive"` // produced vzdump volid
|
||||
Mode string `json:"mode"` // snapshot | stop
|
||||
CrashConsistent bool `json:"crash_consistent"` // always true this slice
|
||||
TargetID string `json:"target_id"` // backup storage name (e.g. "local")
|
||||
VMID int `json:"vmid"` // source guest
|
||||
Archive string `json:"archive"` // produced vzdump volid
|
||||
Mode string `json:"mode"` // snapshot | stop
|
||||
CrashConsistent bool `json:"crash_consistent"` // always true this slice
|
||||
SizeBytes int64 `json:"size_bytes"`
|
||||
Success bool `json:"success"`
|
||||
Error string `json:"error,omitempty"`
|
||||
StartedAt string `json:"started_at"` // RFC3339
|
||||
StartedAt string `json:"started_at"` // RFC3339
|
||||
DurationSeconds float64 `json:"duration_seconds"`
|
||||
UncoveredVolumes []string `json:"uncovered_volumes"` // backup=0/unset mountpoints (bulk gap)
|
||||
}
|
||||
@@ -198,8 +198,26 @@ type RestoreTest struct {
|
||||
DurationSeconds float64 `json:"duration_seconds"`
|
||||
}
|
||||
|
||||
type PBSSnapshot struct{} // slice 6 Phase B: PBS snapshot inventory fields TBD
|
||||
type AuditEntry struct{} // audit-log tail entry fields TBD
|
||||
// PBSSnapshot is one PBS (offsite) snapshot's inventory + integrity state (doc 03 §8, slice
|
||||
// 6 Phase B). Sourced from the PBS API (internal/pbs). `verify_state` is the load-bearing
|
||||
// field — "none" until a verify runs, then "ok"/"failed" (a failed verify is the loudest
|
||||
// offsite-DR signal). `encrypted` is derived from the snapshot's data crypt-mode
|
||||
// (zero-knowledge: the PBS server can't read it). Cross-repo contract — byte-identical golden
|
||||
// + bidirectional key-set test, the slice-5/6 pattern.
|
||||
type PBSSnapshot struct {
|
||||
Namespace string `json:"namespace"` // "root" = default ns
|
||||
BackupType string `json:"backup_type"` // ct | vm
|
||||
BackupID string `json:"backup_id"`
|
||||
BackupTime string `json:"backup_time"` // RFC3339
|
||||
SizeBytes int64 `json:"size_bytes"`
|
||||
Owner string `json:"owner"`
|
||||
Protected bool `json:"protected"`
|
||||
Encrypted bool `json:"encrypted"`
|
||||
VerifyState string `json:"verify_state"` // ok | failed | none
|
||||
VerifyUPID string `json:"verify_upid,omitempty"`
|
||||
}
|
||||
|
||||
type AuditEntry struct{} // audit-log tail entry fields TBD
|
||||
|
||||
// ControlEnvelope is the hub's 200 response to a host-report. This slice the agent
|
||||
// adopts ONLY PollIntervalSeconds; the rest are reserved/forward-compat fields it
|
||||
|
||||
Reference in New Issue
Block a user