#!/bin/bash #Sat Apr 16 09:39:35 EDT 2016 # check_cableModemSignal # Description : Check the cable modem signal to noise ratios # Version : 1.0 # Author : Vince Herried # License : GPLv3 # http://www.speedguide.net/faq/what-cable-modem-signal-levels-are-considered-good-78 # suggests the following levels are considered good # Signal/Noise Ratio (SNR , >30dB) # Commands CMD_GREP="/bin/grep" CMD_AWK="/usr/bin/awk" CMD_EXPR="/usr/bin/expr" CMD_WGET="/usr/bin/wget" SCRIPTNAME=$(basename $0) # Version VERSION="1.0" # Plugin return codes STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 # Default options HOSTNAME="192.168.100.1" WARNING=0 CRITICAL=0 print_version() { echo $SCRIPTNAME version $VERSION echo "" echo "The nagios plugins come with ABSOLUTELY NO WARRANTY." echo "You may redistribute copies of the plugins under the terms of the GNU General Public License v2." } # Option processing print_usage() { echo "Usage: ./$SCRIPTNAME -H 192.168.100.1 -w 4 -c 1" echo " $SCRIPTNAME -H ADDRESS" echo " $SCRIPTNAME -w INTEGER" echo " $SCRIPTNAME -c INTEGER" echo " $SCRIPTNAME -h" echo " $SCRIPTNAME -V" } print_help() { print_version echo "" print_usage echo "" echo "Check the signal to noise ratio(s) of a cable modem" echo "" echo "-H ADDRESS" echo " Name or IP address of cable modem (default: 192.168.100.1)" echo "-w INTEGER" echo " Warning level if any of the signal to noise level is less than this value (default: 0)" echo "-c INTEGER" echo " Critical level if any of the signal to noise level is less than this value (default: 0)" echo "-h" echo " Print this help screen" echo "-V" echo " Print version and license information" echo "" echo "" } while getopts H:w:c:hV OPT do case $OPT in H) HOSTNAME="$OPTARG" ;; w) WARNING=$OPTARG ;; c) CRITICAL=$OPTARG ;; h) print_help exit $STATE_UNKNOWN ;; V) print_version exit $STATE_UNKNOWN ;; esac done # Plugin processing # does this look like the modem? STATUS="Cable Modem Status" $CMD_WGET -E -H -K -p --output-document=- http://$HOSTNAME/indexData.htm 2>/dev/null | $CMD_GREP "$STATUS" >/dev/null RC=$? if [ $RC -ne 0 ] ; then echo "This doesn't appear to be a valid cable modem web page" echo "The first page of the web interface does not include the character string $STATUS" print_help exit $STATE_UNKNOWN fi # is the modem operational ? OPERATIONAL="Operational" $CMD_WGET --output-document=- http://$HOSTNAME/indexData.htm 2>/dev/null | $CMD_GREP "$OPERATIONAL" >/dev/null RC=$? if [ $RC -ne 0 ] ; then echo "The cable modem does not appear to be operational" exit $STATE_CRITICAL fi LOWSNR=9999; CHAN=0; get_low() { # count the number of channels and gather the lowest SNR found if [ $1 -ne 0 ] ; then let CHAN=$CHAN+1 if [ $1 -lt $LOWSNR ] ; then LOWSNR=$1 fi fi } SNR="dB " SNRString=`$CMD_WGET --output-document=- -E -H -K -p http://$HOSTNAME/cmSignalData.htm 2>/dev/null | grep "$SNR"` S1=`echo $SNRString | $CMD_AWK '{ print $1 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S1 S2=`echo $SNRString | $CMD_AWK '{ print $2 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S2 S3=`echo $SNRString | $CMD_AWK '{ print $3 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S3 S4=`echo $SNRString | $CMD_AWK '{ print $4 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S4 S5=`echo $SNRString | $CMD_AWK '{ print $5 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S5 S6=`echo $SNRString | $CMD_AWK '{ print $6 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S6 S7=`echo $SNRString | $CMD_AWK '{ print $7 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S7 S8=`echo $SNRString | $CMD_AWK '{ print $8 }' | $CMD_AWK -F ">" '{ print $NF }'` get_low $S8 if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then if [ $LOWSNR -lt $CRITICAL ] && [ $CRITICAL != 0 ]; then STATE=$STATE_CRITICAL elif [ $LOWSNR -lt $WARNING ] && [ $WARNING != 0 ]; then STATE=$STATE_WARNING else STATE=$STATE_OK fi else STATE=$STATE_OK fi DESCRIPTION="The lowest Cable modem signal to noise ratio was $LOWSNR on the $CHAN checked channels." echo $DESCRIPTION exit $STATE