mirror of
https://github.com/CyberMind-FR/secubox-deb.git
synced 2026-07-29 11:12:29 +00:00
- 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>
169 lines
4.0 KiB
Bash
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
|