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" \