2021/monitoring/icinga2/scripts/openwrt_check_interface_load.sh

158 lines
5.0 KiB
Bash
Raw Normal View History

#!/bin/ash
# set -x
START=`date +%s`
#INTERFACES=`ls /sys/class/net/`
while getopts "w:c:h" OPT; do
case $OPT in
"w") warn=$OPTARG;;
"c") crit=$OPTARG;;
"h") help;;
esac
done
WARNING=$(echo "$warn * 1000000" | bc)
CRITICAL=$(echo "$crit * 1000000" | bc)
#which iftop > /dev/null 2>&1
#if [ $? != 0 ]; then
# echo "Iftop not installed"
# exit 1
#fi
IFTOP="/usr/bin/iftop"
PERFDATA=""
overloaded=""
ex_st=0
int=0
int_ol=0
for i in eth0;
do
#IF_UP=`cat /sys/class/net/$i/operstate`
if [ -e "/sys/class/net/$i/operstate" ]; then
IF_UP=`cat /sys/class/net/$i/operstate 2>&1`
else
continue
fi
if [ $IF_UP == "up" ] || [ $IF_UP == "unknown" ]; then
INTERFACE=$i
TMP_FILE="/tmp/int_${INTERFACE}_cache"
$IFTOP -i $INTERFACE -n -t -s 2 > $TMP_FILE 2>&1
if [ $? != 0 ]; then
rm -f $TMP_FILE
continue
fi
##### TOTAL ########
TOTAL=`cat $TMP_FILE | grep -i 'Total send and receive rate'| awk -F ":" '{print $2}'| awk '{print $1}'`
####################
##### SEND RATE ####
SEND=`cat $TMP_FILE | grep -i 'Total send rate'| awk -F ":" '{print $2}'| awk '{print $1}'`
###################
#### REC RATE #####
REC=`cat $TMP_FILE | grep -i 'Total receive rate'| awk -F ":" '{print $2}'| awk '{print $1}'`
##################
rm -f $TMP_FILE 2>&1
metric=`echo "$TOTAL" | grep -Eo '[[:alpha:]]+'`
TOTAL=${TOTAL/${metric}}
TOTAL=`echo "$TOTAL" | sed 's/,/./'`
if [ $metric == "Mb" ]; then
TOTAL=$(echo "$TOTAL * 1000000" | bc)
elif [ $metric == "Kb" ]; then
TOTAL=$(echo "$TOTAL * 1000" | bc)
elif [ $metric == "b" ]; then
TOTAL=$TOTAL
else
TOTAL=$TOTAL
fi
TOTAL=${TOTAL%.*}
metric=`echo "$SEND" | grep -Eo '[[:alpha:]]+'`
SEND=${SEND/${metric}}
SEND=`echo "$SEND" | sed 's/,/./'`
if [ $metric == "Mb" ]; then
SEND=$(echo "$SEND * 1000000" | bc)
elif [ $metric == "Kb" ]; then
SEND=$(echo "$SEND * 1000" | bc)
elif [ $metric == "b" ]; then
SEND=$SEND
else
SEND=$SEND
fi
SEND=${SEND%.*}
metric=`echo "$REC" | grep -Eo '[[:alpha:]]+'`
REC=${REC/${metric}}
REC=`echo "$REC" | sed 's/,/./'`
if [ $metric == "Mb" ]; then
REC=$(echo "$REC * 1000000" | bc)
elif [ $metric == "Kb" ]; then
REC=$(echo "$REC * 1000" | bc)
elif [ $metric == "b" ]; then
REC=$REC
else
REC=$REC
fi
REC=${REC%.*}
if [ -z $TOTAL ] ; then
TOTAL=0
fi
if [ $TOTAL -ge $CRITICAL ]; then
overloaded="$overloaded $INTERFACE"
int_ol=$(echo "$int_ol + 1" | bc)
ex_st=2
elif [ $TOTAL -lt $CRITICAL ] && [ $TOTAL -ge $WARNING ]; then
overloaded="$overloaded $INTERFACE"
int_ol=$(echo "$int_ol + 1" | bc)
if [ $ex_st -eq 0 ]; then
ex_st=1
fi
elif [ $TOTAL -le $WARNING ]; then
if [ $ex_st -eq 0 ]; then
ex_st=0
fi
else
echo 0 > /dev/null
fi
int=$(echo "$int + 1" | bc)
PERFDATA="$PERFDATA Total_$INTERFACE=${TOTAL};${WARNING};${CRITICAL};0;${CRITICAL} Send_$INTERFACE=${SEND}; Receive_$INTERFACE=${REC};"
elif [ $IF_UP == "down" ]; then
echo 0 > /dev/null
else
echo 0 > /dev/null
fi
done
END=`date +%s`
EXEC_TIME=$(($END-$START))
PERFDATA="$PERFDATA ExecTime=$EXEC_TIME;"
if [ $ex_st -eq 0 ]; then
echo "OK: $int interfaces under expected load | $PERFDATA"
exit $ex_st
elif [ $ex_st -eq 1 ]; then
echo "Warning: $int_ol overloaded interfaces ($overloaded); $int interfaces OK | $PERFDATA"
exit $ex_st
elif [ $ex_st -eq 2 ]; then
echo "Critical: $int_ol overloaded interfaces ($overloaded); $int interfaces OK | $PERFDATA"
exit $ex_st
else
echo "Unknown: $int_ol overloaded interfaces ($overloaded). $int interfaces OK | $PERFDATA"
exit 3
fi