#!/bin/sh

# Author: Dmitriy Shestakov <mid@etersoft.ru>, (c) 2011

PROG_NAME=$0
COUNT_PARAMS=$#
HOST=$1
COMMUNITY=$2

#set param in percent
WARN=$3
CRIT=$4

OK_STATE=0
WARNING_STATE=1
CRITICAL_STATE=2
UNKNOWN_STATE=3
ERROR=4

#init for use in math operation
memRealUsed=0
realPercent=0

memRealTotalOID=".1.3.6.1.4.1.2021.4.5.0"
memRealAvailOID=".1.3.6.1.4.1.2021.4.6.0"
memRealBuffersOID=".1.3.6.1.4.1.2021.4.14.0"
memRealCachedOID=".1.3.6.1.4.1.2021.4.15.0"

# we need direct call command for autosearch package requires (todo for /usr/lib/rpm/shell.req ?)
get_snmpwalk()
{
    snmpwalk -c $COMMUNITY $HOST $@ | gawk '{print $4}'
}

#get info about memory in remote system
get_memoryinfo()
{
    memRealTotal=$(get_snmpwalk $memRealTotalOID)
    memRealAvail=$(get_snmpwalk $memRealAvailOID)
    memRealBuffers=$(get_snmpwalk $memRealBuffersOID)
    memRealCached=$(get_snmpwalk $memRealCachedOID)
}


#Memory calculation
memory_calculate()
{
    #get all used memory(with cache and buffers)
    memRealUsed=$(($memRealTotal - $memRealAvail - $memRealBuffers - $memRealCached ))

    #get real percent usage memory
    realPercent=$(( ($memRealUsed * 100) / $memRealTotal ))
}

#parsing input params
pars_param()
{
    if [ $COUNT_PARAMS -lt 4 ]; then
	usage && exit $ERROR
    elif [ $WARN -gt $CRIT ]; then
	echo "CRITICAL value can't be less then WARNING value."
	usage && exit $ERROR
    elif [ $CRIT -gt 100 ]; then
	echo "CRITICAL value can't be greater then 100 percent."
	usage && exit $ERROR
    fi

}

#matching result for nagios
get_result()
{
    if [ $realPercent -gt $CRIT ]; then
	echo "CRITICAL - used $realPercent% memory (total memory: $memRealTotal KB, avaliable: $memRealAvail KB, cached: $memRealCached KB, buffers: $memRealBuffers KB)"
        exit $CRITICAL_STATE
    elif [ $realPercent -gt $WARN ]; then
	echo "WARNING - used $realPercent% memory (total memory: $memRealTotal KB, avaliable: $memRealAvail KB, cached: $memRealCached KB, buffers: $memRealBuffers KB)"
	exit $WARNING_STATE
    else 
	echo "OK - used $realPercent% memory (total memory: $memRealTotal KB, avaliable: $memRealAvail KB, cached: $memRealCached KB, buffers: $memRealBuffers KB)"
	exit $OK_STATE
    fi
}

##help
usage()
{
echo "Usage:	$PROG_NAME  [HOST] [COMMUNITY] [WARN] [CRIT]"
echo
echo "		COMMUNITY - set the community string"
echo "		HOST -	remote host"
echo "		WARN - warning value of memory in percent"
echo "		CRIT - critical value of memory in percent"
echo
echo "Example:  $PROG_NAME public example.com 70 80"
}

#########main######################
pars_param
get_memoryinfo
memory_calculate
get_result
