#!/bin/bash
# this tiny script checks for sensor values

usage ()
{
cat << EOF
usage:
This scripts reads sensor values from lmsensors. 
Ensure all modules needed for your hardware are loaded (execute /usr/sbin/sensors-detect if your are in doubt)
An error is reported by this script if the sensor level exceed warning or critical value. For temperature 
values, warn level needs to be set lower than crit level. For fan speed values, crit level needs to be set
lower than warn level.
OPTIONS:
 -h	Show this message
 -s XX	sensor name (execute 'sensors' to see whats available on your system)
 -a xx  adapter (execute 'sensors' and see string in line prior "Adapter:" for valid values)
 -c XX	critical level
 -w XX	warning level 
 -v	verbose mode for debugging
EOF
}

# nagios expects one of these as return values
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# set defaults
VERBOSE=0
WARN_LVL=40
CRIT_LVL=60
SENSOR="temp3" 
MODE=""
ADAPTER="coretemp-isa-0001"
 
# parse input
while getopts "hs:c:w:a:rv" OPTION
do
	case $OPTION in
		h) usage
		  exit $STATE_UNKNOWN
		  ;;	
		w) WARN_LVL=$OPTARG
		   ;;
		c) CRIT_LVL=$OPTARG
		   ;;
		s) SENSOR=$OPTARG
		   ;;
		a) ADAPTER=$OPTARG
		   ;;
		v) VERBOSE=1;
		   ;;
		*) echo "unknown parameter"
		   exit $STATE_UNKNOWN
		   ;;
	esac
done

		
# read sensor value 
if [ $VERBOSE -gt 0 ]; then
	echo `sensors -u $ADAPTER | grep "$SENSOR"_input`
fi
SENSOR_VAL=`sensors -u $ADAPTER | grep "$SENSOR"_input | awk '{ print $2 }'`
if [ -z "$SENSOR_VAL" ]; then
	echo "UNKNOWN - can't read value of $SENSOR on $ADAPTER"
	exit $STATE_UNKNOWN
fi

# assemble performance data string
POSTFIX="|level=$SENSOR_VAL;$WARN_LVL;$CRIT_LVL;;"

if [ $VERBOSE -gt 0 ]; then
	echo "$SENSOR_VAL"
fi

# assemble output string
UNIT=""
OUTPUT_TEXT="$SENSOR@$ADAPTER is at $SENSOR_VAL$UNIT$POSTFIX"

# check if sensor value is out of bounds and exit with correct stdout and exti value
if [ $CRIT_LVL -gt $WARN_LVL ]; then
	# normal mode, sensor value should stay below warn or crit
	if [ `echo $SENSOR_VAL'>'$CRIT_LVL | bc -l` == 1 ]; then
		echo "CRITICAL - $OUTPUT_TEXT"
		exit $STATE_CRITICAL
	fi
	
	if [ `echo $SENSOR_VAL'>'$WARN_LVL | bc -l` == 1 ]; then
		echo "WARNING - $OUTPUT_TEXT"
		exit $STATE_WARNING
	fi
	
	echo "OK - $OUTPUT_TEXT"
	
else
	# reverse mode
	if [ `echo $SENSOR_VAL'<'$CRIT_LVL | bc -l` == 1 ]; then
		echo "CRITICAL - $OUTPUT_TEXT"
		exit $STATE_CRITICAL
	fi
	
	if [ `echo $SENSOR_VAL'<'$WARN_LVL | bc -l` == 1 ]; then
		echo "WARNING - $OUTPUT_TEXT"
		exit $STATE_WARNING
	fi
	
	echo "OK - $OUTPUT_TEXT"
fi
