blob: 097542139d93d8aca575af7f4a7a6160b117df84 [file] [log] [blame]
#!/bin/sh
#
# This script monitors CONTROL_PATH folder and decides which is the
# led sequence that has to be echoed to the LEDS_FILE.
. /etc/utils.sh
# Output file.
BASE_PATH="/tmp/gpio"
LEDS_FILE="$BASE_PATH/leds"
CONTROL_PATH="$BASE_PATH/ledcontrol"
LEDSTATE_FILE="$BASE_PATH/ledstate"
IP_FILE="$BASE_PATH/ipconnected"
LINK_DOWN_FILE="$BASE_PATH/link_down"
ACS_FILE="$CONTROL_PATH/acsconnected"
OVERTEMP_FILE="$CONTROL_PATH/overtemperature"
WAITPOWER_FILE="$CONTROL_PATH/waitpower"
# Hardware verion set by manufacture process.
# HW_REV/HW_VER is 0/0 or non 0/1, gpio 15 should be ignored.
# HW_REV/HW_VER is 0/1, gpio 15 is used to control dim/bright.
HW_REV=$(sysvar_cmd --get HW_REV 2>/dev/null)
HW_VER=$(sysvar_cmd --get HW_VER 2>/dev/null)
# Bit sequences.
ALL_LEDS_OFF="0"
HW_FAIL_LED_ON="1" # solid red
ACS_LED_ON="2" # solid blue
IP_LED_ON="2 0 2 0 2 0" # fast blue
LINK_DOWN_LED_ON="1 0 " # slow red blink
ANYTHING_ELSE="x2 2 0" # slow blink blue
change_state() {
# Check if the new state is different from the previous one
if [ ! -e "$LEDSTATE_FILE" ] || [ "$last_ledstate" != "$1" ]; then
if [ "x$HW_REV" = "x0" ] && [ "x$HW_VER" = "x1" ]; then
if [ "x$1" = "xACSCONTACT" ]; then
diags set_led_dim on
else
diags set_led_dim off
fi
fi
leds $2
last_leds="$2"
atomic $LEDSTATE_FILE "$1"
last_ledstate="$1"
echo "state changed to: $last_ledstate $last_leds"
fi
}
does_interface_exist() {
[ -e "/sys/class/net/$1" ]
}
has_ip_address() {
[ -n "$(ip -f inet6 addr show dev $1 scope global)" ] ||
[ -n "$(ip -f inet addr show dev $1 scope global)" ]
}
is_link_up() {
# If there is an explicit WAN link, use that.
# Otherwise for TV Boxes, check MoCA and Ethernet
# and for Storage Boxes check only Ethernet
if does_interface_exist wan0; then
is-interface-up wan0
return $?
fi
is-interface-up eth1
}
watch-dir $CONTROL_PATH |
while read f; do
if is_link_up; then
test ! -e "$LINK_DOWN_FILE" || rm -f "$LINK_DOWN_FILE"
success=
if does_interface_exist wan0; then
ifs="wan0 wan0.2"
else
ifs="br0"
fi
for ifname in $ifs; do
if has_ip_address $ifname; then
success="IP address acquired on $ifname"
break
fi
done
if [ -n "$success" ]; then
echo "$success" >"$IP_FILE"
else
rm -f "$ACS_FILE" "$IP_FILE"
fi
else
echo "Link down" >"$LINK_DOWN_FILE"
rm -f "$ACS_FILE" "$IP_FILE"
fi
if [ -f "$OVERTEMP_FILE" ]; then
change_state OVERTEMP "$HW_FAIL_LED_ON"
elif [ -f "$WAITPOWER_FILE" ]; then
change_state POWEROFF "$ALL_LEDS_OFF"
elif [ -f "$LINK_DOWN_FILE" ]; then
change_state LINKDOWN "$LINK_DOWN_LED_ON"
elif [ ! -f "$IP_FILE" ]; then
change_state NOIP "$ANYTHING_ELSE" # progress: link but no ip
elif [ ! -f "$ACS_FILE" ]; then
change_state IPV6ACQUIRED "$IP_LED_ON" # progress: ip but no acs
else
change_state ACSCONTACT "$ACS_LED_ON" # success!
fi
done