#!/usr/bin/env bash # # nagios-force-check(1) -- Force an immediate check of a nominated host or # service. # # $ nac [/] # # # Author: Tom Ryder # Copyright: 2016 # # Name self self=nagios-force-check # Usage printing function usage() { printf 'USAGE: %s (-a | [&2 exit 1 ;; esac done shift "$((OPTIND-1))" # Bail if -a was selected but there are more arguments if ((check_all_problems)) && (($#)) ; then usage >&2 exit 1 # Bail if -a wasn't selected and there are no arguments elif ! ((check_all_problems)) && ! (($#)) ; then usage >&2 exit 1 fi # Define relatively fixed/guaranteed fields for Nagios command; note that the # comment has a default of 'no comment given' now=$(date +%s) cmdfile=${NAGCMD_FILE:-/usr/local/nagios/var/rw/nagios.cmd} # Specs are either arguments or all unhandled problems declare -a specs if ((check_all_problems)) ; then while read -r object ; do specs=("${specs[@]}" "$object") done < <(nagios-problem-list) else specs=("$@") fi # Iterate through the specs given and run the force recheck command for spec in "${specs[@]}" ; do # Check the host or service exists if ! nagios-exists "$spec" ; then printf '%s: Host/service %s does not seem to exist\n' \ "$self" "$spec" >&2 fi # If a service name is specified after a slash, figure that out if [[ $spec == */* ]] ; then host=${spec%/*} service=${spec##*/} else host=$spec service= fi # Write command and print message if it fails; succeed silently declare -a cmds cmds=() if [[ $service ]] ; then cmds=("${cmds[@]}" "$(printf '[%lu] SCHEDULE_SVC_CHECK;%s;%s;%lu' \ "$now" "$host" "$service" "$now")") else cmds=("${cmds[@]}" "$(printf '[%lu] SCHEDULE_HOST_CHECK;%s;%lu' \ "$now" "$host" "$now")") cmds=("${cmds[@]}" "$(printf '[%lu] SCHEDULE_HOST_SVC_CHECKS;%s;%lu' \ "$now" "$host" "$now")") fi # Attempt to write commands to file for cmd in "${cmds[@]}" ; do if ! printf '%s\n' "$cmd" >> "$cmdfile" ; then printf '%s: Failed to write command to file\n' "$self" >&2 exit 1 fi done done