diff options
Diffstat (limited to 'nscaw.bash')
-rw-r--r-- | nscaw.bash | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/nscaw.bash b/nscaw.bash new file mode 100644 index 0000000..a281162 --- /dev/null +++ b/nscaw.bash @@ -0,0 +1,95 @@ +#!bash +# +# Copyright (C) 2014--2018, 2021 Tom Ryder <tom@sanctum.geek.nz> +# +# This file is part of nscaw. +# +# nscaw is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# nscaw is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# nscaw. If not, see <https://www.gnu.org/licenses/>. +# + +# +# 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 ... +# + +# 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 +TIMEFORMAT=$'real %3lR, user %3lU, sys %3lS\n' \ + time=$( { time "$@" 1>&3 2>&4 ; } 2>&1) ; ret=$? +exec 3>&- 4>&- + +# 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:-nsca}" \ + -c "${NSCAW_CONFIG:-/etc/send_nsca.cfg}" >/dev/null |