#!/bin/bash # check_snmp_printer # Description : Check the status of a printer # Version : 1.1 # Author : Yoann LAMY # Licence : GPLv2 # Commands CMD_BASENAME="/usr/bin/basename" CMD_SNMPGET="/usr/bin/snmpget" CMD_SNMPWALK="/usr/bin/snmpwalk" CMD_GREP="/usr/bin/grep" CMD_AWK="/usr/bin/awk" CMD_EXPR="/usr/bin/expr" # Script name SCRIPTNAME=`$CMD_BASENAME $0` # Version VERSION="1.1" # Plugin return codes STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 # 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" OID_STATUS=".1.3.6.1.2.1.43.11.1.1.9.1" OID_NAME_OTHER=".1.3.6.1.2.1.43.12.1.1.4.1" OID_TOTAL_OTHER=".1.3.6.1.2.1.43.10.2.1.9.1" OID_STATUS_OTHER=".1.3.6.1.2.1.43.10.2.1.10.1" OID_DEVICE_PRINTER=".1.3.6.1.2.1.25.3.2.1.3.1" OID_SERIAL_NUMBER=".1.3.6.1.2.1.43.5.1.1.17.1" OID_PAGE=".1.3.6.1.2.1.43.10.2.1.4.1.1" # Default variables DESCRIPTION="Unknown" STATE=$STATE_UNKNOWN # Default options COMMUNITY="public" HOSTNAME="127.0.0.1" TYPE="page" CONSUMABLE="black" WARNING=0 CRITICAL=0 # Option processing print_usage() { echo "Usage: ./check_snmp_printer -H 127.0.0.1 -C public -t consumable -o black -w 85 -c 90" echo " $SCRIPTNAME -H ADDRESS" echo " $SCRIPTNAME -C STRING" echo " $SCRIPTNAME -t STRING" echo " $SCRIPTNAME -w INTEGER" echo " $SCRIPTNAME -c INTEGER" echo " $SCRIPTNAME -h" echo " $SCRIPTNAME -V" } 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." } print_help() { print_version echo "" print_usage echo "" echo "Check the status of the printer" echo "" echo "-H ADDRESS" echo " Name or IP address of host (default: 127.0.0.1)" echo "-C STRING" echo " Community name for the host's SNMP agent (default: public)" echo "-t STRING" echo " Check type (consumable, page, info) (default: page)" echo "-o STRING" echo " Consumable (black, cyan, magenta, yellow, drum) (default: black)" echo "-w INTEGER" echo " Warning level for consumable in percent (default: 0)" echo "-c INTEGER" echo " Critical level for consumable in percent (default: 0)" echo "-h" echo " Print this help screen" echo "-V" echo " Print version and license information" echo "" echo "" echo "This plugin uses the 'snmpget' command and 'snmpwalk' command included with the NET-SNMP package." echo "This plugin support performance data output." 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 do case $OPT in H) HOSTNAME="$OPTARG" ;; C) COMMUNITY="$OPTARG" ;; t) TYPE="$OPTARG" ;; o) CONSUMABLE="$OPTARG" ;; w) WARNING=$OPTARG ;; c) CRITICAL=$OPTARG ;; h) print_help exit $STATE_UNKNOWN ;; V) print_version exit $STATE_UNKNOWN ;; esac done # Plugin processing if [ $TYPE = "consumable" ] || [ $TYPE = "consummable" ]; then # Check the consumable of the printer (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t consumable -o black -w 85 -c 90) CONSUMABLE_NAME=$CONSUMABLE if [ $CONSUMABLE = "black" ]; then CONSUMABLE_NAME="black\|cartouche\|toner" fi CONSUMABLE_ID=`$CMD_SNMPWALK -t 2 -r 2 -v 1 -c $COMMUNITY $HOSTNAME $OID_NAME | $CMD_GREP -m 1 -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 -m 1 -i "${CONSUMABLE_NAME}" | $CMD_AWK '{ print $1 }' | $CMD_AWK -F "." '{print $NF}'` fi 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}.${CONSMMABLE_ID}` fi if [ -n "$CONSUMABLE_TOTAL" ] && [ -n "$CONSUMABLE_STATUS" ]; then CONSUMABLE_PERCENT=`$CMD_EXPR \( $CONSUMABLE_STATUS \* 100 \) / \( $CONSUMABLE_TOTAL \)` CONSUMABLE_USED_PERCENT=`$CMD_EXPR 100 \- $CONSUMABLE_PERCENT` if [ $WARNING != 0 ] || [ $CRITICAL != 0 ]; then if [ $CONSUMABLE_USED_PERCENT -gt $CRITICAL ] && [ $CRITICAL != 0 ]; then STATE=$STATE_CRITICAL elif [ $CONSUMABLE_USED_PERCENT -gt $WARNING ] && [ $WARNING != 0 ]; then STATE=$STATE_WARNING else STATE=$STATE_OK fi else STATE=$STATE_OK fi case "$CONSUMABLE" in black) CONSUMABLE_NAME="of the black cartridge" ;; cyan) CONSUMABLE_NAME="of the cyan cartridge" ;; magenta) CONSUMABLE_NAME="of the magenta cartridge" ;; yellow) CONSUMABLE_NAME="of the yellow cartridge" ;; drum) CONSUMABLE_NAME="of the printing device" ;; *) CONSUMABLE_NAME="of the consumable" esac DESCRIPTION="Utilisation $CONSUMABLE_NAME : ${CONSUMABLE_USED_PERCENT}% | cons_used=${CONSUMABLE_USED_PERCENT};$WARNING;$CRITICAL;0" else DESCRIPTION="Printer is waiting" 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 count : $PAGES | pages=$PAGES;0;0;0" STATE=$STATE_OK fi elif [ $TYPE = "info" ]; then # Information (Usage : ./check_snmp_printer -H 127.0.0.1 -C public -t info) DEVICE_PRINTER=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_DEVICE_PRINTER` SERIAL_NUMBER=`$CMD_SNMPGET -t 2 -r 2 -v 1 -c $COMMUNITY -Ovq $HOSTNAME $OID_SERIAL_NUMBER | $CMD_AWK -F '"' '{print $2}'` DESCRIPTION="Info : $DEVICE_PRINTER (${SERIAL_NUMBER})" STATE=$STATE_OK fi echo $DESCRIPTION exit $STATE