Repository navigation
docs(adr): name the switch and leave its UI on plain HTTP (#97) - #259
Merged
Merged
Conversation
#97 asks for two things about the MokerLink management UI — a name instead of 10.7.7.2, and a certificate that verifies. They are separable, and only one of them is achievable. Checked against the live switch from prometheus on 2026-09-04: TCP 80 open, no listener on 443, and `GET /` returns a Realtek-SDK frameset over login.cgi titled G2402GSM. There is no TLS listener to point a certificate at and no import to put one in. The certificate half is blocked on the device, not on the name, so ADR-0017 closes it as unavailable rather than leaving it open as pending work. That is the third firmware limit on `neo` after the undeletable SNMP community row (#84) and the missing SNMPv3 (#85), and three is the argument for replacing the switch rather than for another workaround. The name is a plain host override, `neo` -> 10.7.7.2. It was never blocked behind ADR-0008 either: ADR-0010 keeps the overrides on Unbound whatever AdGuard does. A TLS reverse proxy was considered and rejected — it would put the device you open when the network is wrong behind the resolver and another host, reached through the switch being diagnosed. Two claims the docs carried turned out to be false and are corrected rather than left: 10.7.7.2 is documented (network.md has a LAN section for it), it is only outside the 10.0.x convention; and the certificate was never the "harder half". Also: - blackbox: give switch-ui a `via: dns` twin, and record that http_2xx_plain is permanent here rather than a placeholder. - blackbox tests: switch-ui was the worked example for "an endpoint with no dns twin" and now has one. The synthetic series would still pass, which is exactly why it is a bad example — swapped for ups-ui. - security.md: record the cleartext admin credential as an accepted residual. It crosses the wire through `neo` itself, which is the device the password protects. The override itself is applied by hand on pfSense — runbook procedure, config backup first — and must land before this merges, or EndpointNameNotResolving will fire truthfully. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
The host-override verification runbook text incorrectly implies five distinct IP addresses despite intentional duplicates, which can mislead operators during validation.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR documents and operationalizes the decision to give the MokerLink switch management UI a stable DNS name (neo.matrix.elysium) while explicitly accepting that the UI remains plain HTTP due to firmware limitations (no TLS listener / no cert import), and updates monitoring + runbooks accordingly.
Changes:
- Adds ADR-0017 capturing the HTTP-only constraint and rejecting TLS reverse-proxy/renumbering alternatives.
- Updates docs/runbooks/network/security/roadmap to reflect the new
neohostname and the accepted cleartext-admin residual risk. - Updates Prometheus blackbox targets to probe the switch UI via both address and DNS, and adjusts rule tests to use a better “no dns twin” example.
File summaries
| File | Description |
|---|---|
| docs/adr/0017-name-the-switch-and-leave-its-ui-on-plain-http.md | New ADR documenting the decision, device constraints, and rejected alternatives. |
| docs/network.md | Documents neo.matrix.elysium → 10.7.7.2 and states UI remains HTTP-only. |
| docs/roadmap.md | Updates #97 roadmap entry to match ADR-0017’s split decision and sequencing. |
| docs/runbooks/add-a-host-override.md | Adds neo to pfSense host overrides procedure and expands verification guidance. |
| docs/security.md | Records the HTTP-only UI as an accepted residual risk and ties it to ADR-0017. |
| stacks/observability/prometheus/targets/blackbox.yaml | Adds a via: dns blackbox target for switch-ui and clarifies module permanence. |
| stacks/observability/prometheus/tests/blackbox.test.yaml | Replaces the “no dns twin” worked example from switch-ui to ups-ui. |
Review details
- Files reviewed: 7/7 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
The verify step said "Five addresses", which implies five distinct ones. Two pairs deliberately share: oracle/lemmiwinks on 10.0.99.30 and grafana/prometheus on 10.0.99.20, each being two names for one machine. An operator counting distinct answers would find three and go looking for a mistake that is not there. Five answers, three addresses, and the duplicates named so they read as expected rather than as a copy-paste error. Raised in review of #259. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #97.
#97 asks for two things about the MokerLink management UI: a name instead of
10.7.7.2, and a certificate that verifies. They read as one task — give it a name so the lab CA has something to issue for — and they are not. ADR-0017 grants one half and closes the other as unavailable.The check that decided it
From
prometheus(10.0.99.20), against the live switch, 2026-09-04:GET /200, a two-frame frameset overcookie.cgiandlogin.cgi<title>G2402GSMServer:/Date:A Realtek-SDK web UI. No TLS listener to point a certificate at, and no import to put one in.
targets/blackbox.yamlalready claimed "http only — 443 is dropped"; this is that re-checked rather than inherited.So the certificate half is blocked on the device, not on the name. The issue's framing — that a switch reached by IP "cannot be given a certificate that verifies, so it stays on plain HTTP" — has the dependency backwards here. It stays on plain HTTP because that is all it serves, and it would stay there with a name.
That is
neo's third firmware limit after the undeletable SNMP community row (#84) and the missing SNMPv3 (#85). Three is the argument for replacing the switch rather than for another workaround, so ADR-0017 puts TLS management into the selection criteria for whatever replaces it.Two things the issue left open
matrix.elysiumhost overrides stay where they are." Overrides were never downstream of AdGuard.10.7.7.2is not undocumented. The runbook called it "outside every documented subnet, which is the harder half."network.mdhas a LAN section for it. What is true is narrower — it is outside the10.0.xconvention every other management address follows, which is the typo risk the issue names and not a routing problem. Both halves of that sentence are corrected in place rather than left.Rejected
A TLS reverse proxy terminating
https://neo.matrix.elysiumwas considered. It puts the device you open when the network is wrong behind Unbound onmorpheusand a container on another host — reached through the switch being diagnosed. The credential would still cross the last hop in clear.Renumbering onto
10.0.99.xis rejected too, not deferred: it means re-addressing the firewall's LAN interface, the SNMP and blackbox targets that hard-code the address, and two ADR-0013 rules, to make one address prettier on the box that locks everything out if it goes wrong.Changes
add-a-host-override.md—neoadded to the table; the stale "these four were applied" note and the four-name verify block corrected; the closing paragraph rewritten.network.md— the name, and that the UI is plain HTTP and cannot be otherwise.security.md— the cleartext admin credential as an accepted residual. Worth being precise about: it crosses the wire throughneoitself, the device the password protects, and unlike the SNMP communities beside it, this one is read-write.blackbox.yaml— avia: dnstwin forswitch-ui, and a note thathttp_2xx_plainis permanent here rather than a placeholder awaiting a certificate.blackbox.test.yaml—switch-uiwas the worked example for "an endpoint with no dns twin" and now has one. The synthetic series would still pass, which is precisely why it is a bad example; swapped forups-ui.Before merging
The host override must be applied by hand first — pfSense UI, config backup first, per the runbook.
neo.matrix.elysiumis NXDOMAIN as of this writing. If the blackbox target lands first,EndpointNameNotResolvingfires, truthfully, for planned work. The wiki was sequenced the same way.Verification
./scripts/validate.shpasses in full (2 skips, both "not the deployment checkout").promtool check rules+test rulesrun green across all 7 test files.🤖 Generated with Claude Code