#!/bin/bash
#< Nagios Plugin - Check mailq size of a local Solaris zone

AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
ECHO="/bin/echo"
GREP="/usr/xpg4/bin/grep"
MAILQ="/usr/local/bin/mailq"
SED="/usr/bin/sed"
SUDO="/usr/local/bin/sudo"
ZLOGIN="/usr/sbin/zlogin"
ZONEADM="/usr/sbin/zoneadm"

THISPROG=$( ${BASENAME} $0 )

VERBOSE=0

E_SUCCESS=0
E_WARNING=1
E_CRITICAL=2
E_UNKNOWN=3

function print_error {
   ${ECHO} "Error: $@" >&2
}

function printv {
   (( VERBOSE )) && {
      ${ECHO} "--> $@"
   }
}

function print_usage {
   {
      ${ECHO} "Usage: ${THISPROG} [-hv] [-z <zone_name>] -c <crit> -w <warn>"
      ${ECHO} "       -c   Specify critical threshold (integer)"
      ${ECHO} "       -h   Display this usage message"
      ${ECHO} "       -v   Verbose mode"
      ${ECHO} "       -w   Specify warning threshold (integer)"
      ${ECHO} "       -z   Specify zone name"
   } >&2
}

function check_args {
	if [ -z "${ZONE}" ]; then
		${ECHO} "UNKNOWN: Zone name must be specified"
		exit ${E_UNKNOWN}
	fi
   if [ -z "${CRIT}" ]; then
      ${ECHO} "UNKNOWN: You must specify a critical threshold"
      exit ${E_UNKNOWN}
   fi
   if [ -z "${WARN}" ]; then
      ${ECHO} "UNKNOWN: You must specify a warning threshold"
      exit ${E_UNKNOWN}
   fi
   ${ECHO} "${CRIT}" | ${GREP} -E -q '^[0-9]+$'
   if [ "$?" -ne "0" ]; then
      ${ECHO} "UNKNOWN: Invalid format for critical threshold"
      exit ${E_UNKNOWN}
   fi
   ${ECHO} "${WARN}" | ${GREP} -E -q '^[0-9]+$'
   if [ "$?" -ne "0" ]; then
      ${ECHO} "UNKNOWN: Invalid format for warning threshold"
      exit ${E_UNKNOWN}
   fi
   if [ "${CRIT}" -lt "${WARN}" ]; then
      ${ECHO} "UNKNOWN: Critical threshold must be greater than warning threshold"
      exit ${E_UNKNOWN}
   fi
}

function check_zone {
	ZONEADM_OUT=$( ${SUDO} ${ZONEADM} list -cp | ${AWK} 'BEGIN {FS=":"} $1 !~ /^0$/ && $1 !~ /^-$/ {print $2}' )
   ${ECHO} "${ZONEADM_OUT}" | ${GREP} -q "^${ZONE}$"
   if [ "$?" -ne "0" ]; then
		${ECHO} "UNKNOWN: Zone ${ZONE} not present on system"
		exit ${E_UNKNOWN}
	fi
}

function check_mailq {
   MAILQ_OUT=$( ${SUDO} ${ZLOGIN} ${ZONE} ${MAILQ} )
   MAILQ_SIZE=$( ${ECHO} "${MAILQ_OUT}" | ${SED}  -n 's/^--.* \([0-9]*\) Requests\./\1/p' )
   [[ -z "${MAILQ_SIZE}" ]] && MAILQ_SIZE=0
   if [ "${MAILQ_SIZE}" -ge "${CRIT}" ]; then
		${ECHO} "CRITICAL: ${ZONE}: ${MAILQ_SIZE} messages in mailq"
		exit ${E_CRITICAL}
	elif [ "${MAILQ_SIZE}" -ge "${WARN}" ]; then
		${ECHO} "WARNING: ${ZONE}: ${MAILQ_SIZE} messages in mailq"
		exit ${E_WARNING}
	else
		${ECHO} "OK: ${ZONE}: ${MAILQ_SIZE} messages in mailq"
		exit ${E_OK}
	fi
}

#
# main()
#
while getopts ":c:hvw:z:" OPTION; do
  case ${OPTION} in
     "c")  CRIT="${OPTARG}"        ;;
     "h")  print_usage && exit 0   ;;
     "v")  VERBOSE=1               ;;
     "w")  WARN="${OPTARG}"        ;;
     "z")  ZONE="${OPTARG}"        ;;
     *  )  print_usage && exit 1   ;;
  esac
done

shift $(( ${OPTIND} - 1 ))

if [ "$#" -ne "0" ]; then
   print_usage && exit 1
fi

check_args
check_zone
check_mailq

${ECHO} "UNKNOWN: Should never be reached"
exit ${E_UNKNOWN}