blob: 184d92c7036d6b86999d6729edee031284df3e61 [file] [log] [blame]
#!/bin/sh
. /etc/utils.sh
BASE_PATH="/tmp/gpio"
MONITOR_PATH="$BASE_PATH/ledcontrol"
MFG_MODE_FILE="$MONITOR_PATH/mfg_mode"
ACS_FILE="$MONITOR_PATH/acsconnected"
HALTED_FILE="$MONITOR_PATH/halted"
HARDWARE_FAILURE="$MONITOR_PATH/hardware_failure"
NETWORK_STATUS_CONNECTED="CONNECTED"
NETWORK_STATUS_DISCONNECTED="DISCONNECTED"
LED_STATE_FILE="$BASE_PATH/ledstate"
# color is used by gpio-mailbox. 1 is red LED, 2 is blue LED, 3 is both LEDs on
# at the same time (purple).
PURPLE_LED="3"
BLUE_LED="2"
RED_LED="1"
SOLID_MODE="solid"
BLINK_MODE="blink"
FAST_MODE="fast"
PON_IFACE="pon0"
MAN_IFACE="man"
LEDS_PATTERN_FILE="$BASE_PATH/leds"
LEDS_BRIGHTNESS_10P="1"
LEDS_BRIGHTNESS_100P="100"
GPON_INFO_FILE="/sys/devices/platform/gpon/info/infoGpon"
GPON_AES_FILE="/sys/devices/platform/gpon/data/showAes0xxx"
led_state=""
blink_led() {
echo "$1" > "$LEDS_PATTERN_FILE"
}
log_state_change() {
local state="$1"
if [ "$state" != "$led_state" ] ; then
echo "state changed to: $state"
atomic $LED_STATE_FILE "$state"
led_state="$state"
fi
}
set_led_state() {
local mode="$1"
local color="$2"
local state="$3"
local brightness="$4"
case "$mode" in
"$SOLID_MODE")
blink_led "x1 $color@$brightness"
;;
"$BLINK_MODE")
blink_led "x3 $color@${brightness}x2 0 $color@${brightness}x2 0"
;;
"$FAST_MODE")
blink_led "x1 $color@$brightness 0"
;;
*)
echo "unknown mode '$mode'"
;;
esac
log_state_change "$state"
}
is_interface_up() {
# Read the gpon status file. 'OPERATION' means the link should be up.
# The ONU has the following GPON states:
# 1 INITIAL
# 2 STANDBY
# 3 SERIAL NUMBER
# 4 RANGING
# 5 OPERATION
if [ ! -e $GPON_INFO_FILE ]; then
return 1
fi
x=$(cat $GPON_INFO_FILE | grep "ONU STATE")
contains "$x" "OPERATION"
}
is_provisioned() {
# The output looks like:
# [0010]
# [0312][0313][0314][0315][0320][0321][0322][0323]
#
# When unprovsioned this is empty, or has 1 entry. If there are more
# than 7 bytes then we assume the device is provisioned.
if [ ! -e $GPON_AES_FILE ]; then
return 1
fi
aes_gems=$(cat $GPON_AES_FILE | grep '\[' | wc -c)
[ "$aes_gems" -gt 7 ]
}
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)" ]
}
watch-dir $MONITOR_PATH |
while [ -z "$led_state" ] || read event; do
if [ -e "$MFG_MODE_FILE" ]; then
# This is manufacture mode. We have two states: The pon interface is up, we
# blink slow purple. Otherwise, pon interface is down we blink fast purple.
# This should never happen for an installer, if it does they'll know
# something is wrong.
if ! is_interface_up "$PON_IFACE" ; then
# Override the led to blink slow if we're in manufacture mode and the pon
# interface is not up.
set_led_state "$FAST_MODE" "$PURPLE_LED" "MFGMODE" "$LEDS_BRIGHTNESS_100P"
else
# Override the led to blink fast if we're in manufacture mode and the pon
# interface is up.
set_led_state "$BLINK_MODE" "$PURPLE_LED" "MFGMODE" "$LEDS_BRIGHTNESS_100P"
fi
elif [ -e "$HALTED_FILE" ]; then
set_led_state "$SOLID_MODE" "$RED_LED" "HALTED" "$LEDS_BRIGHTNESS_100P"
elif [ -e "$HARDWARE_FAILURE" ]; then
set_led_state "$SOLID_MODE" "$RED_LED" "HWFAIL" "$LEDS_BRIGHTNESS_100P"
elif ! is_interface_up "$PON_IFACE" ; then
set_led_state "$BLINK_MODE" "$RED_LED" "LINKDOWN" "$LEDS_BRIGHTNESS_10P"
elif ! is_provisioned ; then
set_led_state "$FAST_MODE" "$RED_LED" "NETCONNECTING" "$LEDS_BRIGHTNESS_10P"
elif ! has_ip_address "$MAN_IFACE" ; then
set_led_state "$BLINK_MODE" "$BLUE_LED" "NETCONNECTED" "$LEDS_BRIGHTNESS_10P"
elif [ ! -e $ACS_FILE ] ; then
set_led_state "$FAST_MODE" "$BLUE_LED" "IPV6ACQUIRED" "$LEDS_BRIGHTNESS_10P"
else
set_led_state "$SOLID_MODE" "$BLUE_LED" "ACSCONTACT" "$LEDS_BRIGHTNESS_10P"
fi
if [ -z "$led_state" ]; then sleep .5; fi
done