diff --git a/package/secubox/secubox-p2p/root/usr/sbin/secubox-led-safe b/package/secubox/secubox-p2p/root/usr/sbin/secubox-led-safe new file mode 100755 index 00000000..1be9d537 --- /dev/null +++ b/package/secubox/secubox-p2p/root/usr/sbin/secubox-led-safe @@ -0,0 +1,131 @@ +#!/bin/sh +# SecuBox Safe LED Script for MochaBin +# Slow I2C writes with error handling to prevent bus lockup + +LED_BASE="/sys/class/leds" +WRITE_DELAY=1 # 300ms between writes to prevent I2C overload +ERROR_BACKOFF=5 # Wait 5s after any error +MAX_ERRORS=3 # Stop after 3 consecutive errors + +error_count=0 + +# Safe LED write with timeout and error detection +led_write() { + local led="$1" + local val="$2" + local path="$LED_BASE/$led/brightness" + + [ ! -f "$path" ] && return 1 + + # Use timeout to prevent hang (busybox compatible) + echo "$val" > "$path" 2>/dev/null + local ret=$? + + if [ $ret -ne 0 ]; then + error_count=$((error_count + 1)) + logger -t secubox-led "LED write failed: $led (error $error_count)" + sleep $ERROR_BACKOFF + return 1 + fi + + error_count=0 + sleep $WRITE_DELAY + return 0 +} + +# Set all RGB LEDs to a color (one at a time, slowly) +set_color() { + local r="$1" g="$2" b="$3" + + led_write "red:led1" "$r" || return 1 + led_write "green:led1" "$g" || return 1 + led_write "blue:led1" "$b" || return 1 +} + +# Set all 3 LED groups +set_all_leds() { + local r="$1" g="$2" b="$3" + + for i in 1 2 3; do + led_write "red:led$i" "$r" || return 1 + led_write "green:led$i" "$g" || return 1 + led_write "blue:led$i" "$b" || return 1 + done +} + +# Health check - simple status colors +get_status_color() { + # Check basic system health + local load=$(cat /proc/loadavg | cut -d' ' -f1 | cut -d'.' -f1) + local mem_free=$(grep MemAvailable /proc/meminfo | awk '{print int($2/1024)}') + + # Default: green (healthy) + local r=0 g=64 b=0 + + # Warning: yellow (high load or low memory) + if [ "$load" -gt 4 ] || [ "$mem_free" -lt 256 ]; then + r=64 g=64 b=0 + fi + + # Critical: red (very high load or very low memory) + if [ "$load" -gt 8 ] || [ "$mem_free" -lt 128 ]; then + r=64 g=0 b=0 + fi + + echo "$r $g $b" +} + +# Main loop - update every 10 seconds (very slow) +main() { + logger -t secubox-led "Safe LED script starting..." + + # Initial state: dim green + set_all_leds 0 32 0 + + while true; do + # Check for too many errors + if [ $error_count -ge $MAX_ERRORS ]; then + logger -t secubox-led "Too many errors, stopping LED updates" + exit 1 + fi + + # Get status and set color + read r g b << EOF +$(get_status_color) +EOF + set_all_leds "$r" "$g" "$b" + + # Long sleep between updates + sleep 10 + done +} + +# Handle arguments +case "$1" in + start) + main & + echo $! > /tmp/secubox-led.pid + ;; + stop) + [ -f /tmp/secubox-led.pid ] && kill $(cat /tmp/secubox-led.pid) 2>/dev/null + rm -f /tmp/secubox-led.pid + ;; + status) + get_status_color + ;; + test) + echo "Testing LED write..." + set_color 0 32 0 && echo "Green OK" + sleep 2 + set_color 32 32 0 && echo "Yellow OK" + sleep 2 + set_color 32 0 0 && echo "Red OK" + sleep 2 + set_color 0 0 32 && echo "Blue OK" + sleep 2 + set_color 0 32 0 && echo "Back to green" + ;; + *) + echo "Usage: $0 {start|stop|status|test}" + ;; +esac