#!/usr/bin/bash ### # # Options Section # ### set -e set -u set -o pipefail ### # # Variables Section # ### if [[ -f '/etc/ugreen-nas-led.conf' ]]; then source '/etc/ugreen-nas-led.conf' fi NET_DEVICE="${1}" NET_SPEED_MIN=${NET_SPEED_MIN:='0'} NET_SPEED_MAX=${NET_SPEED_MAX:='10000'} NET_LED_COLOR_SPEED_MIN=${NET_LED_COLOR_SPEED_MIN:='255 0 0'} NET_LED_COLOR_SPEED_MAX=${NET_LED_COLOR_SPEED_MAX:='0 255 0'} ### # # Function Section # ### function load_module () { local MODULE MODULE="${1}" if ! /usr/sbin/lsmod | /usr/bin/grep --quiet "${MODULE}"; then /usr/sbin/modprobe "${MODULE}" fi } function set_net_led_color () { local IFS=' ' read -r RGB_RED_MIN RGB_GREEN_MIN RGB_BLUE_MIN <<< "${NET_LED_COLOR_SPEED_MIN}" read -r RGB_RED_MAX RGB_GREEN_MAX RGB_BLUE_MAX <<< "${NET_LED_COLOR_SPEED_MAX}" unset IFS RATIO=$( /usr/bin/awk -v speed="${NET_SPEED}" -v low="${NET_SPEED_MIN}" -v high="${NET_SPEED_MAX}" \ 'BEGIN {print (speed - low) / (high - low)}' ) RATIO=$( /usr/bin/awk -v r="${RATIO}" 'BEGIN {print (r < 0) ? 0 : (r > 1) ? 1 : r}' ) RGB_RED=$( /usr/bin/awk -v ratio="${RATIO}" -v low="${RGB_RED_MIN}" -v high="${RGB_RED_MAX}" \ 'BEGIN {printf "%.0f", low + ratio * (high - low)}' ) RGB_GREEN=$( /usr/bin/awk -v ratio="${RATIO}" -v low="${RGB_GREEN_MIN}" -v high="${RGB_GREEN_MAX}" \ 'BEGIN {printf "%.0f", low + ratio * (high - low)}' ) RGB_BLUE=$( /usr/bin/awk -v ratio="${RATIO}" -v low="${RGB_BLUE_MIN}" -v high="${RGB_BLUE_MAX}" \ 'BEGIN {printf "%.0f", low + ratio * (high - low)}' ) /usr/bin/echo "${RGB_RED} ${RGB_GREEN} ${RGB_BLUE}" > '/sys/class/leds/netdev/color' } ### # # Runtime Environment # ### load_module 'ledtrig_netdev' /usr/bin/echo 'netdev' > '/sys/class/leds/netdev/trigger' /usr/bin/echo "${NET_DEVICE}" > '/sys/class/leds/netdev/device_name' /usr/bin/echo '1' > '/sys/class/leds/netdev/link' if [[ "${NET_LED_TX_RX}" == 'true' ]]; then /usr/bin/echo '1' > '/sys/class/leds/netdev/tx' /usr/bin/echo '1' > '/sys/class/leds/netdev/rx' fi /usr/bin/echo '200' > '/sys/class/leds/netdev/interval' /usr/bin/echo '255 255 255' > '/sys/class/leds/netdev/color' /usr/bin/echo "${NET_LED_BRIGHTNESS}" > '/sys/class/leds/netdev/brightness' if [[ -f "/sys/class/net/${NET_DEVICE}/speed" ]]; then NET_SPEED=$(/usr/bin/cat "/sys/class/net/${NET_DEVICE}/speed") else NET_SPEED='N/A' fi while true; do GATEWAY=$(/usr/bin/ip route | /usr/bin/mawk '/default/ { print $3 }') if /usr/bin/ping -q -c '1' -W '1' "${GATEWAY}" &> '/dev/null'; then if ! set_net_led_color; then /usr/bin/echo '255 255 255' > '/sys/class/leds/netdev/color' fi else case "${NET_SPEED}" in 100) /usr/bin/echo '255 0 0' > '/sys/class/leds/netdev/color' ;; 1000) /usr/bin/echo '255 255 0' > '/sys/class/leds/netdev/color' ;; 10000) /usr/bin/echo '0 255 0' > '/sys/class/leds/netdev/color' ;; *) /usr/bin/echo '255 255 255' > '/sys/class/leds/netdev/color' ;; esac fi /usr/bin/sleep '1m' done