The web front keeps what it serves, its certificates and what it refuses on the bus, with tools to read them (issue 774) #485

Merged
mesh-tools merged 2 commits from feat/route-proxy-tools into main 2026-10-30 22:11:52 +00:00
Member

The web front (route-proxy) had no mesh tools, so "does grafana.novox.be work" needed curl from a machine (the operator, 2026-10-30: "isn't their status known on the bus?"). It now keeps, on change and never on a timer, the states routes (each served name: its targets, its certificate with expiry and renewal, the last upstream answer) and unrouted (names refused as "no route", only under served domains, at most 5 new a minute, other refusals counted in ._other; no visitor address), and route-provider serves route_proxy_routes, route_proxy_route and route_proxy_unrouted, each one call. A refused write to unrouted is dropped, never retried. route-proxy lives in mesh-controller's repository until the controller's removal moves it. Issue 774.

Reviewed-by: rev-sweep@shanks at b7c3868980
The lead merges once mesh/check is green.

The web front (route-proxy) had no mesh tools, so "does grafana.novox.be work" needed curl from a machine (the operator, 2026-10-30: "isn't their status known on the bus?"). It now keeps, on change and never on a timer, the states routes (each served name: its targets, its certificate with expiry and renewal, the last upstream answer) and unrouted (names refused as "no route", only under served domains, at most 5 new a minute, other refusals counted in <node>._other; no visitor address), and route-provider serves route_proxy_routes, route_proxy_route and route_proxy_unrouted, each one call. A refused write to unrouted is dropped, never retried. route-proxy lives in mesh-controller's repository until the controller's removal moves it. Issue 774. Reviewed-by: rev-sweep@shanks at b7c3868980f391b6f76eefd830948058b8cb496b The lead merges once mesh/check is green.
mesh-tools added 2 commits 2026-10-30 22:04:01 +00:00
The web front kept nothing on the bus: whether grafana or drive was routed, where to, with which
certificate, and what it last answered could only be learned with curl or the container's log.

The proxy now keeps `routes` and `unrouted` (announced readable, keyed <node>.<name>), written on
change by one writer: route set changes, certificates stored by autocert's cache or failing at a
handshake, upstream answers that differ from the last written (or are a minute old), and names
refused in a request or a handshake. The provider helper's bundle serves route_proxy_routes,
route_proxy_route and route_proxy_unrouted from those states.

Quick: log the routes at start and grep the journal. Thorough: the state on the bus and the tools
that read it, mesh-wide, in one call. Chose thorough: the operator's question is mesh-wide and
recurs, and the log says nothing about certificates or answers.

Tests: two table tests added (the ledger, the tools), both failing without the change; four
authority tests and four skipped-route tests merged into two, so the module has four fewer.
Keep a scan out of route-proxy's unrouted state: only names under a served domain, a few a minute, no visitor address (issue 774)
mesh/delivery merged: source.main moved to novox/mesh-controller@159db37618c2
mesh/check being carried to b7c3868980f3 on 159db37618c2 | from a4426190b0c7
b7c3868980
Review of ddae6729: a scanner's random Host or SNI names each became a key, bounded only by the
bucket's lifetime and size, and every failed write was retried at each change and logged each time.

A refused name is now kept by name only under the registrable domain of a name the proxy serves, and
at most five new names a minute; every other refusal is counted in memory and written once a minute
under <node>._other (last minute, since start), which route_proxy_unrouted shows. A refused write of
that state is dropped and logged once until a write succeeds; trimming memory to 4096 names moved
from the request to the writer. The visitor's address is no longer kept: the journal has it.

Quick: drop unrouted keys from strangers by a fixed allow-list. Thorough: bound by the proxy's own
domains, by rate, and by never retrying. Chose thorough: the scan is constant on a public machine.
Author
Member

Delivery novox/mesh-controller@b7c3868980f3 — merged since 2026-10-30T22:11:55Z

Source — source.main moved to novox/mesh-controller@159db37618. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Transitions

  • 2026-10-30 22:04 (new) → proposed (announced): novox/mesh-controller#485's head announced
  • 2026-10-30 22:04 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
  • 2026-10-30 22:11 ready → merged (merged): on the trunk its modules follow: merged there

The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/mesh-controller@b7c3868980f3` — **merged** since 2026-10-30T22:11:55Z **Source** — source.main moved to novox/mesh-controller@159db37618c2. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Transitions** - 2026-10-30 22:04 (new) → proposed (announced): novox/mesh-controller#485's head announced - 2026-10-30 22:04 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false) - 2026-10-30 22:11 ready → merged (merged): on the trunk its modules follow: merged there The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
mesh-tools merged commit 159db37618 into main 2026-10-30 22:11:52 +00:00
mesh-tools deleted branch feat/route-proxy-tools 2026-10-30 22:11:52 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-controller#485