#!/bin/bash

# string for help text
usage()
{
cat << EOF
usage:
This script reads the status load status of trays of a laser printer via snmp.
OPTIONS:
 -h	Show this message
 -w	warning level of supply status as integer number 0-100 (default 5)
 -c 	critical value of supply status as integer number 0-100 (default 0, empty)
 -H	hostname (default NPIED9348)
 -s	supply index (default 1)
 -d	snmp domain (default "public")
 -p	snmp protocol (default 1)
 -v	verbose
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 default values
HOSTNAME="NPIED9348"
DOM="public"
SNMP_VERSION=1
TRAY_IDX=1
CRIT_PERCENT=0 # in percent of max level
WARN_PERCENT=5 # in percent of max level
VERBOSE=0


# override default values with input arguments
while getopts ":hw:c:H:t:d:P:v" OPTION
do
  case $OPTION in
	h) usage
	   exit $STATE_UNKNOWN; # nothing checked, but feasible input
	   ;;
	w) WARN_PERCENT=$OPTARG
	   ;;
	c) CRIT_PERCENT=$OPTARG
	   ;;
	H) HOSTNAME=$OPTARG
	   ;;
	t) TRAY_IDX=$OPTARG
	   ;;
	d) DOM=$OPTARG
	   ;;
	P) SNMP_VERSION=$OPTARG
	   ;;
	v) VERBOSE=1;
	   ;;
	?) echo "unknown parameter" 
	   usage
	   exit $NAG_UNKNOWN;
 	   ;;
  esac
done                                
                                                                                                                               

# get values from printer
TRAY_STR=$(snmpwalk -v $SNMP_VERSION -Ov -Oq -c $DOM $HOSTNAME SNMPv2-SMI::mib-2.43.8.2.1.13.1.$TRAY_IDX)
if [ $? -ne 0 ]; then
	echo "UNKNOWN - snmpwalk exited with $TMP"
	exit $STATE_UNKNOWN
fi
LOAD_LEV=$(snmpwalk -v $SNMP_VERSION -Ov -Oq -c $DOM $HOSTNAME SNMPv2-SMI::mib-2.43.8.2.1.10.1.$TRAY_IDX)
if [ $? -ne 0 ]; then
	echo "UNKNOWN - snmpwalk exited with $TMP"
	exit $STATE_UNKNOWN
fi

# compare values to crit- and warn-levels
if [ $LOAD_LEV -eq -3 ]; then
	# printer can say that there is paper in the tray, but can not determine the amount
	echo "OK - Paper is loaded in $TRAY_STR"
	RET_VAL=$STATUS_OK
elif [ $LOAD_LEV -eq -2 ]; then
	# printer has no option to read tray load
	echo "UNKNOWN - Printer can not determine status of $TRAY_STR"
	RET_VAL=$STATUS_UNKNOWN
elif [ $LOAD_LEV -gt 0 ]; then
	# printer can estimate the load value as a number
	LOAD_MAX_LEV=$(snmpwalk -v $SNMP_VERSION -Ov -Oq -c $DOM $HOSTNAME SNMPv2-SMI::mib-2.43.8.2.1.9.1.$TRAY_IDX)
	if [ $? -ne 0 ]; then
		echo "UNKNOWN - snmpwalk exited with $TMP"
		exit $STATE_UNKNOWN
	fi
	# calculate values of of percentages
	WARN_LEV=$(($WARN_PERCENT*$LOAD_MAX_LEV/100))
	CRIT_LEV=$(($CRIT_PERCENT*$LOAD_MAX_LEV/100))
	
        if [ $LOAD_LEV -lt $CRIT_LEV ]; then
                echo "CRITICAL - $TRAY_STR is is low at $LOAD_LEV/$LOAD_MAX_LEV|level=$LOAD_LEV;$WARN_LEV;$CRIT_LEV;0;$LOAD_MAX_LEV"
                RET_VAL=$STATE_CRITICAL
        elif [ $LOAD_LEV -lt $WARN_LEV ]; then
                echo "WARN - $TRAY_STR is low at $LOAD_LEV/$LOAD_MAX_LEV|level=$LOAD_LEV;$WARN_LEV;$LOAD_LEV;0;$LOAD_MAX_LEV"
                RET_VAL=$STATE_WARNING
        else
                echo "OK - $TRAY_STR is at $LOAD_LEV/$LOAD_MAX_LEV|level=$LOAD_LEV;$WARN_LEV;$CRIT_LEV;0;$LOAD_MAX_LEV"
                REV_VAL=$STATE_OK
        fi
else
	echo "UNKNOWN - cannot interpret return value $LOAD_LEV of $TRAY_STR"
	RET_VAL=$STATE_UNKNOWN
fi

exit $RET_VAL

