#!/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 # - setup for autoconf # - add reload function # 1999-08-06 Ethan Galstad # - Added configuration info for use with RedHat's chkconfig tool # per Fran Boon's suggestion # 1999-08-13 Jim Popovitch # - added variable for nagios/var directory # - cd into nagios/var directory before creating tmp files on startup # 1999-08-16 Ethan Galstad # - Added test for rc.d directory as suggested by Karl DeBisschop # 2000-07-23 Karl DeBisschop # - Clean out redhat macros and other dependencies # 2003-01-11 Ethan Galstad # - 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