fix(felhomsshd): operator_peer_configured from belt @operator_ips (agent-readable)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
This commit is contained in:
2026-07-05 22:58:58 +02:00
parent 72d6132907
commit 223c235f01
+9 -14
View File
@@ -75,10 +75,10 @@ func (m *Manager) Status(ctx context.Context, block *hub.WireWireguard) *hub.OOB
st.WGHandshakeAgeS = &age
}
// Operator-peer configured: from the in-memory block when fetched, OR (robust across an agent
// restart, before the next desired-state fetch) from the PERSISTENT rendered wg-felhom.conf — a
// second /32 in AllowedIPs is the operator peer. This keeps the report (and the oob_degraded alert
// gate) accurate immediately after a restart, not only after the next 900s heartbeat fetch.
st.OperatorPeerConfigured = wgConfHasOperatorPeer()
// restart, before the next desired-state fetch) from the PERSISTENT belt @operator_ips set — the
// agent can read it via the sudo nft-list grant (unlike the 0600 root-owned wg-felhom.conf). This
// keeps the report + the oob_degraded alert gate accurate immediately after a restart.
st.OperatorPeerConfigured = m.beltOperatorConfigured(ctx)
if block != nil {
if block.OOBPeerIP != "" {
st.OperatorPeerConfigured = true
@@ -146,17 +146,12 @@ func listenerPresent(port int) bool {
return err == nil && strings.TrimSpace(string(out)) != ""
}
// wgConfHasOperatorPeer reports whether the rendered wg-felhom.conf carries a SECOND AllowedIPs /32
// (the operator OOB peer, alongside the PBS /32). A pure file read — always current, survives restart.
func wgConfHasOperatorPeer() bool {
raw, err := os.ReadFile("/etc/wireguard/wg-felhom.conf")
// beltOperatorConfigured reports whether the belt's @operator_ips set is non-empty (an operator /32
// is allowed to reach felhom-sshd). Read via the sudo nft-list grant — persistent + agent-readable.
func (m *Manager) beltOperatorConfigured(ctx context.Context) bool {
out, _, err := m.runner.Run(ctx, "nft", "list", "set", "inet", "felhom_oob", "operator_ips")
if err != nil {
return false
}
for _, line := range strings.Split(string(raw), "\n") {
if strings.HasPrefix(strings.TrimSpace(line), "AllowedIPs") && strings.Contains(line, ",") {
return true // two or more /32s = PBS + operator
}
}
return false
return strings.Contains(string(out), "elements")
}