feat(heartbeat): Add DNS, BIND, CrowdSec health monitoring
- Add DNS resolution test to heartbeat status - Include BIND, CrowdSec, HAProxy, mitmproxy service checks - Add security metrics (crowdsec_bans, dns_response) - Improve health score calculation with all services Router changes (not in repo): - Enabled BIND recursion with forwarders (9.9.9.9, 1.1.1.1) - Added BIND query/security logging - Added CrowdSec acquisition for BIND logs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
adec1144d6
commit
9884965e2b
93
package/secubox/secubox-core/files/usr/sbin/secubox-heartbeat-status
Executable file
93
package/secubox/secubox-core/files/usr/sbin/secubox-heartbeat-status
Executable file
@ -0,0 +1,93 @@
|
||||
#!/bin/sh
|
||||
# SecuBox Heartbeat Status - Returns JSON for dashboard/LED status
|
||||
# Includes DNS, CrowdSec, HAProxy, mitmproxy health
|
||||
|
||||
# Get resource metrics
|
||||
CPU_LOAD=$(cat /proc/loadavg | cut -d" " -f1)
|
||||
MEM_TOTAL=$(grep MemTotal /proc/meminfo | awk "{print \$2}")
|
||||
MEM_AVAIL=$(grep MemAvailable /proc/meminfo | awk "{print \$2}")
|
||||
MEM_PERCENT=$((100 - (MEM_AVAIL * 100 / MEM_TOTAL)))
|
||||
DISK_PERCENT=$(df / | tail -1 | awk "{print \$5}" | tr -d "%")
|
||||
|
||||
# Service counts
|
||||
SERVICES_UP=$(secubox-profile-snapshot list 2>/dev/null | grep -c "\[UP\]")
|
||||
SERVICES_DOWN=$(secubox-profile-snapshot list 2>/dev/null | grep -c "\[DOWN\]")
|
||||
CONTAINERS_UP=$(lxc-ls -f 2>/dev/null | grep -c RUNNING)
|
||||
|
||||
# DNS Health Check
|
||||
DNS_OK=0
|
||||
DNS_RESPONSE=""
|
||||
if nslookup github.com 127.0.0.1 >/dev/null 2>&1; then
|
||||
DNS_OK=1
|
||||
DNS_RESPONSE="ok"
|
||||
else
|
||||
DNS_RESPONSE="failed"
|
||||
fi
|
||||
|
||||
# BIND running check
|
||||
BIND_RUNNING=0
|
||||
pgrep named >/dev/null 2>&1 && BIND_RUNNING=1
|
||||
|
||||
# CrowdSec health
|
||||
CROWDSEC_OK=0
|
||||
pgrep crowdsec >/dev/null 2>&1 && CROWDSEC_OK=1
|
||||
CROWDSEC_BANS=$(cscli decisions list -o json 2>/dev/null | jsonfilter -e '@[*]' 2>/dev/null | wc -l)
|
||||
|
||||
# HAProxy health
|
||||
HAPROXY_OK=0
|
||||
lxc-info -n haproxy -s 2>/dev/null | grep -q RUNNING && HAPROXY_OK=1
|
||||
|
||||
# mitmproxy health
|
||||
MITMPROXY_OK=0
|
||||
pgrep -f mitmproxy >/dev/null 2>&1 && MITMPROXY_OK=1
|
||||
|
||||
# Calculate health score (0-100)
|
||||
SCORE=100
|
||||
[ "$MEM_PERCENT" -gt 80 ] && SCORE=$((SCORE - 10))
|
||||
[ "$DISK_PERCENT" -gt 80 ] && SCORE=$((SCORE - 10))
|
||||
[ "$SERVICES_DOWN" -gt 0 ] && SCORE=$((SCORE - (SERVICES_DOWN * 5)))
|
||||
[ "$DNS_OK" -eq 0 ] && SCORE=$((SCORE - 20))
|
||||
[ "$CROWDSEC_OK" -eq 0 ] && SCORE=$((SCORE - 15))
|
||||
[ "$HAPROXY_OK" -eq 0 ] && SCORE=$((SCORE - 15))
|
||||
[ "$MITMPROXY_OK" -eq 0 ] && SCORE=$((SCORE - 10))
|
||||
|
||||
# Clamp to 0
|
||||
[ "$SCORE" -lt 0 ] && SCORE=0
|
||||
|
||||
# Determine status level
|
||||
if [ "$SCORE" -ge 80 ]; then
|
||||
LEVEL="healthy"
|
||||
elif [ "$SCORE" -ge 50 ]; then
|
||||
LEVEL="warning"
|
||||
else
|
||||
LEVEL="critical"
|
||||
fi
|
||||
|
||||
cat << JSON
|
||||
{
|
||||
"score": $SCORE,
|
||||
"level": "$LEVEL",
|
||||
"resources": {
|
||||
"cpu_load": "$CPU_LOAD",
|
||||
"memory_percent": $MEM_PERCENT,
|
||||
"storage_percent": $DISK_PERCENT
|
||||
},
|
||||
"services": {
|
||||
"up": $SERVICES_UP,
|
||||
"down": $SERVICES_DOWN,
|
||||
"dns": $DNS_OK,
|
||||
"bind": $BIND_RUNNING,
|
||||
"crowdsec": $CROWDSEC_OK,
|
||||
"haproxy": $HAPROXY_OK,
|
||||
"mitmproxy": $MITMPROXY_OK
|
||||
},
|
||||
"security": {
|
||||
"crowdsec_bans": $CROWDSEC_BANS,
|
||||
"dns_response": "$DNS_RESPONSE"
|
||||
},
|
||||
"containers": {
|
||||
"running": $CONTAINERS_UP
|
||||
},
|
||||
"last_update": "$(date -Iseconds)"
|
||||
}
|
||||
JSON
|
||||
Loading…
Reference in New Issue
Block a user