#!/bin/bash

EXIT_CODE=0
MB=1048576
MAX=$((10240*MB/8))
WARN=100
CRIT=100
if [ "$2" ]; then
    MAX=$(($2*MB/8))
fi
if [ "$4" ]; then
    WARN=$3
    CRIT=$4
fi

DIR="/sys/class/net/$1/statistics"
PROC_BONDING="/proc/net/bonding/$1"

if [ ! -d "$DIR" ]; then
    echo "CRITICAL - $1: No such device"
    exit 2
fi

OPER_STATE="`cat /sys/class/net/$1/operstate`"
STATE="OK - $1 $OPER_STATE"

if [ "$OPER_STATE" = "down" ]; then
  STATE="CRITICAL - $1 $OPER_STATE"
  EXIT_CODE=2
fi

for fn in $DIR/*; do
    val="`basename $fn`"
    eval arr_$val=`cat \$fn`
done

add() {
    rx_name="rx_$1"
    eval rx_bytes="\$arr_rx_$1"
    tx_name="tx_$1"
    eval tx_bytes="\$arr_tx_$1"
    suffix="$2"
    printf " rx_%s=%d%s tx_%s=%d%s" \
      "$1" "$rx_bytes" "$suffix" "$1" "$tx_bytes" "$suffix"
}

if [ -f "$PROC_BONDING" ]; then
  # check bonding interface
  if [ `grep "MII Status: up" "$PROC_BONDING" | wc -l` = 3 ]; then
    STATE="OK - $1 $OPER_STATE"
  else
    STATE="CRITICAL - bonding problem on $1"
    EXIT_CODE=2
  fi
fi

printf "%s|collisions=%sc;1;10;0;%d" "$STATE" $arr_collisions $MAX
mw=$((MAX*WARN/100))
mc=$((MAX*CRIT/100))
add 'bytes' "c;$mw;$mc;0;$MAX"
add 'packets' "c;;;0;$MAX"
add 'errors' "c;1;10;0;$MAX"
add 'dropped' "c;1;10;0;$MAX"
printf "\n"

exit $EXIT_CODE
