Skip to content
This repository was archived by the owner on Jul 5, 2018. It is now read-only.
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
171 changes: 148 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,148 @@
<H3 align=center>check_snmp_proc.sh</H3>
<H5 align=center>This is small Nagios plugin for checking status of processes (or quantity of them) via SNMP</H5>
<br align=left><b>Usage:</b>
<br align=left>./check_snmp_proc -H 127.0.0.1 -C public -N ssh -w 3 -c 0
<br>
<br><b>Where:</b>
<dd> -H hostname /string/
<br> Name or IP address of host (default 127.0.0.1)
<br> -C OID /string/
<br> Community name for the host SNMP agent (default public)
<br> -N Process name /string/
<br> Exact process name (default snmpd)
<br> -w warning level /integer/
<br> Warning level of running processes (default: 0)
<br> -c critical level /integer/
<br> Critical level of running processes (default: 0)
<br> -h help
<br> Print this help screen
<br> -V version number
<br> Print version and license information </dd>
<br>
<br> This plugin uses the 'snmpwalk' command included with the NET-SNMP package.
<br> This nagios plugins comes with ABSOLUTELY NO WARRANTY. So, enjoy ;)
# check_snmp_proc.sh
## This is small Nagios plugin for checking status of processes (or quantity of them) via SNMP</H5>

This plugin uses the [utils.sh from monitoring-plugins.org](https://github.com/monitoring-plugins/monitoring-plugins/blob/v2.2/plugins-scripts/utils.sh.in) to be able to use ranges for warning and critical thresholds.

### Usage:
```
./check_snmp_proc -H 127.0.0.1 -C public -N ssh -w 3 -c 0

Where:
-H hostname /string/
Name or IP address of host (default 127.0.0.1)
-C OID /string/
Community name for the host SNMP agent (default public)
-N Process name /string/
Exact process name (default snmpd)
-w warning level /integer/
Warning level of running processes (default: 0)
-c critical level /integer/
Critical level of running processes (default: 0)
-m minimum level /integer/
Minimum level for performance data (default: 0)
-M maximum level /integer/
Maximum level for performance data (default: 100)
-h help
Print this help screen
-V version number
Print version and license information </dd>

This plugin uses the 'snmpwalk' command included with the NET-SNMP package.
This nagios plugins comes with ABSOLUTELY NO WARRANTY. So, enjoy ;)
```
### Icinga2 Configuration
```
object CheckCommand "snmp_proc" {
import "plugin-check-command"

command = [ PluginGitDir + "/check_snmp_proc.sh" ]

arguments = {
"-H" = {
value = "$snmp_proc_host$"
description = "Name or IP address of host (default 127.0.0.1 but overwritten by address)"
required = false
skip_key = false
order = 1
}
"-C" = {
value = "$snmp_proc_community$"
description = "Community name for the host SNMP agent (default public)"
required = false
skip_key = false
order = 2
}
"-N" = {
value = "$snmp_proc_name$"
description = "Exact process name (default snmpd)"
required = false
skip_key = false
order = 3
}
"-w" = {
value = "$snmp_proc_warning$"
description = "Warning level of running processes (default: 0)"
required = false
skip_key = false
order = 4
}
"-c" = {
value = "$snmp_proc_critical$"
description = "Critical level of running processes (default: 0)"
required = false
skip_key = false
order = 5
}
"-m" = {
value = "$snmp_proc_min$"
description = "Minimum for performance data (default: 0)"
required = false
skip_key = false
order = 6
}
"-M" = {
value = "$snmp_proc_max$"
description = "Maximum for performance data (default: 100)"
required = false
skip_key = false
order = 7
}
}

vars.snmp_proc_host = "$address$"
}

```


```
apply Service for (snmp_proc => config in host.vars.snmp_proc) {
import "generic-service"

check_command = "snmp_proc"

display_name = config.display_name

if (config.groups) {
groups = config.groups
}

if (config.check_interval) {
check_interval = config.check_interval
}

if (config.retry_interval) {
retry_interval = config.retry_interval
}

if (config.max_check_attempts) {
max_check_attempts = config.max_check_attempts
}

vars += config
}
```

```
object Host "snmphost.test" {
import "generic-host"
display_name = "SNMP Test Host"
address = "127.0.0.1"

vars.snmp_proc[ "service_name" ] = {
display_name = "Check SNMP service via SNMP process list"

# snmp_proc_community = "public"
snmp_proc_name = "snmp"
snmp_proc_warning = "40"
snmp_proc_critical = "40"

# check_interval = 10m
# retry_interval = 10m
max_check_attempts = 1
}

}
```


118 changes: 72 additions & 46 deletions check_snmp_proc.sh
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
#!/bin/bash
#!/bin/sh

# Plugin return codes
STATE_OK=0
STATE_CRITICAL=2
STATE_WARNING=1
STATE_UNKNOWN=3
# boilerplate from check_sensors
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export PATH
PROGNAME=`basename $0`
PROGPATH=`echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,'`
REVISION="1.2"

# Version
VERSION="1.1"
. $PROGPATH/utils.sh

# Commands
CMD_BASENAME=$(which basename)
CMD_SNMPWALK=$(which snmpwalk)
CMD_GREP=$(which grep)
CMD_WC=$(which wc)

# Script name
SCRIPTNAME=`$CMD_BASENAME $0`


#Default variables
OID=.1.3.6.1.2.1.25.4.2.1.2
HOST="127.0.0.1"
Expand All @@ -27,27 +23,23 @@ PROCN="snmpd"
STATE=$STATE_UNKNOWN
WARNING=0
CRITICAL=0

PERFDATA=""
MIN=0
MAX=100

print_usage() {
echo "Usage: ./check_snmp_proc -H 127.0.0.1 -C public -N ssh -w 3 -c 0"
echo " $SCRIPTNAME -H ADDRESS"
echo " $SCRIPTNAME -C STRING"
echo " $SCRIPTNAME -N STRING"
echo " $SCRIPTNAME -w INTEGER"
echo " $SCRIPTNAME -c INTEGER"
echo " $SCRIPTNAME -h"
echo " $SCRIPTNAME -V"
}

print_version() {
echo $SCRIPTNAME version $VERSION
echo ""
echo "This nagios plugins comes with ABSOLUTELY NO WARRANTY."
echo " $PROGNAME -H ADDRESS"
echo " $PROGNAME -C STRING"
echo " $PROGNAME -N STRING"
echo " $PROGNAME -w INTEGER"
echo " $PROGNAME -c INTEGER"
echo " $PROGNAME -h"
echo " $PROGNAME -V"
}

print_help() {
print_version
print_revision $PROGNAME $REVISION
echo ""
print_usage
echo ""
Expand All @@ -63,48 +55,82 @@ print_help() {
echo " Warning level of running processes (default: 0)"
echo "-c INTEGER"
echo " Critical level of running processes (default: 0)"
echo "-m INTEGER"
echo " Minimum for performance data (default: 0)"
echo "-M INTEGER"
echo " Maximum for performance data (default: 100)"
echo "-h"
echo " Print this help screen"
echo "-V"
echo " Print version and license information"
echo ""
echo "This plugin uses the 'snmpwalk' command included with the NET-SNMP package."
echo "This plugin uses the utils.sh from monitoring-plugins.org."
}

while getopts H:C:N:w:c:Vh OPT
while getopts H:C:N:w:c:m:M:Vh OPT
do
case $OPT in
H) HOST="$OPTARG" ;;
C) COMM="$OPTARG" ;;
N) PROCN="$OPTARG" ;;
w) WARNING=$OPTARG ;;
c) CRITICAL=$OPTARG ;;
m) MIN=$OPTARG ;;
M) MAX=$OPTARG ;;
h)
print_help
exit $STATE_UNKNOWN
exit $STATE_OK
;;
V)
print_version
exit $STATE_UNKNOWN
print_revision $PROGNAME $REVISION
exit $STATE_OK
;;
esac
done

#Plugin
PROCN=${PROCN:0:15}
CNT=`$CMD_SNMPWALK -v1 -On -c $COMM $HOST $OID | $CMD_GREP "\"$PROCN\"" | $CMD_WC -l`
if [ $CNT -eq 0 ]; then
STATE=$STATE_CRITICAL
DESCRIPTION="CRITICAL: Process $PROCN does not exist"
elif [ $CNT -le $WARNING ]; then
STATE=$STATE_WARNING
DESCRIPTION="WARNING: Running only $CNT instances of $PROCN"
elif [ $CNT -le $CRITICAL ]; then
STATE=$STATE_CRITICAL
DESCRIPTION="CRITICAL: Running only $CNT instances of $PROCN"
#PROCN=${PROCN:0:15}
PROCN=`echo $PROCN | cut -c -15`

#echo $PROCN
WLK=`$CMD_SNMPWALK -v1 -On -c $COMM $HOST $OID`
if [ "$?" -ne 0 ]; then
STATE=$STATE_CRITICAL
exit $STATE
fi


CNT=`echo $WLK | $CMD_GREP "\"$PROCN\"" | $CMD_WC -l`

check_range $CNT $CRITICAL
RET_CRIT=$?
if [ "$RET_CRIT" -eq 2 ]; then
STATE=$STATE_CRITICAL
exit $STATE
fi

check_range $CNT $WARNING
RET_WARN=$?
if [ "$RET_WARN" -eq 2 ]; then
STATE=$STATE_CRITICAL
exit $STATE
fi

#echo "Range return is critical $RET_CRIT and warning $RET_WARN"

PERFDATA="$PROCN=$CNT;$WARNING;$CRITICAL;$MIN;$MAX"

if [ "$RET_CRIT" -eq 0 ]; then
STATE=$STATE_CRITICAL
DESCRIPTION="PROCESS CRITICAL: Number of $PROCN not in range $CRITICAL"
elif [ "$RET_WARN" -eq 0 ]; then
STATE=$STATE_WARNING
DESCRIPTION="PROCESS WARNING: Number of $PROCN not in range $WARNING"
else
STATE=$STATE_OK
DESCRIPTION="OK: Process exist. Running instances: $CNT"
fi
echo $DESCRIPTION
STATE=$STATE_OK
DESCRIPTION="PROCESS OK: Running $CNT instances of $PROCN"
fi

echo "$DESCRIPTION | $PERFDATA"
exit $STATE