#!/bin/bash source /usr/lib/nagios/plugins/utils.sh PROGNAME=`basename $0` SNMP_OID_ECODE="UCD-SNMP-MIB::ucdavis.51.3.1.4.8.115.111.99.107.115.116.97.116" SNMP_OID_DATA="UCD-SNMP-MIB::ucdavis.51.4.1.2.8.115.111.99.107.115.116.97.116.2" SNMP_COMM_DEFAULT="amvbus" DEBUGLOG="/tmp/nagios.$PROGNAME.log" print_usage() { echo "Usage: $PROGNAME -H host.ru -c [-F]" echo "Options:" echo "-H - Hostname " echo "-c - snmp community [Default: $SNMP_COMM_DEFAULT ]" echo "-F - show performance data" } print_help() { echo $PROGNAME $REVISION echo "" print_usage echo "" echo "Will get data from /proc/net/sockstat and try to parse it" echo "" exit $UNKNOWN } ### Parse Arguments while getopts ":hV:H:c:F" Option; do case $Option in h) print_help exit 0 ;; V) print_revision $PROGNAME $REVISION exit 0 ;; H) status_host=${OPTARG} ;; c) SNMP_COMM=${OPTARG} ;; F) show_perfdata="yes" ;; *) print_help exit 0 ;; esac done shift $(($OPTIND - 1)) if [[ "x$status_host" == "x" ]] then echo "No hostname specified, hostname should be like host.ru, use $PROGNAME -h to get help" exit $STATE_UNKNOWN fi if [[ "x$SNMP_COMM" == "x" ]] then SNMP_COMM=$SNMP_COMM_DEFAULT fi snmpcommand="snmpget -OfneQE -v 2c -c $SNMP_COMM $status_host $SNMP_OID_ECODE $SNMP_OID_DATA" reslt=$($snmpcommand 2>&1) reslt_code=$? #echo "return $reslt_code" if [[ "x$reslt_code" != "x0" ]] then echo "snmpwalk returned $reslt_code as return code, message is:$reslt" exit $STATE_UNKNOWN fi if [[ "x$reslt" != "x" ]] then if SNMP_ECODE=$(echo "$reslt"|head -n 1|cut -f 2 -d "="|cut -f 2 -d " ") then #checking if return code is 0 #echo "bla" if [[ "x$SNMP_ECODE" != "x0" ]] then #remote call return code isn't 0, fucking shit! echo "return code of remote check is \"$SNMP_ECODE\" while should be 0, data is: $reslt" exit $STATE_CRITICAL fi else #getting data failed, wrong format? echo "return code parse failed, wrong format? data was:$SNMP_ECODE" exit $STATE_CRITICAL fi #remote return code check passed, let's make the last check... SNMP_DATA=$(echo "$reslt"|tail -n 1) if [[ "x$?" != "x0" ]] then echo "parsing data failed, very bad! data was: $SNMP_DATA" exit $STATE_CRITICAL fi if [[ "x$(echo "$SNMP_DATA"|grep "TCP: inuse"|wc -l)" = "x0" ]] then echo "no valid data detected, data was:$SNMP_DATA" exit $STATE_CRITICAL fi #well, looks like all check passed, let's extract values TCP_SOCKETS=$(echo "$SNMP_DATA"|cut -f 5 -d " ") TCP_TW=$(echo "$SNMP_DATA"|cut -f 9 -d " ") TCP_ORPHAN=$(echo "$SNMP_DATA"|cut -f 7 -d " ") #exit 0 #here should be min & max check, and 1m / 5m / 15m difference check EXITTEXT="socket data:in use $TCP_SOCKETS , timewait $TCP_TW , orphan $TCP_ORPHAN" if [[ ("x$show_perfdata" == "xyes") ]] then #exit 0 EXITTEXT="${EXITTEXT}|'inuse'=${TCP_SOCKETS};;;0; 'timewait'=${TCP_TW};;;0; 'orphan'=${TCP_ORPHAN};;;0;" #echo "exit text: $EXITTEXT" >> $DEBUGLOG fi echo $EXITTEXT if [[ "x$exit_unknown" == "xyes" ]] then exit $STATE_UNKNOWN fi else echo "status is empty, whattafuck?" exit $STATE_UNKNOWN fi