| #!/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 |