Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down
221 changes: 154 additions & 67 deletions check_snmp_printer
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,52 @@
# 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
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"
Expand All @@ -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
Expand All @@ -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"
}
Expand All @@ -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"
Expand All @@ -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
Expand All @@ -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
Expand Down