Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UuFPHmHNrCJj1VhY6QdDMU
6.9 KiB
REPORT — R-66: the box's own address becomes visible (controller v0.159.0, 2026-07-22)
Spec: the R-66 prompt (three XS legs, controller-only, v0.158.1 → v0.159.0).
Commit: 7013a5f on main · image felhom-controller:0.159.0
(sha256 5bbc7d62433c464fbbcdbe8ef819636b94075d0cc481631d50471880d99630c5) · deployed to
demo-felhom 9201 and demo-hp 9201 (both now above the 0.156.0 floor; floor untouched).
1. The one design decision (spec deviation, recorded)
The spec sketched Leg A's Átjáró as a /proc/net/route read and Leg B's DNS as /etc/resolv.conf.
The controller container is bridge-networked (verified live: docker inspect →
NetworkMode=bridge; the bootstrap docker run has no --network host) — so every in-process
answer describes the CONTAINER's netns: routes → the docker bridge gateway (172.x), resolv.conf →
docker's 127.0.0.11 embedded resolver, interfaces → one 172.x eth0. That is exactly the
wrong-kind-of-true trap the codebase already documents on SambaLANAddress (S-2: "the classic
wrong answer that already burned the setup wizard").
Resolution: every guest-net read goes through the ONE guest-netns door this process has — a
docker-exec into the host-networked felhom-samba container (internal/stacks/guestnet.go, one
guestNetExecFn seam for route/link/addr/resolv.conf reads). Accepted consequence, by the spec's
own S-5 logic ("an address-less row beats a wrong address"): with Megosztás off the door is closed
and the card shows „—" / the dump carries per-item error strings. The spec's §2.1 instruction
("check whether it is SMB-conditional… reuse as-is") anticipated exactly this shape.
2. What shipped
- Leg A — „Hálózat" card on Beállítások → Rendszer, between „Verzió és frissítés" and „Szerver
memória" (
settings_system.html,systemPageData): Helyi cím (LAN) via the reusedsambaLANAddress; Hálózati név\\<SMBServerName>gated onsmb.Enabled(the NetBIOS name exists only while samba runs); Átjáró via the newguestGateway; muted footer („…Távoli hibaelhárításnál ezt az oldalt kérjük felolvasni."). No host/Proxmox address, no interface dump. - Leg B —
dump["network"]indebugDump:interfaces(name/up/addresses; veth*/docker*/br-* plumbing skipped),default_route(gateway + source interface),dns_servers(guest resolv.conf — docker copies the HOST's file into anetwork_mode: hostcontainer, so the read answers for the box),lan_address(the SAME live value Leg A shows, the cross-check anchor). Best-effort per item: a failed read yields"error: …"in place, dump never aborts. - Leg C — helper text under the Szerver field (
storage_network.html, naming the »közvetlen cím« row on the Megosztás page), plusnetAddMessage'sunreachablecase appends „Tipp: a(z) »« Windows-hálózati névnek tűnik — használja az eszköz IP-címét." whenlooksLikeFlatNetworkName(server)(non-empty ∧ no dot ∧ notnet.ParseIP-able). Purely lexical; no NetBIOS/mDNS anywhere; agent untouched. - Nothing is stored: no settings.json/app.yaml/hub-report field carries any of these values.
3. Tests + red-proofs
stacks/guestnet_test.go: pinned pure parsers (default route incl. garbage/IPv6-gw refusals;
interface merge with docker-plumbing filtering; resolv.conf), GuestGateway fail-quiet contract,
and the B1 best-effort matrix (scripted per-argv exec fake: healthy / resolv.conf-only failure /
door fully closed). web/network_card_test.go: A1 (all rows render), A2 (Hálózati név ABSENT when
sharing off), A3 („—" + „nem állapítható meg", no crash), per-render freshness counter (2 renders ⇒
2 resolves — the anti-memoization gate), B1 web-half (dump shape + in-place error + dump
completeness), C1/C2/C3 + category containment + IPv6/empty lexical edges.
Red-proof A2 (enabled-gate dropped in systemPageData): FAIL —
Hálózati név row rendered while Megosztás is disabled — a wrong promise. Restored, green.
Red-proof C2 (lexical check inverted): FAIL — the hint visibly nagged the IP user:
hint wrongly present for an IP: "… Tipp: a(z) »192.168.0.50« Windows-hálózati névnek tűnik …"
(C1/C3 + edge assertions also went red). Restored, green.
Full green gate: go build ./... && go vet ./... && go test ./... — clean. All six template gates
(template_id / emoji / native_confirm / offbox_rename / app_row_dedup / mojibake) — OK.
4. Live validation (endpoint-level — the exact endpoints the UI invokes; no browser on DooPlex)
demo-felhom 9201 (sharing ON — the open-door path). Deploy via the bootstrap flow; docker ps
→ 0.159.0 Up (healthy); startup log clean (controller_started (0.159.0), hub report pushed).
Authed session against container-IP:8080 + Host header (credentials sourced, never echoed):
GET /settings— the card renders with real live values:192.168.0.104(the guest's actual DHCP lease), gateway192.168.0.1,\\FELHOM, footer present. ASCII-safe greps per the accent-mangling trap.GET /api/debug/dump→network= all four sub-keys:lan_address 192.168.0.104·default_route {gateway 192.168.0.1, interface eth0}·dns_servers [192.168.0.1]·interfaces [lo up 127.0.0.1/8, eth0 up 192.168.0.104/24]— docker plumbing correctly absent.GET /storage/network— the Szerver helper text present.
demo-hp 9201 (sharing OFF — the closed-door path, live). Access via the hub-vaulted G1
break-glass (file→file, env-var use, credential + hub-DB copy shredded after; demo-hp remains
key-less). 0.156.0 → 0.159.0, docker ps → healthy. Same authed method (customer domain
felhom.enkisfelhom.hu — direct container-IP probing 404s without the right Host, worth knowing):
the card renders with „—" rows (×2 „nem állapítható meg"), no \\FELHOM row — Leg A's A2/A3
behaviors observed in production; the dump's network section carries all four keys with in-place
error: docker exec … strings for interfaces/route/dns and an empty lan_address. The dump
stayed complete.
Screenshots by description (rendering is the only untested residual): the card sits between the
version card and the RAM card; three settings-row lines — „Helyi cím (LAN)" with a mono address
(or „— nem állapítható meg" muted in --text-3), „Hálózati név" with mono \\FELHOM (only while
sharing is on), „Átjáró" with the mono gateway — and a muted one-line footer under the grid. On
demo-hp the same card shows two dash-rows and no name row.
5. Follow-ups
- R-64 (Felhom↔Felhom pairing blessed — evidence drill pending) and R-65 (buddy-box
replication, post-alpha spike-first) minted in
felhom.euROADMAP; R-66 marked SHIPPED there. documentation/controller/network-storage-nas.mdgained the NetBIOS naming-caveat paragraph.- Operator note: a strict end-to-end UI pass of the card is a manual click-through (no browser on DooPlex).