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