Plugins:Dev

From Wiki Centreon

Jump to: navigation, search

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
Personal tools