#!/bin/bash

# Licensed under GPL. See http://www.fsf.org/licensing/licenses/gpl.html#SEC1
# Based on private work from Patrik Schindler <poc@pocnet.net> (c) 2005

MYNAME=`basename $0`
PROGPATH=`echo $0 |sed -e 's,[\\/][^\\/][^\\/]*$,,'`
test -x $PROGPATH/utils.sh && . $PROGPATH/utils.sh

# Ohne Parameter blöde machen
if [ $# -lt 1 ]; then
	printf "Usage: ${MYNAME} -w limit -c limit -h host -s snmp-community\n"
	exit ${STATE_UNKNOWN}
fi

# Optionen parsen: Getopt unter Shell ist der größte Mist, wenn's um : Args geht
NEXT_IS_W=0
NEXT_IS_C=0
NEXT_IS_H=0
NEXT_IS_S=0
#
OPTSTRING=`getopt "vc:w:h:s:" $*`
test $? -ne 0 && exit ${STATE_UNKNOWN}
for OPTION in ${OPTSTRING}; do
	if [ ${NEXT_IS_W} -eq 1 ]; then
		WARNLEVEL=$OPTION
		NEXT_IS_W=0
	elif [ ${NEXT_IS_C} -eq 1 ]; then
		CRITLEVEL=$OPTION
		NEXT_IS_C=0
	elif [ ${NEXT_IS_H} -eq 1 ]; then
		HOST=$OPTION
		NEXT_IS_H=0
	elif [ ${NEXT_IS_S} -eq 1 ]; then
		COMMUNITY=$OPTION
		NEXT_IS_S=0
	fi

	case "${OPTION}" in
		"-v")
			echo "$Id: check_snmp_cisco_memfree,v 1.5 2007/06/07 09:36:39 pschindler Exp $"
			exit ${STATE_UNKNOWN}
		;;
		"-w")
			NEXT_IS_W=1
		;;
		"-c")
			NEXT_IS_C=1
		;;
		"-s")
			NEXT_IS_S=1
		;;
		"-h")
			NEXT_IS_H=1
		;;
	esac
done

unset NEXT_IS_W NEXT_IS_C NEXT_IS_S NEXT_IS_H

# Sanity Check
if [ -z "${HOST}" ]; then
	echo "You MUST supply a host to monitor."
	exit ${STATE_UNKNOWN}
fi
if [ -z "${COMMUNITY}" ]; then
	echo "You MUST supply a snmp community."
	exit ${STATE_UNKNOWN}
fi
if [ -z "${WARNLEVEL}" ]; then
	echo "You MUST supply a warning level."
	exit ${STATE_UNKNOWN}
fi
if [ -z "${CRITLEVEL}" ]; then
	echo "You MUST supply a critical level."
	exit ${STATE_UNKNOWN}
fi
if [ ${CRITLEVEL} -gt ${WARNLEVEL} ]; then
	echo "Warning level must be less or equal to crit level."
	exit ${STATE_UNKNOWN}
fi

# Next, get neccessary information for some mathematics
ERR=0
USED=`snmpget -v1 -OQv -c "${COMMUNITY}" "${HOST}" SNMPv2-SMI::enterprises.9.9.48.1.1.1.5.1` || ERR=`expr ${ERR} + 1`
FREE=`snmpget -v1 -OQv -c "${COMMUNITY}" "${HOST}" SNMPv2-SMI::enterprises.9.9.48.1.1.1.6.1` || ERR=`expr ${ERR} + 1`

if [ ${ERR} -gt 0 ]; then
	echo "SNMP Error."
	exit ${STATE_UNKNOWN}
fi

USED_K=$(( USED / 1024 ))
FREE_K=$(( FREE / 1024 ))
WHOLE_K=$(( FREE_K + USED_K ))


# Now calculon, compute! Ergebnis muß sein: % free
PCT=$(( 100 * FREE_K / WHOLE_K ))

if [ ${PCT} -lt ${WARNLEVEL} ]; then
	echo "MEM WARNING [${PCT}% free (${USED_K}k of ${WHOLE_K}k in use)]"
	exit ${STATE_WARNING}
elif [ ${PCT} -lt ${CRITLEVEL} ]; then
	echo "MEM CRITICAL [${PCT}% free (${USED_K}k of ${WHOLE_K}k in use)]"
	exit ${STATE_CRITICAL}
else
	echo "MEM OK [${PCT}% free (${USED_K}k of ${WHOLE_K}k in use)]"
	exit ${STATE_OK}
fi

# EOF
