c9fa2e717b
gates / gates (push) Successful in 18s
felhom-os-apply gains mode 'bundle' (signed, verified by the wrapper itself against the root-owned signers file — or, when that file is missing, only the installer's pinned key, which it then creates) and --install-bundle (the installer's root entry). BUNDLE_FILES is the one table of paths; every check (visudo, sh/bash -n, python, unit sections, RuntimeDirectory guard, nft -c, the route itself) runs before the first write; a failed write or self-check puts every previous copy back. The trust root is never a bundle path (R17). scripts/build-config-bundle.py builds it reproducibly; release-agent.sh publishes it beside the binary. The agent reports the bundle record in system.config_bundle. felhom-opsign signs agent_config_update. 43 wrapper tests (22 mutants red), Go executor tests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
26 lines
1010 B
Go
26 lines
1010 B
Go
package hub
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// R-840: the agent reports the bundle record itself — "none" when no bundle ever reached the box (so an old wrapper
|
|
// cannot hide that), "unknown" when it cannot be read, else the version and sha the root wrapper recorded.
|
|
func TestReadBundleRecord(t *testing.T) {
|
|
dir := t.TempDir()
|
|
p := filepath.Join(dir, "config-bundle.json")
|
|
if got := string(readBundleRecord(p)); got != `{"version":"none"}` {
|
|
t.Fatalf("absent: %s", got)
|
|
}
|
|
os.WriteFile(p, []byte("{broken"), 0o644)
|
|
if got := string(readBundleRecord(p)); got != `{"version":"unknown"}` {
|
|
t.Fatalf("broken: %s", got)
|
|
}
|
|
os.WriteFile(p, []byte(`{"format":1,"agent_version":"0.143.0","bundle_sha256":"abc","installed_at":"2026-10-04T20:00:00Z","authority":"signed","files":{"/x":"y"}}`), 0o644)
|
|
if got := string(readBundleRecord(p)); got != `{"authority":"signed","bundle_sha256":"abc","installed_at":"2026-10-04T20:00:00Z","version":"0.143.0"}` {
|
|
t.Fatalf("record: %s", got)
|
|
}
|
|
}
|