[xymon] Bug in downtime display on info-page

Dominique Frise dominique.frise at unil.ch
Tue Nov 2 14:44:29 CET 2010


Hi,

After applying the patch below on a 4.3.0-beta2 installation, the 
optional "columns" setting is not displayed correctly.

Example rule from bb-hosts
--------------------------
DOWNTIME=orcl,orcl-chk,http:*:0655:1115:Backups


Info display
------------
Planned downtime:	[Malformed timespec]


Dominique

On 10/29/10 12:47 PM, Henrik Størner wrote:
> In<B08F3F3D67451844A7A8A029FCC71E4C164233112E at WIN01.ad.deltamanagement.se>  =?iso-8859-1?Q?Johan_Sj=F6berg?=<johan.sjoberg at deltamanagement.se>  writes:
>
>> This might already be fixed in 4.3, but I'll report it anyway.
>> The info page in 4.2.3 shows the downtime information in the wrong order.
>> In bb-host I added "DOWNTIME=*:5:0445:0555:reboot" to schedule a downtime
>> each Friday morning for a reboot of a server. I know this downtime works
>> as intended, and the field order is according to the man-page.
>> But on the info-page, the downtime is shown as
>> "Planned downtime:All days:5:0445:0555:reboot", so the "day" and "service"
>> fields are mixed up.
>
> Thanks for reporting this - the routine handling the time-display had
> not been updated to support the extended format. Fixed now. The patch
> below can be applied to 4.2.3 also, if you want to.
>
>
> Regards,
> Henrik
>
> Index: lib/timefunc.c
> ===================================================================
> --- lib/timefunc.c	(revision 6532)
> +++ lib/timefunc.c	(working copy)
> @@ -97,6 +97,7 @@
>   	static strbuffer_t *result = NULL;
>   	char *sCopy;
>   	char *sItem;
> +	char *itmstbuf;
>
>   	if (result == NULL) result = newstrbuffer(0);
>   	clearstrbuffer(result);
> @@ -120,12 +121,36 @@
>   	}
>
>   	sCopy = strdup(spec);
> -	sItem = strtok(sCopy, ",");
> +	sItem = strtok_r(sCopy, ",",&itmstbuf);
>   	while (sItem) {
> +		char *tok, *onebuf, *e1, *e2, *e3, *e4, *e5;
> +		char *days, *starttime, *endtime, *columns, *cause;
>   		char *oneday, *dtext;
> -		int daysdone = 0, firstday = 1;
> -		oneday = sItem;
> +		int daysdone = 0, firstday = 1, ecount;
>
> +		e1 = e2 = e3 = e4 = e5 = NULL; ecount = 0;
> +		e1 = strtok_r(sItem, ":",&onebuf);
> +		if (e1) { ecount++; e2 = strtok_r(NULL, ":",&onebuf); }
> +		if (e2) { ecount++; e3 = strtok_r(NULL, ":",&onebuf); }
> +		if (e3) { ecount++; e4 = strtok_r(NULL, ":",&onebuf); }
> +		if (e4) { ecount++; e5 = strtok_r(NULL, ":",&onebuf); }
> + 		if (e5) { ecount++; }
> +
> +		if (ecount == 3) {
> +			/* Old format: e1=day, e2 = starttime, e3 = endtime */
> +			days = e1; starttime = e2; endtime = e3; columns = NULL; cause = NULL;
> +		}
> +		else if (ecount == 5) {
> +			columns = e1; days = e2; starttime = e3; endtime = e4; cause = e5;
> +		}
> +		else {
> +			addtobuffer(result, "[Malformed timespec]");
> +			sItem = NULL;
> +			continue;
> +		}
> +
> +		oneday = days;
> +
>   		while (!daysdone) {
>   			switch (*oneday) {
>   			  case '*': dtext = "All days"; break;
> @@ -141,12 +166,25 @@
>   			}
>
>   			if (!firstday) addtobuffer(result, "/");
> +
>   			addtobuffer(result, dtext);
>   			oneday++;
>   			firstday = 0;
>   		}
>
> -		sItem = strtok(NULL, ",");
> +		addtobuffer(result, ":"); addtobuffer(result, starttime);
> +		addtobuffer(result, ":"); addtobuffer(result, endtime);
> +		if (columns) {
> +			addtobuffer(result, " (status:");
> +			if (strcmp(columns, "*") == 0)
> +				addtobuffer(result, "All");
> +			else
> +				addtobuffer(result, columns);
> +			addtobuffer(result, ")");
> +		}
> +		if (cause) { addtobuffer(result, " (cause:"); addtobuffer(result, cause); addtobuffer(result, ")"); }
> +
> +		sItem = strtok_r(NULL, ",",&itmstbuf);
>   		if (sItem) addtobuffer(result, ", ");
>   	}
>   	xfree(sCopy);
>
> To unsubscribe from the xymon list, send an e-mail to
> xymon-unsubscribe at xymon.com
>
>



More information about the Xymon mailing list