#!/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 <hostname> <start time> <end time> <fixed> <duration> <user> <comment>"
	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="/usr/local/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
# Zero added to the below line so the script generates correct command
cmdline="[$datetime] SCHEDULE_HOST_DOWNTIME;$hostname;$start_time;$end_time;$fixed;0;$duration;$comment_author;$comment_data"

# append the command to the end of the command file
`$echocmd $cmdline >> $CommandFile`
