Fixes for macros introduced in latest CVS update
Andreas Ericsson
ae at op5.se
Sat Oct 23 12:05:36 CEST 2004
As it turns out there were a couple of errors in the patch. Most notably
in the add_hostextinfo and add_serviceextinfo functions, where notes_url
and action_url weren't beeing assigned by reference instead of getting
strdup()'ed.
I had also left some debugging output and missed to re-insert the
original number of empty lines in the original patch, causing a few
really silly hunks to be included.
Use this new one instead. It's been tested rather thoroughly and works
splendidly.
Andreas Ericsson wrote:
> Ahoy.
>
> I've been playing around with the nagios code a bit and found a two bugs
> inserted while making the latest additions to the macro family;
> HOSTACTIONURL, HOSTNOTESURL, SERVICEACTIONURL and SERVICENOTESURL.
>
> 1. Originally, Nagios would free and NULL the extended data after
> parsing it and dumping it to the objects.cache file. As such, the
> extended info macros couldn't be expanded at notification time and thus
> failed. This has been fixed in the attached patch.
>
> 2. It is allowed to use a limited subset of macros in these variables,
> namely HOSTADDRESS, HOSTNAME and (for services only) SERVICEDESC.
> Previously, these macros were expanded at run-time by the CGI programs
> which turned out to be troublesome come notification time. I relocated
> the code so that URL macro expansion takes place at loading time and
> made the necessary changes to the CGI's.
> As a bonus, a few of the cgi's will run a little faster as well.
>
>
> I have done a few test so far and everything appears to be in order. Let
> me know if you find any bugs.
>
>
> ------------------------------------------------------------------------
>
> diff -urN ../Nagios/base/nagios.c ./base/nagios.c
> --- ../Nagios/base/nagios.c Fri Oct 22 18:51:27 2004
> +++ ./base/nagios.c Sat Oct 23 02:49:51 2004
> @@ -556,9 +556,6 @@
> exit(ERROR);
> }
>
> - /* free extended info data - we don't need this for monitoring */
> - free_extended_data();
> -
> /* initialize embedded Perl interpreter */
> init_embedded_perl();
>
> diff -urN ../Nagios/base/utils.c ./base/utils.c
> --- ../Nagios/base/utils.c Fri Oct 22 18:51:29 2004
> +++ ./base/utils.c Sat Oct 23 04:20:13 2004
> @@ -303,9 +303,74 @@
> /************************ MACRO FUNCTIONS *************************/
> /******************************************************************/
>
> +/* substitute macros in url type vars for hostextinfo and serviceextinfo */
> +char *process_extinfo_url(char *host_name, char *svc_description, char *url){
> + char input_buffer[MAX_INPUT_BUFFER]="";
> + char output_buffer[MAX_INPUT_BUFFER]="";
> + char *temp_buffer;
> + char *processed_url;
> + int in_macro=FALSE;
> + service *temp_service;
> + host *temp_host;
> +
> + if(host_name==NULL || url==NULL)
> + return;
> +
> + if(svc_description!=NULL) {
> + temp_service=find_service(host_name,svc_description);
> + if(temp_service==NULL)
> + return(url);
> + }
> +
> + temp_host=find_host(host_name);
> + if(temp_host==NULL)
> + return(url);
> +
> + strncpy(input_buffer,url,sizeof(input_buffer)-1);
> + input_buffer[sizeof(input_buffer)-1]='\x0';
> +
> + for(temp_buffer=my_strtok(input_buffer,"$");temp_buffer!=NULL;temp_buffer=my_strtok(NULL,"$")){
> +
> + if(in_macro==FALSE){
> + if(strlen(output_buffer)+strlen(temp_buffer)<sizeof(output_buffer)-1){
> + strncat(output_buffer,temp_buffer,sizeof(output_buffer)-strlen(output_buffer)-1);
> + output_buffer[sizeof(output_buffer)-1]='\x0';
> + }
> + in_macro=TRUE;
> + }
> + else{
> +
> + if(strlen(output_buffer)+strlen(temp_buffer) < sizeof(output_buffer)-1){
> +
> + if(!strcmp(temp_buffer,"HOSTNAME"))
> + strncat(output_buffer,temp_host->name,sizeof(output_buffer)-strlen(output_buffer)-1);
> +
> + else if(!strcmp(temp_buffer,"HOSTADDRESS") && temp_host!=NULL)
> + strncat(output_buffer,(temp_host->address==NULL)?"":temp_host->address,sizeof(output_buffer)-strlen(output_buffer)-1);
> +
> + else if(temp_service!=NULL && !strcmp(temp_buffer,"SERVICEDESC"))
> + strncat(output_buffer,temp_service->description,sizeof(output_buffer)-strlen(output_buffer)-1);
> + }
> +
> + in_macro=FALSE;
> + }
> + }
> +
> +
> + temp_buffer=strdup(output_buffer);
> + if(temp_buffer==NULL)
> + return(url);
> +
> + return(temp_buffer);
> + }
> +
> +
> +
> /* replace macros in notification commands with their values */
> int process_macros(char *input_buffer, char *output_buffer, int buffer_length, int options){
> char *temp_buffer;
> + char extinfo_url_buffer[MAX_INPUT_BUFFER];
> + int extinfo_url_macro_options=0;
> int in_macro;
> int arg_index=0;
> int user_index=0;
> @@ -430,8 +495,13 @@
> else if(!strcmp(temp_buffer,"HOSTGROUPALIAS"))
> selected_macro=macro_x[MACRO_HOSTGROUPALIAS];
>
> - else if(!strcmp(temp_buffer,"HOSTACTIONURL"))
> + else if(!strcmp(temp_buffer,"HOSTACTIONURL")){
> selected_macro=macro_x[MACRO_HOSTACTIONURL];
> + /* process_macros(selected_macro,extinfo_url_buffer,sizeof(extinfo_url_buffer),extinfo_url_macro_options); */
> + /* printf("*****\npost processing, hostactionurl turned out as %s\n********\n", extinfo_url_buffer); */
> + /* selected_macro=extinfo_url_buffer; */
> + /* printf("*****\npost processing, selected_macro turned out as %s\n********\n", selected_macro); */
> + }
>
> else if(!strcmp(temp_buffer,"HOSTNOTESURL"))
> selected_macro=macro_x[MACRO_HOSTNOTESURL];
> diff -urN ../Nagios/cgi/extinfo.c ./cgi/extinfo.c
> --- ../Nagios/cgi/extinfo.c Fri Oct 22 18:51:32 2004
> +++ ./cgi/extinfo.c Sat Oct 23 04:26:07 2004
> @@ -373,17 +373,15 @@
> printf("<TABLE BORDER='0'>\n");
> if(temp_hostextinfo->action_url!=NULL && strcmp(temp_hostextinfo->action_url,"")){
> printf("<TR><TD ALIGN='right'>\n");
> - printf("<A HREF='");
> - print_extra_host_url(temp_hostextinfo->host_name,temp_hostextinfo->action_url);
> - printf("' TARGET='_blank'><img src='%s%s' border=0 alt='Perform Additional Actions On This Host' title='Perform Additional Actions On This Host'></A>\n",url_images_path,ACTION_ICON);
> + printf("<A HREF='%s'",url_encode(temp_hostextinfo->action_url));
> + printf(" TARGET='_blank'><img src='%s%s' border=0 alt='Perform Additional Actions On This Host' title='Perform Additional Actions On This Host'></A>\n",url_images_path,ACTION_ICON);
> printf("<BR CLEAR=ALL><FONT SIZE=-1><I>Extra Host Actions</I></FONT><BR CLEAR=ALL><BR CLEAR=ALL>\n");
> printf("</TD></TR>\n");
> }
> if(temp_hostextinfo->notes_url!=NULL && strcmp(temp_hostextinfo->notes_url,"")){
> printf("<TR><TD ALIGN='right'>\n");
> - printf("<A HREF='");
> - print_extra_host_url(temp_hostextinfo->host_name,temp_hostextinfo->notes_url);
> - printf("' TARGET='_blank'><img src='%s%s' border=0 alt='View Additional Notes For This Host' title='View Additional Notes For This Host'></A>\n",url_images_path,NOTES_ICON);
> + printf("<A HREF='%s'", url_encode(temp_hostextinfo->notes_url));
> + printf(" TARGET='_blank'><img src='%s%s' border=0 alt='View Additional Notes For This Host' title='View Additional Notes For This Host'></A>\n",url_images_path,NOTES_ICON);
> printf("<BR CLEAR=ALL><FONT SIZE=-1><I>Extra Host Notes</I></FONT><BR CLEAR=ALL><BR CLEAR=ALL>\n");
> printf("</TD></TR>\n");
> }
> @@ -463,7 +461,7 @@
>
> /* free all allocated memory */
> free_memory();
> - free_extended_data();
> + free_object_data();
> free_comment_data();
> free_downtime_data();
>
> diff -urN ../Nagios/cgi/status.c ./cgi/status.c
> --- ../Nagios/cgi/status.c Fri Oct 22 18:51:34 2004
> +++ ./cgi/status.c Sat Oct 23 04:26:44 2004
> @@ -466,7 +466,7 @@
>
> /* free all allocated memory */
> free_memory();
> - free_extended_data();
> + free_object_data();
> free_comment_data();
>
> /* free memory allocated to the sort lists */
> diff -urN ../Nagios/cgi/statusmap.c ./cgi/statusmap.c
> --- ../Nagios/cgi/statusmap.c Fri Oct 22 18:51:35 2004
> +++ ./cgi/statusmap.c Sat Oct 23 04:27:23 2004
> @@ -293,7 +293,7 @@
>
> /* free all allocated memory */
> free_memory();
> - free_extended_data();
> + free_object_data();
> free_layer_list();
>
> return OK;
> diff -urN ../Nagios/cgi/statuswrl.c ./cgi/statuswrl.c
> --- ../Nagios/cgi/statuswrl.c Fri Oct 22 18:51:35 2004
> +++ ./cgi/statuswrl.c Sat Oct 23 04:27:04 2004
> @@ -181,7 +181,7 @@
>
> /* free all allocated memory */
> free_memory();
> - free_extended_data();
> + free_object_data();
>
> return OK;
> }
> diff -urN ../Nagios/common/objects.c ./common/objects.c
> --- ../Nagios/common/objects.c Fri Oct 22 18:51:41 2004
> +++ ./common/objects.c Sat Oct 23 04:24:12 2004
> @@ -79,7 +79,6 @@
>
>
>
> -
> /******************************************************************/
> /******* TOP-LEVEL HOST CONFIGURATION DATA INPUT FUNCTION *********/
> /******************************************************************/
> @@ -4351,7 +4350,11 @@
> if(notes_url==NULL || !strcmp(notes_url,""))
> new_hostextinfo->notes_url=NULL;
> else{
> - new_hostextinfo->notes_url=strdup(notes_url);
> +#ifdef NSCORE
> + new_hostextinfo->notes_url=process_extinfo_url(new_hostextinfo->host_name,NULL,notes_url);
> +#else
> + new_hostextinfo->notes_url=notes_url;
> +#endif
> if(new_hostextinfo->notes_url==NULL){
> free(new_hostextinfo->notes);
> free(new_hostextinfo->host_name);
> @@ -4363,12 +4366,19 @@
> #endif
> return NULL;
> }
> + else{
> + printf("new_hostextinfo->notes_url = %s\n", new_hostextinfo->notes_url);
> + }
> }
>
> if(action_url==NULL || !strcmp(action_url,""))
> new_hostextinfo->action_url=NULL;
> else{
> - new_hostextinfo->action_url=strdup(action_url);
> +#ifdef NSCORE
> + new_hostextinfo->action_url=process_extinfo_url(new_hostextinfo->host_name,NULL,action_url);
> +#else
> + new_hostextinfo->action_url=action_url;
> +#endif
> if(new_hostextinfo->action_url==NULL){
> free(new_hostextinfo->notes_url);
> free(new_hostextinfo->notes);
> @@ -4601,7 +4611,11 @@
> if(notes_url==NULL || !strcmp(notes_url,""))
> new_serviceextinfo->notes_url=NULL;
> else{
> - new_serviceextinfo->notes_url=strdup(notes_url);
> +#ifdef NSCORE
> + new_serviceextinfo->notes_url=process_extinfo_url(new_serviceextinfo->host_name,new_serviceextinfo->description,notes_url);
> +#else
> + new_serviceextinfo->notes_url=notes_url;
> +#endif
> if(new_serviceextinfo->notes_url==NULL){
> free(new_serviceextinfo->notes);
> free(new_serviceextinfo->description);
> @@ -4619,7 +4633,11 @@
> if(action_url==NULL || !strcmp(action_url,""))
> new_serviceextinfo->action_url=NULL;
> else{
> - new_serviceextinfo->action_url=strdup(action_url);
> +#ifdef NSCORE
> + new_serviceextinfo->action_url=process_extinfo_url(new_serviceextinfo->host_name,new_serviceextinfo->description,action_url);
> +#else
> + new_serviceextinfo->action_url=action_url;
> +#endif
> if(new_serviceextinfo->action_url==NULL){
> free(new_serviceextinfo->notes_url);
> free(new_serviceextinfo->notes);
> @@ -5687,6 +5705,11 @@
> hostdependency *next_hostdependency=NULL;
> hostescalation *this_hostescalation=NULL;
> hostescalation *next_hostescalation=NULL;
> + hostextinfo *this_hostextinfo;
> + hostextinfo *next_hostextinfo;
> + serviceextinfo *this_serviceextinfo;
> + serviceextinfo *next_serviceextinfo;
> +
> int day;
> int i;
>
> @@ -6035,32 +6058,10 @@
> hostescalation_hashlist=NULL;
> hostescalation_list=NULL;
>
> - /* free extended info data */
> - free_extended_data();
> -
> #ifdef DEBUG1
> printf("\thostescalation_list freed\n");
> #endif
>
> -#ifdef DEBUG0
> - printf("free_object_data() end\n");
> -#endif
> -
> - return OK;
> - }
> -
> -
> -/* free all allocated memory for extended info objects */
> -int free_extended_data(void){
> - hostextinfo *this_hostextinfo;
> - hostextinfo *next_hostextinfo;
> - serviceextinfo *this_serviceextinfo;
> - serviceextinfo *next_serviceextinfo;
> -
> -#ifdef DEBUG0
> - printf("free_extended_data() start\n");
> -#endif
> -
> /* free memory for the extended host info list */
> for(this_hostextinfo=hostextinfo_list;this_hostextinfo!=NULL;this_hostextinfo=next_hostextinfo){
> next_hostextinfo=this_hostextinfo->next;
> @@ -6105,11 +6106,9 @@
> serviceextinfo_hashlist=NULL;
> serviceextinfo_list=NULL;
>
> -
> #ifdef DEBUG0
> - printf("free_extended_data() start\n");
> + printf("free_object_data() end\n");
> #endif
>
> return OK;
> }
> -
> diff -urN ../Nagios/include/nagios.h.in ./include/nagios.h.in
> --- ../Nagios/include/nagios.h.in Fri Oct 22 18:52:17 2004
> +++ ./include/nagios.h.in Sat Oct 23 03:59:46 2004
> @@ -594,6 +594,7 @@
>
>
> /**** Macro Functions ****/
> +char *process_extinfo_url(char *,char *,char *); /* replace macros with their actual values in extinfo object urls */
> int process_macros(char *,char *,int,int); /* replace macros with their actual values */
> char *clean_macro_chars(char *,int); /* cleans macros characters before insertion into output string */
> int grab_service_macros(service *); /* updates the service macro data */
--
Andreas Ericsson andreas.ericsson at op5.se
OP5 AB www.op5.se
Lead Developer
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: nagios-extinfo_url-processing.diff
URL: <https://www.monitoring-lists.org/archive/developers/attachments/20041023/d7150221/attachment.ksh>
More information about the Developers
mailing list