The mesh noticed 48 core failures in six days and told nobody (ADR 0227). messenger holds the operator-channel seat: it consumes the controller's condition events and sends them to Telegram and the desktop notifier, deduplicated by key, reminded once, edited on clear, capped at 20 an hour with the rest folded, and refusing anything carrying an address, a path or a secret. mesh-watcher, on a machine other than the control node, sends to Telegram directly when the self-check heartbeat or the bus goes silent.
64 lines
2.7 KiB
Go
64 lines
2.7 KiB
Go
package main
|
|
|
|
import "testing"
|
|
|
|
func TestRolesAndWordsMayLeave(t *testing.T) {
|
|
for _, s := range []string{
|
|
"URGENT: the home server has not been heard for 15 min",
|
|
"key: provider.keycloak.ace.gitea.failing",
|
|
"more: conditions show machine.ace.silent",
|
|
"since: 2026-10-06 12:30 UTC",
|
|
"call call-1759752000123456789-12 has run past its bound of 10 min",
|
|
"ace/postgres.query answers no more",
|
|
"3/4 machines answered; plan 41 waits on build 7f3a9c1e",
|
|
"the bus advisory slow-consumer for ace_records",
|
|
"core.controller.novox.rolled-back",
|
|
"seat node-notifier has no live holder",
|
|
"HELD BACK: 5 message(s) over the cap of 20 an hour",
|
|
"STILL OPEN after 1.5 h: the controller's event loop takes no message",
|
|
"node-engine and node tools builds differ from the plan's",
|
|
} {
|
|
if r, ok := Check(s); !ok {
|
|
t.Errorf("refused %q: %s", s, r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAnAddressAPathOrASecretMayNot(t *testing.T) {
|
|
for s, class := range map[string]string{
|
|
"cannot reach 192.168.1.20": "address",
|
|
"listening on 10.0.0.7:5432": "address",
|
|
"route fd00:1234:5678::1 is gone": "address",
|
|
"fe80::1 answered": "address",
|
|
"2001:db8:0:0:0:0:2:1 answered": "address",
|
|
"see https://git.example.org/x": "address",
|
|
"git.novox.internal does not answer": "address",
|
|
"the mail for admin@example.org bounced": "address",
|
|
"zurag.be is down": "address",
|
|
"localhost refused": "address",
|
|
"the card aa:bb:cc:dd:ee:ff went away": "address",
|
|
"/var/lib/mesh-controller is full": "path",
|
|
"~/.config/hal/env changed": "path",
|
|
"read ./grants.json": "path",
|
|
"services/postgres/data/pg_hba.conf": "path",
|
|
"C:\\Users\\x": "path",
|
|
"token 123456789:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw": "secret",
|
|
"ghp_abcdefghijklmnopqrstuvwxyz0123456789": "secret",
|
|
"password=hunter2": "secret",
|
|
"api_key: x": "secret",
|
|
"-----BEGIN OPENSSH PRIVATE KEY-----": "secret",
|
|
"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0": "secret",
|
|
"commit 3f2a9c1e5b7d4f6a8c0e2b4d6f8a0c2e4b6d8f0a": "secret",
|
|
"value Zx8Qp2Lm9Rt4Vb7Nc1Kd5Hs3Jf6": "secret",
|
|
} {
|
|
r, ok := Check(s)
|
|
if ok {
|
|
t.Errorf("let %q leave", s)
|
|
continue
|
|
}
|
|
if r.Class != class {
|
|
t.Errorf("%q refused as %s, want %s", s, r, class)
|
|
}
|
|
}
|
|
}
|