In <B08F3F3D67451844A7A8A029FCC71E4C1941CC1661 at WIN01.ad.deltamanagement.se> =?iso-8859-1?Q?Johan_Sj=F6berg?= <johan.sjoberg at deltamanagement.se> writes:
Yes, exactly. It is a script from Xymonton that is invoked using SCRIPT. So= I would like to know if any variable is passed to the script containing th= e status "disabled"
OK, this turned out to be a slightly larger change than I had anticipated. After testing things a bit, it dawned on me that neither the mail-messages nor the script-based alerts would be able to tell the difference between a genuine recovery (going "green") and a recovery due to the status being disabled. Which doesn't seem right. The patch below should solve this. For mail/SMS alerts the subject and message text has been changed from "recovered" to "disabled". For scripts this can be seen from the value of the RECOVERED variable - it will be "1" for a genuine recovery (unchanged from before) and "2" for a recover- by-disable. The BBCOLORLEVEL setting remains unchanged, i.e. it will NOT be blue. This is because BBCOLORLEVEL holds the value of the color that triggered the alert - not the current color of the status. Note: When you apply this patch (against 4.3.0-RC1), please run "make clean" and then "make" to build the package. Without the "make clean", some of the library modules will probably not get updated - causing weird results. Regards, Henrik Index: lib/loadalerts.c =================================================================== --- lib/loadalerts.c (revision 6631) +++ lib/loadalerts.c (working copy) @@ -958,7 +958,7 @@ return result; } - if (alert->state == A_RECOVERED) { + if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { /* * Dont do the check until we are checking individual recipients (rulecrit is set). * You dont need to have RECOVERED on the top-level rule, it's enough if a recipient Index: lib/loadalerts.h =================================================================== --- lib/loadalerts.h (revision 6631) +++ lib/loadalerts.h (working copy) @@ -18,7 +18,7 @@ #if defined(LOCALCLIENT) || !defined(CLIENTONLY) #include <pcre.h> -typedef enum { A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_NOTIFY, A_DEAD } astate_t; +typedef enum { A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD } astate_t; typedef struct activealerts_t { /* Identification of the alert */ Index: xymond/xymond_alert.c =================================================================== --- xymond/xymond_alert.c (revision 6631) +++ xymond/xymond_alert.c (working copy) @@ -75,8 +75,8 @@ activealerts_t *ahead = NULL; char *statename[] = { - /* A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_NOTIFY, A_DEAD */ - "paging", "norecip", "acked", "recovered", "notify", "dead" + /* A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD */ + "paging", "norecip", "acked", "recovered", "disabled", "notify", "dead" }; char *find_name(RbtHandle tree, char *name) @@ -662,7 +662,7 @@ * Dont update the color here - we want recoveries to go out * only if the alert color triggered an alert */ - awalk->state = A_RECOVERED; + awalk->state = (newcolor == COL_BLUE) ? A_DISABLED : A_RECOVERED; } if (oldalertstatus != newalertstatus) { @@ -865,6 +865,7 @@ break; case A_RECOVERED: + case A_DISABLED: case A_NOTIFY: anytogo++; break; @@ -895,6 +896,7 @@ break; case A_RECOVERED: + case A_DISABLED: case A_NOTIFY: send_alert(awalk, notiflogfd); break; @@ -929,6 +931,7 @@ break; case A_RECOVERED: + case A_DISABLED: case A_NOTIFY: awalk->state = A_DEAD; /* Fall through */ Index: xymond/do_alert.c =================================================================== --- xymond/do_alert.c (revision 6631) +++ xymond/do_alert.c (working copy) @@ -225,6 +225,12 @@ alert->hostname, alert->testname, recip->cfid); break; + case A_DISABLED: + subjfmt = (include_configid ? "Xymon %s:%s disabled [cfid:%d]" : "Xymon %s:%s disabled"); + snprintf(subj, sizeof(subj)-1, subjfmt, + alert->hostname, alert->testname, recip->cfid); + break; + case A_NORECIP: case A_DEAD: /* Cannot happen */ @@ -310,6 +316,11 @@ alert->hostname, alert->testname); break; + case A_DISABLED: + sprintf(info, "%s:%s DISABLED", + alert->hostname, alert->testname); + break; + case A_NOTIFY: sprintf(info, "%s:%s NOTICE", alert->hostname, alert->testname); @@ -365,7 +376,7 @@ int first = 1; int alertcount = 0; time_t now = getcurrenttime(NULL); - char *alerttxt[A_DEAD+1] = { "Paging", "Acked", "Recovered", "Notify", "Dead" }; + char *alerttxt[A_DEAD+1] = { "Paging", "Acked", "Recovered", "Disabled", "Notify", "Dead" }; dbgprintf("send_alert %s:%s state %d\n", alert->hostname, alert->testname, (int)alert->state); traceprintf("send_alert %s:%s state %s\n", @@ -380,7 +391,7 @@ continue; } - if (recip->noalerts && ((alert->state == A_PAGING) || (alert->state == A_RECOVERED))) { + if (recip->noalerts && ((alert->state == A_PAGING) || (alert->state == A_RECOVERED) || (alert->state == A_DISABLED))) { traceprintf("Recipient '%s' dropped (NOALERT)\n", recip->recipient); continue; } @@ -408,7 +419,7 @@ } alertcount++; } - else if (alert->state == A_RECOVERED) { + else if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { /* RECOVERED messages require that we've sent out an alert before */ repeat_t *rpt = NULL; @@ -463,7 +474,7 @@ timestamp, alert->hostname, alert->testname, alert->ip, mailrecip, recip->cfid, (long)now, servicecode(alert->testname)); - if (alert->state == A_RECOVERED) { + if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { fprintf(logfd, " %ld\n", (long)(now - alert->eventstart)); } else { @@ -561,7 +572,17 @@ putenv(bbcolorlevel); recovered = (char *)malloc(strlen("RECOVERED=") + 2); - sprintf(recovered, "RECOVERED=%d", ((alert->state == A_RECOVERED) ? 1 : 0)); + switch (alert->state) { + case A_RECOVERED: + strcpy(recovered, "RECOVERED=1"); + break; + case A_DISABLED: + strcpy(recovered, "RECOVERED=2"); + break; + default: + strcpy(recovered, "RECOVERED=0"); + break; + } putenv(recovered); downsecs = (char *)malloc(strlen("DOWNSECS=") + 20); @@ -572,7 +593,7 @@ sprintf(eventtstamp, "EVENTSTART=%ld", (long)alert->eventstart); putenv(eventtstamp); - if (alert->state == A_RECOVERED) { + if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { downsecsmsg = (char *)malloc(strlen("DOWNSECSMSG=Event duration :") + 20); sprintf(downsecsmsg, "DOWNSECSMSG=Event duration : %ld", (long)(getcurrenttime(NULL) - alert->eventstart)); } @@ -628,7 +649,7 @@ timestamp, alert->hostname, alert->testname, alert->ip, scriptrecip, (long)now, servicecode(alert->testname)); - if (alert->state == A_RECOVERED) { + if ((alert->state == A_RECOVERED) || (alert->state == A_DISABLED)) { fprintf(logfd, " %ld\n", (long)(now - alert->eventstart)); } else {