secubox-deb/docs/reference/secubox-led-pulse-openwrt.sh
CyberMind-FR dbf76b7f29 feat(led): Add 3-tier LED HealthBump system with kernel timer triggers
- LED1 (HW): Orange 4s cycle - hardware layer (CPU, memory, WAN)
- LED2 (SVC): Green 3s cycle - services layer (HAProxy, Nginx, certs)
- LED3 (SEC): Blue 2s cycle - security layer (CrowdSec bans)

Uses slow kernel timer triggers instead of userspace scripts to avoid
I2C bus errors on Debian 6.12 kernel (mv64xxx driver timing issues).

Scripts:
- secubox-led: Manual LED control with layer aliases
- secubox-led-trigger: Kernel timer trigger setup
- secubox-healthbump: Health status checker (30s timer)
- secubox-led-pulse: Userspace pulse daemon (deprecated)

Systemd services:
- secubox-led-trigger.service: Setup timers at boot
- secubox-healthbump.timer: Health check every 30s

Reference: docs/reference/secubox-led-pulse-openwrt.sh (original OpenWrt script)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-05-08 08:29:08 +02:00

169 lines
4.0 KiB
Bash

#!/bin/sh
# SecuBox LED Pulse - Tri-Color Status with Critical Alert Mode
# Original from OpenWrt secubox-openwrt (overlay filesystem)
# Reference only - Debian uses 3-tier LED system instead
#
# Matches control panel (port 8511) + SPUNK ALERT for critical failures
LED_GREEN1='/sys/class/leds/green:led1'
LED_RED1='/sys/class/leds/red:led1'
LED_BLUE1='/sys/class/leds/blue:led1'
CACHE_FILE="/tmp/secubox/health-status.json"
led_set() {
local led="$1" val="$2"
echo "${val:-0}" > "$led/brightness" 2>/dev/null
}
set_color() {
local r="$1" g="$2" b="$3"
led_set "$LED_RED1" "$r"
led_set "$LED_GREEN1" "$g"
led_set "$LED_BLUE1" "$b"
}
all_off() { set_color 0 0 0; }
get_json_val() {
local key="$1"
jsonfilter -i "$CACHE_FILE" -e "@.$key" 2>/dev/null
}
# Check for CRITICAL services - these trigger SPUNK ALERT
check_critical_services() {
local critical=0
# HAProxy must be running (PERMANENT priority)
if ! pgrep haproxy >/dev/null 2>&1; then
critical=1
fi
# CrowdSec must be running (URGENT priority)
if ! pgrep crowdsec >/dev/null 2>&1; then
critical=1
fi
# Check if services are down from cache
local haproxy_ok=$(get_json_val "services.haproxy")
local crowdsec_ok=$(get_json_val "services.crowdsec")
[ "$haproxy_ok" = "0" ] && critical=1
[ "$crowdsec_ok" = "0" ] && critical=1
return $critical
}
# SPUNK ALERT - Rapid red flashing for critical failures
spunk_alert() {
echo "SPUNK ALERT - Critical service down!" >&2
echo "CRITICAL" > /tmp/secubox/led-status
local i
for i in 1 2 3 4 5; do
# Rapid red flash
set_color 255 0 0
local x=0; while [ $x -lt 25000 ]; do x=$((x+1)); done
all_off
x=0; while [ $x -lt 25000 ]; do x=$((x+1)); done
done
# Brief pause before next check
sleep 1
}
# Calculate colors based on metrics
calc_health_color() {
local score=$(get_json_val "score")
[ -z "$score" ] && score=100
if [ "$score" -ge 80 ]; then echo "green"
elif [ "$score" -ge 50 ]; then echo "yellow"
else echo "red"; fi
}
calc_cpu_color() {
local cpu=$(get_json_val "resources.cpu_load" | cut -d'.' -f1)
[ -z "$cpu" ] && cpu=0
local pct=$((cpu * 25))
if [ "$pct" -lt 60 ]; then echo "green"
elif [ "$pct" -lt 85 ]; then echo "yellow"
else echo "red"; fi
}
calc_mem_color() {
local mem=$(get_json_val "resources.memory_percent")
[ -z "$mem" ] && mem=50
if [ "$mem" -lt 60 ]; then echo "green"
elif [ "$mem" -lt 85 ]; then echo "yellow"
else echo "red"; fi
}
# Pulse with specific color
pulse_color() {
case "$1" in
green) set_color 0 255 0 ;;
yellow) set_color 255 165 0 ;;
red) set_color 255 0 0 ;;
cyan) set_color 0 255 255 ;;
*) set_color 0 128 0 ;;
esac
}
dim_color() {
case "$1" in
green) set_color 0 64 0 ;;
yellow) set_color 64 42 0 ;;
red) set_color 64 0 0 ;;
cyan) set_color 0 64 64 ;;
*) set_color 0 32 0 ;;
esac
}
# Busy wait for ms (BusyBox compatible)
busy_wait() {
local count=$(($1 * 100))
local x=0
while [ $x -lt $count ]; do x=$((x+1)); done
}
echo 'SecuBox LED Tri-Color + SPUNK ALERT starting...'
all_off
# Main loop
while true; do
# PRIORITY 1: Check for critical service failures
if ! check_critical_services; then
spunk_alert
continue
fi
# Normal operation: Tri-color heartbeat
health_color=$(calc_health_color)
cpu_color=$(calc_cpu_color)
mem_color=$(calc_mem_color)
echo "$health_color $cpu_color $mem_color" > /tmp/secubox/led-status
# Triple-pulse cascade (Health -> CPU -> Memory)
# Pulse 1: Health
pulse_color "$health_color"
busy_wait 150
dim_color "$health_color"
busy_wait 100
# Pulse 2: CPU
pulse_color "$cpu_color"
busy_wait 150
dim_color "$cpu_color"
busy_wait 100
# Pulse 3: Memory
pulse_color "$mem_color"
busy_wait 150
all_off
busy_wait 500
# Pause between heartbeats
sleep 1
done