#!/bin/sh
#
# chkconfig: - 99 01
# description: Nagios network monitor
# processname: nagios
# File : nagios
#
# 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)
# 2018-11-28 Justin Paulsen <petaris@gmail.com>
#  - Patched for EPEL release of Nagioscore 4.4.2
#  - - nagios-0001-default-init.patch
#
# Description: Starts and stops the Nagios monitor
#              used to provide network services status.
#
### BEGIN INIT INFO
# Provides:		nagios
# Required-Start:	$local_fs $syslog $network
# Required-Stop:	$local_fs $syslog $network
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Short-Description:	Starts and stops the Nagios monitoring server
# Description:		Starts and stops the Nagios monitoring server
### END INIT INFO

# Our install-time configuration.
NagiosBin=/usr/sbin/nagios
NagiosCfgFile=/etc/nagios/nagios.cfg
NagiosCfgtestFile=/var/spool/nagios/nagios.configtest
NagiosStatusFile=/var/spool/nagios/status.dat
NagiosRetentionFile=/var/spool/nagios/retention.dat
NagiosCommandFile=/var/spool/nagios/cmd/nagios.cmd
NagiosRunFile=/var/run/nagios/nagios.pid
NagiosVarDir=/var/spool/nagios/
NagiosCGIDir=/usr/lib64/nagios/cgi
NagiosUser=nagios
NagiosGroup=nagios
checkconfig="true"

# Load any extra environment variables for Nagios and its plugins.
if test -f /etc/sysconfig/nagios; then
	. /etc/sysconfig/nagios
fi

# Automate addition of RAMDISK based on environment variables
USE_RAMDISK=${USE_RAMDISK:-0}
if test "$USE_RAMDISK" -ne 0 && test "$RAMDISK_SIZE"X != "X"; then
	ramdisk=`mount |grep "${RAMDISK_DIR} type tmpfs"`
	if [ "$ramdisk"X == "X" ]; then
		if [ ! -d ${RAMDISK_DIR} ]; then
			mkdir -p -m 0755 ${RAMDISK_DIR}
			if [ -d ${RAMDISK_DIR} ]; then
				NagiosUserUID=`id -u ${NagiosUser}`
				NagiosGroupGID=`id -g ${NagiosGroup}`
				mount -t tmpfs -o uid=${NagiosUserUID},gid=${NagiosGroupGID},size=${RAMDISK_SIZE}m tmpfs ${RAMDISK_DIR}
				su ${NagiosUser} -c "mkdir -m 0755 ${RAMDISK_DIR}/checkresults"
			else
				echo "ERROR: Unable to create ramdisk directory (${RAMDISK_DIR})"
				exit 1
			fi
		fi
	fi
fi


check_config ()
{
	if test "$checkconfig" != "true"; then
		return 0
	fi

	echo -n "Running configuration check... "

	/bin/rm -f "$NagiosCfgtestFile";
	if test -e "$NagiosCfgtestFile"; then
		echo "ERROR: Could not delete '$NagiosCfgtestFile'"
		exit 8
	fi
	if ! su $NagiosUser -c "touch $NagiosCfgtestFile" -s /bin/sh ; then
		echo "ERROR: Could not create or update '$NagiosCfgtestFile'"
		exit 8
	fi

	TMPFILE=$(mktemp $NagiosCfgtestFile.XXX)
	$NagiosBin -vp $NagiosCfgFile > "$TMPFILE"
	WARN=`grep ^"Total Warnings:" "$TMPFILE" |awk -F: '{print \$2}' |sed s/' '//g`
	ERR=`grep ^"Total Errors:" "$TMPFILE" |awk -F: '{print \$2}' |sed s/' '//g`

	if test "$WARN" = "0" && test "${ERR}" = "0"; then
		echo "OK - Configuration check verified" > $NagiosCfgtestFile
		/bin/rm "$TMPFILE"
		return 0
	elif test "${ERR}" = "0"; then
		# Write the errors to a file we can have a script watching for.
		echo "WARNING: Warnings in config files - see log for details: $NagiosCfgtestFile" > $NagiosCfgtestFile
		egrep -i "(^warning|^error)" "$TMPFILE" >> $NagiosCfgtestFile
		/bin/rm "$TMPFILE"
		return 0
	else
		# Write the errors to a file we can have a script watching for.
		echo "ERROR: Errors in config files - see log for details: $NagiosCfgtestFile" > $NagiosCfgtestFile
		egrep -i "(^warning|^error)" "$TMPFILE" >> $NagiosCfgtestFile
		cat "$TMPFILE"
		exit 8
	fi
}


status_nagios ()
{
	if test -x $NagiosCGIDir/daemonchk.cgi; then
		if $NagiosCGIDir/daemonchk.cgi -l $NagiosRunFile > /dev/null 2>&1; then
			return 0
		fi
	else
		if ps -p $NagiosPID > /dev/null 2>&1; then 
			return 0
		fi
	fi

	return 1
}

printstatus_nagios ()
{
	status_nagios $1 $2
	RETVAL=$?
	if [ $RETVAL = 0 ]; then
		echo "nagios (pid $NagiosPID) is running..."
	else
		echo "nagios is not running"
	fi
	return $RETVAL
}

killproc_nagios ()
{
	/usr/bin/kill -s "$1" $NagiosPID
}

pid_nagios ()
{
	if test ! -f $NagiosRunFile; then
		echo "No lock file found in $NagiosRunFile"
		return 1
	fi

	export NagiosPID=`head -n 1 $NagiosRunFile`
	if [[ -z "$NagiosPID" ]]; then
	    echo "No usable PID found in $NagiosRunFile"
	    exit 1
	fi
	
	regex='^[0-9]+$'
	if ! [[ $NagiosPID =~ $regex ]]; then
	    echo "PID not number found in $NagiosRunFile"
	    exit 1
	fi
}

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

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

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

	start)
		echo -n "Starting nagios: "

		check_config

		if test -f $NagiosRunFile; then
			NagiosPID=`head -n 1 $NagiosRunFile`
			if status_nagios; then
				echo "another instance of nagios is already running."
				exit 0
			fi
		fi

		su $NagiosUser -c "touch $NagiosVarDir/nagios.log $NagiosRetentionFile" -s /bin/sh
		/bin/rm -f $NagiosCommandFile
		touch $NagiosRunFile
		$NagiosBin -d $NagiosCfgFile

		echo "done."
		;;

	stop)
		echo -n "Stopping nagios: "

		pid_nagios
		if [ $? -eq 1 ]; then
			exit 0
		fi
		killproc_nagios TERM

		# now we have to wait for nagios to exit and remove its
		# own NagiosRunFile, otherwise a following "start" could
		# happen, and then the exiting nagios will remove the
		# new NagiosRunFile, allowing multiple nagios daemons
		# to (sooner or later) run - John Sellens
		#echo -n 'Waiting for nagios to exit .'
		for i in {1..90}; do
			if status_nagios > /dev/null; then
				echo -n '.'
				sleep 1
			else
				break
			fi
		done
		if status_nagios > /dev/null; then
			echo ""
			echo "Warning - nagios did not exit in a timely manner - Killing it!"
			killproc_nagios KILL
		else
			echo "done."
		fi

		/bin/rm -f $NagiosStatusFile $NagiosRunFile $NagiosCommandFile
		;;

	status)
		pid_nagios
		if [ $? -eq 1 ]; then
			exit 3
		fi
		printstatus_nagios
		;;

	checkconfig)
		check_config

		if [ $? -eq 0 ]; then
			echo "OK."
		else
			echo "CONFIG ERROR!  Check your Nagios configuration."
			exit 1
		fi
		;;

	restart)
		check_config

		$0 stop
		$0 start
		;;

	reload|force-reload)
		check_config

		if test ! -f $NagiosRunFile; then
			$0 start
		else
			pid_nagios
			if status_nagios > /dev/null; then
				echo -n "Reloading nagios configuration... "
				killproc_nagios HUP
				echo "done"
			else
				$0 stop
				$0 start
			fi
		fi
		;;

	configtest)
		$NagiosBin -vp $NagiosCfgFile
		;;

	*)
		echo "Usage: nagios {start|stop|restart|reload|force-reload|status|checkconfig|configtest}"
		exit 1
		exit 2
		;;

esac

# End of this script
