[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [xymon] Bug in downtime display on info-page



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