#!/bin/sh
# 
# chkconfig: 345 99 01
# description: Icinga network monitor
### BEGIN INIT INFO
# Provides: icinga
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start:  3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop Icinga monitoring daemon
# Description: Icinga is a service monitoring system
### END INIT INFO
#
# File : icinga
#
# Author : Jorge Sanchez Aymar (jsanchez@lanchile.cl)
# 
# Changelog :
#
# 1999-07-09 Karl DeBisschop <kdebisschop@infoplease.com>
#  - setup for autoconf
#  - add reload function
# 1999-08-06 Ethan Galstad <egalstad@nagios.org>
#  - Added configuration info for use with RedHat's chkconfig tool
#    per Fran Boon's suggestion
# 1999-08-13 Jim Popovitch <jimpop@rocketship.com>
#  - added variable for icinga/var directory
#  - cd into icinga/var directory before creating tmp files on startup
# 1999-08-16 Ethan Galstad <egalstad@nagios.org>
#  - Added test for rc.d directory as suggested by Karl DeBisschop
# 2000-07-23 Karl DeBisschop <kdebisschop@users.sourceforge.net>
#  - Clean out redhat macros and other dependencies
# 2003-01-11 Ethan Galstad <egalstad@nagios.org>
#  - Updated su syntax (Gary Miller)
# 2010-04-20 Michael Friedrich <michael.friedrich@univie.ac.at>
#  - Added show-errors, improved configuration checks (Wolfgang Nieder)
#
# Description: Starts and stops the Icinga monitor
#              used to provide network services status.
#
  
status_icinga ()
{

	if test -x $IcingaCGI/daemonchk.cgi; then
		if $IcingaCGI/daemonchk.cgi -l $IcingaRunFile; then
		        return 0
		else
			return 1
		fi
	else
		if ps -p $IcingaPID > /dev/null 2>&1; then
		        return 0
		else
			return 1
		fi
	fi

	return 1
}


printstatus_icinga()
{

	if status_icinga $1 $2; then
		echo "icinga (pid $IcingaPID) is running..."
	else
		echo "icinga is not running"
	fi
}


killproc_icinga ()
{

	kill $2 $IcingaPID

}


pid_icinga ()
{

	if test ! -f $IcingaRunFile; then
		echo "Icinga not running. No lock file found in $IcingaRunFile"
		exit 1
	fi

	IcingaPID=`head -n 1 $IcingaRunFile`
}


chk_config ()
{
	echo "Running configuration check..."
	$IcingaBin -v $IcingaCfgFile > $IcingaChkFile 2>&1
	if test $? -ne 0; then
		if test -z "$1"; then
			cat $IcingaChkFile
			echo "Result saved to $IcingaChkFile"
		else
			echo $1
		fi
		exit 1
	fi
	rm -f $IcingaChkFile
	echo "OK"
	#exit 0
}

# Source function library
# Solaris doesn't have an rc.d directory, so do a test first
if [ -f /etc/rc.d/init.d/functions ]; then
	. /etc/rc.d/init.d/functions
elif [ -f /etc/init.d/functions ]; then
	. /etc/init.d/functions
fi

prefix=/usr
exec_prefix=/usr
IcingaBin=/usr/bin/icinga
IcingaCfgFile=/etc/icinga/icinga.cfg
IcingaStatusFile=/var/icinga/status.dat
IcingaRetentionFile=/var/icinga/retention.dat
IcingaCommandFile=/var/icinga/rw/icinga.cmd
IcingaVarDir=/var/icinga
IcingaRunFile=/var/icinga/icinga.pid
IcingaLockDir=/var/lock/subsys
IcingaLockFile=icinga
IcingaCGIDir=/usr/share/icinga/cgi
IcingaUser=icinga
IcingaGroup=icinga
IcingaChkFile=/var/icinga/icinga.chk
          

# Check that icinga exists.
if [ ! -f $IcingaBin ]; then
    echo "Executable file $IcingaBin not found.  Exiting."
    exit 1
fi

# Check that icinga.cfg exists.
if [ ! -f $IcingaCfgFile ]; then
    echo "Configuration file $IcingaCfgFile not found.  Exiting."
    exit 1
fi
          
# See how we were called.
case "$1" in

	start)
		# Check if icinga is already running
	        $0 status > /dev/null
                if [ $? -eq 0 ]; then
                        pid_icinga
			# check if pid can be found running
			if status_icinga > /dev/null; then
	                        echo "Icinga is already running. PID: $IcingaPID"
				exit 1
			else
				echo "Icinga PID $IcingaPID not running. Removing lockfile."
				rm -f $IcingaStatusFile $IcingaRunFile $IcingaLockDir/$IcingaLockFile $IcingaCommandFile
			fi
                fi

		echo -n "Starting icinga: "
		chk_config "CONFIG ERROR!  Start aborted. See $IcingaChkFile for details."
		rm -f $IcingaCommandFile
		touch $IcingaRunFile
		chown $IcingaUser:$IcingaGroup $IcingaRunFile
		$IcingaBin -d $IcingaCfgFile
		if [ -d $IcingaLockDir ]; then touch $IcingaLockDir/$IcingaLockFile; fi
		echo "Starting icinga done."
		exit 0
		;;

	stop)
		echo -n "Stopping icinga: "

		pid_icinga
		killproc_icinga icinga

 		# now we have to wait for icinga to exit and remove its
 		# own IcingaRunFile, otherwise a following "start" could
 		# happen, and then the exiting icinga will remove the
 		# new IcingaRunFile, allowing multiple icinga daemons
 		# to (sooner or later) run - John Sellens
		#echo -n 'Waiting for icinga to exit .'
 		for i in 1 2 3 4 5 6 7 8 9 10 ; do
 		    if status_icinga > /dev/null; then
 			echo -n '.'
 			sleep 1
 		    else
 			break
 		    fi
 		done
 		if status_icinga > /dev/null; then
 		    echo ''
 		    echo 'Warning - icinga did not exit in a timely manner. Please try again.'
 		else
 		    echo 'Stopping icinga done.'
                    rm -f $IcingaStatusFile $IcingaRunFile $IcingaLockDir/$IcingaLockFile $IcingaCommandFile
 		fi

		;;

	status)
		pid_icinga
		printstatus_icinga icinga
		;;

	checkconfig)
		chk_config " CONFIG ERROR!  See $IcingaChkFile for details."
		;;

	show-errors)
		chk_config
		;;

	restart)
		chk_config " CONFIG ERROR!  Restart aborted.  See $IcingaChkFile for details."
		$0 stop
		$0 start
		;;

	reload|force-reload)
		chk_config " CONFIG ERROR!  Reload aborted.  See $IcingaChkFile for details."
		if test ! -f $IcingaRunFile; then
			$0 start
		else
			pid_icinga
			if status_icinga > /dev/null; then
				printf "Reloading icinga configuration..."
				killproc_icinga icinga -HUP
				echo "done"
			else
				$0 stop
				$0 start
			fi
		fi
		;;

	*)
		echo "Usage: icinga {start|stop|restart|reload|force-reload|status|checkconfig|show-errors}"
		exit 1
		;;

esac
  
# End of this script
