#!/bin/sh # Version 1.2 as of 20-Jun-2012 # CONFIGURATION SECTION ################################################ # Note that since v1.2, these configs can be overridden by options # nagiostats/icingastats/... executable EXEC="/usr/local/nagios/bin/nagiostats" # Cumulation function (MIN, MAX, AVG) and timeframe (1, 5, or 15 # minutes) of choice for the "gimme all there is" mode CUMULATE="AVG" TIMERANGE="5" # Attempt to add the $TIMERANGEs used to the perfdata? RANGETRACK=true # Hostname and service description to use when passive check mode is # requested and host and/or service cannot be determined PASSIVE_EMERGENCY_HOST="Nagios" PASSIVE_EMERGENCY_SERV="Nagios Stats" ######################################################################## PASSIVE=false CONFIG="" make_an_exit() { if $PASSIVE ; then date '+[%s] PROCESS_SERVICE_CHECK_RESULT;'"$PSV_HST;$PSV_SVC;$1;$2" exit 0 else echo "$2" exit $1 fi } while true ; do case $1 in # Controlling active/passive mode -p|--passive) PASSIVE=true PSV_HST="$2" PSV_SVC="$3" if [ "$PSV_HST" = "" -o "$PSV_SVC" = "" ]; then PSV_HST="$PASSIVE_EMERGENCY_HOST" PSV_SVC="$PASSIVE_EMERGENCY_SERV" make_an_exit 3 "UNKNOWN: `basename $0`: '--passive' needs to be followed by host ($2) and service ($3)" fi shift 2 ;; -a|--active) PASSIVE=false ;; # Options passed to $EXEC -c|--config|-s|--statsfile) CONFIG="$CONFIG $1 $2" shift ;; -c*|--config=*|-s*|--statsfile=*) CONFIG="$CONFIG $1" ;; # Modifying our own default configs -E|--exec|--EXEC) EXEC="$2" shift ;; -C|--cumulate|--CUMULATE) CUMULATE="$2" shift ;; -T|--timerange|--TIMERANGE) TIMERANGE="$2" shift ;; -R|--rangetrack|--RANGETRACK) RANGETRACK=true ;; -N|--norangetrack|--NORANGETRACK) RANGETRACK=false ;; # Online help -h|--help) BASESELF=`basename $0` BASEEXEC=`basename $EXEC` MODE="--active" if $PASSIVE ; then MODE="--passive '$PSV_HST' '$PSV_SVC'" fi TRACK="--NORANGETRACK" if $RANGETRACK ; then TRACK="--RANGETRACK" fi cat << EOHelp Usage: $BASESELF [ options ... ] [ checks ... ] Executes $BASEEXEC (or an equivalent command) to re- trieve internal statistics from your monitoring solu- tion, and optionally checks values against limits you specify. If no checks are requested, only values disagreeing from the preselected timerange and cumulation function are omitted from the output. Options: --passive "Hostname" "Service Description" Output passive check result in external command syntax. (Remember to redirect the output to the command pipe.) --active Switches back to active check mode. --config Configfile --statsfile Statusfile Passed through as-is to $BASEEXEC (for OMD's benefit). --EXEC StatisticsGatherer - i.e., /path/to/$BASEEXEC --CUMULATE CumulationFunction - i.e., MIN, MAX, or AVG --TIMERANGE TimeRange - i.e., 1, 5, or 15 (minutes) --RANGETRACK --NORANGETRACK Change $BASESELF configuration values on the fly. --help Output this help (and exit). Note: The options and values set or implied at this point are: $MODE$CONFIG --EXEC $EXEC --CUMULATE $CUMULATE --TIMERANGE $TIMERANGE $TRACK Checks: Every check is specified as: variable comparison value(pair) where: "variable" is any "MRTG variable" supported by your $BASEEXEC "comparison" is any numeric comparison operator that your local "test" executable offers "value(pair)" is either one integer (CRITICAL limit) or two integers with a '/' separator (i.e., WARNING/CRITICAL) the result being TRUE means that the alert should be raised "variable -lt 0" can (should) be used to include the variable into the output without checking any limits on it Example: $BASESELF --active STATUSFILEAGETT -gt 900/1800 PROGRUNTIMETT -lt 0 OK: STATUSFILEAGETT=3 PROGRUNTIMETT=160707 | STATUSFILEAGETT=3;900;1800 PROGRUNTIMETT=160707 checks the age of your status.dat, returns WARNING/CRITICAL if the file hasn't been updated for more than 15/30 minutes, and also tells you how long the program has been running since the last restart/reload (without applying limits to that). EOHelp exit 0 ;; # Unknown option -*) make_an_exit 3 "UNKNOWN: Unknown option '$1'" ;; # Not an option at all (parameters start) *) break ;; esac shift done if [ ! -x "$EXEC" ]; then make_an_exit 3 "UNKNOWN: Cannot find executable $EXEC" fi if [ $# -gt 0 ]; then EXITVAL=0 EXITSTR="OK" OUTPUT="" while [ $# -gt 0 ]; do if [ "$1" = "" ]; then make_an_exit 3 "UNKNOWN: Need a value name" fi VALUE=`$EXEC $CONFIG -m -d "$1"` if [ "$VALUE" = "" -o "$VALUE" = "$1" ]; then make_an_exit 3 "UNKNOWN: Value $1 does not seem to exist" fi INTVAL="`echo $VALUE | sed -e 's/^\./0\./' -e 's/\..*//'`" if [ "`echo $INTVAL | sed -e 's/[0-9]*//'`" != "" ]; then make_an_exit 3 "UNKNOWN: Value $1 seems to be non-numeric ($VALUE)" fi if [ "`echo $3 | sed -e 's|.*/.*|/|'`" = "/" ]; then WARN="`echo $3 | sed -e 's|/.*||'`" CRIT="`echo $3 | sed -e 's|.*/||'`" else WARN="" CRIT="$3" fi if [ "$WARN" != "" -a "`echo $WARN | sed -e 's/[0-9]*//'`" != "" ]; then make_an_exit 3 "UNKNOWN: Not an integer: $WARN" fi if [ "$CRIT" = "" -o "`echo $CRIT | sed -e 's/[0-9]*//'`" != "" ]; then make_an_exit 3 "UNKNOWN: Not an integer: $CRIT" fi LIMITS="" for LIMIT in "$WARN" "$CRIT" ; do if [ "$LIMIT" = "" -o \( "$2" = "-lt" -a "$LIMIT" = "0" \) ]; then if [ "$CRIT" != "0" ]; then LIMITS="$LIMITS;" fi else case $2 in -eq) LIMITS="$LIMITS;@${LIMIT}:$LIMIT" ;; -ne) LIMITS="$LIMITS;${LIMIT}:$LIMIT" ;; -ge) LIMITS="$LIMITS;`echo $LIMIT 1 - p | dc`" ;; -gt) LIMITS="$LIMITS;$LIMIT" ;; -le) LIMITS="$LIMITS;`echo $LIMIT 1 + p | dc`:" ;; -lt) LIMITS="$LIMITS;${LIMIT}:" ;; *) make_an_exit 3 "UNKNOWN: Not a comparison operator: $2" ;; esac fi done if [ $INTVAL $2 $CRIT ]; then EXITVAL=2 EXITSTR="CRITICAL" OUTPUT="$OUTPUT "'**'"$1=$VALUE"'**' elif [ "$WARN" != "" ]; then if [ $INTVAL $2 $WARN ]; then if [ $EXITVAL -eq 0 ]; then EXITVAL=1 EXITSTR="WARNING" fi OUTPUT="$OUTPUT "'*'"$1=$VALUE"'*' else OUTPUT="$OUTPUT $1=$VALUE" fi else OUTPUT="$OUTPUT $1=$VALUE" fi PERFDATA="$PERFDATA $1=$VALUE$LIMITS" if $RANGETRACK ; then if [ "`echo $1 | sed -e 's/[^0-9]//g'`" != "" ]; then PERFDATA="$PERFDATA r_$1=`echo $1 | sed -e 's/[^0-9][^0-9]*$//' -e 's/^.*[^0-9]//'`" fi fi shift 3 done make_an_exit $EXITVAL "${EXITSTR}:$OUTPUT |$PERFDATA" else PREFIX="" if $PASSIVE ; then PREFIX=`date '+[%s] PROCESS_SERVICE_CHECK_RESULT;'"$PSV_HST;$PSV_SVC;0;"` fi POSTFIX="" if $RANGETRACK ; then POSTFIX=" TimeRange=$TIMERANGE" fi $EXEC $CONFIG -m -d `$EXEC $CONFIG -h | egrep '^ *([A-Z][A-Z]|xx)' | \ awk 'BEGIN { s=""; } { printf "%s%s=,%s",s,$1,$1; s=","; }' | \ sed -e 's/xxxx*/'"$CUMULATE/g" -e 's/xx*/'"$TIMERANGE/g"` | \ sed -e '/=$/N' -e 's/=[^0-9]*/=/' | egrep '=([0-9][0-9]*|[0-9]*\.[0-9][0-9]*)$' | \ tr '\n' ' ' | sed -e 's/^/'"$PREFIX"'OK: Statistics read | /' -e 's/$/'"$POSTFIX/" | \ grep 'OK: Statistics read' if [ $? -eq 0 ]; then exit 0 else make_an_exit 2 "CRITICAL: Cannot read statistics with `basename $EXEC`" fi fi