From: <ag...@us...> - 2012-08-26 20:08:13
|
Revision: 2109 http://nagios.svn.sourceforge.net/nagios/?rev=2109&view=rev Author: ageric Date: 2012-08-26 20:08:06 +0000 (Sun, 26 Aug 2012) Log Message: ----------- base/config: Clean up the messy command resolution code Introducing a small helper makes life so much easier and lets us remove huge chunks of messy mass-indented code. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-08-26 20:07:41 UTC (rev 2108) +++ nagioscore/trunk/base/config.c 2012-08-26 20:08:06 UTC (rev 2109) @@ -203,8 +203,31 @@ extern int allow_empty_hostgroup_assignment; +/*** helpers ****/ +/* + * find a command with arguments still attached + * if we're unsuccessful, the buffer pointed to by 'name' is modified + * to have only the real command name (everything up until the first '!') + */ +static command *find_bang_command(char *name) +{ + char *bang; + command *cmd; + if (!name) + return NULL; + bang = strchr(name, '!'); + if (!bang) + return find_command(name); + *bang = 0; + cmd = find_command(name); + *bang = '!'; + return cmd; +} + + + /******************************************************************/ /************** CONFIGURATION INPUT FUNCTIONS *********************/ /******************************************************************/ @@ -1458,8 +1481,6 @@ host *temp_host = NULL; char *buf = NULL; service *temp_service = NULL; - command *temp_command = NULL; - char *temp_command_name = ""; int warnings = 0; int errors = 0; struct timeval tv[4]; @@ -1492,42 +1513,18 @@ if(verify_config == TRUE) printf("Checking global event handlers...\n"); if(global_host_event_handler != NULL) { - - /* check the event handler command */ - buf = (char *)strdup(global_host_event_handler); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global host event handler command '%s' is not defined anywhere!", temp_command_name); + global_host_event_handler_ptr = find_bang_command(global_host_event_handler); + if (global_host_event_handler_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global host event handler command '%s' is not defined anywhere!", global_host_event_handler); errors++; } - - /* save the pointer to the command for later */ - global_host_event_handler_ptr = temp_command; - - my_free(buf); } if(global_service_event_handler != NULL) { - - /* check the event handler command */ - buf = (char *)strdup(global_service_event_handler); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global service event handler command '%s' is not defined anywhere!", temp_command_name); + global_service_event_handler_ptr = find_bang_command(global_service_event_handler); + if (global_service_event_handler_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global service event handler command '%s' is not defined anywhere!", global_service_event_handler); errors++; } - - /* save the pointer to the command for later */ - global_service_event_handler_ptr = temp_command; - - my_free(buf); } @@ -1537,40 +1534,17 @@ if(verify_config == TRUE) printf("Checking obsessive compulsive processor commands...\n"); if(ocsp_command != NULL) { - - buf = (char *)strdup(ocsp_command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Obsessive compulsive service processor command '%s' is not defined anywhere!", temp_command_name); + ocsp_command_ptr = find_bang_command(ocsp_command); + if (!ocsp_command_ptr) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCSP command '%s' is not defined anywhere!\n", ocsp_command); errors++; } - - /* save the pointer to the command for later */ - ocsp_command_ptr = temp_command; - - my_free(buf); } if(ochp_command != NULL) { - - buf = (char *)strdup(ochp_command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Obsessive compulsive host processor command '%s' is not defined anywhere!", temp_command_name); - errors++; - } - - /* save the pointer to the command for later */ - ochp_command_ptr = temp_command; - - my_free(buf); + ochp_command_ptr = find_bang_command(ochp_command); + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCHP command '%s' is not defined anywhere!\n", ochp_command); + ochp_command_ptr = find_bang_command(ochp_command); + errors += ochp_command_ptr == NULL; } @@ -1675,8 +1649,6 @@ timeperiod *temp_timeperiod = NULL; timeperiod *temp_timeperiod2 = NULL; timeperiodexclusion *temp_timeperiodexclusion = NULL; - char *buf = NULL; - char *temp_command_name = ""; int found = FALSE; int total_objects = 0; int warnings = 0; @@ -1721,42 +1693,20 @@ /* check the event handler command */ if(temp_service->event_handler != NULL) { - - /* check the event handler command */ - buf = (char *)strdup(temp_service->event_handler); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified in service '%s' for host '%s' not defined anywhere", temp_command_name, temp_service->description, temp_service->host_name); + temp_service->event_handler_ptr = find_bang_command(temp_service->event_handler); + if(temp_service->event_handler_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified in service '%s' for host '%s' not defined anywhere", temp_service->event_handler, temp_service->description, temp_service->host_name); errors++; } - - my_free(buf); - - /* save the pointer to the event handler for later */ - temp_service->event_handler_ptr = temp_command; } /* check the service check_command */ - buf = (char *)strdup(temp_service->service_check_command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service check command '%s' specified in service '%s' for host '%s' not defined anywhere!", temp_command_name, temp_service->description, temp_service->host_name); + temp_service->check_command_ptr = find_bang_command(temp_service->service_check_command); + if(temp_service->check_command_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service check command '%s' specified in service '%s' for host '%s' not defined anywhere!", temp_service->service_check_command, temp_service->description, temp_service->host_name); errors++; } - my_free(buf); - - /* save the pointer to the check command for later */ - temp_service->check_command_ptr = temp_command; - /* check for sane recovery options */ if(temp_service->notify_on_recovery == TRUE && temp_service->notify_on_warning == FALSE && temp_service->notify_on_critical == FALSE) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Recovery notification option in service '%s' for host '%s' doesn't make any sense - specify warning and/or critical options as well", temp_service->description, temp_service->host_name); @@ -1840,44 +1790,20 @@ /* check the event handler command */ if(temp_host->event_handler != NULL) { - - /* check the event handler command */ - buf = (char *)strdup(temp_host->event_handler); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified for host '%s' not defined anywhere", temp_command_name, temp_host->name); + temp_host->event_handler_ptr = find_bang_command(temp_host->event_handler); + if(temp_host->event_handler_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified for host '%s' not defined anywhere", temp_host->event_handler, temp_host->name); errors++; } - - my_free(buf); - - /* save the pointer to the event handler command for later */ - temp_host->event_handler_ptr = temp_command; } /* hosts that don't have check commands defined shouldn't ever be checked... */ if(temp_host->host_check_command != NULL) { - - /* check the host check_command */ - buf = (char *)strdup(temp_host->host_check_command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host check command '%s' specified for host '%s' is not defined anywhere!", temp_command_name, temp_host->name); + temp_host->check_command_ptr = find_bang_command(temp_host->host_check_command); + if(temp_host->check_command_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host check command '%s' specified for host '%s' is not defined anywhere!", temp_host->host_check_command, temp_host->name); errors++; } - - /* save the pointer to the check command for later */ - temp_host->check_command_ptr = temp_command; - - my_free(buf); } /* check host check timeperiod */ @@ -2065,24 +1991,12 @@ errors++; } else for(temp_commandsmember = temp_contact->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { - - /* check the host notification command */ - buf = (char *)strdup(temp_commandsmember->command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service notification command '%s' specified for contact '%s' is not defined anywhere!", temp_command_name, temp_contact->name); - errors++; - } - - /* save pointer to the command for later */ - temp_commandsmember->command_ptr = temp_command; - - my_free(buf); + temp_commandsmember->command_ptr = find_bang_command(temp_commandsmember->command); + if(temp_commandsmember->command_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service notification command '%s' specified for contact '%s' is not defined anywhere!", temp_commandsmember->command, temp_contact->name); + errors++; } + } /* check host notification commands */ if(temp_contact->host_notification_commands == NULL) { @@ -2090,24 +2004,12 @@ errors++; } else for(temp_commandsmember = temp_contact->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { - - /* check the host notification command */ - buf = (char *)strdup(temp_commandsmember->command); - - /* get the command name, leave any arguments behind */ - temp_command_name = my_strtok(buf, "!"); - - temp_command = find_command(temp_command_name); - if(temp_command == NULL) { - logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host notification command '%s' specified for contact '%s' is not defined anywhere!", temp_command_name, temp_contact->name); - errors++; - } - - /* save pointer to the command for later */ - temp_commandsmember->command_ptr = temp_command; - - my_free(buf); + temp_commandsmember->command_ptr = find_bang_command(temp_commandsmember->command); + if(temp_commandsmember->command_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host notification command '%s' specified for contact '%s' is not defined anywhere!", temp_commandsmember->command, temp_contact->name); + errors++; } + } /* check service notification timeperiod */ if(temp_contact->service_notification_period == NULL) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-09-02 08:34:17
|
Revision: 2128 http://nagios.svn.sourceforge.net/nagios/?rev=2128&view=rev Author: ageric Date: 2012-09-02 08:34:10 +0000 (Sun, 02 Sep 2012) Log Message: ----------- base/config: Print number of checked host/service dependencies We used to do that when we verified the data in them, and now we do it again when we assure their acyclicity (if that's not a word, it should be). Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-09-02 08:33:51 UTC (rev 2127) +++ nagioscore/trunk/base/config.c 2012-09-02 08:34:10 UTC (rev 2128) @@ -2362,6 +2362,8 @@ dep_type = temp_sd->dependency_type; dfs_servicedep_path(ary[dep_type - 1], temp_sd->dependent_service_ptr, dep_type, &errors); } + if(verify_config == TRUE) + printf("\tChecked %u service dependencies\n", num_objects.servicedependencies); /* check host dependencies */ for (i = 0; i < ARRAY_SIZE(ary); i++) @@ -2371,6 +2373,9 @@ dfs_hostdep_path(ary[dep_type - 1], temp_hd->dependent_host_ptr, dep_type, &errors); } + if(verify_config == TRUE) + printf("\tChecked %u host dependencies\n", num_objects.hostdependencies); + /* update warning and error count */ *e += errors; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-09-02 08:34:53
|
Revision: 2130 http://nagios.svn.sourceforge.net/nagios/?rev=2130&view=rev Author: ageric Date: 2012-09-02 08:34:47 +0000 (Sun, 02 Sep 2012) Log Message: ----------- base/config: Fix free()'ing of arrays in pre_flight_circular_check() With high levels of optimization, the compiler would unroll the loop and could yield code that tries to free() array subscripts with negative numbers. We restrict the test to make sure the index never goes below 0 and decrement it before checking to restrict the compiler not to unroll that particular loop. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-09-02 08:34:30 UTC (rev 2129) +++ nagioscore/trunk/base/config.c 2012-09-02 08:34:47 UTC (rev 2130) @@ -2328,8 +2328,8 @@ for (i = 0; i < ARRAY_SIZE(ary); i++) { if (!(ary[i] = calloc(1, alloc))) { - while (i) { - my_free(ary[--i]); + while (--i >= 0) { + my_free(ary[i]); } logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to allocate memory for circular path checks.\n"); errors++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-09-12 15:39:10
|
Revision: 2191 http://nagios.svn.sourceforge.net/nagios/?rev=2191&view=rev Author: ageric Date: 2012-09-12 15:38:59 +0000 (Wed, 12 Sep 2012) Log Message: ----------- core: Only warn about hosts with no services if verify_config >= 2 This is accomplished by giving -v twice (or more). "empty" hosts are perfectly valid ever since active host checks were introduced, so it's time we get these warnings a bit harder to come by. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-09-12 15:38:38 UTC (rev 2190) +++ nagioscore/trunk/base/config.c 2012-09-12 15:38:59 UTC (rev 2191) @@ -1564,7 +1564,7 @@ total_objects++; /* make sure each host has at least one service associated with it */ - if(temp_host->total_services == 0) { + if(temp_host->total_services == 0 && verify_config >= 2) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Host '%s' has no services associated with it!", temp_host->name); warnings++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-09-20 15:44:28
|
Revision: 2274 http://nagios.svn.sourceforge.net/nagios/?rev=2274&view=rev Author: ageric Date: 2012-09-20 15:44:17 +0000 (Thu, 20 Sep 2012) Log Message: ----------- core/config: Rename the query_handler_socket option to query_socket Having typed it wrong 14 times myself I've finally given up. This is clearly the obvious name for me, and since I write the code I get to decide. mwahahaha ;) Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-09-20 09:12:21 UTC (rev 2273) +++ nagioscore/trunk/base/config.c 2012-09-20 15:44:17 UTC (rev 2274) @@ -171,7 +171,7 @@ else if(!strcmp(variable, "check_workers")) num_check_workers = atoi(value); - else if(!strcmp(variable, "query_handler_socket")) + else if(!strcmp(variable, "query_socket")) qh_socket_path = (char *)strdup(value); else if(!strcmp(variable, "log_file")) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-09-22 13:01:47
|
Revision: 2292 http://nagios.svn.sourceforge.net/nagios/?rev=2292&view=rev Author: ageric Date: 2012-09-22 13:01:37 +0000 (Sat, 22 Sep 2012) Log Message: ----------- core: Resolve contacts and contactgroups for services Livestatus crashes pretty hard when it gets service requests without this patch. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-09-22 13:01:20 UTC (rev 2291) +++ nagioscore/trunk/base/config.c 2012-09-22 13:01:37 UTC (rev 2292) @@ -1481,6 +1481,8 @@ } total_objects = 0; for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { + contactgroupsmember *cgm; + contactsmember *cm; total_objects++; @@ -1535,6 +1537,23 @@ } } + for(cgm = temp_service->contact_groups; cgm; cgm = cgm->next) { + cgm->group_ptr = find_contactgroup(cgm->group_name); + if(cgm->group_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Contactgroup '%s' on service '%s;%s' could not be found\n", + cgm->group_name, temp_service->host_name, temp_service->description); + errors++; + } + } + for(cm = temp_service->contacts; cm; cm = cm->next) { + cm->contact_ptr = find_contact(cm->contact_name); + if(cm->contact_ptr == NULL) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Contact '%s' on service '%s;%s' could not be found\n", + cm->contact_name, temp_service->host_name, temp_service->description); + errors++; + } + } + /* see if the notification interval is less than the check interval */ if(temp_service->notification_interval < temp_service->check_interval && temp_service->notification_interval != 0) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service '%s' on host '%s' has a notification interval less than its check interval! Notifications are only re-sent after checks are made, so the effective notification interval will be that of the check interval.", temp_service->description, temp_service->host_name); @@ -1631,6 +1650,7 @@ errors++; } + temp_contactgroupsmember->group_name = temp_contactgroup->group_name; /* save the contact group pointer for later */ temp_contactgroupsmember->group_ptr = temp_contactgroup; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-10-20 08:22:40
|
Revision: 2374 http://nagios.svn.sourceforge.net/nagios/?rev=2374&view=rev Author: ageric Date: 2012-10-20 08:22:34 +0000 (Sat, 20 Oct 2012) Log Message: ----------- base/config: Stop hinting about the -x option It's deprecated, so we shouldn't announce it anywhere at all. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-10-20 08:22:17 UTC (rev 2373) +++ nagioscore/trunk/base/config.c 2012-10-20 08:22:34 UTC (rev 2374) @@ -1416,13 +1416,13 @@ printf("Timing information on configuration verification is listed below.\n\n"); - printf("CONFIG VERIFICATION TIMES (* = Potential for speedup with -x option)\n"); + printf("CONFIG VERIFICATION TIMES\n"); printf("----------------------------------\n"); printf("Object Relationships: %.6lf sec\n", runtime[0]); - printf("Circular Paths: %.6lf sec *\n", runtime[1]); + printf("Circular Paths: %.6lf sec\n", runtime[1]); printf("Misc: %.6lf sec\n", runtime[2]); printf(" ============\n"); - printf("TOTAL: %.6lf sec * = %.6lf sec (%.1f%%) estimated savings\n", runtime[3], runtime[1], (runtime[1] / runtime[3]) * 100.0); + printf("TOTAL: %.6lf sec\n", runtime[3]); printf("\n\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-10-23 01:20:20
|
Revision: 2391 http://nagios.svn.sourceforge.net/nagios/?rev=2391&view=rev Author: ageric Date: 2012-10-23 01:20:13 +0000 (Tue, 23 Oct 2012) Log Message: ----------- core: Parse the absolute path of directories before we try them out Doing it the other way around means we're not testing the path we'll be using. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-10-22 23:38:41 UTC (rev 2390) +++ nagioscore/trunk/base/config.c 2012-10-23 01:20:13 UTC (rev 2391) @@ -250,19 +250,19 @@ break; } - if((tmpdir = opendir((char *)value)) == NULL) { - asprintf(&error_message, "Temp path is not a valid directory"); - error = TRUE; - break; - } - closedir(tmpdir); - my_free(temp_path); temp_path = nspath_absolute(value, config_file_dir); /* make sure we don't have a trailing slash */ if(temp_path[strlen(temp_path) - 1] == '/') temp_path[strlen(temp_path) - 1] = '\x0'; + if((tmpdir = opendir(temp_path)) == NULL) { + asprintf(&error_message, "Temp path '%s' is not a valid directory", temp_path); + error = TRUE; + break; + } + closedir(tmpdir); + /* save the macro */ my_free(mac->x[MACRO_TEMPPATH]); mac->x[MACRO_TEMPPATH] = (char *)strdup(temp_path); @@ -276,19 +276,19 @@ break; } - if((tmpdir = opendir((char *)value)) == NULL) { - asprintf(&error_message, "Check result path is not a valid directory"); - error = TRUE; - break; - } - closedir(tmpdir); - my_free(check_result_path); check_result_path = nspath_absolute(value, config_file_dir); /* make sure we don't have a trailing slash */ if(check_result_path[strlen(check_result_path) - 1] == '/') check_result_path[strlen(check_result_path) - 1] = '\x0'; + if((tmpdir = opendir(check_result_path)) == NULL) { + asprintf(&error_message, "Check result path '%s' is not a valid directory", check_result_path); + error = TRUE; + break; + } + closedir(tmpdir); + } else if(!strcmp(variable, "max_check_result_file_age")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-12-06 12:15:37
|
Revision: 2509 http://nagios.svn.sourceforge.net/nagios/?rev=2509&view=rev Author: ageric Date: 2012-12-06 12:15:31 +0000 (Thu, 06 Dec 2012) Log Message: ----------- core: Use nagios.cfg-relative paths when locating broker modules We do it for everything else (or so I hope), so it makes sense to do it for these too. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-12-06 12:15:10 UTC (rev 2508) +++ nagioscore/trunk/base/config.c 2012-12-06 12:15:31 UTC (rev 2509) @@ -1055,7 +1055,14 @@ modptr = strtok(value, " \n"); argptr = strtok(NULL, "\n"); #ifdef USE_EVENT_BROKER - neb_add_module(modptr, argptr, TRUE); + modptr = nspath_absolute(modptr, config_file_dir); + if (modptr) { + neb_add_module(modptr, argptr, TRUE); + free(modptr); + } + else { + logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate module path memory for '%s'\n", value); + } #endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2012-12-19 16:52:52
|
Revision: 2543 http://nagios.svn.sourceforge.net/nagios/?rev=2543&view=rev Author: ageric Date: 2012-12-19 16:52:46 +0000 (Wed, 19 Dec 2012) Log Message: ----------- core: Try really hard to log errors regarding logging during reloads If the user has made a typo in the log_file path and issues a reload, we didn't print an error message anywhere at all, but silently failed to log anything at all. With this patch, we'll redirect such logs to the old logfile, but we consider it an error that we can't write to the newly configured file and return an error code promptly. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2012-12-19 16:52:27 UTC (rev 2542) +++ nagioscore/trunk/base/config.c 2012-12-19 16:52:46 UTC (rev 2543) @@ -176,6 +176,8 @@ else if(!strcmp(variable, "query_socket")) qh_socket_path = (char *)strdup(value); else if(!strcmp(variable, "log_file")) { + char *orig_log_file; + FILE *fp; if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Log file is too long"); @@ -183,12 +185,21 @@ break; } - my_free(log_file); + orig_log_file = log_file; log_file = nspath_absolute(value, config_file_dir); - - /* save the macro */ - my_free(mac->x[MACRO_LOGFILE]); - mac->x[MACRO_LOGFILE] = (char *)strdup(log_file); + if((fp = fopen(log_file, "w")) == NULL) { + char *value_absolute = log_file; + log_file = orig_log_file; + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to open logfile '%s' for writing: %s\n", value_absolute, strerror(errno)); + return ERROR; + } + else { + fclose(fp); + /* save the macro */ + my_free(orig_log_file); + my_free(mac->x[MACRO_LOGFILE]); + mac->x[MACRO_LOGFILE] = (char *)strdup(log_file); + } } else if(!strcmp(variable, "debug_level")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-01-08 17:13:24
|
Revision: 2559 http://nagios.svn.sourceforge.net/nagios/?rev=2559&view=rev Author: ageric Date: 2013-01-08 17:13:17 +0000 (Tue, 08 Jan 2013) Log Message: ----------- core: Try harder to make sense of the temp_path and temp_file Since temp_path and temp_file are sort of cooperative, one can override the other and it rarely makes sense to put tempfiles in the same directory where one keeps the nagios.cfg file, we special-case temp_file so it's relative to temp_path instead. The change looks larger than it is, since we have to revamp the ordering a bit in order to be able to use the temp_path directive last seen in the config file and thus have to duplicate a bit of error handling as well, but now a configuration such as temp_path=/usr/local/nagios/var temp_file=nagios.tmp will cause temp_file to actually become temp_file=/usr/local/nagios/var/nagios.tmp which makes sense and is less surprising than the alternative. Also, since we do rely pretty hard on being able to generate temp files, we make sure to have sensible fallbacks in case it's not configured, with "nagios.tmp" being the standard base template for the filename, and the environment variables TMPDIR and TMP setting defaults for the temp directory, with "/tmp" as the ultimate fallback. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-01-08 17:12:59 UTC (rev 2558) +++ nagioscore/trunk/base/config.c 2013-01-08 17:13:17 UTC (rev 2559) @@ -240,45 +240,13 @@ } else if(!strcmp(variable, "temp_file")) { - - if(strlen(value) > MAX_FILENAME_LENGTH - 1) { - asprintf(&error_message, "Temp file is too long"); - error = TRUE; - break; - } - my_free(temp_file); - temp_file = nspath_absolute(value, config_file_dir); - - /* save the macro */ - my_free(mac->x[MACRO_TEMPFILE]); - mac->x[MACRO_TEMPFILE] = (char *)strdup(temp_file); + temp_file = strdup(value); } else if(!strcmp(variable, "temp_path")) { - - if(strlen(value) > MAX_FILENAME_LENGTH - 1) { - asprintf(&error_message, "Temp path is too long"); - error = TRUE; - break; - } - my_free(temp_path); temp_path = nspath_absolute(value, config_file_dir); - /* make sure we don't have a trailing slash */ - if(temp_path[strlen(temp_path) - 1] == '/') - temp_path[strlen(temp_path) - 1] = '\x0'; - - if((tmpdir = opendir(temp_path)) == NULL) { - asprintf(&error_message, "Temp path '%s' is not a valid directory", temp_path); - error = TRUE; - break; - } - closedir(tmpdir); - - /* save the macro */ - my_free(mac->x[MACRO_TEMPPATH]); - mac->x[MACRO_TEMPPATH] = (char *)strdup(temp_path); } else if(!strcmp(variable, "check_result_path")) { @@ -1174,6 +1142,56 @@ } + if (!temp_path && !(temp_path = getenv("TMPDIR")) && !(temp_path = getenv("TMP"))) { + temp_path = strdup("/tmp"); + } + else { + /* make sure we don't have a trailing slash */ + if(temp_path[strlen(temp_path) - 1] == '/') + temp_path[strlen(temp_path) - 1] = '\x0'; + } + + if((strlen(temp_path) > MAX_FILENAME_LENGTH - 1)) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: temp_path is too long\n"); + return ERROR; + } + if((tmpdir = opendir(temp_path)) == NULL) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: temp_path '%s' is not a valid directory\n", temp_path); + return ERROR; + } + closedir(tmpdir); + + /* now that we know we have temp_path, we can set temp_file properly */ + if (!temp_file) { + temp_file = nspath_absolute("nagios.tmp", temp_path); + } + else if (*temp_file == '.') { + /* temp_file is relative. Make it nagios.cfg-relative */ + char *foo = temp_file; + temp_file = nspath_absolute(temp_file, config_file_dir); + free(foo); + } + else if (*temp_file != '/') { + /* + * tempfile is not relative and not absolute, so + * put it in temp_path + */ + char *foo = temp_file; + temp_file = nspath_absolute(temp_file, temp_path); + free(foo); + } + + if(strlen(temp_file) > MAX_FILENAME_LENGTH - 1) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Temp file '%s' is too long\n", temp_file); + return ERROR; + } + + /* save the macros */ + my_free(mac->x[MACRO_TEMPPATH]); + mac->x[MACRO_TEMPFILE] = (char *)strdup(temp_path); + my_free(mac->x[MACRO_TEMPFILE]); + mac->x[MACRO_TEMPFILE] = (char *)strdup(temp_file); + /* adjust timezone values */ if(use_timezone != NULL) set_environment_var("TZ", use_timezone, 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-02-04 11:59:53
|
Revision: 2591 http://nagios.svn.sourceforge.net/nagios/?rev=2591&view=rev Author: ageric Date: 2013-02-04 11:59:46 +0000 (Mon, 04 Feb 2013) Log Message: ----------- core: typofix: Set TEMPPATH macro properly We used to set TEMPFILE twice instead. For the record: Typos are silly. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-02-02 13:45:41 UTC (rev 2590) +++ nagioscore/trunk/base/config.c 2013-02-04 11:59:46 UTC (rev 2591) @@ -1171,8 +1171,8 @@ /* save the macros */ my_free(mac->x[MACRO_TEMPPATH]); - mac->x[MACRO_TEMPFILE] = (char *)strdup(temp_path); my_free(mac->x[MACRO_TEMPFILE]); + mac->x[MACRO_TEMPPATH] = (char *)strdup(temp_path); mac->x[MACRO_TEMPFILE] = (char *)strdup(temp_file); /* adjust timezone values */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-03-01 15:31:24
|
Revision: 2646 http://nagios.svn.sourceforge.net/nagios/?rev=2646&view=rev Author: ageric Date: 2013-03-01 15:31:17 +0000 (Fri, 01 Mar 2013) Log Message: ----------- core: Avoid warning about valid OCHP commands It's ok to have an OCHP command, so long as we can find it. Fortunately, the warning was a false alarm and configuration parsing still went through just fine, but we really should stfu when everything's fine and dandy. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-01 15:30:55 UTC (rev 2645) +++ nagioscore/trunk/base/config.c 2013-03-01 15:31:17 UTC (rev 2646) @@ -1377,9 +1377,10 @@ } if(ochp_command != NULL) { ochp_command_ptr = find_bang_command(ochp_command); - logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCHP command '%s' is not defined anywhere!\n", ochp_command); - ochp_command_ptr = find_bang_command(ochp_command); - errors += ochp_command_ptr == NULL; + if (!ochp_command_ptr) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCHP command '%s' is not defined anywhere!\n", ochp_command); + errors++; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-03-14 13:18:34
|
Revision: 2658 http://nagios.svn.sourceforge.net/nagios/?rev=2658&view=rev Author: ageric Date: 2013-03-14 13:18:25 +0000 (Thu, 14 Mar 2013) Log Message: ----------- core: Stop leaking the string to default logfile Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-14 13:18:08 UTC (rev 2657) +++ nagioscore/trunk/base/config.c 2013-03-14 13:18:25 UTC (rev 2658) @@ -183,6 +183,7 @@ break; } + my_free(log_file); log_file = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "debug_level")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-03-22 15:44:01
|
Revision: 2698 http://nagios.svn.sourceforge.net/nagios/?rev=2698&view=rev Author: ageric Date: 2013-03-22 15:43:53 +0000 (Fri, 22 Mar 2013) Log Message: ----------- core: Make sure configured logfile always trumps default one Previously we could end up logging to the default location if we had deprecated variables defined before we defined log_file (which caused us to write to the log_file set as default at compile time), but the logging api is clever enough to keep that file open and won't reopen it unnecessarily. With this patch, we always close the log_file whenever we run into the log_file statement, which causes the logging api to reopen it with the new (and correct) path whenever we want to log something again. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-22 13:29:38 UTC (rev 2697) +++ nagioscore/trunk/base/config.c 2013-03-22 15:43:53 UTC (rev 2698) @@ -185,6 +185,8 @@ my_free(log_file); log_file = nspath_absolute(value, config_file_dir); + /* make sure the configured logfile takes effect */ + close_log_file(); } else if(!strcmp(variable, "debug_level")) debug_level = atoi(value); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-03-22 15:44:19
|
Revision: 2699 http://nagios.svn.sourceforge.net/nagios/?rev=2699&view=rev Author: ageric Date: 2013-03-22 15:44:13 +0000 (Fri, 22 Mar 2013) Log Message: ----------- core: Log deprecated variables to the 'final' logfile The previous patch made sure we started writing "real" logmessages to the right place, but could still cause some logmessages to end up in the wrong logfile. With this change we protect against that by adding deprecated variables to a list and printing their warnings when we're done parsing the entire file (which means we've always parsed the 'log_file' statement). Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-22 15:43:53 UTC (rev 2698) +++ nagioscore/trunk/base/config.c 2013-03-22 15:44:13 UTC (rev 2699) @@ -74,12 +74,15 @@ return OK; } +static objectlist *deprecated = NULL; static void obsoleted_warning(const char *key, const char *msg) { - if (msg) - logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: %s is deprecated and will be removed. %s\n", key, msg); - else - logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: %s is deprecated and will be removed.\n", key); + char *buf; + asprintf(&buf, "Warning: %s is deprecated and will be removed.%s%s\n", + key, msg ? " " : "", msg ? msg : ""); + if (!buf) + return; + prepend_object_to_objectlist(&deprecated, buf); } /* process the main configuration file */ @@ -96,6 +99,7 @@ char *argptr = NULL; DIR *tmpdir = NULL; nagios_macros *mac; + objectlist *list; mac = get_global_macros(); @@ -1128,6 +1132,15 @@ } + if (deprecated) { + for (list = deprecated; list; list = list->next) { + logit(NSLOG_CONFIG_WARNING, TRUE, "%s", (char *)list->object_ptr); + free(list->object_ptr); + } + free_objectlist(&deprecated); + deprecated = NULL; + } + if (!temp_path && !(temp_path = getenv("TMPDIR")) && !(temp_path = getenv("TMP"))) { temp_path = strdup("/tmp"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-03-23 11:20:42
|
Revision: 2700 http://nagios.svn.sourceforge.net/nagios/?rev=2700&view=rev Author: ageric Date: 2013-03-23 11:20:35 +0000 (Sat, 23 Mar 2013) Log Message: ----------- core: Check timeperiods for circular exclusions Doing the exclusion logic right means traversing all the exclusions. If there are circular paths there we might be at it for ever, which is bad. With this patch we know we don't need to bother checking it in the timeperiod handling code, which is messy enough as it is. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-22 15:44:13 UTC (rev 2699) +++ nagioscore/trunk/base/config.c 2013-03-23 11:20:35 UTC (rev 2700) @@ -542,7 +542,7 @@ } } - + else if(!strcmp(variable,"service_check_timeout_state")){ if(!strcmp(value,"o")) @@ -2156,20 +2156,52 @@ return dfs_get_status(root); } +int dfs_timeperiod_path(char *ary, timeperiod *root, int *errors) +{ + timeperiodexclusion *exc; + + if(dfs_get_status(root) != DFS_UNCHECKED) + return dfs_get_status(root); + + /* Mark the root temporary checked */ + dfs_set_status(root, DFS_TEMP_CHECKED); + + for (exc = root->exclusions; exc; exc = exc->next) { + int child_status = dfs_timeperiod_path(ary, exc->timeperiod_ptr, errors); + + if(child_status == DFS_TEMP_CHECKED) { + logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The timeperiods '%s' and '%s' form or lead into a circular exclusion chain!", + root->name, exc->timeperiod_ptr->name); + (*errors)++; + dfs_set_status(exc->timeperiod_ptr, DFS_LOOPY); + dfs_set_status(root, DFS_LOOPY); + continue; + } + } + + if(dfs_get_status(root) == DFS_TEMP_CHECKED) + dfs_set_status(root, DFS_OK); + + return dfs_get_status(root); +} + + /* check for circular paths and dependencies */ int pre_flight_circular_check(int *w, int *e) { host *temp_host = NULL; servicedependency *temp_sd = NULL; hostdependency *temp_hd = NULL; + timeperiod *tp; int i, errors = 0; unsigned int alloc, dep_type; char *ary[2]; - /* this would be a valid but pathological case */ if(num_objects.hosts > num_objects.services) alloc = num_objects.hosts; else alloc = num_objects.services; + if(num_objects.timeperiods > alloc) + alloc = num_objects.timeperiods; for (i = 0; i < ARRAY_SIZE(ary); i++) { if (!(ary[i] = calloc(1, alloc))) { @@ -2187,18 +2219,17 @@ /* check for circular paths between hosts */ /********************************************/ if(verify_config) - printf("Checking for circular paths between hosts...\n"); + printf("Checking for circular paths...\n"); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { dfs_host_path(ary[0], temp_host, &errors); } + if (verify_config) + printf("\tChecked %u hosts\n", num_objects.hosts); /********************************************/ /* check for circular dependencies */ /********************************************/ - if(verify_config) - printf("Checking for circular host and service dependencies...\n"); - /* check service dependencies */ /* We must clean the dfs status from previous check */ for (i = 0; i < ARRAY_SIZE(ary); i++) @@ -2232,6 +2263,15 @@ if(verify_config) printf("\tChecked %u host dependencies\n", num_objects.hostdependencies); + /* check timeperiod exclusion chains */ + for (i = 0; i < ARRAY_SIZE(ary); i++) + memset(ary[i], 0, alloc); + for (tp = timeperiod_list; tp; tp = tp->next) { + dfs_timeperiod_path(ary[0], tp, &errors); + } + if (verify_config) + printf("\tChecked %u timeperiods\n", num_objects.timeperiods); + /* update warning and error count */ *e += errors; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ag...@us...> - 2013-04-04 09:28:00
|
Revision: 2711 http://nagios.svn.sourceforge.net/nagios/?rev=2711&view=rev Author: ageric Date: 2013-04-04 09:27:49 +0000 (Thu, 04 Apr 2013) Log Message: ----------- core: Bail out when we fail to read the resource file It should be a fatal error, so let's make it so. Signed-off-by: Andreas Ericsson <ae...@op...> Modified Paths: -------------- nagioscore/trunk/base/config.c Modified: nagioscore/trunk/base/config.c =================================================================== --- nagioscore/trunk/base/config.c 2013-03-25 15:38:49 UTC (rev 2710) +++ nagioscore/trunk/base/config.c 2013-04-04 09:27:49 UTC (rev 2711) @@ -170,7 +170,9 @@ mac->x[MACRO_RESOURCEFILE] = nspath_absolute(value, config_file_dir); /* process the resource file */ - read_resource_file(mac->x[MACRO_RESOURCEFILE]); + if(read_resource_file(mac->x[MACRO_RESOURCEFILE]) == ERROR) { + error = TRUE; + } } else if(!strcmp(variable, "loadctl_options")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |