Files
felhom.eu/REPORT.md
T
admin c918baa656 hub v0.42.0: remote "Debug mód" toggle on the customer config editor
Adds a form-level debug-mode checkbox to the customer config editor so an
operator can flip the controller's Logging.Level=debug (/debug menu + verbose
log) remotely, without SSH. Form field (not raw-JSON injection) because
handleConfigUpdate rebuilds ConfigJSON from the form on every save; the
config-version bump makes the controller re-pull + self-restart next cycle.

- buildConfigJSON: debug_mode checked -> "logging":{"level":"debug"};
  unchecked -> logging key omitted.
- config_form.html: "Hibakeresési mód (fejlesztői)" section + render state.
- configs_debug_test.go: form->JSON both ways; full-path survival test
  (debug lands, offsite descriptor unchanged, foreign-key red-proof); render
  state; red-proof exercised.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
2026-07-10 15:14:43 +02:00

3.3 KiB

felhom.eu — task reports

Overwrite this file with a summary of the most recent task only (uniform with the other repos; not cumulative). The cumulative hub history lives in hub/CHANGELOG.md; the scripts history lives in scripts/CHANGELOG.md.

TASK — hub v0.42.0: remote "Debug mód" toggle on the customer config editor — 2026-07-10

Scope: hub only (felhom.eu/hub). Agent/controller unchanged — the controller already honours Logging.Level=="debug" (isDebug()/debug menu + verbose log). Version 0.41.0 → 0.42.0.

Goal

Let an operator enable the controller's debug mode remotely, without SSH, from the hub's customer config editor — the support workflow (today: Peti's box). Enabling on any specific customer is a Viktor decision/click; this task does not turn it on for anyone.

Why a form field, not raw-JSON injection

handleConfigUpdate rebuilds ConfigJSON from the form on every save (configs.gobuildConfigJSON), so a foreign key poked straight into the stored JSON is dropped on the next save. The toggle is therefore a first-class form field, which by construction survives every save. The offsite descriptor survives independently, via the post-save provision-merge — untouched by this change.

Changes

  • internal/web/configs.gobuildConfigJSON: debug_mode checked → "logging":{"level":"debug"}; unchecked → the logging key is omitted entirely (controller.yaml default stands; no needless "info").
  • internal/web/templates/config_form.html — new collapsible "Hibakeresési mód (fejlesztői)" section with the debug_mode checkbox + a Hungarian hint (restart-next-cycle + the /debug URL + "turn it off after"). Render state parsed from ConfigJSON. No emoji, no BOM (consistent with the hub templates).
  • internal/web/configs_debug_test.go — new tests (below).
  • Untouched, as required: configgen, the offsite provision-merge, the controller. No generic raw-JSON editor.

Tests (non-hollow) — all green

  • TestBuildConfigJSON_DebugMode — checked emits logging.level=debug; unchecked omits the logging key.
  • TestConfigUpdate_DebugSurvivesRebuild_OffsiteUntouched — full path through handleConfigUpdate: (a) the debug key lands, (b) the offsite descriptor (host/user/repo_path/host_fingerprint/quota_gb) is unchanged across save + idempotent re-provision, and the red-proof that a hand-injected foreign key (foo) is gone after one save — the concrete proof of why the switch had to be a form field.
  • TestConfigForm_DebugRenderState — debug-on ConfigJSON renders the checkbox checked; plain renders it unchecked.
  • Red-proof exercised: with the logging block removed from buildConfigJSON, the survival + form tests fail.

Green gate: go build ./... && go vet ./... && go test ./... — all pass.

Deploy + live check (operator-free)

GitOps: build 0.42.0 on 180 → bump manifests/hub.yaml tag → ArgoCD sync → Synced/Healthy. Live proof on the demo customer (not Peti): edit → tick debug → save → the demo controller restarts next cycle → /debug serves → untick → save → /debug 404 again. See the hub CHANGELOG top entry + session notes for the live-validation outcome. Peti-box use (enabling on his config) is Viktor's click — not part of this task.