diff --git a/.gitignore b/.gitignore index 4bb5c7a..256454b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ autom4te.cache config.log config.status daemon-init +openrc-init Makefile tags .deps/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..3e2e8b6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,165 @@ +# Contributing + +Thank you for considering contributing your time and effort to this Nagios project. +This document serves as our guidelines for contribution. Keep in mind that these +are simply *guidelines* - nothing here is set in stone. + +## Questions + +If you have a question, you don't need to file an Issue. You can simply connect +with the Nagios Support Team via the +[Nagios Support Forum](https://support.nagios.com/forum/). + +Not to say that you **can't** open an Issue - but you'll likely get a much faster +response by posting it on the forum. + +## Ideas + +If you have an idea your best bet is to open an Issue. This gets it on the radar much +quicker than any other method. + +First, let's define what an "Idea" really is. An Idea is simply an +[Enhancement](#enhancements) request in its infancy. +There's really nothing to it! + +Something as simple as "I think that this project should somehow connect with a +widget" is a valid Idea. + +These are unrefined and raw. That's why you open an issue - so everyone gets a chance +to chime in and come up with a plan! + +## Feedback + +Feedback can be given via several methods. The *easiest* method is by opening an Issue. +You're more than welcome to leave feedback on the +[Nagios Support Forum](https://support.nagios.com/forum/) as well. + +By opening an Issue, however, you're insuring that the maintainers and reviewers are +the first ones to see the feedback. In most cases, this is likely ideal. + +## Bugs + +Here's where it starts to get serious. + +Following the guidelines outlined in this section allows the maintainers, developers, and +community to understand and reproduce your bug report. + +Make sure to search existing open and closed [Issues](https://guides.github.com/features/issues/) +before opening a bug report. If you find a closed Issue that seems like it's the same +thing that you're experiencing, open a new Issue and include a link to the original Issue +in the body of the new one. + +**If you have a bug, you *NEED* to open an Issue.** + +Not only that, but when you open the Issue, this is what we ***absolutely require***: + +* Use a clear and concise title for the Issue to identify the problem accurately + +* Describe the bug with as much detail as you can + +* Include the version of the project containing the bug you're reporting + +* Include your operating system information (`uname -a`) + +* Include a list of third party modules that are installed and/or loaded + +* Explain the behavior you expected to see (and why) vs. what actually happened + +Once you've got that covered - there's still more to include if you want to +make a ***killer*** report: + +* Describe the ***exact steps*** that reproduce the problem + +* Provide **specific** examples to demonstrate those steps + +* If your bug is from an older version, make sure test against the latest (and/or the `maint` branch) + +* Include any screenshots that can help explain the issue + +* Include a file containing `strace` and/or `valgrind` output + +* Explain when the problem started happening: was it after an upgrade? or was it always present? + +* Define how reliably you can reproduce the bug + +* Any other information that you decide is relevant is also welcome + +## Enhancements + +An enhancement is either a completely new feature or an improvement to existing +functionality. We consider it to be a bit different than idea - based solely +on the fact that it's more detailed than an idea would be. + +So you've got an idea for an ehancement? Great! + +Following the guidelines outlined in this section allows maintainers, developers, and +the community to understand your enhancement and determine whether or not it's worth +doing and/or what's involved in carrying it out. + +Make sure to search open and closed Issues and Pull Requests to determine if +someone has either submitted the enhancement. If you feel like your enhancement +is similar to one found, make sure to link the original in your request. + +Enhancements are submitted by opening an Issue. + +Unlike an [Idea](#idea), when you decide to submit your enhancement and open +the Issue, we require at least the following information: + +* Use a clear and descriptive title to illustrate the enhancement you're requesting + +* Describe the current behavior (if it exists) and what changes you think should be made + +* Explain the enhancement in detail - make sure it makes sense and is easily understandable + +* Specify why the enhancement would be useful and who it would be useful to + +* If there is some other project or program where this enhancement already exists, make sure +to link to it + +Beyond that, there are a few more things you can do to make sure you **really** get your +point across: + +* Create a mockup of the enhancement (if applicable) and attach whatever files you can + +* Provide a step-by-step description of the suggested enhancement + +* Generate a fully dressed use-case for the enhancement request + +* Create a specification for the preferred implementation of the enhancement + +* Include a timeline regarding development expectations towards the request + +## Submitting Code + +Everything else in this document has lead up to this moment - how can ***you*** submit +code to the **project**. + +We allow code submissions via [Pull Requests](https://help.github.com/articles/about-pull-requests/). +These let you (and us) discuss and review any changes to code in any repository you've made. + +How to create and manage Pull Requests is outside of the scope of this document, but make +sure to check out GitHub's official documentation ([link here](https://help.github.com/)) +to get a handle on it. + +While you're forking the repository to create a patch or an enhancement, create a *new +branch* to make the change - it will be easier to submit a pull request using a new +branch in your forked repository! + +When you submit a Pull Request, make sure you follow the guidelines: + +* Make sure you're submitting to the proper branch. Branch `maint` is used for the +**next** bugfix release. The next enhancement release branch will vary. + +* ***NEVER*** submit a Pull Request to `master` branch. + +* Keep commit messages as concise as possible. +* Update the appropriate files in regards to your changes: + + * `CHANGES` + + * `THANKS` + +* End all committed files with a newline. + +* Test your changes and include the results as a comment. + diff --git a/Changelog b/Changelog index 8794e16..f0bbf75 100644 --- a/Changelog +++ b/Changelog @@ -2,7 +2,28 @@ Nagios Core 4 Change Log ######################## -4.3.2 - xxxx-xx-xx + +4.3.4 - 2017-08-24 +------------------ +* Improved config file parsing (Mark Felder) +* Fixed configure script to check for existence of /run for lock file (in regards to CVE-2017-12847, Bryan Heden) +* Use absolute paths when deleting check results files (Emmanuel Dreyfus) +* Add sanity checking in reassign_worker (sq5bpf) + + +4.3.3 - 2017-08-12 +------------------ +* xodtemplate.c wrong option-deprecation code warning (alex2grad / John Frickson) +* On-demand host check always use cached host state (John Frickson) +* 'á' causes Serivce Status Information to not be displayed (John Frickson) +* New Macro(s) to generate URL for host / service object (John Frickson) +* Fix minor map issues (Troy Lea) +* Fix lockfile issues (Bryan Heden) +* Switch order of daemon_init and drop_priveleges (CVE-2017-12847, Bryan Heden) +* Add an OpenRC init script (Michael Orlitzky) + + +4.3.2 - 2017-05-09 ------------------ FIXED * Every 15sec /var/log/messages is flooded with "nagios: set_environment_var" (John Frickson) diff --git a/Makefile.in b/Makefile.in index 19aff26..a6a520f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -197,7 +197,7 @@ distclean: clean cd $(SRC_TTAP) && $(MAKE) $@ cd $(SRC_WORKERS) && $(MAKE) $@ rm -f sample-config/*.cfg sample-config/*.conf sample-config/template-object/*.cfg - rm -f daemon-init pkginfo + rm -f daemon-init openrc-init pkginfo rm -f Makefile subst rm -f config.log config.status config.cache rm -f tags diff --git a/THANKS b/THANKS index 90ee406..3789bd9 100644 --- a/THANKS +++ b/THANKS @@ -70,6 +70,7 @@ wrong, please let me know. * David Kmoch * David Schlecht * David Tilloy +* David Walser * Dawid Golunski * Dean Lane * Denis Seleznyov @@ -183,10 +184,12 @@ wrong, please let me know. * Luigi Balzano * Luiz Felipe R E * Luke Ross +* Emmanuel Dreyfus * Marc Powell * Marcus Fleige * Marcus Hildenbrand * Mark DeTrano +* Mark Felder * Mark Frost * Mark Goldfinch * Mark Schenker @@ -218,6 +221,7 @@ wrong, please let me know. * Michael Lubben * Michael Marineau * Michael O'Reilly +* Michael Orlitzky * Michael Smedius * Michal Zimen * Michelle Craft @@ -258,6 +262,7 @@ wrong, please let me know. * Ralph Rossner * Ray Bengen * Remi Paulmier +* Rémi Verschelde * Rene Klootwijk * Ricardo Maraschini * Richard Mayhew @@ -282,6 +287,7 @@ wrong, please let me know. * Sergio Guzman * Shad Lords * Simon Beale +* sq5bpf * Stanley Hopcroft * Stefan Rompf * Stefan Schurtz @@ -318,6 +324,7 @@ wrong, please let me know. * Tomer Okavi * Ton Voon * Torsten Huebler +* Troy Lea * Tyler Lund * Uwe Knop * Uwe Knop diff --git a/base/checks.c b/base/checks.c index aeeb739..1a777ba 100644 --- a/base/checks.c +++ b/base/checks.c @@ -400,7 +400,6 @@ int handle_async_service_check_result(service *temp_service, check_result *queue char *temp_ptr = NULL; servicedependency *temp_dependency = NULL; service *master_service = NULL; - int state_changes_use_cached_state = TRUE; /* TODO - 09/23/07 move this to a global variable */ int flapping_check_done = FALSE; @@ -676,7 +675,7 @@ int handle_async_service_check_result(service *temp_service, check_result *queue else { /* can we use the last cached host state? */ /* usually only use cached host state if no service state change has occurred */ - if((state_change == FALSE || state_changes_use_cached_state == TRUE) && temp_host->has_been_checked == TRUE && ((current_time - temp_host->last_check) <= cached_host_check_horizon)) { + if(state_change == FALSE && temp_host->has_been_checked == TRUE && ((current_time - temp_host->last_check) <= cached_host_check_horizon)) { log_debug_info(DEBUGL_CHECKS, 1, "* Using cached host state: %d\n", temp_host->current_state); update_check_stats(ACTIVE_ONDEMAND_HOST_CHECK_STATS, current_time); update_check_stats(ACTIVE_CACHED_HOST_CHECK_STATS, current_time); @@ -770,7 +769,7 @@ int handle_async_service_check_result(service *temp_service, check_result *queue log_debug_info(DEBUGL_CHECKS, 1, "Host is currently UP, so we'll recheck its state to make sure...\n"); /* only run a new check if we can and have to */ - if(execute_host_checks && (state_change == TRUE && state_changes_use_cached_state == FALSE) && temp_host->last_check + cached_host_check_horizon < current_time) { + if(execute_host_checks && state_change == TRUE && temp_host->last_check + cached_host_check_horizon < current_time) { schedule_host_check(temp_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } else { @@ -786,7 +785,7 @@ int handle_async_service_check_result(service *temp_service, check_result *queue log_debug_info(DEBUGL_CHECKS, 1, "Host is currently %s.\n", host_state_name(temp_host->current_state)); - if(execute_host_checks && (state_change == TRUE && state_changes_use_cached_state == FALSE)) { + if(execute_host_checks && state_change == TRUE) { schedule_host_check(temp_host, current_time, CHECK_OPTION_NONE); } /* else fake the host check, but (possibly) resend host notifications to contacts... */ diff --git a/base/config.c b/base/config.c index a2ad487..edd43e1 100644 --- a/base/config.c +++ b/base/config.c @@ -107,7 +107,7 @@ int read_main_config_file(char *main_config_file) { /* open the config file for reading */ if((thefile = mmap_fopen(main_config_file)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Cannot open main configuration file '%s' for reading!", main_config_file); - return ERROR; + exit(ERROR); } /* save the main config file macro */ @@ -175,6 +175,11 @@ int read_main_config_file(char *main_config_file) { } } + else if(!strcmp(variable, "website_url")) { + my_free(website_url); + website_url = strdup(value); + } + else if(!strcmp(variable, "loadctl_options")) error = set_loadctl_options(value, strlen(value)) != OK; else if(!strcmp(variable, "check_workers")) @@ -1267,12 +1272,11 @@ int read_main_config_file(char *main_config_file) { my_free(value); /* make sure a log file has been specified */ - strip(log_file); - if(!strcmp(log_file, "")) { - if(daemon_mode == FALSE) - printf("Error: Log file is not specified anywhere in main config file '%s'!\n", main_config_file); - return ERROR; + if(log_file == NULL) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Log file is not specified anywhere in main config file '%s'!", main_config_file); + exit(ERROR); } + strip(log_file); return OK; } diff --git a/base/nagios.c b/base/nagios.c index 2678700..6811aa6 100644 --- a/base/nagios.c +++ b/base/nagios.c @@ -592,6 +592,22 @@ int main(int argc, char **argv) { program_start = time(NULL); my_free(mac->x[MACRO_PROCESSSTARTTIME]); asprintf(&mac->x[MACRO_PROCESSSTARTTIME], "%llu", (unsigned long long)program_start); + + /* enter daemon mode (unless we're restarting...) */ + if(daemon_mode == TRUE && sigrestart == FALSE) { + + result = daemon_init(); + + /* we had an error daemonizing, so bail... */ + if(result == ERROR) { + logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to failure to daemonize. (PID=%d)", (int)getpid()); + cleanup(); + exit(EXIT_FAILURE); + } + + /* get new PID */ + nagios_pid = (int)getpid(); + } /* drop privileges */ if(drop_privileges(nagios_user, nagios_group) == ERROR) { @@ -612,21 +628,6 @@ int main(int argc, char **argv) { /* error has already been logged */ exit(EXIT_FAILURE); } - /* enter daemon mode (unless we're restarting...) */ - if(daemon_mode == TRUE && sigrestart == FALSE) { - - result = daemon_init(); - - /* we had an error daemonizing, so bail... */ - if(result == ERROR) { - logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to failure to daemonize. (PID=%d)", (int)getpid()); - cleanup(); - exit(EXIT_FAILURE); - } - - /* get new PID */ - nagios_pid = (int)getpid(); - } /* this must be logged after we read config data, as user may have changed location of main log file */ logit(NSLOG_PROCESS_INFO, TRUE, "Nagios %s starting... (PID=%d)\n", PROGRAM_VERSION, (int)getpid()); diff --git a/base/utils.c b/base/utils.c index d098b26..8116ebf 100644 --- a/base/utils.c +++ b/base/utils.c @@ -189,6 +189,7 @@ int free_child_process_memory; int child_processes_fork_twice; char *use_timezone; +char *website_url; int allow_empty_hostgroup_assignment; @@ -263,6 +264,7 @@ void init_main_cfg_vars(int first_time) { nagios_user = NULL; nagios_group = NULL; + website_url = NULL; use_regexp_matches = FALSE; use_true_regexp_matching = FALSE; @@ -2131,7 +2133,11 @@ int process_check_result_queue(char *dirname) { /* if the file is too old, we delete it */ if (stat_buf.st_mtime + max_check_result_file_age < time(NULL)) { - delete_check_result_file(dirfile->d_name); + + if (delete_check_result_file(file) != OK + && delete_check_result_file(dirfile->d_name) != OK) + logit(NSLOG_RUNTIME_WARNING, TRUE, "Error: Unable to delete '%s' or '%s'!", file, dirfile->d_name); + continue; } @@ -2361,16 +2367,17 @@ int process_check_result_file(char *fname) { /* deletes as check result file, as well as its ok-to-go file */ int delete_check_result_file(char *fname) { char *temp_buffer = NULL; + int result = OK; /* delete the result file */ - unlink(fname); + result = unlink(fname); /* delete the ok-to-go file */ asprintf(&temp_buffer, "%s.ok", fname); - unlink(temp_buffer); + result |= unlink(temp_buffer); my_free(temp_buffer); - return OK; + return result; } @@ -3383,6 +3390,7 @@ void free_memory(nagios_macros *mac) { my_free(command_file); mac->x[MACRO_COMMANDFILE] = NULL; /* assigned from command_file */ my_free(log_archive_path); + my_free(website_url); for (i = 0; i < MAX_USER_MACROS; i++) { my_free(macro_user[i]); @@ -3442,6 +3450,7 @@ int reset_variables(void) { my_free(ocsp_command); my_free(ochp_command); + my_free(website_url); /* Next re-initialize configuration variables */ init_main_cfg_vars(0); diff --git a/base/workers.c b/base/workers.c index 1e78fd0..9c74e0c 100644 --- a/base/workers.c +++ b/base/workers.c @@ -604,9 +604,13 @@ static void fo_reassign_wproc_job(void *job_) { struct wproc_job *job = (struct wproc_job *)job_; job->wp = get_worker(job->command); - job->id = get_job_id(job->wp); - /* macros aren't used right now anyways */ - wproc_run_job(job, NULL); + if (job->wp != NULL) { + job->id = get_job_id(job->wp); + /* macros aren't used right now anyways */ + wproc_run_job(job, NULL); + } else { + logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Error: can't get_worker() in fo_reassign_wproc_job\n"); + } } static int handle_worker_result(int sd, int events, void *arg) diff --git a/cgi/cgiutils.c b/cgi/cgiutils.c index ed16661..ee3021e 100644 --- a/cgi/cgiutils.c +++ b/cgi/cgiutils.c @@ -1088,33 +1088,37 @@ const char *url_encode(const char *input) { return str; } -static char * copy_wc_to_output(wchar_t wc, char *outstp, int output_max) { +static inline char* encode_character(char in, char *outcp, int output_max) +{ + char *entity = NULL; + int rep_lth, out_len = outcp - encoded_html_string; - int wctomb_result; - char mbtemp[ 10]; - - wctomb_result = wctomb(mbtemp, wc); - if(( wctomb_result > 0) && - ((( outstp - encoded_html_string) + wctomb_result) < output_max)) { - strncpy( outstp, mbtemp, wctomb_result); - outstp += wctomb_result; - } - return outstp; + switch(in) { + case '&': entity = "&"; break; + case '"': entity = """; break; + case '\'': entity = "'"; break; + case '<': entity = "<"; break; + case '>': entity = ">"; break; } -static char * encode_character(wchar_t wc, char *outstp, int output_max) { - - char temp_expansion[11]; - - sprintf(temp_expansion, "&#%u;", (unsigned int)wc); - if(((outstp - encoded_html_string) + strlen(temp_expansion)) < - (unsigned int)output_max) { - strncpy(outstp, temp_expansion, strlen( temp_expansion)); - outstp += strlen( temp_expansion); + if (entity) { + rep_lth = strlen(entity); + if (out_len + rep_lth < output_max) { + strcpy(outcp, entity); + outcp += rep_lth; } - return outstp; + return outcp; } + if (out_len + 6 >= output_max) + return outcp; + + sprintf(outcp, "&#%u", (unsigned int)in); + outcp += strlen(outcp); + + return outcp; +} + #define WHERE_OUTSIDE_TAG 0 /* Not in an HTML tag */ #define WHERE_IN_TAG_NAME 1 /* In HTML tag name (either opening or closing tag) */ @@ -1131,11 +1135,8 @@ static char * encode_character(wchar_t wc, char *outstp, int output_max) { char * html_encode(char *input, int escape_newlines) { int len; int output_max; - char *outstp; - wchar_t *wcinput; - wchar_t *inwcp; - wchar_t *tagname = L""; - size_t mbstowcs_result; + char *incp, *outcp; + char *tagname = ""; int x; int where_in_tag = WHERE_OUTSIDE_TAG; /* Location in HTML tag */ wchar_t attr_value_start = (wchar_t)0; /* character that starts the @@ -1145,135 +1146,124 @@ char * html_encode(char *input, int escape_newlines) { /* we need up to six times the space to do the conversion */ len = (int)strlen(input); output_max = len * 6; - if(( outstp = encoded_html_string = (char *)malloc(output_max + 1)) == NULL) + if(( outcp = encoded_html_string = (char *)malloc(output_max + 1)) == NULL) return ""; strcpy(encoded_html_string, ""); - /* Convert the string to a wide character string */ - if(( wcinput = malloc( len * sizeof( wchar_t))) == NULL) { - return ""; - } - if((mbstowcs_result = mbstowcs( wcinput, input, len)) == (size_t)-1) { - free( wcinput); - return ""; - } - /* Process all converted characters */ - for( x = 0, inwcp = wcinput; x < (int)mbstowcs_result && '\0' != *inwcp; - x++, inwcp++) { + for (x = 0, incp = input; x < len && *incp; x++, incp++) { /* Most ASCII characters don't get encoded */ - if(( *inwcp >= 0x20 && *inwcp <= 0x7e) && - ( !( '"' == *inwcp || '&' == *inwcp || '\'' == *inwcp || - '<' == *inwcp || '>' == *inwcp))) { - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + if (*incp >= 0x20 && *incp <= 0x7e && !strchr("'\"&^<>", *incp)) { + *outcp++ = *incp; + switch(where_in_tag) { + case WHERE_IN_TAG_NAME: - switch(*inwcp) { + switch(*incp) { case 0x20: where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; - *inwcp = 0; + *incp = 0; break; case '!': where_in_tag = WHERE_IN_COMMENT; break; } break; + case WHERE_IN_TAG_OUTSIDE_ATTRIBUTE: - if(*inwcp != 0x20) { + if(*incp != 0x20) where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_NAME; - } break; + case WHERE_IN_TAG_IN_ATTRIBUTE_NAME: - if(*inwcp == '=') { + if(*incp == '=') where_in_tag = WHERE_IN_TAG_AT_EQUALS; - } break; + case WHERE_IN_TAG_AT_EQUALS: - if(*inwcp != 0x20) { - attr_value_start = *inwcp; + if(*incp != 0x20) { + attr_value_start = *incp; where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_VALUE; - } - break; - case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: - if((*inwcp == 0x20) && (attr_value_start != '"') && - (attr_value_start != '\'')) { - where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; - } - break; } + break; + + case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: + if((*incp == 0x20) && (attr_value_start != '"') && (attr_value_start != '\'')) + where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; + break; } + } /* Special handling for quotes */ - else if(FALSE == escape_html_tags && - ('"' == *inwcp || '\'' == *inwcp)) { + else if(escape_html_tags == FALSE && (*incp == '"' || *incp == '\'')) { + switch(where_in_tag) { + case WHERE_OUTSIDE_TAG: - if(tag_depth >0) { - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - } - else { - outstp = encode_character(*inwcp, outstp, output_max); - } + if (tag_depth > 0) + *outcp++ = *incp; + else + outcp = encode_character(*incp, outcp, output_max); break; + case WHERE_IN_COMMENT: - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + *outcp++ = *incp; break; + case WHERE_IN_TAG_AT_EQUALS: - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - attr_value_start = *inwcp; + *outcp++ = *incp; + attr_value_start = *incp; where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_VALUE; break; + case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: - if(*(inwcp-1) == '\\') { - /* This covers the case where the quote is backslash - escaped. */ - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - } - else if(attr_value_start == *inwcp) { + if(*(incp-1) == '\\') + /* This covers the case where the quote is backslash escaped. */ + *outcp++ = *incp; + else if(attr_value_start == *incp) { /* If the quote is the same type of quote that started the attribute value and it is not backslash escaped, it signals the end of the attribute value */ - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + *outcp++ = *incp; where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; - } - else { - /* If we encounter an quote that did not start the - attribute value and is not backslash escaped, - use it as is */ - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - } - break; - default: - if (tag_depth > 0 && !wcscmp(tagname, L"script")) - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - else - outstp = encode_character(*inwcp, outstp, output_max); - break; } + else + /* If we encounter an quote that did not start the attribute + value and is not backslash escaped, use it as is */ + *outcp++ = *incp; + break; + + default: + if (tag_depth > 0 && !strcmp(tagname, "script")) + *outcp++ = *incp; + else + outcp = encode_character(*incp, outcp, output_max); + break; } + } /* newlines turn to
tags */ - else if(escape_newlines == TRUE && '\n' == *inwcp) { - strncpy( outstp, "
", 4); - outstp += 4; - } + else if(escape_newlines == TRUE && *incp == '\n') { + strncpy( outcp, "
", 4); + outcp += 4; + } - else if(escape_newlines == TRUE && '\\' == *inwcp && '\n' == *( inwcp + 1)) { - strncpy( outstp, "
", 4); - outstp += 4; - inwcp++; /* needed so loop skips two wide characters */ - } + else if(escape_newlines == TRUE && *incp == '\\' && *(incp + 1) == '\n') { + strncpy( outcp, "
", 4); + outcp += 4; + incp++; /* needed so loop skips two characters */ + } /* TODO - strip all but allowed HTML tags out... */ - else if(('<' == *inwcp) && (FALSE == escape_html_tags)) { + else if (*incp == '<' && escape_html_tags == FALSE) { switch(where_in_tag) { case WHERE_OUTSIDE_TAG: - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + *outcp++ = *incp; where_in_tag = WHERE_IN_TAG_NAME; - switch(*(inwcp+1)) { + switch(*(incp+1)) { case '/': tag_depth--; break; @@ -1281,68 +1271,73 @@ char * html_encode(char *input, int escape_newlines) { break; default: tag_depth++; - tagname = inwcp + 1; + tagname = incp + 1; break; } break; - default: - if (tag_depth > 0 && !wcscmp(tagname, L"script")) - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - else - outstp = encode_character(*inwcp, outstp, output_max); - break; - } - } - else if(('>' == *inwcp) && (FALSE == escape_html_tags)) { + default: + if (tag_depth > 0 && !strcmp(tagname, "script")) + *outcp++ = *incp; + else + outcp = encode_character(*incp, outcp, output_max); + break; + } + } + + else if( *incp == '>' && escape_html_tags == FALSE) { switch(where_in_tag) { case WHERE_IN_TAG_NAME: case WHERE_IN_TAG_OUTSIDE_ATTRIBUTE: case WHERE_IN_COMMENT: case WHERE_IN_TAG_IN_ATTRIBUTE_NAME: - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + *outcp++ = *incp; where_in_tag = WHERE_OUTSIDE_TAG; - *inwcp = 0; + *incp = 0; break; + case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: if((attr_value_start != '"') && (attr_value_start != '\'')) { - outstp = copy_wc_to_output(*inwcp, outstp, output_max); + *outcp++ = *incp; where_in_tag = WHERE_OUTSIDE_TAG; - } - else { - outstp = encode_character(*inwcp, outstp, output_max); - } - break; - default: - if (tag_depth > 0 && !wcscmp(tagname, L"script")) - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - else - outstp = encode_character(*inwcp, outstp, output_max); - break; } - } + else + outcp = encode_character(*incp, outcp, output_max); + break; - /* check_multi puts out a '&ndash' so don't encode the '&' in that case */ - else if (*inwcp == '&' && escape_html_tags == FALSE) { - if (tag_depth > 0 && !wcsncmp(inwcp, L"&ndash", 6)) - outstp = copy_wc_to_output(*inwcp, outstp, output_max); - else - outstp = encode_character(*inwcp, outstp, output_max); - } - - /* for simplicity, all other chars represented by their numeric value */ - else { - outstp = encode_character(*inwcp, outstp, output_max); + default: + if (tag_depth > 0 && !strcmp(tagname, "script")) + *outcp++ = *incp; + else + outcp = encode_character(*incp, outcp, output_max); + break; } } + /* check_multi puts out a '&ndash' so don't encode the '&' in that case */ + else if (*incp == '&' && escape_html_tags == FALSE) { + if (tag_depth > 0 && !strcmp(incp, "&ndash")) + *outcp++ = *incp; + else + outcp = encode_character(*incp, outcp, output_max); + } + + else if ((unsigned char)*incp > 0x7f) + /* pass through UTF-8 characters */ + *outcp++ = *incp; + + /* for simplicity, all other chars represented by their numeric value */ + else + outcp = encode_character(*incp, outcp, output_max); + } + /* Null terminate the encoded string */ - *outstp = '\x0'; + *outcp = '\x0'; encoded_html_string[ output_max - 1] = '\x0'; return encoded_html_string; - } +} diff --git a/common/macros.c b/common/macros.c index eb26baa..033451d 100644 --- a/common/macros.c +++ b/common/macros.c @@ -689,6 +689,7 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar /* HOST MACROS */ /***************/ case MACRO_HOSTGROUPNAMES: + case MACRO_HOSTINFOURL: *free_macro = TRUE; case MACRO_HOSTNAME: case MACRO_HOSTALIAS: @@ -828,6 +829,7 @@ int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *ar /* SERVICE MACROS */ /******************/ case MACRO_SERVICEGROUPNAMES: + case MACRO_SERVICEINFOURL: *free_macro = TRUE; case MACRO_SERVICEDESC: case MACRO_SERVICESTATE: @@ -1813,6 +1815,12 @@ int grab_standard_host_macro_r(nagios_macros *mac, int macro_type, host *temp_ho *output = (char *)mkstr("%u", temp_host->hourly_value + host_services_value(temp_host)); break; + case MACRO_HOSTINFOURL: + buf1 = get_url_encoded_string(temp_host->name); + asprintf(output, "%s/cgi-bin/extinfo.cgi?type=1&host=%s", + website_url ? website_url : "website_url not set", buf1); + my_free(buf1); + break; #endif /***************/ @@ -2145,6 +2153,21 @@ int grab_standard_service_macro_r(nagios_macros *mac, int macro_type, service *t case MACRO_SERVICEIMPORTANCE: *output = (char *)mkstr("%u", temp_service->hourly_value); break; + case MACRO_SERVICEINFOURL: + + buf1 = get_url_encoded_string(temp_service->host_name); + buf2 = get_url_encoded_string(temp_service->description); + asprintf(output, "%s/cgi-bin/extinfo.cgi?type=2&host=%s&service=%s", + website_url ? website_url : "website_url not set", + buf1, buf2); + my_free(buf1); + my_free(buf2); + break; + + + + my_free(buf1); + break; #endif /***************/ @@ -2778,6 +2801,8 @@ int init_macrox_names(void) { add_macrox_name(SERVICEIMPORTANCE); add_macrox_name(HOSTANDSERVICESIMPORTANCE); add_macrox_name(HOSTGROUPMEMBERADDRESSES); + add_macrox_name(HOSTINFOURL); + add_macrox_name(SERVICEINFOURL); return OK; } diff --git a/configure b/configure index 6fd5a4b..541afeb 100755 --- a/configure +++ b/configure @@ -1405,7 +1405,8 @@ Optional Packages: sets path to check results spool directory --with-temp-dir= sets path to temp directory --with-init-dir= sets directory to place init script into - --with-lockfile= sets path and file name for lock file + --with-lockfile= sets path for lock file (default: + [/var]/run/nagios.lock) --with-iobroker= specify the method to use with iobroker: epoll, poll, or select @@ -2353,9 +2354,9 @@ ac_config_headers="$ac_config_headers include/config.h lib/snprintf.h lib/iobrok PKG_NAME=nagios -PKG_VERSION="4.3.2" +PKG_VERSION="4.3.4" PKG_HOME_URL="https://www.nagios.org/" -PKG_REL_DATE="2017-05-09" +PKG_REL_DATE="2017-08-24" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -4942,11 +4943,17 @@ fi +default_lockfile_path=/var/run/nagios.lock +if test -d /run; then + default_lockfile_path=/run/nagios.lock +fi + + # Check whether --with-lockfile was given. if test "${with_lockfile+set}" = set; then : withval=$with_lockfile; lockfile=$withval else - lockfile=$localstatedir/nagios.lock + lockfile=$default_lockfile_path fi @@ -4954,7 +4961,6 @@ fi - case $host_os in linux*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glibc at least version 2.4" >&5 @@ -5978,7 +5984,7 @@ if test -z "$UNZIP"; then as_fn_error $? "Cannot continue without unzip!" "$LINENO" 5 fi -ac_config_files="$ac_config_files Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init t/Makefile t-tap/Makefile" +ac_config_files="$ac_config_files Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init openrc-init t/Makefile t-tap/Makefile" @@ -6604,6 +6610,7 @@ do "worker/ping/Makefile") CONFIG_FILES="$CONFIG_FILES worker/ping/Makefile" ;; "xdata/Makefile") CONFIG_FILES="$CONFIG_FILES xdata/Makefile" ;; "daemon-init") CONFIG_FILES="$CONFIG_FILES daemon-init" ;; + "openrc-init") CONFIG_FILES="$CONFIG_FILES openrc-init" ;; "t/Makefile") CONFIG_FILES="$CONFIG_FILES t/Makefile" ;; "t-tap/Makefile") CONFIG_FILES="$CONFIG_FILES t-tap/Makefile" ;; @@ -7363,8 +7370,6 @@ perl subst sample-config/template-object/printer.cfg perl subst sample-config/template-object/switch.cfg - - echo "" echo "" { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:" >&5 diff --git a/configure.ac b/configure.ac index d3a4c7f..12ad986 100644 --- a/configure.ac +++ b/configure.ac @@ -10,9 +10,9 @@ AC_PREFIX_DEFAULT(/usr/local/nagios) PKG_NAME=nagios -PKG_VERSION="4.3.2" +PKG_VERSION="4.3.4" PKG_HOME_URL="https://www.nagios.org/" -PKG_REL_DATE="2017-05-09" +PKG_REL_DATE="2017-08-24" dnl Figure out how to invoke "install" and what install options to use. AC_PROG_INSTALL @@ -265,15 +265,22 @@ AC_ARG_WITH(init_dir, AC_SUBST(init_dir) dnl User can override lock file location +dnl Use the /var/run/ path by default +dnl and use /run if it is available + +default_lockfile_path=/var/run/nagios.lock +if test -d /run; then + default_lockfile_path=/run/nagios.lock +fi + AC_ARG_WITH(lockfile, AC_HELP_STRING([--with-lockfile=], - [sets path and file name for lock file]), + [sets path for lock file (default: [/var]/run/nagios.lock)]), lockfile=$withval, - lockfile=$localstatedir/nagios.lock + lockfile=$default_lockfile_path ) AC_SUBST(lockfile) - dnl Determine the library to be used by the iobroker dnl epoll_*() is linux specific and was added to glibc 2.3.2, so we @@ -794,7 +801,7 @@ if test -z "$UNZIP"; then AC_MSG_ERROR([Cannot continue without unzip!]) fi -AC_OUTPUT(Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init t/Makefile t-tap/Makefile) +AC_OUTPUT(Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init openrc-init t/Makefile t-tap/Makefile) perl subst include/locations.h @@ -821,8 +828,6 @@ perl subst sample-config/template-object/printer.cfg perl subst sample-config/template-object/switch.cfg - - dnl Review options echo "" echo "" diff --git a/daemon-init.in b/daemon-init.in index af1498c..7f034ca 100644 --- a/daemon-init.in +++ b/daemon-init.in @@ -91,6 +91,10 @@ check_config () echo "ERROR: Could not delete '$NagiosCfgtestFile'" exit 8 fi + if ! su $NagiosUser -c "touch $NagiosCfgtestFile"; then + echo "ERROR: Could not create or update '$NagiosCfgtestFile'" + exit 8 + fi TMPFILE=$(mktemp /tmp/.configtest.XXXXXXXX) $NagiosBin -vp $NagiosCfgFile > "$TMPFILE" @@ -99,24 +103,18 @@ check_config () 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 @@ -209,10 +207,9 @@ case "$1" in fi fi - touch $NagiosVarDir/nagios.log $NagiosRetentionFile + su $NagiosUser -c "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 diff --git a/doxy.conf b/doxy.conf index 36b99bc..36e4fcc 100644 --- a/doxy.conf +++ b/doxy.conf @@ -1,5 +1,5 @@ PROJECT_NAME = Nagios -PROJECT_NUMBER = 4.3.2 +PROJECT_NUMBER = 4.3.4 PROJECT_BRIEF = "Dev docs for Nagios core and neb-module hackers" INPUT = lib/ docs/ diff --git a/html/js/map-directive.js b/html/js/map-directive.js index 1d13b37..3a257ad 100644 --- a/html/js/map-directive.js +++ b/html/js/map-directive.js @@ -7,10 +7,10 @@ angular.module("mapApp") cgiurl: "@cgiurl", layoutIndex: "@layout", dimensions: "@dimensions", - ulxValue: "@ulx", - ulyValue: "@uly", - lrxValue: "@lrx", - lryValue: "@lry", + ulx: "@ulx", + uly: "@uly", + lrx: "@lrx", + lry: "@lry", root: "=root", maxzoom: "=maxzoom", nolinks: "@nolinks", diff --git a/html/main.php b/html/main.php index f29d86f..7fa4aaf 100644 --- a/html/main.php +++ b/html/main.php @@ -1,7 +1,7 @@ @@ -140,7 +140,7 @@ $this_year = '2017';
Nagios® Core
Version
-
May 09, 2017
+
August 24, 2017
diff --git a/html/map.php b/html/map.php index 82ab2fd..ee02511 100644 --- a/html/map.php +++ b/html/map.php @@ -27,6 +27,18 @@ if ($layout > 10 || $layout < 0) $layout = 6; } + + /* This allows a user supplied layout */ + if ( + filter_input(INPUT_GET, 'layout', FILTER_VALIDATE_INT) === 0 || + filter_input(INPUT_GET, 'layout', FILTER_VALIDATE_INT, array( + "options" => array("min_range"=>1, "max_range"=>10) + ) + ) + ) { + $layout = $_GET['layout']; + } + if ($layout == 4) $layout = 6; ?> diff --git a/html/side.php b/html/side.php index 97893b4..94a62c1 100644 --- a/html/side.php +++ b/html/side.php @@ -1,7 +1,7 @@ diff --git a/include/common.h b/include/common.h index c113b65..b0973eb 100644 --- a/include/common.h +++ b/include/common.h @@ -24,8 +24,8 @@ #include "shared.h" -#define PROGRAM_VERSION "4.3.2" -#define PROGRAM_MODIFICATION_DATE "2017-05-09" +#define PROGRAM_VERSION "4.3.4" +#define PROGRAM_MODIFICATION_DATE "2017-08-24" NAGIOS_BEGIN_DECL @@ -66,6 +66,7 @@ extern int obsess_over_hosts; extern int enable_timing_point; extern char *config_file_dir; +extern char *website_url; #ifdef HAVE_TZNAME #ifdef CYGWIN diff --git a/include/macros.h b/include/macros.h index 94bc0a5..9f476fe 100644 --- a/include/macros.h +++ b/include/macros.h @@ -38,7 +38,7 @@ #define MAX_USER_MACROS 256 /* maximum number of $USERx$ macros */ -#define MACRO_X_COUNT 157 /* size of macro_x[] array */ +#define MACRO_X_COUNT 159 /* size of macro_x[] array */ NAGIOS_BEGIN_DECL @@ -218,6 +218,8 @@ typedef struct nagios_macros nagios_macros; #define MACRO_SERVICEIMPORTANCE 154 #define MACRO_HOSTANDSERVICESIMPORTANCE 155 #define MACRO_HOSTGROUPMEMBERADDRESSES 156 +#define MACRO_HOSTINFOURL 157 +#define MACRO_SERVICEINFOURL 158 /************* MACRO CLEANING OPTIONS *****************/ diff --git a/nagios.spec b/nagios.spec index 0ed76dd..9d8d98e 100644 --- a/nagios.spec +++ b/nagios.spec @@ -21,7 +21,7 @@ Summary: Open Source host, service and network monitoring program Name: nagios -Version: 4.3.2 +Version: 4.3.4 Release: 2%{?dist} License: GPL Group: Applications/System diff --git a/openrc-init.in b/openrc-init.in new file mode 100644 index 0000000..967b149 --- /dev/null +++ b/openrc-init.in @@ -0,0 +1,66 @@ +#!/sbin/openrc-run + +# This is a custom variable, and has the following default value if a +# specific config file is not defined by the user. +: ${NAGIOS_CONFIG:="@sysconfdir@/nagios.cfg"} + +# These two facilitate the bindir variable substitution below. +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +# The rest are OpenRC variables. +extra_commands="checkconfig" +extra_started_commands="reload" + +# We put "--daemon" in command_args and not command_args_background +# because the latter interacts weirdly with the config file argument. +command="@bindir@/nagios" +command_args="--daemon ${NAGIOS_CONFIG}" +pidfile="@lockfile@" + +depend(){ + # Most daemons don't really *need* the network; they're happy with + # the loopback interface. However, nagios might start generating + # "EVERYTHING IS DOWN" alerts if it starts before the real live + # network comes up. + need net + use logger + after mysql postgresql +} + +reload(){ + checkconfig || return $? + ebegin "Reloading configuration" + start-stop-daemon --signal HUP --pidfile "${pidfile}" + eend $? +} + +checkconfig(){ + ebegin "Verifying config files" + + # Save the output in case verification fails and errors are printed. + OUTPUT=$( ${command} --verify-config "${NAGIOS_CONFIG}" ) + + # Save the exit code from the verification so that `echo` doesn't + # clobber it. Then, if verification failed, show its + # output. Otherwise, succeed quietly. + local exit_code=$? + [ $exit_code -ne 0 ] && echo "${OUTPUT}" >&2 + eend $exit_code +} + +start_pre() { + # Without this, the "start" action will appear to succeed even if + # the config file contains errors, and the daemon fails to start. + # Another approach would be to wait for the PID file to appear, but + # this is fast enough and feels cleaner. + checkconfig || return $? +} + +stop_pre() { + # If this is a restart, check to make sure the user's config + # isn't busted before we stop the running daemon. + if [ "${RC_CMD}" = "restart" ] ; then + checkconfig || return $? + fi +} diff --git a/update-version b/update-version index 7b6c379..df72d5b 100755 --- a/update-version +++ b/update-version @@ -12,10 +12,10 @@ else fi # Current version number -CURRENTVERSION=4.3.2 +CURRENTVERSION=4.3.4 # Last date -LASTDATE=2017-05-09 +LASTDATE=2017-08-24 if [ "x$1" = "x" ] then diff --git a/xdata/xodtemplate.c b/xdata/xodtemplate.c index 66a683b..dc770ad 100644 --- a/xdata/xodtemplate.c +++ b/xdata/xodtemplate.c @@ -679,15 +679,31 @@ int xodtemplate_process_config_file(char *filename, int options) { } /* check validity of object type */ - if(strcmp(input, "timeperiod") && strcmp(input, "command") && strcmp(input, "contact") && strcmp(input, "contactgroup") && strcmp(input, "host") && strcmp(input, "hostgroup") && strcmp(input, "servicegroup") && strcmp(input, "service") && strcmp(input, "servicedependency") && strcmp(input, "serviceescalation") && strcmp(input, "hostgroupescalation") && strcmp(input, "hostdependency") && strcmp(input, "hostescalation")) { - if(strcmp(input, "hostextinfo") && strcmp(input, "serviceextinfo")) { + if( strcmp(input, "timeperiod") + && strcmp(input, "command") + && strcmp(input, "contact") + && strcmp(input, "contactgroup") + && strcmp(input, "host") + && strcmp(input, "hostgroup") + && strcmp(input, "servicegroup") + && strcmp(input, "service") + && strcmp(input, "servicedependency") + && strcmp(input, "serviceescalation") + && strcmp(input, "hostgroupescalation") + && strcmp(input, "hostdependency") + && strcmp(input, "hostescalation")) { + + if ( strcmp(input, "hostextinfo") + && strcmp(input, "serviceextinfo")) { + logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid object definition type '%s' in file '%s' on line %d.\n", input, filename, current_line); result = ERROR; break; - } - logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: Extinfo objects are deprecated and will be removed in future versions\n"); } + logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: Extinfo objects are deprecated and will be removed in future versions\n"); + } + /* we're already in an object definition... */ if(in_definition == TRUE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unexpected start of object definition in file '%s' on line %d. Make sure you close preceding objects before starting a new one.\n", filename, current_line); @@ -2399,7 +2415,7 @@ int xodtemplate_add_object_property(char *input, int options) { } else if(!strcmp(variable, "retry_interval") || !strcmp(variable, "retry_check_interval")) { if(!strcmp(variable, "retry_check_interval")) - logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The normal_retry_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); + logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); temp_host->retry_interval = strtod(value, NULL); temp_host->have_retry_interval = TRUE; } @@ -2858,7 +2874,7 @@ int xodtemplate_add_object_property(char *input, int options) { } else if(!strcmp(variable, "retry_interval") || !strcmp(variable, "retry_check_interval")) { if(!strcmp(variable, "retry_check_interval")) - logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The normal_retry_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); + logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); temp_service->retry_interval = strtod(value, NULL); temp_service->have_retry_interval = TRUE; } diff --git a/xdata/xsddefault.c b/xdata/xsddefault.c index dfde377..1c42625 100644 --- a/xdata/xsddefault.c +++ b/xdata/xsddefault.c @@ -237,6 +237,7 @@ int xsddefault_save_status_data(void) { fprintf(fp, "\tcheck_command=%s\n", (temp_host->check_command == NULL) ? "" : temp_host->check_command); fprintf(fp, "\tcheck_period=%s\n", (temp_host->check_period == NULL) ? "" : temp_host->check_period); fprintf(fp, "\tnotification_period=%s\n", (temp_host->notification_period == NULL) ? "" : temp_host->notification_period); + fprintf(fp, "\timportance=%u\n", temp_host->hourly_value); fprintf(fp, "\tcheck_interval=%f\n", temp_host->check_interval); fprintf(fp, "\tretry_interval=%f\n", temp_host->retry_interval); fprintf(fp, "\tevent_handler=%s\n", (temp_host->event_handler == NULL) ? "" : temp_host->event_handler); @@ -303,6 +304,7 @@ int xsddefault_save_status_data(void) { fprintf(fp, "\tcheck_command=%s\n", (temp_service->check_command == NULL) ? "" : temp_service->check_command); fprintf(fp, "\tcheck_period=%s\n", (temp_service->check_period == NULL) ? "" : temp_service->check_period); fprintf(fp, "\tnotification_period=%s\n", (temp_service->notification_period == NULL) ? "" : temp_service->notification_period); + fprintf(fp, "\timportance=%u\n", temp_service->hourly_value); fprintf(fp, "\tcheck_interval=%f\n", temp_service->check_interval); fprintf(fp, "\tretry_interval=%f\n", temp_service->retry_interval); fprintf(fp, "\tevent_handler=%s\n", (temp_service->event_handler == NULL) ? "" : temp_service->event_handler);