#!/usr/bin/ksh
#
# Nagios Plugin for checking fd_count.
#
# Description: Nagios Plugin for checking fd_count.
#
# Author     : Peter Tuschy
# Version    : 1.01
# Date       : 2009-12-02
# 
#

#
# sudoers config needed
#
# Defaults:nagios !syslog
# Cmnd_Alias      MONITORING = /bin/ls
# nagios          ALL=(ALL)       NOPASSWD: MONITORING
#
#

LANG=C
export LANG

VERSION=1.0

# where we are started
WHERE=`dirname $0`

# setting default exit values
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# import exit values from utils.sh if we found one
if   [ -f ${WHERE}/utils.sh ] ; then
    . ${WHERE}/utils.sh
elif [ -f ${WHERE}/../utils.sh ] ; then
    . ${WHERE}/../utils.sh
fi

usage() {
    echo "Usage: $0 [-w <number of FDs> [-c <number of FDs>] -p <process>"
    echo "Revision: $VERSION"
    echo 
    echo "Determines the number FDs used by a process."
    echo 
    echo "Warning and critical thresholds are optional."
    exit $STATE_UNKNOWN
}

warning=""
critical=""
check_dir=""
#check_dir=`pwd`

while [ "$1" != "" ]; do
    case $1 in
	-w)
		shift
		warning=`echo $1 | tr -dc '[:digit:]'`
		;;
	-c)
		shift
		critical=`echo $1 | tr -dc '[:digit:]'`
		;;
	-p)
		shift
		process=$1
		;;
	-*)
		usage
		;;
	*)
		check_dir=$1
    esac
    shift
done

if [ -z "${process}" ] ; then
    usage
fi

if [ ! -z "${critical}" ] ; then
    if [ ${critical} -le 0 ] ; then
	echo "Critical must be a positive integer."
	exit $STATE_UNKNOWN
    fi
fi

if [ ! -z "${warning}" ] ; then
    if [ ${warning} -le 0 ] ; then
	echo "Critical must be a positive integer."
	exit $STATE_UNKNOWN
    fi
fi

if [ ! -z "${critical}" -a ! -z "${warning}" ] ; then
    if [ ${critical} -le ${warning} ] ; then
	echo "Warning must be less than critical value."
	exit $STATE_UNKNOWN
    fi
fi

OUTPUT=""

PID=$(pgrep ${process})

if [ ! -z "${PID}" ]; then 
	OUTPUT=$(/usr/bin/sudo /bin/ls -1 /proc/${PID}/fd | wc -l)
else 
	echo "UNKNKOWN - no ${process} found"
	exit $STATE_UNKNOWN
fi

PLUGDATA="FD count is ${OUTPUT} for ${process} | count=${OUTPUT};"

if [ ! -z "${critical}" ] ; then
    if [ ${OUTPUT} -ge ${critical} ]; then
	echo "CRITICAL - ${PLUGDATA}"
	exit $STATE_CRITICAL
    fi
elif [ ! -z "${warning}" ] ; then
    if [ ${OUTPUT} -ge ${warning} ]; then
	echo "WARNING - ${PLUGDATA}"
	exit $STATE_WARNING
    fi
fi

echo "OK - ${PLUGDATA}"
exit $STATE_OK
