aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/dashboard
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-07 22:35:22 +0100
committertv <tv@krebsco.de>2026-11-07 22:35:22 +0100
commitd322e7d4aa41d94232113cb7680cec1d65a11b0c (patch)
tree874e03dbf7acebc51a144498c89c43b335641bf7 /src/api/dashboard
parenta99bacc0c90ca7a7f879cec8a8fb33f4aa14e84f (diff)
access: members refused as a whole
With signatures required, a member whose own change broke a rule is refused as a whole: sent nothing, shown in /peers (refused), in stats (sync.refusedPeers) and on the dashboard, until a change of its is taken again or the epoch changes. Auth plan M6 (diverged standing).
Diffstat (limited to 'src/api/dashboard')
-rw-r--r--src/api/dashboard/dashboard.html13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/api/dashboard/dashboard.html b/src/api/dashboard/dashboard.html
index 601b578..fa4d436 100644
--- a/src/api/dashboard/dashboard.html
+++ b/src/api/dashboard/dashboard.html
@@ -284,6 +284,7 @@
#peers td.via { max-width: 0; min-width: 8em; width: 100%; overflow: hidden; text-overflow: ellipsis; }
/* A peer's status (not the legend's "dormant"). */
#peers .active { color: var(--ok); } #peers .dormant { color: var(--bad); }
+ #peers .refused { color: var(--bad); font-weight: 600; }
#peers .unknown { color: var(--muted); }
.tree { font-family: ui-monospace, monospace; font-size: 12px; }
/* Every entry indented alike: a branch's triangle sits in the indentation, left of
@@ -658,9 +659,15 @@ function renderPeers() {
el("td", { title: id + (peer.neighbour ? ""
: "\nnot a neighbour: this node only answers it, and syncs with it on its own only as a neighbour") },
peer.alias || el("span", { class: "id" }, short(id))),
- // How long dormant is about how long unseen ("seen"): in the tooltip only.
- el("td", { class: peer.status, title: peer.status === "dormant"
- ? "dormant for " + age(aged("dormantForSecs", peer.dormantForSecs)) : "" }, peer.status),
+ // How long dormant is about how long unseen ("seen"): in the tooltip only. Refused
+ // as a whole (its own change broke the swarm's rules) above all.
+ peer.refused
+ ? el("td", { class: "refused", title: "refused as a whole for " +
+ age(aged("secsAgo", peer.refused.secsAgo)) + ": its change " +
+ short(peer.refused.change) + " broke the swarm's rules (" + peer.refused.why +
+ "), so this node sends it nothing" }, "refused")
+ : el("td", { class: peer.status, title: peer.status === "dormant"
+ ? "dormant for " + age(aged("dormantForSecs", peer.dormantForSecs)) : "" }, peer.status),
el("td", {}, age(aged("lastSeenSecsAgo", peer.lastSeenSecsAgo))),
el("td", { class: "id via", title: via }, via),
el("td", {}, rtt),