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