diff --git a/README.txt b/README.txt index c3b0634..89ad4d3 100644 --- a/README.txt +++ b/README.txt @@ -2,20 +2,28 @@ This plugin can check your printer consumables status using SNMP v1 queries. check_snmp_printer is written in Bash and is distributed under the GPLv2 license. This plugin have been created by Yoann LAMY. -Usage: ./check_snmp_printer -H xxx.xxx.xxx.xxx -C public -t consummable -o black -w 85 -c 90 +Usage: ./check_snmp_printer -H xxx.xxx.xxx.xxx -C public -t consummable -o black -w 15 -c 10 -H ADDRESS Name or IP address of host (default: 127.0.0.1) -C STRING Community name for the host's SNMP agent (default: public) -t STRING -Check type (consummable, page) (default: page) +Check type (consumable, page, model, serial) (default: page) -o STRING -Consummable (black, cyan, magenta, yellow, drum) (default: black) +Consumable (black, cyan, magenta, yellow, drum) (default: black) -w INTEGER -Warning level for consummable in percent (default: 0) +Warning level for consumable in percent (default: 0) -c INTEGER -Critical level for consummable in percent (default: 0) +Critical level for consumable in percent (default: 0) +-X STRING +Overwrites OID used in check type PAGE, MODEL and SERIAL. Also used for check type CONSUMABLE (replaces OID_NAME) +-Y STRING +Overwrites OID used in check type CONSUMABLE (replaces OID_TOTAL) +-Z STRING +Overwrites OID used in check type CONSUMABLE (replaces OID_STATUS) +-n +Use SNMPGETNEXT instead of SNMPGET command -h Print this help screen -V @@ -26,7 +34,7 @@ This plugin support performance data output. If the percentage of the warning le Examples : -./check_snmp_printer -H xxx.xxx.xxx.xxx -C public -t consummable -o black -w 85 -c 90 +./check_snmp_printer -H xxx.xxx.xxx.xxx -C public -t consummable -o black -w 15 -c 10 ./check_snmp_printer -H xxx.xxx.xxx.xxx -C public -t page This nagios plugins comes with ABSOLUTELY NO WARRANTY. diff --git a/check_snmp_printer b/check_snmp_printer index 34a3080..208b60a 100644 --- a/check_snmp_printer +++ b/check_snmp_printer @@ -5,20 +5,42 @@ # Version : 1.0 # Author : Yoann LAMY # Licence : GPLv2 +# +# Version : 1.1 +# Author : Michael Nolte (@mn26826) +# Changes and improvements: +# +# * Added check types "MODEL" and "SERIAL" for parameter "-t" +# * Added parameter "-n" for using SNMPGETNEXT instead of SNMPGET +# * Changed french variable names to english +# * Printer is tested by a single ping before firing the snmp commands. Just to +# ensure the device is accessable. If the printer is not responding (turned +# off) the state defined in $STATE_NOTRESPONDING is returned. By default this +# is "OK" to avoid warnings for devices that are not running 24x7. +# * Changed the way consumables are interpreted. Now the REMAINING value is +# returned. Seemed more intuitive to me. +# * Used OIDs can be overwritten by parameters -X (OID_1), -Y (OID_2) and -Z +# (OID_3) if the default OIDs in this plugin are not suitable for your +# specific device. +# Use -X for check types PAGE, MODEL and SERIAL. +# Use -X, -Y and -Z for check type CONSUMABLE. OID_1 replaces OID_NAME, OID_2 +# replaces OID_TOTAL, OID_3 replaces OID_STATUS. # Commands CMD_BASENAME="/bin/basename" CMD_SNMPGET="/usr/bin/snmpget" +CMD_SNMPGETNEXT="/usr/bin/snmpgetnext" CMD_SNMPWALK="/usr/bin/snmpwalk" CMD_GREP="/bin/grep" CMD_AWK="/bin/awk" CMD_EXPR="/usr/bin/expr" +CMD_PING="/usr/bin/ping" # Script name SCRIPTNAME=`$CMD_BASENAME $0` # Version -VERSION="1.0" +VERSION="1.1" # Plugin return codes STATE_OK=0 @@ -26,6 +48,9 @@ STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 +# What should be the state if the printer is not responding? +STATE_NOTRESPONDING=$STATE_OK + # Default OID (Printer-MIB) OID_NAME=".1.3.6.1.2.1.43.11.1.1.6.1" OID_TOTAL=".1.3.6.1.2.1.43.11.1.1.8.1" @@ -37,6 +62,9 @@ OID_STATUS_OTHER=".1.3.6.1.2.1.43.10.2.1.10.1" OID_PAGE=".1.3.6.1.2.1.43.10.2.1.4.1.1" +OID_MODEL=".1.3.6.1.2.1.25.3.2.1.3.1" +OID_SERIAL=".1.3.6.1.2.1.43.5.1.1.17.1" + # Default variables DESCRIPTION="Unknown" STATE=$STATE_UNKNOWN @@ -45,18 +73,22 @@ STATE=$STATE_UNKNOWN COMMUNITY="public" HOSTNAME="127.0.0.1" TYPE="page" -CONSUMMABLE="black" +CONSUMABLE="black" WARNING=0 CRITICAL=0 +OID_1="" +OID_2="" +OID_3="" # Option processing print_usage() { - echo "Usage: ./check_snmp_printer -H 127.0.0.1 -C public -t consummable -o black -w 85 -c 90" + echo "Usage: ./check_snmp_printer -H 127.0.0.1 -C public -t consumable -o black -w 15 -c 10" echo " $SCRIPTNAME -H ADDRESS" echo " $SCRIPTNAME -C STRING" echo " $SCRIPTNAME -t STRING" echo " $SCRIPTNAME -w INTEGER" echo " $SCRIPTNAME -c INTEGER" + echo " $SCRIPTNAME -n" echo " $SCRIPTNAME -h" echo " $SCRIPTNAME -V" } @@ -80,13 +112,22 @@ print_help() { echo "-C STRING" echo " Community name for the host's SNMP agent (default: public)" echo "-t STRING" - echo " Check type (consummable, page) (default: page)" + echo " Check type (consumable, page, model, serial) (default: page)" echo "-o STRING" - echo " Consummable (black, cyan, magenta, yellow, drum) (default: black)" + echo " Consumable (black, cyan, magenta, yellow, drum) (default: black)" echo "-w INTEGER" - echo " Warning level for consummable in percent (default: 0)" + echo " Warning level for consumable in percent (default: 0)" echo "-c INTEGER" - echo " Critical level for consummable in percent (default: 0)" + echo " Critical level for consumable in percent (default: 0)" + echo "-X STRING" + echo " Overwrites OID used in check type PAGE, MODEL and SERIAL. Also used" + echo " for check type CONSUMABLE (replaces OID_NAME)" + echo "-Y STRING" + echo " Overwrites OID used in check type CONSUMABLE (replaces OID_TOTAL)" + echo "-Z STRING" + echo " Overwrites OID used in check type CONSUMABLE (replaces OID_STATUS)" + echo "-n" + echo " Use SNMPGETNEXT instead of SNMPGET" echo "-h" echo " Print this help screen" echo "-V" @@ -98,15 +139,19 @@ print_help() { echo "If the percentage of the warning level and the critical level are 0, then the script returns a state OK." } -while getopts H:C:t:o:w:c:hV OPT +while getopts H:C:t:o:w:c:hV:X:Y:Z:n OPT do case $OPT in H) HOSTNAME="$OPTARG" ;; C) COMMUNITY="$OPTARG" ;; t) TYPE="$OPTARG" ;; - o) CONSUMMABLE="$OPTARG" ;; + o) CONSUMABLE="$OPTARG" ;; w) WARNING=$OPTARG ;; c) CRITICAL=$OPTARG ;; + X) OID_1=$OPTARG ;; + Y) OID_2=$OPTARG ;; + Z) OID_3=$OPTARG ;; + n) CMD_SNMPGET=$CMD_SNMPGETNEXT ;; h) print_help exit $STATE_UNKNOWN @@ -118,79 +163,121 @@ do esac done -# Plugin processing -if [ $TYPE = "consummable" ]; then - # Check the consummable of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t consummable -o black -w 85 -c 90) - CONSUMMABLE_NAME=$CONSUMMABLE - - if [ $CONSUMMABLE = "black" ]; then - CONSUMMABLE_NAME="black\|cartouche\|toner" - fi +# Check if printer is alive +$CMD_PING -c 1 $HOSTNAME >/dev/null +if [ "$?" = 0 ]; then + # Printer is responding - CONSUMMABLE_ID=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME | $CMD_GREP -i "${CONSUMMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}'` - if [ -z "$CONSUMMABLE_ID" ]; then - CONSUMMABLE_ID=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME_OTHER | $CMD_GREP -i "${CONSUMMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}'` - fi + # Plugin processing + if [ $TYPE = "consumable" ]; then + if [ ! -z $OID_1 ]; then + OID_NAME="$OID_1" + fi + + if [ ! -z $OID_2 ]; then + OID_TOTAL="$OID_2" + fi + + if [ ! -z $OID_3 ]; then + OID_STATUS="$OID_3" + fi + + # Check the consumable of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t consumable -o black -w 15 -c 10) + CONSUMABLE_NAME=$CONSUMABLE - if [ -n "$CONSUMMABLE_ID" ]; then - CONSUMMABLE_TOTAL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_TOTAL}.${CONSUMMABLE_ID}` - CONSUMMABLE_STATUS=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_STATUS}.${CONSUMMABLE_ID}` + if [ $CONSUMABLE = "black" ]; then + CONSUMABLE_NAME="black\|cartouche\|toner" + fi - if [ ${CONSUMMABLE_TOTAL: 0:1} = "-" ]; then - CONSUMMABLE_TOTAL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_TOTAL_OTHER}.${CONSUMMABLE_ID}` - CONSUMMABLE_STATUS=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_STATUS_OTHER}.${CONSUMMABLE_ID}` + CONSUMABLE_ID=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME | $CMD_GREP -i "${CONSUMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}'` + if [ -z "$CONSUMABLE_ID" ]; then + CONSUMABLE_ID=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME_OTHER | $CMD_GREP -i "${CONSUMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}'` fi - if [ -n "$CONSUMMABLE_TOTAL" ] && [ -n "$CONSUMMABLE_STATUS" ]; then + if [ -n "$CONSUMABLE_ID" ]; then + CONSUMABLE_TOTAL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_TOTAL}.${CONSUMABLE_ID}` + CONSUMABLE_STATUS=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_STATUS}.${CONSUMABLE_ID}` + + if [ ${CONSUMABLE_TOTAL: 0:1} = "-" ]; then + CONSUMABLE_TOTAL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_TOTAL_OTHER}.${CONSUMABLE_ID}` + CONSUMABLE_STATUS=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME ${OID_STATUS_OTHER}.${CONSUMABLE_ID}` + fi - CONSUMMABLE_POURCENT=`$CMD_EXPR \( $CONSUMMABLE_STATUS \* 100 \) / \( $CONSUMMABLE_TOTAL \)` - CONSUMMABLE_USED_POURCENT=`$CMD_EXPR 100 \- $CONSUMMABLE_POURCENT` + if [ -n "$CONSUMABLE_TOTAL" ] && [ -n "$CONSUMABLE_STATUS" ]; then - if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then + CONSUMABLE_PERCENT=`$CMD_EXPR \( $CONSUMABLE_STATUS \* 100 \) / \( $CONSUMABLE_TOTAL \)` - if [ $CONSUMMABLE_USED_POURCENT -gt $CRITICAL ] && [ $CRITICAL != 0 ]; then - STATE=$STATE_CRITICAL - elif [ $CONSUMMABLE_USED_POURCENT -gt $WARNING ] && [ $WARNING != 0 ]; then - STATE=$STATE_WARNING + if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then + if [ $CONSUMABLE_PERCENT -lt $CRITICAL ] && [ $CRITICAL != 0 ]; then + STATE=$STATE_CRITICAL + elif [ $CONSUMABLE_PERCENT -lt $WARNING ] && [ $WARNING != 0 ]; then + STATE=$STATE_WARNING + else + STATE=$STATE_OK + fi else STATE=$STATE_OK fi + + case "$CONSUMABLE" in + black) + CONSUMABLE_NAME="BK" + ;; + cyan) + CONSUMABLE_NAME="C" + ;; + magenta) + CONSUMABLE_NAME="M" + ;; + yellow) + CONSUMABLE_NAME="Y" + ;; + drum) + CONSUMABLE_NAME="Drum" + ;; + *) + CONSUMABLE_NAME="" + esac + + DESCRIPTION="Remaining $CONSUMABLE_NAME : ${CONSUMABLE_PERCENT}% | cons_remain=${CONSUMABLE_PERCENT};$WARNING;$CRITICAL;0" else - STATE=$STATE_OK + DESCRIPTION="Printer not responding on snmp request." fi - - case "$CONSUMMABLE" in - black) - CONSUMMABLE_NAME="of the black cartridge" - ;; - cyan) - CONSUMMABLE_NAME="of the cyan cartridge" - ;; - magenta) - CONSUMMABLE_NAME="of the magenta cartridge" - ;; - yellow) - CONSUMMABLE_NAME="of the yellow cartridge" - ;; - drum) - CONSUMMABLE_NAME="of the printing device" - ;; - *) - CONSUMMABLE_NAME="of the consummable" - esac - - DESCRIPTION="Utilisation $CONSUMMABLE_NAME : ${CONSUMMABLE_USED_POURCENT}% | cons_used=${CONSUMMABLE_USED_POURCENT};$WARNING;$CRITICAL;0" - else - DESCRIPTION="Printer is waiting" + fi + elif [ $TYPE = "model" ]; then + if [ ! -z $OID_1 ]; then + OID_MODEL="$OID_1" + fi + # Check model name of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t model) + MODEL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_MODEL` + if [ -n "$MODEL" ]; then + DESCRIPTION="$MODEL" + STATE=$STATE_OK + fi + elif [ $TYPE = "serial" ]; then + if [ ! -z $OID_1 ]; then + OID_SERIAL="$OID_1" + fi + # Check model name of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t model) + SERIAL=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_SERIAL` + if [ -n "$SERIAL" ]; then + DESCRIPTION="S/N: $SERIAL" + STATE=$STATE_OK + fi + elif [ $TYPE = "page" ]; then + if [ ! -z $OID_1 ]; then + OID_PAGE="$OID_1" + fi + # Check page number of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t page) + PAGES=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_PAGE` + if [ -n "$PAGES" ]; then + DESCRIPTION="Page count : $PAGES | pages=$PAGES;0;0;0" + STATE=$STATE_OK fi fi -elif [ $TYPE = "page" ]; then - # Check page number of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t page) - PAGES=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_PAGE` - if [ -n "$PAGES" ]; then - DESCRIPTION="Page number : $PAGES | pages=$PAGES;0;0;0" - STATE=$STATE_OK - fi +else + DESCRIPTION="Printer not responding / turned off." + STATE=$STATE_NOTRESPONDING fi echo $DESCRIPTION