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