#!/bin/sh
#
### BEGIN INIT INFO
# Provides:          ido2db
# Required-Start:    $remote_fs $syslog $named $network $time
# Required-Stop:     $remote_fs $syslog $named $network
# X-Start-Before:    icinga
# X-Stop-After:      icinga
# Should-Start:      mysql postgresql
# Should-Stop:       mysql postgresql
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Icinga IDO2DB Initscript
# Description: 	     Icinga Data Out Daemon
### END INIT INFO

# chkconfig: 345 98 01
#
# File : ido2db
#
# 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 nagios/var directory
#  - cd into nagios/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)
# 2009-07-11 Hendrik Bäcker <andurin@process-zero.de>
#  - Rewrite ido2db init script, inspired by Sascha Runschke
#
#

servicename=@ido2db_name@
prefix=@prefix@
exec_prefix=${prefix}
Ido2dbBin=@bindir@/@ido2db_name@
Ido2dbCfgFile=@sysconfdir@/ido2db.cfg
Ido2dbRunFile=@IDO2DBLOCKFILE@
Ido2dbSockFile=@IDOSOCKFILE@
Ido2dbLockDir=/var/lock/subsys
Ido2dbLockFile=@ido2db_name@
Ido2dbUser=@icinga_user@
Ido2dbGroup=@icinga_grp@

#add ocilib lib path to link at runtime if enabled
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@ido2db_runtime@
export LD_LIBRARY_PATH


# load extra environment variables
if [ -f /etc/sysconfig/ido2db ]; then
    . /etc/sysconfig/ido2db
fi


# 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


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

# Check that ido2db.cfg exists.
if [ ! -f $Ido2dbCfgFile ]; then
    echo "Configuration file $Ido2dbCfgFile not found.  Exiting."
    exit 1
fi

## helper functions ##

# checks status if ido2db daemon
# return 0 if running
# return 1 if dead but pidfile exists
# return 3 if daemon is not running
# return 4 if the state is unknown
status_ido2db ()
{
    if pid_ido2db && status_ido2db_process; then
        return 0
    elif ! pid_ido2db && ! status_ido2db_process; then
        return 3
    elif pid_ido2db; then
        return 1
    else
        return 4
    fi
}

# check if process is running
status_ido2db_process ()
{
    if ps -p $Ido2dbPID > /dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}

# check pidfile for existence
pid_ido2db ()
{
    if test -f $Ido2dbRunFile; then
        Ido2dbPID=`head -n 1 $Ido2dbRunFile`
        return 0
    else
        return 1
    fi
}

# print human readable output of service status
printstatus_ido2db()
{
    status_ido2db $1 $2
    STATUS=$?
    if [ $STATUS -eq 0 ]; then
        echo "$servicename (pid $Ido2dbPID) is running..."
    elif [ $STATUS -eq 1 ]; then
        echo "$servicename is not running but subsystem locked"
    else
        echo "$servicename is not running"
    fi
    exit $STATUS
}

killproc_ido2db ()
{
	if status_ido2db $1 $2; then
		kill $Ido2dbPID
	fi

}

killproc9_ido2db ()
{
    kill -9 $Ido2dbPID

}

## MAIN ##
# See how we were called.
case "$1" in

	start)
		#check if ido2db is already running
		$0 status > /dev/null
		if [ $? -eq 0 ]; then
			pid_ido2db
			# check if pid can be found running
			if status_ido2db > /dev/null; then
				echo "$servicename is already running. PID: $Ido2dbPID"
				exit 0
			else
				echo "$servicename PID $Ido2dbPID not running. Removing lockfile."
				rm -f $Ido2dbStatusFile $Ido2dbRunFile $Ido2dbLockDir/$Ido2dbLockFile $Ido2dbCommandFile
			fi
		fi
		printf "Starting $servicename:"
		# remove leftover sockfile, from a system crash
		rm -f $Ido2dbSockFile
		touch $Ido2dbRunFile
		chown $Ido2dbUser:$Ido2dbGroup $Ido2dbRunFile
		$Ido2dbBin -c $Ido2dbCfgFile
		if [ -d $Ido2dbLockDir ]; then touch $Ido2dbLockDir/$Ido2dbLockFile; fi
		echo " done."
		exit 0
		;;

	stop)
		printf "Stopping $servicename: "

		pid_ido2db
		killproc_ido2db

 		# now we have to wait for ido2db to exit and remove its
 		# own Ido2dbRunFile, otherwise a following "start" could
 		# happen, and then the exiting ido2db will remove the
 		# new Ido2dbRunFile, allowing multiple ido2db daemons
 		# to (sooner or later) run - John Sellens
 		for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
 		    if status_ido2db > /dev/null; then
 			printf '.'
 			sleep 1
 		    else
 			break
 		    fi
 		done
 		if status_ido2db > /dev/null; then
 		    echo ''
 		    echo "Warning - $servicename did not exit in a timely manner. Sending kill -9"
		    kill9proc_ido2db
 		else
 		    echo "done."
		    rm -f $Ido2dbStatusFile $Ido2dbRunFile $Ido2dbLockDir/$Ido2dbLockFile $Ido2dbCommandFile
 		fi

		;;

    status)
		printstatus_ido2db ido2db
                ;;

	restart)
		$0 stop
		$0 start
		;;

	*)
		echo "Usage: $servicename {start|stop|restart|status}"
		exit 1
		;;

esac
  
# End of this script
