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);