#!/usr/bin/bash
#
# Description: check arp cache usage
#
# Author     : Michael Hissler
# Version    : 1.0
# Date       : 2014-12-09
# 
#

LANG=C
export LANG

# 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 <free integer|percent>] [-c <free integer|percent>]"
    exit $STATE_UNKNOWN
}

# make no warning or critical default
warning=
critical=

# command line parsing
while [ "$1" != "" ];
do
        case $1 in
        -w)
            shift
            wpercent=`echo $1 | tr -d '[:digit:].' 2>/dev/null`
            warning=`echo $1 | tr -d '%' 2>/dev/null`
            ;;
        -c)
            shift
            cpercent=`echo $1 | tr -d '[:digit:].' 2>/dev/null`
            critical=`echo $1 | tr -d '%' 2>/dev/null`
            ;;
        --help|-h)
            usage
            ;;
        -*)
            usage
            ;;
        *)
            usage
            
        esac
        shift
done

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

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


OS=`uname`

case "${OS}" in
#    SunOS)
#        ENTRIES=`arp -a | sed 1,3d | wc -l`
#        THRES=`...`  # ndd -get /dev/ip ..., ndd -get /dev/arp ...?
#        ;;
    Linux)
        ENTRIES=`arp | sed 1d | wc -l`
        THRES=`cat /proc/sys/net/ipv4/neigh/default/gc_thresh2`
        ;;
    *)
        echo "OS ${OS} not supportet by this check"
        exit $STATE_UNKNOWN
esac

FREE=`expr $THRES - $ENTRIES`

#calculate  threshold values if needed
if [ ! -z "$wpercent" ] ; then
    warning=$(echo "${THRES} * ${warning} / 100" | bc)
fi
if [ ! -z "$cpercent" ] ; then
    critical=$(echo "${THRES} * ${critical} / 100" | bc)
fi

PERFDATA="used=${ENTRIES};;;0;${THRES} free=${FREE};${warning};${critical};${THRES};0"
PLUGDATA="arp cache usage ( free ${FREE} / used ${ENTRIES} )"


alerting=$FREE
alertlabel="free arp cache entries"


if [ ! -z "${alerting}" ] ; then
    if [ ! -z "${critical}" ] ; then
        if [ ${alerting} -le ${critical} ]; then
            echo "CRITICAL - ${alertlabel} less then ${critical} / ${PLUGDATA} | ${PERFDATA}"
            exit $STATE_CRITICAL
        fi
    fi
    if [ ! -z "${warning}" ] ; then
        if [ ${alerting} -le ${warning} ]; then
            echo "WARNING - ${alertlabel} less then ${warning} / ${PLUGDATA} | ${PERFDATA}"
            exit $STATE_WARNING
        fi
    fi
fi

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