#!/bin/bash

# Licensed under GPL. See http://www.fsf.org/licensing/licenses/gpl.html#SEC1
# Based on private work from poc@pocnet.net - (c) 2006

# Fixes/Changes:
# Works now with old snmp-utils (Debian Woody Style)
# Won't get overflow with big disks anymore (but needs bc)

# FIXME: Spaces in storage descr won't get processed properly by getopt

unset LANG LANGUAGE

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 [ -c snmp-community ] [ <path> | -l | mem | swap ]\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
NEXT_IS_DASH=0
#
OPTSTRING=`getopt "vc:w:h:s:l" $*`
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_S} -eq 1 ]; then
		COMMUNITY=$OPTION
		NEXT_IS_S=0
	elif [ ${NEXT_IS_DASH} -eq 1 ]; then
		MOUNTPATH=$OPTION
		NEXT_IS_DASH=0
	elif [ ${NEXT_IS_H} -eq 1 ]; then
		HOST=$OPTION
		NEXT_IS_H=0
	fi

	case "${OPTION}" in
		"-v")
			echo '$Id: check_snmp_disk,v 1.4 2007/06/07 10:01:00 pschindler Exp $'
			exit ${STATE_UNKNOWN}
		;;
		"-w")
			NEXT_IS_W=1
		;;
		"-c")
			NEXT_IS_C=1
		;;
		"-s")
			NEXT_IS_S=1
		;;
		"--")
			NEXT_IS_DASH=1
		;;
		"-h")
			NEXT_IS_H=1
		;;
		"-l")
			snmpwalk -v1 -OQ -c "${COMMUNITY}" "${HOST}" HOST-RESOURCES-MIB::hrStorageDescr
			exit ${STATE_UNKNOWN}
		;;
	esac
done

unset NEXT_IS_W NEXT_IS_C NEXT_IS_DASH NEXT_IS_H NEXT_IS_S

# Sanity Check
if [ -z "${MOUNTPATH}" ]; then
	echo "You MUST supply a path to monitor."
	exit ${STATE_UNKNOWN}
fi
if [ -z "${HOST}" ]; then
	echo "You MUST supply a host to monitor."
	exit ${STATE_UNKNOWN}
fi
if [ -z "${COMMUNITY}" ]; then
	COMMUNITY="public"
fi
if [ \( ! -z "${CRITLEVEL}" -o ! -z "${WARNLEVEL}" \) -a ${CRITLEVEL} -lt ${WARNLEVEL} ]; then
	echo "Warning level must be less or equal to crit level."
	exit ${STATE_UNKNOWN}
fi

# Replace dummy values with the real ones
if [ "${MOUNTPATH}" = "mem" ]; then
	MOUNTPATH="Real Memory"
elif [ "${MOUNTPATH}" = "swap" ]; then
	MOUNTPATH="Swap Space"
fi

# Search for Device
SNMPLINE=`snmpwalk -v1 -OQ -c "${COMMUNITY}" "${HOST}" host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageDescr |grep "${MOUNTPATH}\$"`
if [ $? -ne 0 ]; then
	echo "Error: Mount Path not found."
	exit ${STATE_UNKNOWN}
fi

# Now get the wanted device's index
INDEX=`echo ${SNMPLINE} |sed 's/^.*hrStorageDescr\.\([0-9]*\) = .*$/\1/'`

# Next, get neccessary information for some mathematics
SIZE=`snmpget -v1 -OQv -c "${COMMUNITY}" "${HOST}" host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageSize.${INDEX}`
USED=`snmpget -v1 -OQv -c "${COMMUNITY}" "${HOST}" host.hrStorage.hrStorageTable.hrStorageEntry.hrStorageUsed.${INDEX}`

if [ -z "${SIZE}" -o -z "${USED}" ]; then
	echo "Could not get size values."
	exit ${STATE_UNKNOWN}
fi

if [ ${SIZE} -eq 0 -o ${USED} -eq 0 ]; then
	echo "Size values are zero."
	exit ${STATE_UNKNOWN}
fi

# Now calculon, compute! Ergebnis muß sein: % free
FREE=`echo "$SIZE - $USED" |bc`
PCT=`echo "100 * $FREE / $SIZE" |bc`

if [ ${PCT} -ge ${CRITLEVEL} ]; then
	echo "DISK CRITICAL [${PCT}% used on ${MOUNTPATH}]"
	exit ${STATE_CRITICAL}
elif [ ${PCT} -ge ${WARNLEVEL} ]; then
	echo "DISK WARNING [${PCT}% used on ${MOUNTPATH}]"
	exit ${STATE_WARNING}
else
	echo "DISK OK [${PCT}% used on ${MOUNTPATH}]"
	exit ${STATE_OK}
fi

# EOF
