#!/usr/bin/env bash # # Command wrapper that sends an appropriate passive check to an NSCA server # using send_nsca, depending on the command's outcome. # # Make sure send_nsca is in $PATH and that NSCAW_SERVER is set. # # $ nscaw IMPORTANT_JOB -- important-job -o options args ... # # Author: Tom Ryder # License: MIT # # Name ourself self=nscaw # If there's a defaults file with environment variables for us, source it if [[ -r /etc/default/"$self" ]] ; then source /etc/default/"$self" fi # Define a function to explain how to use this script usage() { printf 'Usage: %s SERVICE -- COMMAND...\n' \ "$self" } # Respond to requests for help with usage (exit success) case $1 in -h|--help) usage exit 0 ;; esac # Check that at least three arguments are present and in the correct form if (( $# < 3 )) || [[ $2 != -- ]] ; then usage >&2 exit 1 fi # Pull the service from the first argument and shift the first two arguments # off the arguments array; the rest of the array should be the command to run service=$1 shift 2 # Figure out our hostname; most of the time `hostname -s` will be fine, but # it can be overridden with the value of NSCAW_HOSTNAME if defined hostname=${NSCAW_HOSTNAME:-$(hostname -s)} # Figure out our username username=$(whoami) # Attempt to run command within a time wrapper # exec 3>&1 4>&2 time=$( { time "$@" 1>&3 2>&4 ; } 2>&1) ; ret=$? exec 3>&- 4>&- # Munge the time to make it palatable as a single line time=${time#$'\n'} # Strip leading newline time=${time//$'\n'/, } # Change all newlines to comma-space time=${time//$'\t'/ } # Change all tabs to spaces # Decide return code and message based on command exit value case $ret in 0) code=0 # OK message=$(printf '%s: `%s` ran with no errors as user %s: %s' \ "$self" "$*" "$username" "$time") ;; 127) code=3 # UNKNOWN message=$(printf '%s: `%s` could not be found as user %s with PATH=%s' \ "$self" "$1" "$username" "$PATH") ;; *) code=2 # CRITICAL message=$(printf '%s: `%s` ran with errors as user %s: %s' \ "$self" "$*" "$username" "$time") ;; esac # Format the passive check and pipe it into send_nsca; note that we ignore the # stdout of send_nsca as it's just a diagnostic message printf '%s\t%s\t%u\t%s\n' \ "$hostname" "$service" "$code" "$message" | send_nsca -H "${NSCAW_SERVER:?}" \ -c "${NSCAW_CONFIG:-/etc/send_nsca.cfg}" >/dev/null