#!/bin/sh
#
# chkconfig: 345 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)
#
# 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.
prefix=/usr/local/nagios
exec_prefix=${prefix}
NagiosBin=${exec_prefix}/bin/nagios
NagiosCfgFile=${prefix}/etc/nagios.cfg
NagiosCfgtestFile=${prefix}/var/nagios.configtest
NagiosStatusFile=${prefix}/var/status.dat
NagiosRetentionFile=${prefix}/var/retention.dat
NagiosCommandFile=${prefix}/var/rw/nagios.cmd
NagiosVarDir=${prefix}/var
NagiosRunFile=${prefix}/var/nagios.lock
NagiosLockDir=/var/lock/subsys
NagiosLockFile=nagios
NagiosCGIDir=${exec_prefix}/sbin
NagiosUser=nagios
NagiosGroup=nagios
checkconfig="true"

# Source function library
# Some *nix do not 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
elif [ -f /lib/lsb/init-functions ]; then
        . /lib/lsb/init-functions
fi

# 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
                mkdir -p -m 0755 ${RAMDISK_DIR}
                mount -t tmpfs -o size=${RAMDISK_SIZE}m tmpfs ${RAMDISK_DIR}
                mkdir -p -m 0755 ${RAMDISK_DIR}/checkresults
                chown -R $NagiosUser:$NagiosGroup ${RAMDISK_DIR}
        fi
fi


check_config ()
{
        TMPFILE=$(mktemp /tmp/.configtest.XXXXXXXX)
        $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
                chmod 0644 $NagiosCfgtestFile
                chown $NagiosUser:$NagiosGroup $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
                chmod 0644 $NagiosCfgtestFile
                chown $NagiosUser:$NagiosGroup $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
                chmod 0644 $NagiosCfgtestFile
                chown $NagiosUser:$NagiosGroup $NagiosCfgtestFile
                cat "$TMPFILE"
                exit 8
        fi
}


status_nagios ()
{
        if test -x $NagiosCGI/daemonchk.cgi; then
                if $NagiosCGI/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 ()
{
        if status_nagios; then
                echo "nagios (pid $NagiosPID) is running..."
        else
                echo "nagios is not running"
        fi
}

killproc_nagios ()
{
        kill -s "$1" $NagiosPID
}

pid_nagios ()
{
        if test ! -f $NagiosRunFile; then
                echo "No lock file found in $NagiosRunFile"
                exit 1
        fi

        NagiosPID=`head -n 1 $NagiosRunFile`
}



# 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:"

                if test "$checkconfig" = "true"; then
                        check_config
                        # check_config exits on configuration errors.
                fi

                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

                touch $NagiosVarDir/nagios.log $NagiosRetentionFile
                rm -f $NagiosCommandFile
                touch $NagiosRunFile
                chown $NagiosUser:$NagiosGroup $NagiosRunFile $NagiosVarDir/nagios.log $NagiosRetentionFile
                $NagiosBin -d $NagiosCfgFile
                if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi

                echo " done."
                ;;

        stop)
                echo -n "Stopping nagios:"

                pid_nagios
                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

                rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile $NagiosCommandFile
                ;;

        status)
                pid_nagios
                printstatus_nagios
                ;;

        checkconfig)
                if test "$checkconfig" = "true"; then
                        printf "Running configuration check...\n"
                        check_config
                fi

                if [ $? -eq 0 ]; then
                        echo " OK."
                else
                        echo " CONFIG ERROR!  Check your Nagios configuration."
                        exit 1
                fi
                ;;

        restart)
                if test "$checkconfig" = "true"; then
                        printf "Running configuration check...\n"
                        check_config
                fi

                $0 stop
                $0 start
                ;;

        reload|force-reload)
                if test "$checkconfig" = "true"; then
                        printf "Running configuration check...\n"
                        check_config
                fi

                if test ! -f $NagiosRunFile; then
                        $0 start
                else
                        pid_nagios
                        if status_nagios > /dev/null; then
                                printf "Reloading nagios configuration...\n"
                                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
                ;;

esac

# End of this script
