#!/bin/sh # # Write a command to the Nagios command file to cause # it to schedule host downtime. # # Author: Sam Tilders sam@jovianprojects.com.au # # Based on the example event handler scripts and cmd.c/.cgi # # Requires: # GNU Date (for date formatting options) # Bash > 2.x (for inline variable regex substitution on the comment_data) # Notes: # 1) In order for Nagios to process any commands that # are written to the command file, you must enable # the check_external_commands option in the main # configuration file. # Caveats: # Using "date" to validate the command line date format doesn't always pick # up all mistakes in the date format. Sometimes "date" seems to invent something # that might have been what you intented. # Makes no attempt to verify the hostname before passing it to # the command pipe. Nagios seems to ignore the command if it doesn't match. # Example: # A cron entry to schedule downtime for the mailserver on the first # day of the month from 0400 - 0500: # 30 0 1 * * schedule_host_downtime mailserver "`date --iso-8601` 04:00:00" "`date --iso-8601` 05:00:00" 1 3600 auto "scheduled maintenance" # There are utilities such as "shellsupport" that will do date manipulation allowing shell scripts # to wrap around this command to schedule for days in advance instead of same date. usage() { echo "Usage: $0 " echo " Times must be in the form \"CCYY-MM-DD HH:mm:ss\" and will probably need to be quoted." echo " fixed is either 1 or 0 and indicates that the time period is fixed and duration should be ignored" echo " length of the downtime in seconds, only used if not fixed downtime" echo " user who is requesting the downtime" echo " comment to place on the downtime, probably will need to be quoted." } if [ $# -lt 7 ]; then echo "$0: Too few parameters" usage exit 1 fi if [ $# -gt 7 ]; then echo "$0: Too many parameters" usage exit 1 fi hostname=$1 raw_start=$2 raw_end=$3 fixed=$4 duration=$5 comment_author=$6 # command is comment with ; replaced for space comment_data=${7/;/ } echocmd="/bin/echo" CommandFile="/opt/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` start_time=`date -d "$raw_start" +%s` if [ $? != 0 ]; then echo "Bad format for start time." usage exit 1 fi end_time=`date -d "$raw_end" +%s` if [ $? != 0 ]; then echo "Bad format for end time." usage exit 1 fi if [ $fixed != 1 -a $fixed != 0 ]; then echo "Fixed must be 1 or 0" usage exit 1 fi # create the command line to add to the command file cmdline="[$datetime] SCHEDULE_HOST_DOWNTIME;$hostname;$start_time;$end_time;$fixed;$duration;$comment_author;$comment_data" # append the command to the end of the command file `$echocmd $cmdline >> $CommandFile`