#!/bin/bash
#< Nagios Plugin - Check load/usage of a Solaris processor pool
AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
ECHO="/bin/echo"
GREP="/usr/xpg4/bin/grep"
POOLSTAT="/usr/bin/poolstat"
SED="/usr/bin/sed"
THISPROG=$( ${BASENAME} $0 )
POOL="pool_default"
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] {-u|-l} [-p <pool_name>] -c <crit> -w <warn>"
${ECHO} " -c Specify critical threshold (integer)"
${ECHO} " -h Display this usage message"
${ECHO} " -l Check pool load"
${ECHO} " -p Specify pool name (default: pool_default)"
${ECHO} " -u Check pool usage"
${ECHO} " -v Verbose mode"
${ECHO} " -w Specify warning threshold (integer)"
} >&2
}
function check_args {
if [ -z "${MODE}" ]; then
${ECHO} "UNKNOWN: You must specify a check type"
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_pool {
POOLSTAT_OUTPUT=$( ${POOLSTAT} -p ${POOL} -r pset 1 2 2>&1 )
if [ "$?" -ne "0" ]; then
${ECHO} "CRITICAL: Pool ${POOL} not found"
exit ${E_CRITICAL}
fi
POOLSTAT_OUTPUT=$( ${ECHO} "${POOLSTAT_OUTPUT}" | ${SED} -n '$p' )
case ${MODE} in
"load" ) POOL_LOAD=$( ${ECHO} "${POOLSTAT_OUTPUT}" | ${AWK} '{print $10}' )
POOL_LOAD_INT=$( ${ECHO} "${POOL_LOAD}" | ${SED} 's/\.[^.]*//' )
if [ "${POOL_LOAD_INT}" -ge "${CRIT}" ]; then
${ECHO} "CRITICAL: ${POOL} load ${POOL_LOAD}"
exit ${E_CRITICAL}
elif [ "${POOL_LOAD_INT}" -ge "${WARN}" ]; then
${ECHO} "WARNING: ${POOL} load ${POOL_LOAD}"
exit ${E_WARNING}
else
${ECHO} "OK: ${POOL} load ${POOL_LOAD}"
exit ${E_OK}
fi
;;
"usage" ) POOL_USAGE=$( ${ECHO} "${POOLSTAT_OUTPUT}" | ${AWK} '{print $9}' )
POOL_USAGE_INT=$( ${ECHO} "${POOL_USAGE}" | ${SED} 's/\.[^.]*//' )
if [ "${POOL_USAGE_INT}" -ge "${CRIT}" ]; then
${ECHO} "CRITICAL: ${POOL} usage ${POOL_USAGE}"
exit ${E_CRITICAL}
elif [ "${POOL_USAGE_INT}" -ge "${WARN}" ]; then
${ECHO} "WARNING: ${POOL} usage ${POOL_USAGE}"
exit ${E_WARNING}
else
${ECHO} "OK: ${POOL} usage ${POOL_USAGE}"
exit ${E_OK}
fi
;;
esac
}
#
# main()
#
while getopts ":c:hlp:uvw:" OPTION; do
case ${OPTION} in
"c") CRIT="${OPTARG}" ;;
"h") print_usage && exit 0 ;;
"l") MODE="load" ;;
"p") POOL="${OPTARG}" ;;
"u") MODE="usage" ;;
"v") VERBOSE=1 ;;
"w") WARN="${OPTARG}" ;;
* ) print_usage && exit 1 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
if [ "$#" -ne "0" ]; then
print_usage && exit 1
fi
check_args
check_pool
${ECHO} "UNKNOWN: Should never be reached"
exit ${E_UNKNOWN}