[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