--- nagios-2.8.orig/include/config.h.in 2006-05-17 10:35:30.000000000 -0700 +++ nagios-2.8/include/config.h.in 2007-03-28 14:10:43.000000000 -0700 @@ -290,7 +290,6 @@ #endif #endif - /***** MARO DEFINITIONS *****/ /* this needs to come after all system include files, so we don't accidentally attempt to redefine it */ @@ -301,5 +300,6 @@ # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif +#define SUPPORT_SAMEHOSTDEPENDENCY #endif --- nagios-2.8.orig/xdata/xodtemplate.h 2005-11-16 00:49:35.000000000 -0800 +++ nagios-2.8/xdata/xodtemplate.h 2007-03-28 14:10:43.000000000 -0700 @@ -348,6 +348,11 @@ int fail_execute_on_critical; int fail_execute_on_pending; +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + int dependency_samehost; + int have_dependency_samehost; +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ + int have_inherits_parent; int have_notification_dependency_options; int have_execution_dependency_options; @@ -590,7 +595,11 @@ int xodtemplate_duplicate_hostescalation(xodtemplate_hostescalation *,char *); int xodtemplate_duplicate_serviceescalation(xodtemplate_serviceescalation *,char *,char *); int xodtemplate_duplicate_hostdependency(xodtemplate_hostdependency *,char *,char *); +#ifdef SUPPORT_SAMEHOSTDEPENDENCY +int xodtemplate_duplicate_servicedependency(xodtemplate_servicedependency *,char *,char *,char *,char *,char *,char *); +#else int xodtemplate_duplicate_servicedependency(xodtemplate_servicedependency *,char *,char *,char *,char *); +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ int xodtemplate_duplicate_hostextinfo(xodtemplate_hostextinfo *,char *); int xodtemplate_duplicate_serviceextinfo(xodtemplate_serviceextinfo *,char *); --- nagios-2.8.orig/xdata/xodtemplate.c 2007-01-19 14:02:01.000000000 -0800 +++ nagios-2.8/xdata/xodtemplate.c 2007-03-28 14:10:43.000000000 -0700 @@ -1070,6 +1070,10 @@ new_servicedependency->dependent_host_name=NULL; new_servicedependency->dependent_service_description=NULL; new_servicedependency->inherits_parent=FALSE; +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + new_servicedependency->dependency_samehost=FALSE; + new_servicedependency->have_dependency_samehost=FALSE; +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ new_servicedependency->fail_execute_on_ok=FALSE; new_servicedependency->fail_execute_on_unknown=FALSE; new_servicedependency->fail_execute_on_warning=FALSE; @@ -2161,6 +2165,12 @@ return ERROR; } } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + else if(!strcmp(variable,"dependent_same_host")){ + temp_servicedependency->dependency_samehost=(atoi(value)>0)?TRUE:FALSE; + temp_servicedependency->have_dependency_samehost=TRUE; + } +#endif /* SUPPORT_SAMEHOSTDEPDENDENCY */ else if(!strcmp(variable,"inherits_parent")){ temp_servicedependency->inherits_parent=(atoi(value)>0)?TRUE:FALSE; temp_servicedependency->have_inherits_parent=TRUE; @@ -3819,6 +3829,9 @@ xodtemplate_serviceescalation *temp_serviceescalation; xodtemplate_hostdependency *temp_hostdependency; xodtemplate_servicedependency *temp_servicedependency; +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + xodtemplate_servicedependency *this_servicedependency; +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ xodtemplate_hostlist *temp_hostlist; xodtemplate_hostlist *this_hostlist; xodtemplate_servicelist *temp_servicelist; @@ -4130,6 +4143,9 @@ } /* get list of dependent host names */ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if (temp_servicedependency->dependency_samehost==FALSE) { +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ dependent_hostlist=xodtemplate_expand_hostgroups_and_hosts(temp_servicedependency->dependent_hostgroup_name,temp_servicedependency->dependent_host_name); if(dependent_hostlist==NULL){ #ifdef NSCORE @@ -4139,13 +4155,28 @@ #endif return ERROR; } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + } + else { + dependent_hostlist=NULL; +#ifdef NSCORE + if (temp_servicedependency->dependent_hostgroup_name!=NULL || temp_servicedependency->dependent_host_name!=NULL) { + snprintf(temp_buffer,sizeof(temp_buffer)-1,"Warning: dependent_host or dependent_hostgroup ignored when dependent_same_host is 1 (config file '%s', line %d)\n",xodtemplate_config_file_name(this_servicedependency->_config_file),this_servicedependency->_start_line); + temp_buffer[sizeof(temp_buffer)-1]='\x0'; + write_to_logs_and_console(temp_buffer,NSLOG_CONFIG_WARNING,TRUE); + } +#endif + } +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* duplicate the dependency definitions */ first_item=TRUE; for(temp_hostlist=master_hostlist;temp_hostlist!=NULL;temp_hostlist=temp_hostlist->next){ - +#ifndef SUPPORT_SAMEHOSTDEPENDENCY for(this_hostlist=dependent_hostlist;this_hostlist!=NULL;this_hostlist=this_hostlist->next){ - +#else + for(this_hostlist=(temp_servicedependency->dependency_samehost==TRUE)?temp_hostlist:dependent_hostlist;this_hostlist!=NULL;this_hostlist=(temp_servicedependency->dependency_samehost==TRUE)?NULL:this_hostlist->next){ +#endif /* SUPPORT_SAMEHOSTDEPDENDENCY */ /* existing definition gets first names */ if(first_item==TRUE){ free(temp_servicedependency->host_name); @@ -4156,7 +4187,11 @@ continue; } else +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_hostlist->host_name,temp_servicedependency->service_description,this_hostlist->host_name,temp_servicedependency->dependent_service_description, temp_servicedependency->servicegroup_name, temp_servicedependency->dependent_servicegroup_name); +#else result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_hostlist->host_name,temp_servicedependency->service_description,this_hostlist->host_name,temp_servicedependency->dependent_service_description); +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* exit on error */ if(result==ERROR) @@ -4174,12 +4209,30 @@ /* THIS MUST BE DONE AFTER DUPLICATING FOR MULTIPLE HOST NAMES (SEE ABOVE) */ for(temp_servicedependency=xodtemplate_servicedependency_list;temp_servicedependency!=NULL;temp_servicedependency=temp_servicedependency->next){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + /* skip servicedependencies without enough data */ + if(temp_servicedependency->host_name==NULL || (temp_servicedependency->service_description==NULL && temp_servicedependency->dependency_samehost==FALSE)) { + if(temp_servicedependency->dependency_samehost==TRUE) + temp_servicedependency->register_object=FALSE; + continue; + } + + /* get list of services */ + temp_servicelist=xodtemplate_expand_servicegroups_and_services(temp_servicedependency->servicegroup_name,temp_servicedependency->host_name,temp_servicedependency->service_description); + + if(temp_servicelist==NULL && temp_servicedependency->dependency_samehost==TRUE) { + temp_servicedependency->register_object=FALSE; + continue; + } +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ /* skip servicedependencies without enough data */ if(temp_servicedependency->service_description==NULL || temp_servicedependency->host_name==NULL) continue; /* get list of services */ temp_servicelist=xodtemplate_expand_servicegroups_and_services(temp_servicedependency->servicegroup_name,temp_servicedependency->host_name,temp_servicedependency->service_description); +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ + if(temp_servicelist==NULL){ #ifdef NSCORE snprintf(temp_buffer,sizeof(temp_buffer)-1,"Error: Could not expand services specified in service dependency (config file '%s', starting on line %d)\n",xodtemplate_config_file_name(temp_servicedependency->_config_file),temp_servicedependency->_start_line); @@ -4189,26 +4242,65 @@ return ERROR; } - /* duplicate service escalation entries */ + /* duplicate service dependency entries */ first_item=TRUE; for(this_servicelist=temp_servicelist;this_servicelist!=NULL;this_servicelist=this_servicelist->next){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if (temp_servicedependency->dependency_samehost==TRUE && this_servicelist->service_description==NULL) { + temp_servicedependency->register_object=FALSE; + continue; + } + if (temp_servicedependency->dependency_samehost!=TRUE || strcmp(temp_servicedependency->host_name,this_servicelist->host_name)==0) { +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* if this is the first duplication, use the existing entry */ if(first_item==TRUE){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if (temp_servicedependency->service_description!=NULL) + free(temp_servicedependency->service_description); + if (this_servicelist->service_description!=NULL) + temp_servicedependency->service_description=strdup(this_servicelist->service_description); + if (temp_servicedependency->service_description==NULL && this_servicelist->service_description!=NULL) { + xodtemplate_free_servicelist(temp_servicelist); + return ERROR; + } +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ free(temp_servicedependency->service_description); temp_servicedependency->service_description=strdup(this_servicelist->service_description); if(temp_servicedependency->service_description==NULL){ xodtemplate_free_servicelist(temp_servicelist); return ERROR; } +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ first_item=FALSE; continue; } - /* duplicate service escalation definition */ - result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_servicedependency->host_name,this_servicelist->service_description,temp_servicedependency->dependent_host_name,temp_servicedependency->dependent_service_description); + /* duplicate service dependency definition */ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_servicedependency->host_name,this_servicelist->service_description,temp_servicedependency->dependent_host_name,temp_servicedependency->dependent_service_description, NULL, temp_servicedependency->dependent_servicegroup_name); + /* exit on error */ + if(result==ERROR){ + if (temp_servicelist!=NULL) + xodtemplate_free_servicelist(temp_servicelist); + return ERROR; + } + } + } + + /* check if there were any matches above, if not skip this dependency */ + if (first_item==TRUE && temp_servicedependency->dependency_samehost==TRUE) { + temp_servicedependency->register_object=FALSE; + continue; + } + + /* free memory we used for service list */ + if (temp_servicelist!=NULL) + xodtemplate_free_servicelist(temp_servicelist); +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ + result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_servicedependency->host_name,this_servicelist->service_description,temp_servicedependency->dependent_host_name,temp_servicedependency->dependent_service_description); /* exit on error */ if(result==ERROR){ @@ -4219,6 +4311,7 @@ /* free memory we used for service list */ xodtemplate_free_servicelist(temp_servicelist); +#endif /* SUPPORT_SAMEHOSTDEPENENCY */ } @@ -4226,12 +4319,30 @@ /* THIS MUST BE DONE AFTER DUPLICATING FOR MULTIPLE HOST NAMES (SEE ABOVE) */ for(temp_servicedependency=xodtemplate_servicedependency_list;temp_servicedependency!=NULL;temp_servicedependency=temp_servicedependency->next){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + /* skip servicedependencies without enough data */ + if(temp_servicedependency->dependent_host_name==NULL || (temp_servicedependency->dependent_service_description==NULL && temp_servicedependency->dependency_samehost==FALSE)) { + if(temp_servicedependency->dependency_samehost==TRUE) + temp_servicedependency->register_object=FALSE; + continue; + } + + /* get list of services */ + temp_servicelist=xodtemplate_expand_servicegroups_and_services(temp_servicedependency->dependent_servicegroup_name,temp_servicedependency->dependent_host_name,temp_servicedependency->dependent_service_description); + + if(temp_servicelist==NULL && temp_servicedependency->dependency_samehost==TRUE) { + temp_servicedependency->register_object=FALSE; + continue; + } +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ /* skip servicedependencies without enough data */ if(temp_servicedependency->dependent_service_description==NULL || temp_servicedependency->dependent_host_name==NULL) continue; /* get list of services */ temp_servicelist=xodtemplate_expand_servicegroups_and_services(temp_servicedependency->dependent_servicegroup_name,temp_servicedependency->dependent_host_name,temp_servicedependency->dependent_service_description); +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ + if(temp_servicelist==NULL){ #ifdef NSCORE snprintf(temp_buffer,sizeof(temp_buffer)-1,"Error: Could not expand services specified in service dependency (config file '%s', starting on line %d)\n",xodtemplate_config_file_name(temp_servicedependency->_config_file),temp_servicedependency->_start_line); @@ -4241,25 +4352,66 @@ return ERROR; } - /* duplicate service escalation entries */ + /* duplicate service dependency entries */ first_item=TRUE; for(this_servicelist=temp_servicelist;this_servicelist!=NULL;this_servicelist=this_servicelist->next){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if (temp_servicedependency->dependency_samehost==TRUE && this_servicelist->service_description==NULL) { + temp_servicedependency->register_object=FALSE; + continue; + } + /* comparing 'service_description' to ignore "self" dependency when '*' is used */ + if (temp_servicedependency->dependency_samehost!=TRUE || (strcmp(temp_servicedependency->host_name,this_servicelist->host_name)==0 && (temp_servicedependency->service_description==NULL || this_servicelist->service_description==NULL || strcmp(temp_servicedependency->service_description,this_servicelist->service_description)!=0))) { +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* if this is the first duplication, use the existing entry */ if(first_item==TRUE){ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if (temp_servicedependency->dependent_service_description!=NULL) + free(temp_servicedependency->dependent_service_description); + if (this_servicelist->service_description!=NULL) + temp_servicedependency->dependent_service_description=strdup(this_servicelist->service_description); + if (temp_servicedependency->dependent_service_description==NULL && this_servicelist->service_description!=NULL) { + xodtemplate_free_servicelist(temp_servicelist); + return ERROR; + } +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ free(temp_servicedependency->dependent_service_description); temp_servicedependency->dependent_service_description=strdup(this_servicelist->service_description); if(temp_servicedependency->dependent_service_description==NULL){ xodtemplate_free_servicelist(temp_servicelist); return ERROR; } +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ first_item=FALSE; continue; } - /* duplicate service escalation definition */ + /* duplicate service dependency definition */ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_servicedependency->host_name,temp_servicedependency->service_description,temp_servicedependency->dependent_host_name,this_servicelist->service_description,NULL,NULL); + + /* exit on error */ + if(result==ERROR){ + if (temp_servicelist!=NULL) + xodtemplate_free_servicelist(temp_servicelist); + return ERROR; + } + } + } + + /* check if there were any matches above, if not skip this dependency */ + if (first_item==TRUE && temp_servicedependency->dependency_samehost==TRUE) { + temp_servicedependency->register_object=FALSE; + continue; + } + + /* free memory we used for service list */ + if (temp_servicelist!=NULL) + xodtemplate_free_servicelist(temp_servicelist); +#else /* SUPPORT_SAMEHOSTDEPENDENCY */ result=xodtemplate_duplicate_servicedependency(temp_servicedependency,temp_servicedependency->host_name,temp_servicedependency->service_description,temp_servicedependency->dependent_host_name,this_servicelist->service_description); /* exit on error */ @@ -4271,6 +4423,7 @@ /* free memory we used for service list */ xodtemplate_free_servicelist(temp_servicelist); +#endif /* SUPPORT_SAMEHOSTDEPENENCY */ } @@ -5033,7 +5186,11 @@ /* duplicates a service dependency definition */ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY +int xodtemplate_duplicate_servicedependency(xodtemplate_servicedependency *temp_servicedependency, char *master_host_name, char *master_service_description, char *dependent_host_name, char *dependent_service_description, char* master_servicegroup_name, char* dependent_servicegroup_name){ +#else int xodtemplate_duplicate_servicedependency(xodtemplate_servicedependency *temp_servicedependency, char *master_host_name, char *master_service_description, char *dependent_host_name, char *dependent_service_description){ +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ xodtemplate_servicedependency *new_servicedependency; #ifdef DEBUG0 @@ -5081,9 +5238,19 @@ new_servicedependency->inherits_parent=temp_servicedependency->inherits_parent; new_servicedependency->have_inherits_parent=temp_servicedependency->have_inherits_parent; +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + new_servicedependency->dependency_samehost=temp_servicedependency->dependency_samehost; + new_servicedependency->have_dependency_samehost=temp_servicedependency->have_dependency_samehost; + new_servicedependency->service_description=NULL; + new_servicedependency->dependent_service_description=NULL; +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* allocate memory for and copy string members of hostdependency definition */ +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if(master_host_name!=NULL && (temp_servicedependency->host_name!=NULL || temp_servicedependency->dependency_samehost==TRUE)){ +#else if(temp_servicedependency->host_name!=NULL){ +#endif /* SUPPORT_SAMEHOSTDEPENCY */ new_servicedependency->host_name=strdup(master_host_name); if(new_servicedependency->host_name==NULL){ #ifdef DEBUG1 @@ -5093,7 +5260,11 @@ return ERROR; } } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if(master_service_description!=NULL && (temp_servicedependency->service_description!=NULL || temp_servicedependency->dependency_samehost==TRUE)){ +#else if(temp_servicedependency->service_description!=NULL){ +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ new_servicedependency->service_description=strdup(master_service_description); if(new_servicedependency->service_description==NULL){ #ifdef DEBUG1 @@ -5103,7 +5274,11 @@ return ERROR; } } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if(dependent_host_name!=NULL && (temp_servicedependency->dependent_host_name!=NULL || temp_servicedependency->dependency_samehost==TRUE)){ +#else if(temp_servicedependency->dependent_host_name!=NULL){ +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ new_servicedependency->dependent_host_name=strdup(dependent_host_name); if(new_servicedependency->dependent_host_name==NULL){ #ifdef DEBUG1 @@ -5113,7 +5288,11 @@ return ERROR; } } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if(dependent_service_description!=NULL && (temp_servicedependency->dependent_service_description!=NULL || temp_servicedependency->dependency_samehost==TRUE)){ +#else if(temp_servicedependency->dependent_service_description!=NULL){ +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ new_servicedependency->dependent_service_description=strdup(dependent_service_description); if(new_servicedependency->dependent_service_description==NULL){ #ifdef DEBUG1 @@ -5146,6 +5325,28 @@ return ERROR; } } +#ifdef SUPPORT_SAMEHOSTDEPENDENCY + if(temp_servicedependency->servicegroup_name!=NULL && master_servicegroup_name!=NULL){ + new_servicedependency->servicegroup_name=strdup(master_servicegroup_name); + if(new_servicedependency->servicegroup_name==NULL){ +#ifdef DEBUG1 + printf("Error: Could not allocate memory for duplicate definition of service dependency.\n"); +#endif + free(new_servicedependency); + return ERROR; + } + } + if(temp_servicedependency->dependent_servicegroup_name!=NULL && dependent_servicegroup_name!=NULL){ + new_servicedependency->dependent_servicegroup_name=strdup(dependent_servicegroup_name); + if(new_servicedependency->dependent_servicegroup_name==NULL){ +#ifdef DEBUG1 + printf("Error: Could not allocate memory for duplicate definition of service dependency.\n"); +#endif + free(new_servicedependency); + return ERROR; + } + } +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ /* add new servicedependency to head of list in memory */ new_servicedependency->next=xodtemplate_servicedependency_list; @@ -5756,6 +5957,12 @@ this_servicedependency->fail_notify_on_pending=template_servicedependency->fail_notify_on_pending; this_servicedependency->have_notification_dependency_options=TRUE; } +#ifdef SUPPORT_SAMEHOSTDEPENDENDENCY + if(this_servicedependency->have_dependency_samehost==FALSE && template_servicedependency->have_dependency_samehost==TRUE) { + this_servicedependency->dependency_samehost=template_servicedependency->dependency_samehost; + this_servicedependency->have_dependency_samehost=TRUE; + } +#endif /* SUPPORT_SAMEHOSTDEPENDENCY */ #ifdef DEBUG0 printf("xodtemplate_resolve_servicedependency() end\n");