[opsview-base] [471] Back port of f85bac11561de99268e18dd0e41211f94d7bf2c2 - block external commands until all earlier downtimes have been set

1 view
Skip to first unread message

s...@opsview.com

unread,
Oct 23, 2014, 6:51:36 PM10/23/14
to opsview-...@googlegroups.com
Revision
471
Author
tvoon
Date
2014-10-23 23:51:35 +0100 (Thu, 23 Oct 2014)

Log Message

Back port of f85bac11561de99268e18dd0e41211f94d7bf2c2 - block external commands until all earlier downtimes have been set

Modified Paths

Added Paths

Modified: trunk/Makefile
===================================================================
--- trunk/Makefile	2014-08-05 12:57:03 UTC (rev 470)
+++ trunk/Makefile	2014-10-23 22:51:35 UTC (rev 471)
@@ -639,6 +639,7 @@
 	cd ${NAGIOS} && patch -p1 < ../patches/nagios_cve_2014_1878.patch
 	cd ${NAGIOS} && patch -p1 < ../patches/nagios_defunct_reload_workers.patch
 	cd ${NAGIOS} && patch -p1 < ../patches/nagios_downtimes_block_host_service_recoveries.patch
+	cd ${NAGIOS} && patch -p1 < ../patches/nagios_external_command_start.patch
 	if [ $(KERNEL_NAME) = Linux ] ; then \
 		cd ${NAGIOS} && CFLAGS="${CFLAGS}" ./configure --with-nagios-user=$(NAGIOS_USER) --with-nagios-group=$(NAGIOS_GROUP) --with-command-group=$(NAGIOS_GROUP) --with-cgiurl=/cgi-bin --with-htmurl=/ --enable-libtap ; \
 	elif [ $(KERNEL_NAME) = Darwin ] ; then \

Added: trunk/patches/nagios_external_command_start.patch
===================================================================
--- trunk/patches/nagios_external_command_start.patch	                        (rev 0)
+++ trunk/patches/nagios_external_command_start.patch	2014-10-23 22:51:35 UTC (rev 471)
@@ -0,0 +1,99 @@
+diff -ur nagios-4.0.20130912.original/base/commands.c nagios-4.0.20130912/base/commands.c
+--- nagios-4.0.20130912.original/base/commands.c	2014-10-20 16:06:15.971371875 +0000
++++ nagios-4.0.20130912/base/commands.c	2014-10-23 22:03:09.461171634 +0000
+@@ -136,6 +136,13 @@
+ 	char *buf;
+ 	unsigned long size;
+ 
++	/* We ignore the input until we're signalled to go, otherwise downtimes are not necessarily setup correctly on a reload.
++	   There is a cost of calling this routine many times if this is on a queue, but the alternative of
++	   having separate iobroker sets seems excessive for a fairly uncommon situation */
++	if (external_command_start == FALSE) {
++		return 0;
++	}
++
+ 	ret = iocache_read(command_worker.ioc, sd);
+ 	log_debug_info(DEBUGL_COMMANDS, 2, "Read %d bytes from command worker\n", ret);
+ 	if (ret == 0) {
+diff -ur nagios-4.0.20130912.original/base/events.c nagios-4.0.20130912/base/events.c
+--- nagios-4.0.20130912.original/base/events.c	2014-10-20 16:06:14.695387917 +0000
++++ nagios-4.0.20130912/base/events.c	2014-10-23 22:00:30.237182679 +0000
+@@ -1314,6 +1314,14 @@
+ 				}
+ 			break;
+ 
++		case EVENT_EXTERNAL_COMMAND_START:
++
++			log_debug_info(DEBUGL_EVENTS, 0, "** External command start Event. Latency: %.3fs\n", latency);
++
++			/* Signal that external commands are ready for processing */
++			external_command_start=TRUE;
++			break;
++
+ 		default:
+ 
+ 			break;
+diff -ur nagios-4.0.20130912.original/base/nagios.c nagios-4.0.20130912/base/nagios.c
+--- nagios-4.0.20130912.original/base/nagios.c	2014-10-20 16:06:15.419378815 +0000
++++ nagios-4.0.20130912/base/nagios.c	2014-10-23 21:59:44.217162192 +0000
+@@ -754,6 +754,12 @@
+ 				exit(EXIT_FAILURE);
+ 			}
+ 			timing_point("%u workers spawned\n", wproc_num_workers_spawned);
++
++			/* The polling here also causes the pre-reload external command pipe worker
++			   to be processed, if there is any data waiting to be received. This is because nagios_iobs includes
++			   the workers as well as the command pipe worker. We get around this by setting a semaphore and then running the EXTERNAL_COMMAND_START event to set the flag. This allows
++			   running the EXTERNAL_COMMAND_START event now, thus allowing earlier downtime to be set before the passive results arrive */
++			external_command_start=FALSE;
+ 			i = 0;
+ 			while (i < 50 && wproc_num_workers_online < wproc_num_workers_spawned) {
+ 				iobroker_poll(nagios_iobs, 50);
+@@ -802,6 +808,9 @@
+ 			my_free(mac->x[MACRO_EVENTSTARTTIME]);
+ 			asprintf(&mac->x[MACRO_EVENTSTARTTIME], "%lu", (unsigned long)event_start);
+ 
++			/* Let the event calculation set downtimes that started before now to be set before processing external commands */
++			schedule_new_event(EVENT_EXTERNAL_COMMAND_START, TRUE, event_start, FALSE, 0, NULL, TRUE, NULL, NULL, 0);
++
+ 			timing_point("Entering event execution loop\n");
+ 			/***** start monitoring all services *****/
+ 			/* (doesn't return until a restart or shutdown signal is encountered) */
+diff -ur nagios-4.0.20130912.original/base/utils.c nagios-4.0.20130912/base/utils.c
+--- nagios-4.0.20130912.original/base/utils.c	2014-10-20 16:06:13.763399634 +0000
++++ nagios-4.0.20130912/base/utils.c	2014-10-23 21:58:26.197159385 +0000
+@@ -160,6 +160,7 @@
+ 
+ int sigshutdown = FALSE;
+ int sigrestart = FALSE;
++int external_command_start = FALSE;
+ int caught_signal = FALSE;
+ int sig_id = 0;
+ 
+diff -ur nagios-4.0.20130912.original/include/nagios.h nagios-4.0.20130912/include/nagios.h
+--- nagios-4.0.20130912.original/include/nagios.h	2014-10-20 16:06:13.783399382 +0000
++++ nagios-4.0.20130912/include/nagios.h	2014-10-23 21:59:27.953166091 +0000
+@@ -192,6 +192,7 @@
+ extern time_t event_start;
+ 
+ extern int sigshutdown, sigrestart;
++extern int external_command_start;
+ extern int currently_running_service_checks;
+ extern int currently_running_host_checks;
+ 
+@@ -363,6 +364,7 @@
+ #define EVENT_RESCHEDULE_CHECKS		14      /* adjust scheduling of host and service checks */
+ #define EVENT_EXPIRE_COMMENT            15      /* removes expired comments */
+ #define EVENT_CHECK_PROGRAM_UPDATE      16      /* checks for new version of Nagios */
++#define EVENT_EXTERNAL_COMMAND_START    17      /* external command start processing results */
+ #define EVENT_SLEEP                     98      /* asynchronous sleep event that occurs when event queues are empty */
+ #define EVENT_USER_FUNCTION             99      /* USER-defined function (modules) */
+ 
+@@ -389,6 +391,7 @@
+ 	type == EVENT_RESCHEDULE_CHECKS ? "RESCHEDULE_CHECKS" : \
+ 	type == EVENT_EXPIRE_COMMENT ? "EXPIRE_COMMENT" : \
+ 	type == EVENT_CHECK_PROGRAM_UPDATE ? "CHECK_PROGRAM_UPDATE" : \
++	type == EVENT_EXTERNAL_COMMAND_START ? "EXTERNAL_COMMAND_START" : \
+ 	type == EVENT_SLEEP ? "SLEEP" : \
+ 	type == EVENT_USER_FUNCTION ? "USER_FUNCTION" : \
+ 	"UNKNOWN" \

Reply all
Reply to author
Forward
0 new messages