#!/bin/bash
#< Nagios plugin to monitor Postfix mail queue

AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
ECHO="/bin/echo"
EGREP="/bin/egrep"
POSTQUEUE="/usr/sbin/postqueue"
SED="/usr/bin/sed"

THISPROG=$( ${BASENAME} $0 )

CRIT=0
WARN=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]"   
      ${ECHO} "       -h   Display this usage message"
      ${ECHO} "       -v   Verbose mode"
   } >&2
}

function check_args {
   if [ "${CRIT}" -eq "0" -o "${WARN}" -eq "0" ]; then
      ${ECHO} "UNKNOWN: WARN and CRIT are mandatory and must be >0"
      exit ${E_UNKNOWN}
   fi
   ${ECHO} "${WARN}" | ${EGREP} -q "^[0-9]+$"
   if [ "$?" -ne "0" ]; then
      ${ECHO} "UNKNOWN: WARN must be an integer"
      exit ${E_UNKNOWN}
   fi
   ${ECHO} "${CRIT}" | ${EGREP} -q "^[0-9]+$"
   if [ "$?" -ne "0" ]; then
      ${ECHO} "UNKNOWN: CRIT must be an integer"
      exit ${E_UNKNOWN}
   fi
   if [ "${CRIT}" -le "${WARN}" ]; then
      ${ECHO} "UNKNOWN: CRIT must be > WARN"
      exit ${E_UNKNOWN}
   fi
}

function do_check {
   MAILQ_ITEMS=$( ${POSTQUEUE} -p | ${SED} -n '$p' | ${AWK} '{print $5}' )
   if [ "${MAILQ_ITEMS}" = "" ]; then
      ${ECHO} "OK: mailq is empty|mailq=0;${WARN};${CRIT}" && exit ${E_SUCCESS}
   fi  
   if [ "${MAILQ_ITEMS}" -ge "${CRIT}" ]; then
      ${ECHO} "CRITICAL: ${MAILQ_ITEMS} messages in mailq|mailq=${MAILQ_ITEMS};${WARN};${CRIT}" && exit ${E_CRITICAL}
   elif [ "${MAILQ_ITEMS}" -ge "${WARN}" ]; then
      ${ECHO} "WARNING: ${MAILQ_ITEMS} messages in mailq|mailq=${MAILQ_ITEMS};${WARN};${CRIT}" && exit ${E_WARNING}
   else
      ${ECHO} "OK: ${MAILQ_ITEMS} messages in mailq|mailq=${MAILQ_ITEMS};${WARN};${CRIT}" && exit ${E_SUCCESS}
   fi
}

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

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

if [ "$#" -ne "0" ]; then
   print_usage && exit ${E_UNKNOWN}
fi

check_args
do_check

# not reached
exit ${E_SUCCESS}