316 lines
8.2 KiB
Bash
316 lines
8.2 KiB
Bash
#!/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=@prefix@
|
|
exec_prefix=@exec_prefix@
|
|
NagiosBin=@bindir@/nagios
|
|
NagiosCfgFile=@sysconfdir@/nagios.cfg
|
|
NagiosCfgtestFile=@localstatedir@/nagios.configtest
|
|
NagiosStatusFile=@localstatedir@/status.dat
|
|
NagiosRetentionFile=@localstatedir@/retention.dat
|
|
NagiosCommandFile=@localstatedir@/rw/nagios.cmd
|
|
NagiosVarDir=@localstatedir@
|
|
NagiosRunFile=@lockfile@
|
|
NagiosLockDir=/var/lock/subsys
|
|
NagiosLockFile=nagios
|
|
NagiosCGIDir=@sbindir@
|
|
NagiosUser=@nagios_user@
|
|
NagiosGroup=@nagios_grp@
|
|
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 -h -R $NagiosUser:$NagiosGroup ${RAMDISK_DIR}
|
|
fi
|
|
fi
|
|
|
|
|
|
check_config ()
|
|
{
|
|
rm -f "$NagiosCfgtestFile";
|
|
if test -e "$NagiosCfgtestFile"; then
|
|
echo "ERROR: Could not delete '$NagiosCfgtestFile'"
|
|
exit 8
|
|
fi
|
|
|
|
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 -h $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 -h $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 -h $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`
|
|
}
|
|
|
|
remove_commandfile ()
|
|
{
|
|
# Removing a stalled command file, while there are processes trying/waiting to write into it,
|
|
# will deadlock those processes in a blocking open() system call. To allow such processes to
|
|
# die on a broken pipe, the pipe must be opened for reading without actually reading from it,
|
|
# which is what dd does here. To avoid a chicken-egg problem, the pipe is renamed beforehand.
|
|
# In order for the dd to not deadlock when there is no writing process, it is executed in the
|
|
# background in a subshell together with an empty echo to have at least one writing process.
|
|
|
|
# see http://unix.stackexchange.com/questions/335406/opening-named-pipe-blocks-forever-if-pipe-is-deleted-without-being-connected
|
|
|
|
if [ -p $NagiosCommandFile ]; then
|
|
mv -f $NagiosCommandFile $NagiosCommandFile~
|
|
(dd if=$NagiosCommandFile~ count=0 2>/dev/null & echo -n "" >$NagiosCommandFile~)
|
|
fi
|
|
|
|
rm -f $NagiosCommandFile $NagiosCommandFile~
|
|
}
|
|
|
|
|
|
# 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
|
|
remove_commandfile
|
|
touch $NagiosRunFile
|
|
chown -h $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
|
|
|
|
remove_commandfile
|
|
rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile
|
|
;;
|
|
|
|
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
|