#!/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}