| #!/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 |
| |
| BASE_PATH="/tmp/gpio" |
| CONTROL_PATH="$BASE_PATH/ledcontrol" |
| |
| # Output file. |
| LEDSTATE_FILE="$BASE_PATH/ledstate" |
| |
| # Indicator files. |
| SECUREBOOT_FILE="$CONTROL_PATH/secure_boot" |
| HALT_FILE="$CONTROL_PATH/halted" |
| KEYBOX_FILE="$CONTROL_PATH/invalid_keybox" |
| OVERTEMP_FILE="$CONTROL_PATH/overtemperature" |
| HDPAIRING_FILE="$CONTROL_PATH/hdd_bad_pair" |
| HDMOUNT_FILE="$CONTROL_PATH/hdd_mount_err" |
| BADBLOCK_FILE="$CONTROL_PATH/flash_bad_blocks" |
| TPM_ERROR_FILE="$CONTROL_PATH/tpm_err" |
| TUNER_FILE="$CONTROL_PATH/tuner_err" |
| WAITPOWER_FILE="$CONTROL_PATH/waitpower" |
| LINK_DOWN_FILE="$BASE_PATH/link_down" |
| IP_FILE="$BASE_PATH/ipconnected" |
| REGERR_FILE="$CONTROL_PATH/reg_err" |
| REGPOLL_FILE="$CONTROL_PATH/regpoll" |
| BOOTED_FILE="$CONTROL_PATH/booted" |
| TPM_ENROLL_FILE="$CONTROL_PATH/tpm_enroll" |
| GCD_REG_FILE="$CONTROL_PATH/gcd_registered" |
| MONLOG_CREDS_FILE="$CONTROL_PATH/monlog_creds" |
| PARAMS_FILE="$CONTROL_PATH/has_params" |
| AUTHORIZATION_FILE="$CONTROL_PATH/app_authorized" |
| CERT_FILE="$CONTROL_PATH/app_cert" |
| APP_RUNNING_FILE="$CONTROL_PATH/app_running" |
| TUNER_LOCK_FILE="$CONTROL_PATH/app_tuner_lock" |
| DATA_STREAM_FILE="$CONTROL_PATH/app_data" |
| APP_INITIALIZING_FILE="$CONTROL_PATH/app_init" |
| UPDATE_CHECK_COMPLETE_FILE="$CONTROL_PATH/update_check_complete" |
| UPDATING_FILE="$CONTROL_PATH/updating" |
| |
| # Bit sequences. |
| ALL_LEDS_OFF="0" |
| HW_FAIL_LED_ON="1" # solid red |
| SW_FAIL_LED_ON="1" # solid red |
| NO_INTERNET_LED_ON="1 0" # blink red |
| LINK_DOWN_LED_ON="x2 3 0" # slow blink purple |
| NO_IP_LED_ON="3 0 3 0 3 0" # fast blink purple |
| NO_SATELLITE_LED_ON="3" # solid purple |
| FASTWAIT_LED_ON="2 0 2 0 2 0" # fast blink blue |
| WAITING_LED_ON="x2 2 0" # slow blink blue |
| RUNNING_LED_ON="2" # solid blue |
| |
| IFNAME="lan0" |
| |
| change_state() { |
| # Check if the new state is different from the previous one |
| if [ ! -e "$LEDSTATE_FILE" ] || [ "$last_ledstate" != "$1" ]; then |
| 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() { |
| # FIXME TODO(efirst): The line below is commented out until we support IPv6. |
| # [ -n "$(ip -f inet6 addr show dev $1 scope global)" ] || |
| [ -n "$(ip -f inet addr show dev $1 scope global)" ] |
| } |
| |
| is_link_up() { |
| is-interface-up "$IFNAME" |
| } |
| |
| watch-dir $CONTROL_PATH | |
| while read f; do |
| |
| if is_link_up; then |
| test ! -e "$LINK_DOWN_FILE" || rm -f "$LINK_DOWN_FILE" |
| if has_ip_address $IFNAME; then |
| echo "IP address acquired on $IFNAME" >"$IP_FILE" |
| else |
| rm -f "$IP_FILE" |
| fi |
| else |
| echo "Link down" >"$LINK_DOWN_FILE" |
| rm -f "$IP_FILE" |
| fi |
| |
| if [ ! -e /tmp/DEBUG ] && [ ! -f "$SECUREBOOT_FILE" ]; then |
| change_state UNSECUREBOOT "$HW_FAIL_LED_ON" |
| elif [ -f "$HALT_FILE" ]; then |
| change_state HALT "$HW_FAIL_LED_ON" |
| elif [ -f "$KEYBOX_FILE" -a ! -f /rw/ignore-bad-keybox ]; then |
| change_state INVALID_KEYBOX "$HW_FAIL_LED_ON" |
| elif [ -f "$OVERTEMP_FILE" ]; then |
| change_state OVERTEMP "$HW_FAIL_LED_ON" |
| elif [ -f "$HDPAIRING_FILE" ]; then |
| change_state HDPAIR_FAIL "$HW_FAIL_LED_ON" |
| elif [ -f "$HDMOUNT_FILE" ]; then |
| change_state HDMOUNT_FAIL "$HW_FAIL_LED_ON" |
| elif [ -f "$BADBLOCK_FILE" ]; then |
| change_state BADBLOCK "$HW_FAIL_LED_ON" |
| elif [ -f "$TPM_ERROR_FILE" ]; then |
| change_state TPM_ERROR "$HW_FAIL_LED_ON" |
| elif [ -f "$TUNER_FILE" ]; then |
| change_state TUNER_FAIL "$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 "$NO_IP_LED_ON" |
| elif [ -f "$REGERR_FILE" ]; then |
| change_state REG_ERROR "$SW_FAIL_LED_ON" |
| elif [ -f "$REGPOLL_FILE" ]; then |
| change_state REG_POLL "$FASTWAIT_LED_ON" |
| elif [ ! -f "$BOOTED_FILE" ]; then |
| change_state BOOTING "$WAITING_LED_ON" |
| elif [ ! -f "$UPDATE_CHECK_COMPLETE_FILE" ]; then |
| change_state UPDATE_CHECK_FAILED "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$TPM_ENROLL_FILE" ]; then |
| change_state TPM_NOTENROLLED "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$GCD_REG_FILE" ]; then |
| change_state GCD_UNREGISTERED "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$MONLOG_CREDS_FILE" ]; then |
| change_state NO_MONLOG_CREDS "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$PARAMS_FILE" ]; then |
| change_state NOPARAMS "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$AUTHORIZATION_FILE" ]; then |
| change_state APP_NOTAUTHORIZED "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$CERT_FILE" ]; then |
| change_state APP_NOCERT "$NO_INTERNET_LED_ON" |
| elif [ ! -f "$APP_RUNNING_FILE" ]; then |
| change_state APP_ERROR "$SW_FAIL_LED_ON" |
| elif [ ! -f "$TUNER_LOCK_FILE" ]; then |
| change_state APP_NOTUNERLOCK "$NO_SATELLITE_LED_ON" |
| elif [ ! -f "$DATA_STREAM_FILE" ]; then |
| change_state APP_NODATA "$NO_SATELLITE_LED_ON" |
| elif [ -f "$APP_INITIALIZING_FILE" ]; then |
| change_state APP_INIT "$WAITING_LED_ON" |
| elif [ -f "$UPDATING_FILE" ]; then |
| change_state UPDATING "$WAITING_LED_ON" |
| else |
| change_state RUNNING "$RUNNING_LED_ON" |
| fi |
| done |