#!/bin/bash
# Dmitry Vayntrub 03/11/2009
#
# The plugin shows the uptime and optionally
# compares it against MIN and MAX uptime thresholds
#
# Revision History:
#	v 1.06 - Performance Data added by Tony Yarusso on Jan 27, 2011.
#	v 1.05 - Bugfix added by Peter Lecki on July 28, 2010.
#	v 1.04 - posted by Dmitry Vayntrub Mar 11, 2009 on Nagios Exchange.
#
#######################################################################
VERSION="check_uptime v1.06"

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

usage()
{
cat << EOF
usage: $0 [-c OPTION]|[-w OPTION] [-C OPTION]|[-W OPTION] [ -V ]

This script checks uptime and optionally verifies if the uptime
is below MINIMUM or above MAXIMUM uptime treshholds

OPTIONS:
   -h   Help
   -c   CRITICAL MIN uptime (minutes)
   -w   WARNING  MIN uptime (minutes)
   -C   CRITICAL MAX uptime (minutes)
   -W   WARNING  MAX uptime (minutes)
   -V   Version
EOF
}

while getopts c:w:C:W:Vv OPTION
do
     case $OPTION in
	c)
	   MIN_CRITICAL=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	w)
	   MIN_WARNING=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	C)
	   MAX_CRITICAL=`echo $OPTARG | grep -v "^-"`
	   [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
	   exit $STATE_UNKNOWN
	   ;;
	W)
	   MAX_WARNING=`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


UPTIME_REPORT=`uptime | tr -d ","`

if	echo $UPTIME_REPORT | grep -i day > /dev/null ; then

	if	echo $UPTIME_REPORT | grep -i "min" > /dev/null ; then

		DAYS=`echo $UPTIME_REPORT | awk '{ print $3 }'`
		MINUTES=`echo $UPTIME_REPORT | awk '{ print $5}'`

	else
		DAYS=`echo $UPTIME_REPORT | awk '{ print $3 }'`
		HOURS=`echo $UPTIME_REPORT | awk '{ print $5}' | cut -f1 -d":"`
		MINUTES=`echo $UPTIME_REPORT | awk '{ print $5}' | cut -f2 -d":"`
	fi

elif	#in AIX 5:00 will show up as 5 hours, and in Solaris 2.6 as 5 hr(s)
	echo $UPTIME_REPORT | egrep -e "hour|hr\(s\)" > /dev/null ; then
	HOURS=`echo $UPTIME_REPORT | awk '{ print $3}'`
else
	echo $UPTIME_REPORT | awk '{ print $3}' | grep ":" > /dev/null && \
	HOURS=`echo $UPTIME_REPORT | awk '{ print $3}' | cut -f1 -d":"`
	MINUTES=`echo $UPTIME_REPORT | awk '{ print $3}' | cut -f2 -d":"`
fi

UPTIME_MINUTES=`expr 0$DAYS \* 1440 + 0$HOURS \* 60 + 0$MINUTES`
if [ -x /usr/bin/bc ]; then
	RAW_DAYS=`echo "$UPTIME_MINUTES / 1440" | /usr/bin/bc -l`
else
	RAW_DAYS=`expr 0$UPTIME_MINUTES \/ 1440`
fi
UPTIME_DAYS=`printf %3.4lf $RAW_DAYS`
UPTIME_MSG="${DAYS:+$DAYS Days,} ${HOURS:+$HOURS Hours,} $MINUTES Minutes"
PERFDATA="|Uptime=$UPTIME_DAYS;$MIN_WARNING:$MAX_WARNING;$MIN_CRITICAL:$MAX_CRITICAL;0;"
if [ $MIN_CRITICAL ] && [ $UPTIME_MINUTES -lt $MIN_CRITICAL ] ; then
	echo "CRITICAL - system rebooted $UPTIME_MSG ago$PERFDATA"
	exit $STATE_CRITICAL

  elif [ $MIN_WARNING ] && [ $UPTIME_MINUTES -lt $MIN_WARNING ] ; then
	echo "WARNING - system rebooted $UPTIME_MSG ago$PERFDATA"
	exit $STATE_WARNING

  elif [ $MAX_CRITICAL ] && [ $UPTIME_MINUTES -gt $MAX_CRITICAL ] ; then
	echo "CRITICAL - system has not rebooted for $UPTIME_MSG$PERFDATA"
	exit $STATE_CRITICAL

  elif [ $MAX_WARNING ] && [ $UPTIME_MINUTES -gt $MAX_WARNING ] ; then
	echo "WARNING - system has not rebooted for $UPTIME_MSG$PERFDATA"
	exit $STATE_WARNING

  else
	echo "OK - uptime is $UPTIME_MSG$PERFDATA"
	exit $STATE_OK
fi


