Plugins:Dev
From Wiki Centreon
If you want to develop your own plugins for specific checks, get information about plugins here :
http://nagiosplug.sourceforge.net/developer-guidelines.html
check_fsnmp plugin
This plugin is a script shell, it allows user to set perfdata labels and metrics.
exemple :
nagios command check sample :
define command {
command_name check_snmp_cpustat
command_line $USER1$/check_fsnmp -H $HOSTADDRESS$ -C $ARG1$ -o ".1.3.6.1.4.1.2021.11.9.0 .1.3.6.1.4.1.2021.11.10.0 .1.3.6.1.4.1.2021.11.11.0" -l "cpu_user cpu_system cpu_idle" -m "% % %" -w "90 70 70" -c "120 100 100"
}
using :
-bash-3.1$ ./check_fsnmp -H proton -C public -o ".1.3.6.1.4.1.2021.11.9.0 .1.3.6.1.4.1.2021.11.10.0 .1.3.6.1.4.1.2021.11.11.0" -l "cpu_user cpu_system cpu_idle" -m "% % %" -w "90 70 70" -c "120 100 100" cpu_user:OK-0% cpu_system:OK-0% cpu_idle:WARNING-99>70% | cpu_user=0%;120;90; cpu_system=0%;100;70; cpu_idle=99%;100;70; -bash-3.1$ echo $? 1 -bash-3.1$
plugin code :
#!/bin/bash
##############################################################################
# Author : G. Lucas #
# Date : 04-11-2007 #
# Purpose : makes SNMP check and returns perfdata compatible format #
# Dependances : net-snmp #
# Version : 0.1b #
##############################################################################
#####################################################################
# 1 - init des variales
SNMP_PATH=/usr/bin
MA_VERSION="check_fsnmp version 0.01b (april 11 2007) "
PLUGIN_PATH=/usr/lib/nagios/plugins
#HOST=
#OID=
COMMUNITY=public
#LABEL=
#METRIC=
DEFAULT_METRIC="?"
RESULT=""
RETURN=""
NAGIOS_OUT=""
PERFDATA_OUT=""
#CRITICAL=
#WARNING=
#REGEX=
VERSION=1
#NO_PERFDATA=
#RETURN_CODE=
#######################################################################
# 2 - init des options
for i in $@; do
case $1 in
--help|-h)
echo "use: check_fsnmp <-H|--host> <-o|--oid> [-C|--community] [-2] [-l|--label] [-m|--metric]"
echo " [-c|--critical] [-w|--warning] [-r|--regex] [--no-perfdata] [--speed]"
echo ""
echo " -H|--host : host address or name (required)"
echo " -o|--oid : snmp oid to check (required) \"o1 o2 ...\""
echo " -C|--community : snmp community (default : public)"
echo " -2 : use snmp version 2 (default : 1)"
echo " -l|--label : human readable label matching oid (default : oid name) \"l1 l2 ...\" [perfdata]"
echo " -m|--metric : oid data metric (default : $DEFAULT_METRIC) \"m1 m2 ...\" [perfdata]"
echo " -c|--critical : critical level (default : none -> no critical) \"c1 c2 ...\" [perfdata]"
echo " -w|--warning : warning level (default : none -> no warning) \"w1 w2 ...\" [perfdata]"
echo " --no-perfdata : do not use perfdata (optional)"
echo " --speed : store previous values and compute speed between two checks"
echo " -r|--regex : regular expression that answer should match to be ok (optional) [no-perfdata]"
echo ""
echo " -v|--version : print version"
echo " -h|--help : show this help message"
echo ""
echo "exemple: check_fsnmp -H localhost -o \"1.3.1.0 1.3.2.0\" -m \"MB kbps\" -l \"size traffic_in\""
echo "exemple: check_fsnmp -H localhost -o \"1.3.7.0 1.3.9.0\" -r \"Netopia '.*[0-9]$'\" --no-perfdata"
echo ""
echo "if no numerical data use --no-perfdata option"
exit 3;;
--label|-l)
shift
LABEL=($1)
shift;;
--metric|-m)
shift
METRIC=($1)
shift;;
--oid|-o)
shift
OID=($1)
shift;;
--community|-C)
shift
COMMUNITY=$1
shift;;
-2)
shift
VERSION=2c;;
--host|-H)
shift
HOST=$1
shift;;
--warning|-w)
shift
WARNING=($1)
shift;;
--critical|-c)
shift
CRITICAL=($1)
shift;;
--regex|-r)
shift
REGEX=($1)
shift;;
--no-perfdata)
NO_PERFDATA=1
shift;;
--speed)
SPEED=1
shift;;
-v|--version)
echo "$MA_VERSION using :"
echo `$SNMP_PATH/snmpget --version`
exit 3;;
[^-]*)
echo unknown option $1, use: check_fsnmp --help
exit 3;;
esac
done
#echo "$SNMP_PATH/snmpget -v $VERSION -c $COMMUNITY $HOST $OID"
#########################################################################
# 3 - commandes snmpget pour chaque oid et stockage dans des tableaux
i=0
while [ -n "${OID[$i]}" ]; do
RESULT[$i]="`$SNMP_PATH/snmpget -v $VERSION -c $COMMUNITY $HOST ${OID[$i]} -Os 2>&1`"
RETURN[$i]="$?"
i=`expr $i + 1`
done
#i=0
#while [ -n "${OID[$i]}" ]; do
# echo "${RESULT[$i]}:${RETURN[$i]}"
# i=`expr $i + 1`
#done
# $? : 0=ok 1=erreur_format 2=erreur_reponse
# format de retour : ssIndex.0 = INTEGER: 1
# echo "$RESULT"
i=0
while [ -n "${OID[$i]}" ]; do
if [ -z "${LABEL[$i]}" ]; then
LABEL[$i]=`expr "$RESULT" : '\([^\ ]*\).0 '`
fi
if [ -z "${METRIC[$i]}" ]; then
METRIC[$i]="$DEFAULT_METRIC"
fi
case ${RETURN[$i]} in
0)
OLD_VALUE=0
TIME=1
TIMENOW=`date +%s`
if [ -n "$SPEED" ]; then
if [ -s /tmp/${HOST}_${OID[$i]} ]; then
j=0
VAL=
for V in `cat /tmp/${HOST}_${OID[$i]}`; do
VAL[$j]=$V
j=$(($j + 1))
done
OLD_VALUE=${VAL[1]}
TIME=$(($TIMENOW - ${VAL[0]}))
fi
fi
if [ -z "$NO_PERFDATA" ]; then
NEWVALUE=`expr "${RESULT[$i]}" : '.*= [A-Z|a-z|0-9]*: \([0-9]*\)$'`
if [ -z "$NEWVALUE" ]; then
echo "use --no-perfdata option when checking not numerical results"
exit 3
fi
VALUE=$(( ($NEWVALUE - $OLD_VALUE) / $TIME))
if [ "$OLD_VALUE" -ge "$NEWVALUE" ]; then
VALUE=0
fi
PERFDATA_OUT="$PERFDATA_OUT${LABEL[$i]}=$VALUE${METRIC[$i]};${CRITICAL[$i]};${WARNING[$i]}; "
C=0
W=0
if [ -n "${WARNING[$i]}" -a -n "${CRITICAL[$i]}" ]; then
if [ "$VALUE" -ge "${WARNING[$i]}" ]; then
W=1
fi
if [ "$VALUE" -ge "${CRITICAL[$i]}" ]; then
C=1
fi
if [ "$W" -eq "1" -a "$C" -eq "0" ]; then
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:WARNING-$VALUE>${WARNING[$i]}${METRIC[$i]} "
if [ "$RETURN" -lt "2" ]; then
RETURN=1
fi
fi
if [ "$C" -eq "1" ]; then
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:CRITICAL-$VALUE>${CRITICAL[$i]}${METRIC[$i]} "
RETURN=2
fi
fi
if [ "$C" -eq "0" -a "$W" -eq "0" ]; then
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:OK-$VALUE${METRIC[$i]} "
fi
else
NEWVALUE=`expr "$RESULT" : '.*= [A-Z|a-z|0-9]*: \(.*\)'`
VALUE=$(( ($NEWVALUE - $OLD_VALUE) / $TIME))
if [ "$OLD_VALUE" -ge "$NEWVALUE" ]; then
VALUE=0
fi
if [ -n "${REGEX[$i]}" ]; then
R=`expr "$VALUE" : ".*${REGEX[$i]}"`
if [ "$R" -eq "0" ]; then
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:CRITICAL-$VALUE no regex match "
RETURN=2
else
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:OK-$VALUE "
fi
else
NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:OK-$VALUE "
fi
fi
if [ -n "$SPEED" ]; then
echo "$TIMENOW $NEWVALUE" > /tmp/${HOST}_${OID[$i]}
fi
;;
1) NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:UNKNOWN-${RESULT[$i]} "
if [ "$RETURN" != "2" ]; then
RETURN=3
fi
;;
2) NAGIOS_OUT="$NAGIOS_OUT${LABEL[$i]}:CRITICAL-${RESULT[$i]} "
RETURN=2
;;
esac
i=`expr $i + 1`
done
if [ -z "$NO_PERFDATA" ]; then
echo "$NAGIOS_OUT | $PERFDATA_OUT"
else
echo "$NAGIOS_OUT"
fi
exit $RETURN
check_snmp_ups
This plugin is a script shell, it allows user to get information about your ups devices from standard UPS-MIB.
exemple :
nagios command check sample :
define command {
command_name check_snmp_ups_voltage
command_line $USER1$/check_snmp_ups -H $HOSTADDRESS$ -C $ARG1$ -v
}
using :
-bash-3.1$ ./check_snmp_ups -H (host_name/ip_address) -C public -v battery OK OnLine voltage_in:233V voltage_out:229V | voltage_in=233V; voltage_out=229V; -bash-3.1$ echo $? 0
-bash-3.1$ ./check_snmp_ups -H (host_name/ip_address) -C public -l -a battery OK OnLine battery_load:100% load:0% alarms : upsAlarmBatteryBab upsAlarmOnBypass upsAlarmUpsOutputOff | battery_load=100%; load=0%; -bash-3.1$ echo $? 2
Guess it's time to change this ups device's battery, it looks dead... Your Nagios told you before catastrophy :)
plugin code :
#!/bin/bash
##################################################################################################
# Author : G. Lucas #
# Date : 07-20-2007 #
# Purpose : makes SNMP std check for ups devices and returns perfdata compatible format #
# Dependances : net-snmp #
# Version : 0.1b #
##################################################################################################
SNMP_VERSION=1
COMMUNITY=public
NO_PERFDATA=0
TIMEOUT=1
RETRY=1
LOAD=0
VOLT=0
ALARM=0
CURRENT=0
POWER=0
FREQ=0
for i in $@; do
case $1 in
-H|--hostname)
shift
HOSTNAME=$1
shift;;
-C|--community)
shift
COMMUNITY=$1
shift;;
-2)
SNMP_VERSION=2;
shift;;
-t|--timeout)
shift
TIMEOUT=$1
shift;;
-r|--retry)
shift
RETRY=$1
shift;;
-l|--load)
LOAD=1
shift;;
-v|--voltage)
VOLT=1
shift;;
-cu|--current)
CURRENT=1
shift;;
-p|--power)
POWER=1
shift;;
-f|--frequency)
FREQ=1
shift;;
-a|--alarms)
ALARM=1
shift;;
--no-perfdata)
NO_PERFDATA=1
shift;;
-h|--help)
echo "use : $0 <-H> [-C] [-2] <-l|-v> [--no-perfdata]"
echo ""
echo " -H|--hostname : hostname or IP address of ups device"
echo " -C|--community : snmp community (default:public)"
echo " -2 : snmp version 2 (default:version 1)"
echo " -t|--timeout : timeout (default 1s)"
echo " -r|--retry : number of retry (default 1)"
echo ""
echo " -l|--load : get battery and ups load"
echo " -v|--voltage : get input and output voltage"
echo " -cu|--icurrent : get input and output current"
echo " -p|--power : get input and output power"
echo " -f|--frequency : get input and output frequency"
echo " -a|--alarms : check alarms"
echo ""
echo " --no-perfdata : do not output perfdata"
echo " -h|--help : print this message"
exit 3;
esac
done
# get battery status :
BAT_STAT=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.2.1.0 2>&1`
case "$BAT_STAT" in
SNMPv2-SMI::mib-2.33.1.2.1.0\ \=\ INTEGER:\ 1) # unknown status
NAGIOS_OUT="UNKNOWN battery status "
RET_CODE=3;;
SNMPv2-SMI::mib-2.33.1.2.1.0\ \=\ INTEGER:\ 2) # normal status
NAGIOS_OUT="battery OK "
RET_CODE=0;;
SNMPv2-SMI::mib-2.33.1.2.1.0\ \=\ INTEGER:\ 3) # low
NAGIOS_OUT="battery low WARNING "
RET_CODE=1;;
SNMPv2-SMI::mib-2.33.1.2.1.0\ \=\ INTEGER:\ 4) # depleted
NAGIOS_OUT="battery depleted CRITICAL "
RET_CODE=2;;
*) # bad result
echo "UNKNOWN : $BAT_STAT"
exit 3;;
esac
BAT_ON_TIME=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.2.2.0 2>&1`
BAT_ON_TIME=`expr "$BAT_ON_TIME" : '.*INTEGER:\ \([0-9]*\)'`
case "$BAT_ON_TIME" in
0)
NAGIOS_OUT=$NAGIOS_OUT" OnLine ";;
[0-9]*)
NAGIOS_OUT=$NAGIOS_OUT" OnBattery "
if [ "$RET_CODE" -eq 0 ]; then $RET_CODE=1; fi;;
*)
NAGIOS_OUT=$NAGIOS_OUT" ukn time: $BAT_ON_TIME ";;
esac
# load
if [ "$LOAD" -eq 1 ]; then
# battery
BAT_LOAD_REMAIN=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.2.4.0 2>&1`
BAT_LOAD_REMAIN=`expr "$BAT_LOAD_REMAIN" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" battery_load:"$BAT_LOAD_REMAIN"% "
PERFDATA="battery_load="$BAT_LOAD_REMAIN"%; "
# output
OUTPUT_LOAD=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.4.4.1.5.0 2>&1`
OUTPUT_LOAD=`expr "$OUTPUT_LOAD" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" load:"$OUTPUT_LOAD"% "
PERFDATA=$PERFDATA"load="$OUTPUT_LOAD"%; "
fi
# valtage
if [ "$VOLT" -eq 1 ]; then
# input
IN_VOLT=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.3.3.1.3.0 2>&1`
IN_VOLT=`expr "$IN_VOLT" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" voltage_in:"$IN_VOLT"V "
PERFDATA=$PERFDATA"voltage_in="$IN_VOLT"V; "
# output
OUT_VOLT=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.4.4.1.2.0 2>&1`
OUT_VOLT=`expr "$OUT_VOLT" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" voltage_out:"$OUT_VOLT"V "
PERFDATA=$PERFDATA"voltage_out="$OUT_VOLT"V; "
fi
# current
if [ "$CURRENT" -eq 1 ]; then
# input
IN_CURR=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.3.3.1.4.0 2>&1`
IN_CURR=`expr "$IN_CURR" : '.*INTEGER:\ \([0-9]*\)'`
IN_CURR=`expr "$IN_CURR" \/ 10`
NAGIOS_OUT=$NAGIOS_OUT" current_in:"$IN_CURR"A "
PERFDATA=$PERFDATA"current_in="$IN_CURR"A; "
# output
OUT_CURR=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.4.4.1.3.0 2>&1`
OUT_CURR=`expr "$OUT_CURR" : '.*INTEGER:\ \([0-9]*\)'`
OUT_CURR=`expr "$OUT_CURR" \/ 10`
NAGIOS_OUT=$NAGIOS_OUT" current_out:"$OUT_CURR"A "
PERFDATA=$PERFDATA"current_out="$OUT_CURR"A; "
fi
# power
if [ "$POWER" -eq 1 ]; then
# input
IN_PWR=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.3.3.1.5.0 2>&1`
IN_PWR=`expr "$IN_PWR" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" power_in:"$IN_PWR"W "
PERFDATA=$PERFDATA"power_in="$IN_PWR"W; "
# output
OUT_PWR=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.4.4.1.4.0 2>&1`
OUT_PWR=`expr "$OUT_PWR" : '.*INTEGER:\ \([0-9]*\)'`
NAGIOS_OUT=$NAGIOS_OUT" power_out:"$OUT_PWR"W "
PERFDATA=$PERFDATA"power_out="$OUT_PWR"W; "
fi
# frequency
if [ "$FREQ" -eq 1 ]; then
# input
IN_FREQ=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.3.3.1.2.0 2>&1`
IN_FREQ=`expr "$IN_FREQ" : '.*INTEGER:\ \([0-9]*\)'`
IN_FREQ=`expr "$IN_FREQ" \/ 10`
NAGIOS_OUT=$NAGIOS_OUT" freq_in:"$IN_FREQ"Hz "
PERFDATA=$PERFDATA"freq_in="$IN_FREQ"Hz; "
# output
OUT_FREQ=`snmpget -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.4.2.0 2>&1`
OUT_FREQ=`expr "$OUT_FREQ" : '.*INTEGER:\ \([0-9]*\)'`
OUT_FREQ=`expr "$OUT_FREQ" \/ 10`
NAGIOS_OUT=$NAGIOS_OUT" freq_out:"$OUT_FREQ"Hz "
PERFDATA=$PERFDATA"freq_out="$OUT_FREQ"Hz "
fi
# alarms
if [ "$ALARM" -eq 1 ]; then
# construction du tableau :
ALARM_NAME=( \
upsAlarmBatteryBab \
upsAlarmOnBattery \
upsAlarmLowBattery \
upsAlarmDepletedBattery \
upsAlarmTempBad \
upsAlarmInputBad \
upsAlarmOutputBad \
upsAlarmOutputOverload \
upsAlarmOnBypass \
upsAlarmBypassBad \
upsAlarmOutputOffAsRequested \
upsAlarmUpsOffAsRequested \
upsAlarmChargerFailed \
upsAlarmUpsOutputOff \
upsAlarmUpsSystemOff \
upsAlarmFanFailure \
upsAlarmFuseFailure \
upsAlarmGeneralFault \
upsAlarmDiagnosticTestFailed \
upsAlarmCommunicationsLost \
upsAlarmAwaitingPower \
upsAlarmShutdownPending \
upsAlarmShutdownImminent \
upsAlarmTestInProgress)
ALARMS=(`snmpwalk -c $COMMUNITY -v $SNMP_VERSION -t $TIMEOUT -r $RETRY $HOSTNAME 1.3.6.1.2.1.33.1.6.3 2>&1 | awk '{print $4}' `)
NAGIOS_OUT=$NAGIOS_OUT"alarms : "
i=0
while [ ! -z ${ALARMS[$i]} ]; do
if [ "${ALARMS[$i]}" -eq 1 ]; then
NAGIOS_OUT=$NAGIOS_OUT${ALARM_NAME[$i]}" "
RET_CODE=2
fi
i=`expr $i + 1`
done
fi
if [ "$NO_PERFDATA" -eq "1" -o -z "$PERFDATA" ]; then
echo $NAGIOS_OUT
else
echo $NAGIOS_OUT"| "$PERFDATA
fi
exit $RET_CODE

