previously I wrote an article on how to create a deamon script for ndo. But when you are using Centreon the only “nice” way to do this is by altering the Nagios startupscript to include the ndo part.
Here is what i have done to make this possible.
First i wrote a function to find the PIDs for the ndo deamon process based on a specific config. In this one the config is hardcoded,
but you might also replace the $NagiosNdoConfig with $1 instead and call the function like;
getNdoPid “/usr/local/nagios/etc/yourconfig.cfg”
getNdoPid () { #Declare a var containing the correct ndo PID, there are processes being forked from ndo so we need to #do some awk filtering also to fetch the correct one. #Not that the parent process always has a parent pid "1" so we use that to filter the parent from the childs. ndoPID=`ps -ef | grep $NagiosNdoConf | grep "?" | awk -F ' ' '{if($3 == '1') print $2}'` #next we validate if we got an pid returned to us, and fill a wrapper that we will use like $? that ill convieniently call "ls" LastState. if [[ "$ndoPID" == '' ]]; then ls=1; else ls=0; fi }
Next using the getNdoPid function u wrote another two functions to start and to stop the ndo daemon. I choose this method so i can include these function inside the existing start stop scripting used by nagios. In effect when you start nagios, th start case select is used which will call our ndo start script.
The ndo kill function
kill_ndo () { #Find the actual PID if [[ "$ndoPID" == '' ]]; then #No process running to kill... ls=0; else kill $ndoPID; sleep 2 #parent needs some time to kill the child processes if any getNdoPid if [[ "$ls" == '1' ]]; then ls=0; else ls=1; fi fi }
and the start portion…
The ndo start function
start_ndo () { #always make sure ndo isnt running! $NagiosNdo -c $NagiosNdoConf; if [[ "$?" == '0' ]]; then ls=0; else ls=1; fi }
Again i am using the ls (laststate) var to save the last state of the executed command. This is important because the state of a command can only be tested right after execution of that command. by using the ls var i make sure i am always testing the correct result. this is because the $? is also overwritten when performing an var assignment, if test etc.
Next I added a few vars for configuration, stuff like where the ndo2db bin is located, and the config file.
NagiosNdo=/usr/sbin/ndo2db; NagiosNdoConf=/usr/local/nagios/etc/ndo2db.cfg;
naturally the NDO bin could also be found like;
NagiosNdo=`which ndo2db`;
Bu this will require the ndo2db bin to be somewhere in the path var. We are not sure this is always the case because there is no consensus on where these nagios bins should be placed. This may vary from distro to distro and from user to user. In my case, it being placed inside /user/bin this whould also work.
I also extended the functionality of the startupscript by adding new options to start, stop and restart the ndo deamon by using the nagios startupscript. This is what i did.
inside the “case” statement where the “/etc/init.d/nagios args” are tested i added some new options namely “startndo, stopndo, restartndo” and this is what it looks like.
For the option “/etc/init.d/nagios startndo”
startndo) getNdoPid if [[ "$ls" == '1' ]]; then start_ndo if [[ "$ls" == '0' ]]; then echo 'NDO deamon started succesfully'; exit 0; else echo 'Failed to start NDO, check your logging for more info'; exit 1; fi else echo "Ndo deamon allready running with PID : $ndoPID"; exit 1; fi ;;
for the “/etc/init.d/nagios stopndo” option
stopndo) getNdoPid if [[ "$ls" == '1' ]]; then echo "$ls"; exit 1; else kill_ndo sleep 2 #it needs some time to kill the childs (that get ppid 1 when the parent quits) getNdoPid if [[ "$ls" == '1' ]]; then echo "Ndo stopped succesfully"; exit 0; else echo "Unable to kill ndo, please review you logging"; exit 1; fi fi ;;
And a restart option “/etc/init.d/nagios restartndo”
restartndo) $0 stopndo $0 startndo ;;
To include the start and stop options in the nagios start and stop process all you need to do is add the start and or stop options in there.
Here is an example
start) echo -n "Starting nagios:" $NagiosBin -v $NagiosCfgFile > /dev/null 2>&1; if [ $? -eq 0 ]; then su - $NagiosUser -c "touch $NagiosVarDir/nagios.log $NagiosRetentionFile" rm -f $NagiosCommandFile touch $NagiosRunFile chown $NagiosUser:$NagiosGroup $NagiosRunFile $NagiosBin -d $NagiosCfgFile if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi #chmod 777 $NagiosCommandFile start_ndo echo " done." exit 0 else echo "CONFIG ERROR! Start aborted. Check your Nagios configuration." exit 1 fi ;; #Stop portion stop) echo -n "Stopping nagios: " pid_nagios killproc_nagios nagios kill_ndo # 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 2 3 4 5 6 7 8 9 10 ; 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' else echo 'done.' fi rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile $NagiosCommandFile ;; status) pid_nagios printstatus_nagios nagios ;;
Now when i start and stop nagios using the centreon “start / stop / reload” options my ndo daemon is also started / stopped. Ps. This manual uses Nagios 3.0 and Centreon 2.2
This is what a restart looks like
[root@UX127 var]# service nagios restartndo Ndo stopped succesfully NDO deamon started succesfully
Rgrds,
Tagged: bash, Daemon, how, Init, init.d, init.rd, nagios, ndo, Restart, Script, Scripting, start, startup, stop, to, Using
