aboutsummaryrefslogblamecommitdiff
path: root/nscaw
blob: ca97baca1b33e535e309094ffa09aa4f1a25ac9b (plain) (tree)


















































                                                                             


                         









                                                            

                                                            
            

                   

                                                   


                         

                                                                            






                                                                              

                                                               
 
#!/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 <tom@sanctum.geek.nz>
# 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
# <http://mywiki.wooledge.org/BashFAQ/032>
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` succeeded: %s' \
            "$self" "$*" "$time")
        ;;
    *)
        code=2 # CRITICAL
        message=$(printf '%s: `%s` failed (exit %d), USER %s, PATH=%s: %s' \
            "$self" "$*" "$ret" "$username" "$PATH" "$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