121 lines
10 KiB
Markdown
121 lines
10 KiB
Markdown
# REPORT — second day brief, 2026-10-19 (ep0 one copy per week; the passphrase measured; hub 0.160.0; controller 0.333.0; gofmt gates)
|
|
|
|
## In plain words
|
|
|
|
- **ep0 keeps one whole-box copy per week, for 2 weeks** (your „yes"). Before the change, PBS's own dry run showed it
|
|
removes nothing today. The first real run is 2026-10-20 03:30 UTC; CC reads it then (row R-1162 stays open until then).
|
|
- **The household passphrase:** alone it gets the box's keys, and with them every off-site key action. Two options are
|
|
in STATUS (D19). CC picks A: the passphrase gives keys only while the customer has no box record.
|
|
- **Controller 0.333.0 is the floor for every box** (12:16 local): a dashboard sign-out now also ends the file manager's
|
|
own 2-hour pass; the recovery-code page says the code becomes live after the two words.
|
|
- **Hub 0.160.0 is live** (your „yes"): a reinstall within 45 minutes mails you too; a repeated refused backup is counted
|
|
and the alarm repeats at most once a day; the old off-site re-issue on a reinstall is kept, with true words.
|
|
- **gofmt:** the hub and the agent are formatted, and both now have the controller's gate.
|
|
- **New for you:** another device keeps taking demo-hp's network address (R-1166) — fix it in the router.
|
|
|
|
## 1. ep0 (R-1162; `07` Plane-2 row and §6.1)
|
|
|
|
- **Before** (`audits/day-2026-10-19b/P1/ep0-settings-before.txt`): `prune-demo-hp` and `prune-demo-felhom` —
|
|
`keep-last 2`, 03:30, ns-scoped, `max-depth 0`; `prune-operator-hubdb` — keep-daily 14 + keep-weekly 8, 03:45.
|
|
`tester-1` (3 copies) and `Tester-2` (1) have **no job**. ep0's clock is UTC.
|
|
- **DooPlex's copy of ep0:** `prune-ep0-copy`, `keep-weekly 8`, 07:30 (decision 71) — already by time; not changed.
|
|
- **Dry run** (PBS's own: `proxmox-backup-debug api create /admin/datastore/felhom-offsite/prune --dry-run true …`, no
|
|
task created; cross-checked with an offline model of PBS's selection, `P1/prune_sim.py`; 8 snapshots before and after):
|
|
|
|
| Box | Snapshots | keep-last 2 removes | keep-weekly 2 keeps | keep-weekly 2 removes |
|
|
|---|---|---|---|---|
|
|
| demo-hp | 2 | none | 2026-10-08, 2026-10-15 | none |
|
|
| demo-felhom | 2 | none | 2026-10-06, 2026-10-13 | none |
|
|
| tester-1 (no job) | 3 | (2026-10-04) | 2026-10-11, 2026-10-18 | (2026-10-04) |
|
|
| Tester-2 (no job) | 1 | none | 2026-10-04 | none |
|
|
|
|
- **Answer:** „Yes, the two rules" (not the tester-1 job). **After** (07:49 UTC, `P1/ep0-settings-after.txt`): both jobs
|
|
`keep-weekly 2`, schedule 03:30 unchanged, nothing run by hand. Check for 2026-10-20: the 03:30 `prunejob` tasks OK with
|
|
`keep-weekly 2` and two snapshots per namespace (the next step of R-1162).
|
|
|
|
## 2. The household passphrase (R-1159)
|
|
|
|
Measured with the hub's real router (`P2/passphrase-reach.txt`; a made-up customer, a fake off-site service). A live
|
|
measurement on Tester4 was not possible: CC holds no Tester4 passphrase, and reading it from the hub database was
|
|
refused by CC's own safety check (correctly).
|
|
|
|
- Passphrase → `GET /config/{id}` 200 with `hub.api_key` (wrong passphrase 401); `POST /host-enroll` 200 with the
|
|
EXISTING host's key.
|
|
- Controller key → `register-key`, `confirm-key` (removes every other line, the box's own key included), `move-aside`,
|
|
`window-open`, `abandon-request` (the hub deletes a set-aside copy after 7 days unless cancelled), `abandon-cancel`,
|
|
`abandon-status`: all past auth (wrong key 401 each).
|
|
- Host key → escrow GET/PUT, recovery-credential PUT, wg, desired-state, jobs, host-report: all past auth.
|
|
- The passphrase is used only at install time (the installer, the controller's setup wizard).
|
|
- **Option A (CC's pick):** keys only while the customer has no host record (`/config` leaves out the key, `/host-enroll`
|
|
refuses once a host exists). Closes the chain at its source; a reinstall needs the operator's delete first — already the
|
|
rule since R-1154. **Option B:** a second factor on the destructive off-site routes. Every reinstall waits for the
|
|
operator, and the host key stays reachable by the passphrase, so B alone does not close it. No change in this task.
|
|
|
|
## 3. Controller 0.333.0 — R-1155, R-1161, the Install chip
|
|
|
|
- **R-1155:** first measured on demo-hp (0.332.0): the household's FileBrowser token opened FileBrowser after the
|
|
dashboard sign-out (200, cookie and Bearer). Fix: the forwardAuth answer refuses a request with no valid files cookie
|
|
that carries a non-admin FileBrowser token, everywhere FileBrowser reads one (cookie, `?auth=`, Bearer, Basic
|
|
password). **The commit's security review found Basic missing** in the first version (`c809dd3`); fixed in `a6fa3c0`
|
|
before any release. Red-proofs: without the check → 200 after the sign-out; without the Basic branch → 200; with every
|
|
token refused → admin's own token 302. Live (rc.2 demo-hp, 0.333.0 Tester 1): files cookie 200; token alone 401 in all
|
|
four forms, before and after the sign-out; FileBrowser's sign-in page 200.
|
|
- **R-1161:** new key `backups_escrow.ez_a_kod_az_ellenorzes` (hu + en); the old sentence only when the claim answer says
|
|
no confirm. Fixtures re-captured: `escrow_first`, `escrow_receremony` (reason: R-1151 made the old sentence untrue);
|
|
all others byte-identical. Live on demo-hp (`P6/06-escrow-page-text.txt`): new text shown, old hidden, switch present,
|
|
negative control 0.
|
|
- **The Chrome „Install" chip: NOT-A-FINDING.** FileBrowser 1.5.6 links `/public/static/site.webmanifest` on every page;
|
|
its only PWA setting is `disablePWAInstall` (already set). Not patched (`P3/install-chip.txt`).
|
|
|
|
## 4. Hub 0.160.0
|
|
|
|
- **R-1156:** a live re-enroll is a warning mailed to the operator, same instruction; a `--resume` mails too and says it
|
|
needs nothing. **R-1157:** further refusals in one episode counted (`refusals_in_episode`), alarm at most once a day,
|
|
total on the cleared record. **R-1158:** the reinstall's off-site re-issue changes nothing a box uses (only the hub's
|
|
own registrar reads that password; no box has received it since v0.127.0); kept because it repairs a broken stored
|
|
login; comments and the `offsite_reissued` text corrected (`05` §8). Each red-proved.
|
|
- **Answer:** „Yes, deploy now". Image `0.160.0` digest `sha256:e9a360bc00d00a15014e272c4d023fef118a8b043956f3fc928dd26c00b34230`
|
|
(clean clone at `a17db0c3`; the first push hit a DNS timeout, the retry pushed it). Manifest `5d3cb5c1`; only
|
|
Deployment/hub was OutOfSync and only it was synced; Synced/Healthy; running image digest = built digest; 0 `[ERROR]`
|
|
lines; floor read back from hub.db + WAL (0.332.0 then, 0.333.0 now); host and controller reports from demo-hp, Tester 1
|
|
and demo-felhom after the restart.
|
|
|
|
## 5. gofmt (R-1160)
|
|
|
|
Hub `d5e3c8b0` (22 files) and agent `1edfd8e` (14 files), formatting only, tests green before each. Gates: `hub-gofmt`
|
|
(`scripts/hub_gofmt_gate.py`, `repo_gates.py`) and `gofmt` (felhom-agent `scripts/gofmt_gate.py`, `agent_gates.py`), fast
|
|
set, decoys on scratch trees, red-proved. No agent release.
|
|
|
|
## 6. Controller release (decision 250)
|
|
|
|
Per-box floors 0.333.0 at 09:59:38 UTC → all three on 0.333.0 within about a minute (demo-hp from rc.2 at 10:13). Box
|
|
walk (`P6/`): 0 unhealthy, 0 allow-list refusals, catalog in sync; https-only 28 OK, 0 failures; „Fájlok ↗" with no second
|
|
login on demo-hp and Tester 1, sign-out asks again. **Global floor 0.333.0 / MinAgent 0.158.1 at 10:16:22 UTC**
|
|
(303 `floor_set`, read back with the WAL); per-box floors cleared.
|
|
|
|
## 7. Versions, commits, fixtures, rows
|
|
|
|
- **Controller 0.333.0** (`c809dd3`, `a6fa3c0`, REPORT `e1a2abf`), image digest
|
|
`sha256:f150a8d8cd329f5cde9e34249e34edc59b6b5db29db1e3200900f3869a0de11b`; rc.1/rc.2 on demo-hp only. Fixtures:
|
|
`escrow_first`, `escrow_receremony`.
|
|
- **Hub 0.160.0** (`d5e3c8b0`, `503c93fa`, `a17db0c3`, manifest `5d3cb5c1`).
|
|
- **Agent:** no release (`1edfd8e`, `0cbd500`). 0.160.0 stays the vouched one.
|
|
- **Rows: 167 before, 163 after; closed 6** (R-1155, R-1156, R-1157, R-1158, R-1160, R-1161), **opened 2** (R-1165,
|
|
R-1166); R-1159 → READY (D19), R-1162 → NARROWED (one run to read).
|
|
- **System poster:** text only — `felhom-system-poster.facts.md` and the matching text in `felhom-system-poster.html`
|
|
(„last 2" → „one per week, 2 weeks").
|
|
- **Teardown:** machine — rc images only on demo-hp 9201, now on the release; no test app. Host — none. Hub — no test
|
|
customer; the per-box floors cleared. ep0 — the two prune jobs changed on the operator's yes, nothing else.
|
|
|
|
## Observations
|
|
|
|
1. Two household namespaces on ep0 have no prune job; nothing creates one for a new household. FILED: R-1165.
|
|
2. Another device takes demo-hp's address 192.168.0.104 every few minutes; demo-hp also lost its link to ep0 for 8 minutes. FILED: R-1166.
|
|
3. A config download with the passphrase is a log line only, and the host key it yields can rewrite the box's escrow and recovery credential. FILED: R-1159.
|
|
4. The first R-1155 version missed FileBrowser's Basic-auth token source (the commit's security review). NOT-A-FINDING: fixed before any release in `a6fa3c0` and red-proved (the size rule).
|
|
5. Chrome offers „Install" for the file manager. NOT-A-FINDING: FileBrowser 1.5.6 has no setting that stops its manifest; the brief forbids patching it.
|
|
6. One of CC's probe scripts on DooPlex passed the household's FileBrowser token to curl on its command line (visible to local processes for about a second; never printed or saved). NOT-A-FINDING: CC's own tooling on DooPlex, not the product; every probe now passes tokens through 0600 header files, and the token expired two hours later.
|
|
7. Two copies of CC's hub-database snapshot ran into one folder at once and one read failed („malformed"). NOT-A-FINDING: CC's helper, a local copy only; the live hub and its database were untouched, and the next read was clean.
|
|
8. The first hub image push failed on a DNS timeout at DooPlex. NOT-A-FINDING: a short DNS outage (the website session saw it too); the build's own check found the tag absent and the retry pushed it.
|
|
9. FileBrowser's `admin` password login was not walked live. NOT-A-FINDING: CC holds no FileBrowser admin password; admin's token passing is unit-pinned and the sign-in page answers 200 live.
|