#!/bin/sh
# written by Steve Murphy, with inspiration from Dmitry Vayntrub's check_uptime.sh
#
# The plugin shows the number of open files by asterisk
# and allows you to set warn/crit values in case asterisk
# 'leaks' open file descriptors.
#
#######################################################################
VERSION="check_asterisk_ps v1.00"

# Exit-Codes:
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

usage()
{
cat << EOF
usage: $0 [-C OPTION] [-c OPTION] [-M OPTION] [-m OPTION] [-T OPTION] [-t OPTION] [ -V ]

This script checks Asterisk process status parameters and optionally verifies if %mem/%cpu/thread
numbers are above treshholds

OPTIONS:
   -h   Help
   -C   CRITICAL MAX %CPU
   -c   WARNING  MAX %CPU
   -M   CRITICAL MAX %MEM
   -m   WARNING  MAX %MEM
   -T   CRITICAL MAX threads
   -t   WARNING  MAX threads
   -V   Version
EOF
}

while getopts c:m:C:M:T:t:Vv OPTION
do
     case $OPTION in
	C)
	   CRITICAL_CPU=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	c)
	   WARNING_CPU=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	M)
	   CRITICAL_MEM=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	m)
	   WARNING_MEM=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	  ;;
	T)
	   CRITICAL_THREADS=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	t)
	   WARNING_THREADS=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	  ;;
	V)
	   echo $VERSION
	   exit $STATE_OK
	   ;;
	v)
	   VERBOSE=1
	   ;;
	?)
	   usage
	   exit $STATE_UNKNOWN
	   ;;
     esac
done

AST_PROC=`cat /var/run/asterisk/asterisk.pid`
PS_REPORT=`ps -p $AST_PROC --no-headers -o \%cpu,\%mem,nlwp,rss,sz,vsz`
PCPU=`echo $PS_REPORT | awk '{ print $1}'`
PMEM=`echo $PS_REPORT | awk '{ print $2}'`
NTHR=`echo $PS_REPORT | awk '{ print $3}'`
RSS=`echo $PS_REPORT | awk '{ print $4}'`
SZ=`echo $PS_REPORT | awk '{ print $5}'`
VSZ=`echo $PS_REPORT | awk '{ print $6}'`
PERFDATA="|pcpu=$PCPU;pmem=$PMEM;nthr=$NTHR;rss=$RSS;sz=$SZ;vsz=$VSZ;";

if [ $CRITICAL_CPU ] ; then
    BCRES=`echo "$PCPU > $CRITICAL_CPU" | bc`

    if [ $BCRES -ne 0 ] ; then
	echo "CRITICAL - %CPU ($PCPU) greater than threshold of $CRITICAL_CPU$PERFDATA"
	exit $STATE_CRITICAL
    fi
fi

if [ $WARNING_CPU ] ; then
    BCRES=`echo "$PCPU > $WARNING_CPU" | bc`
    if [ $BCRES -ne 0 ] ; then
	echo "WARNING - %CPU ($PCPU) greater than threshold of $WARNING_CPU$PERFDATA"
	exit $STATE_WARNING
    fi
fi

if [ $CRITICAL_MEM ] ; then
    BCRES=`echo "$PMEM > $CRITICAL_MEM" | bc`
    if [ $BCRES -ne 0 ] ; then
	echo "CRITICAL - %MEM ($PMEM) greater than threshold of $CRITICAL_MEM$PERFDATA"
	exit $STATE_CRITICAL
    fi
fi
if [ $WARNING_MEM ] ; then
    BCRES=`echo "$PMEM > $WARNING_MEM" | bc`
    if [ $BCRES -ne 0 ] ; then
	echo "WARNING - %MEM ($PMEM) greater than threshold of $WARNING_MEM$PERFDATA"
	exit $STATE_WARNING
    fi
fi

if [ $CRITICAL_THREADS ] && [ $NTHR -gt $CRITICAL_THREADS ] ; then
	echo "CRITICAL - Number of Threads ($NTHR) greater than threshold of $CRITICAL_THREADS$PERFDATA"
	exit $STATE_CRITICAL

  elif [ $WARNING_THREADS ] && [ $NTHR -gt $WARNING_THREADS ] ; then
	echo "WARNING - Number of Threads ($NTHR) greater than threshold of $WARNING_THREADS$PERFDATA"
	exit $STATE_WARNING

  else
	echo "OK - Asterisk %cpu=$PCPU; %mem=$PMEM; threads=$NTHR; rss=$RSS; sz=$SZ; vsz=$VSZ$PERFDATA"
	exit $STATE_OK
fi
