blob: 4039f79e9e118b61192f1d98961e3701bc93c8f6 [file] [log] [blame]
#!/bin/sh
#
# This script monitors /tmp/gpio/ledcontrol and decides which is the
# led sequence that should be used to indicate the current system status.
#
. /etc/utils.sh
OUT="/tmp/gpio"
IN="/tmp/gpio/ledcontrol"
CONMAN="/tmp/conman/status"
# LED sequences
OFF="0"
PURPLE="5"
SOLID_RED="1"
SLOW_RED="x4 1 0"
SOLID_BLUE="4"
FAST_BLUE="4 0 4 0 4 0"
SLOW_BLUE="x2 4 0"
change_state() {
# Check if the new state is different from the previous one
if [ ! -e /tmp/gpio/ledstate ] || [ "$last_ledstate" != "$1" ]; then
leds $2
last_leds="$2"
atomic /tmp/gpio/ledstate "$1"
last_ledstate="$1"
echo "state changed to: $last_ledstate $last_leds"
fi
}
has_ip_address() {
[ -n "$(ip -f inet6 addr show dev $1 scope global 2>/dev/null)" ] ||
[ -n "$(ip -f inet addr show dev $1 scope global 2>/dev/null)" ]
}
is_link_up() {
if interface_exists wan0; then
# If there is an explicit WAN link, use that.
is-interface-up wan0
elif is-tv-box; then
# Otherwise for TV Boxes, any interface could be upstream.
is-interface-up eth0 ||
is-interface-up eth1 ||
is-interface-up moca0 ||
is-interface-up wcli0 ||
is-interface-up wcli1
elif is-storage-box; then
# For storage boxes (the ones that don't have a wan0), the MoCA
# link should never be upstream, so count only the ethernet.
is-interface-up eth0
elif is-ptp; then
is-interface-up sw0.inband
else
echo "Unknown device type; assuming link is down." >&2
false
fi
}
is_manufactured_recently() {
if [ ! "$is_manufactured_recently_status" ]; then
platform=$(cat /etc/platform)
if [ "$platform" != GFHD100 ] && [ "$platform" != GFMS100 ]; then
is_manufactured_recently_status=0
else
# Check if the device is made within or after 2013.
serial=$(serial)
# Serial number format: GABCYWWSSSSS.
# Check if the serial number matches this format (starting from G)
# and YWWSSSSS >= 30000000
date_manufactured=${serial#G???}
[ "$serial" != "$date_manufactured" ] && [ "$date_manufactured" -ge 30000000 ]
is_manufactured_recently_status=$?
fi
fi
return $is_manufactured_recently_status
}
{ echo; watch-dir "$IN" "$CONMAN"; } |
while read f; do
if is_link_up; then
rm -f "$OUT/link_down"
if interface_exists wan0; then
ifs="wan0 wan0.2"
else
ifs="br0 wcli0 wcli1"
fi
success=
for ifname in $ifs; do
if has_ip_address $ifname; then
success="IP address acquired on $ifname"
break
fi
done
if [ -n "$success" ]; then
atomic "$OUT/ipconnected" "$success"
else
rm -f "$IN/acsconnected" "$OUT/ipconnected"
fi
else
atomic "$OUT/link_down" "Link down"
rm -f "$IN/acsconnected" "$OUT/ipconnected"
fi
if is_manufactured_recently &&
[ ! -f "$IN/secure_boot" ] &&
[ ! -e "/config/IGNORE_UNSECURE" ]; then
change_state UNSECUREBOOT "$PURPLE"
elif [ -f "$IN/halted" ]; then
change_state HALT "$SOLID_RED"
elif [ -f "$IN/invalid_keybox" -a ! -f /rw/ignore-bad-keybox ]; then
change_state INVALID_KEYBOX "$SOLID_RED"
elif [ -f "$IN/overtemperature" ]; then
change_state OVERTEMP "$SOLID_RED"
elif [ -f "$IN/hdd_bad_pair" ]; then
change_state HDPAIR_FAIL "$SOLID_RED"
elif [ -f "$IN/hdd_mount_err" ]; then
change_state HDMOUNT_FAIL "$SOLID_RED"
elif [ -f "$IN/flash_bad_blocks" ]; then
change_state BADBLOCK "$SOLID_RED"
elif [ -f "$IN/waitpower" ]; then
change_state POWEROFF "$OFF"
elif [ -f "$OUT/link_down" ]; then
# http://go/wireless-cpe-led-states
# If the link is down but this is a wireless client that is currently trying
# to join an open network or the user's WLAN, or conman belives it can reach
# the ACS if it wants to, we should blink slow blue.
if [ -f "$CONMAN/TRYING_OPEN" ]; then
change_state TRYING_OPEN_WIFI "$SLOW_BLUE"
elif [ -f "$CONMAN/TRYING_WLAN" ]; then
change_state TRYING_WLAN "$SLOW_BLUE"
elif [ -f "$CONMAN/COULD_REACH_ACS" ]; then
change_state COULD_REACH_ACS "$SLOW_BLUE"
else
change_state LINKDOWN "$SLOW_RED"
fi
elif [ -f "$OUT/modem_down" ]; then
change_state MODEMDOWN "$SLOW_RED"
elif [ -f "$OUT/sfp_down" ]; then
change_state SFPDOWN "$SLOW_RED"
elif [ ! -f "$OUT/ipconnected" ]; then
# progress: link but no ip
change_state NOIP "$SLOW_BLUE"
elif [ ! -f "$IN/acsconnected" ]; then
# progress: ip but no acs
change_state IPV6ACQUIRED "$FAST_BLUE"
elif [ -f "$CONMAN/CONNECTED_TO_OPEN" ] && ! connection_check -I br0; then
# http://go/wireless-cpe-led-states
# progress: acs but connected to a provisioning network, and don't have
# internet via br0. Checking br0 is necessary because if conman dies while
# connected to an open network and then ethernet/MoCa is connected, this is
# the wrong state.
change_state PROVISIONING "$FAST_BLUE"
else
# success!
change_state ACSCONTACT "$SOLID_BLUE"
fi
done