#!/usr/bin/bash

# function for removing lockfile
exit-ugreen-netdevmon() {
  if [[ -f "/var/run/ugreen-netdevmon.lock" ]]; then
    rm "/var/run/ugreen-netdevmon.lock"
  fi
}

# trap exit and remove lockfile
trap 'exit-ugreen-netdevmon' EXIT

# check if script is already running
if [[ -f "/var/run/ugreen-netdevmon.lock" ]]; then
  echo "ugreen-netdevmon already running!"
  exit 1
fi
touch /var/run/ugreen-netdevmon.lock

{ lsmod | grep ledtrig_netdev > /dev/null; } || { modprobe -v ledtrig_netdev && sleep 2; }

# load environment variables
if [[ -f /etc/ugreen-leds.conf ]]; then
  source /etc/ugreen-leds.conf
fi

COLOR_NETDEV_NORMAL=${COLOR_NETDEV_NORMAL:="255 255 255"} 
COLOR_NETDEV_GATEWAY_UNREACHABLE=${COLOR_NETDEV_GATEWAY_UNREACHABLE:="255 0 0"} 

BRIGHTNESS_NETDEV_LED=${BRIGHTNESS_NETDEV_LED:="255"} 

CHECK_NETDEV_INTERVAL=${CHECK_NETDEV_INTERVAL:=60} 
CHECK_GATEWAY_CONNECTIVITY=${CHECK_GATEWAY_CONNECTIVITY:=false} 
CHECK_LINK_SPEED=${CHECK_LINK_SPEED:=false} 

led="netdev"
netdev_name=$1
echo netdev > /sys/class/leds/$led/trigger
echo $netdev_name > /sys/class/leds/$led/device_name
echo 1 > /sys/class/leds/$led/link
echo ${NETDEV_BLINK_TX:=1} > /sys/class/leds/$led/tx
echo ${NETDEV_BLINK_RX:=1} > /sys/class/leds/$led/rx
echo ${NETDEV_BLINK_INTERVAL:=200} > /sys/class/leds/$led/interval
echo $COLOR_NETDEV_NORMAL > /sys/class/leds/$led/color
echo $BRIGHTNESS_NETDEV_LED > /sys/class/leds/$led/brightness

function set_netdev_normal_color() {
    color=$COLOR_NETDEV_NORMAL

    if [[ $CHECK_LINK_SPEED == true ]]; then
        case $(cat /sys/class/net/$netdev_name/speed) in
            100)   color=${COLOR_NETDEV_LINK_100:=$COLOR_NETDEV_NORMAL};;
            1000)  color=${COLOR_NETDEV_LINK_1000:=$COLOR_NETDEV_NORMAL};;
            2500)  color=${COLOR_NETDEV_LINK_2500:=$COLOR_NETDEV_NORMAL};;
            10000) color=${COLOR_NETDEV_LINK_10000:=$COLOR_NETDEV_NORMAL};;
        esac
    fi

    echo $color > /sys/class/leds/$led/color
}

if [[ $CHECK_GATEWAY_CONNECTIVITY == false && $CHECK_LINK_SPEED == false ]]; then
    exit 0
fi

gw_conn=1

while true; do

    if [[ $CHECK_GATEWAY_CONNECTIVITY == true ]]; then
        gw=$(ip route | awk '/default/ { print $3 }')
        if ping -q -c 1 -W 1 $gw >/dev/null; then
            gw_conn=1
        else
            gw_conn=0
        fi
    fi

    if [[ $gw_conn == 1 ]]; then
        set_netdev_normal_color
    else
        echo $COLOR_NETDEV_GATEWAY_UNREACHABLE > /sys/class/leds/$led/color
    fi


    sleep ${CHECK_NETDEV_INTERVAL}s

done
