Xymon Mailing List Archive search

Alerts variables

list Henrik Størner
Thu, 17 Feb 2011 08:22:52 +0000 (UTC)
Message-Id: <ijilss$o9i$user-e356fad9864f@xymon.invalid>

In <user-bdd7400d1b9a@xymon.invalid> "Nordquist, Daniel" <user-b7c65cb59f49@xymon.invalid> writes:
Can we apply this code to 4.2.3?
Already done.


Regards,
Henrik

-----Original Message-----
From: Henrik St=C3=B8rner [mailto:user-ce4a2c883f75@xymon.invalid]
Sent: Monday, February 14, 2011 7:40 AM
To: xymon at xymon.com
Subject: Re: [xymon] RE: Alerts variables
In <user-b954bdf70b7d@xymon.invalid>=
=3D?iso-8859-1?Q?Johan_Sj=3DF6berg?=3D <user-74c177c1220d@xymon.invalid> =
writes:
Yes, exactly. It is a script from Xymonton that is invoked using SCRIPT. S=
o=3D
I would like to know if any variable is passed to the script containing t=
h=3D
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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- lib/loadalerts.c    (revision 6631)
+++ lib/loadalerts.c    (working copy)
@@ -958,7 +958,7 @@
               return result;
       }
-       if (alert->state =3D=3D A_RECOVERED) {
+       if ((alert->state =3D=3D A_RECOVERED) || (alert->state =3D=3D A_DIS=
ABLED)) {
               /*
                * Dont do the check until we are checking individual recip=
ients (rulecrit is set).
                * You dont need to have RECOVERED on the top-level rule, i=
t's enough if a recipient
Index: lib/loadalerts.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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_NO=
TIFY, A_DEAD } astate_t;
typedef struct activealerts_t {
       /* Identification of the alert */
Index: xymond/xymond_alert.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- xymond/xymond_alert.c       (revision 6631)
+++ xymond/xymond_alert.c       (working copy)
@@ -75,8 +75,8 @@
activealerts_t *ahead =3D NULL;
char *statename[] =3D {
-       /* 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", "d=
ead"
};
char *find_name(RbtHandle tree, char *name)
@@ -662,7 +662,7 @@
                                * Dont update the color here - we want rec=
overies to go out
                                * only if the alert color triggered an ale=
rt
                                */
-                               awalk->state =3D A_RECOVERED;
+                               awalk->state =3D (newcolor =3D=3D COL_BLUE)=
? A_DISABLED : A_RECOVERED;
                       }
                       if (oldalertstatus !=3D 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, notiflogf=
d);
                                               break;
@@ -929,6 +931,7 @@
                               break;
                         case A_RECOVERED:
+                         case A_DISABLED:
                         case A_NOTIFY:
                               awalk->state =3D A_DEAD;
                               /* Fall through */
Index: xymond/do_alert.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 =3D (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 =3D 1;
       int alertcount =3D 0;
       time_t now =3D getcurrenttime(NULL);
-       char *alerttxt[A_DEAD+1] =3D { "Paging", "Acked", "Recovered", "Not=
ify", "Dead" };
+       char *alerttxt[A_DEAD+1] =3D { "Paging", "Acked", "Recovered", "Dis=
abled", "Notify", "Dead" };
       dbgprintf("send_alert %s:%s state %d\n", alert->hostname, alert->te=
stname, (int)alert->state);
       traceprintf("send_alert %s:%s state %s\n",
@@ -380,7 +391,7 @@
                       continue;
               }
-               if (recip->noalerts && ((alert->state =3D=3D A_PAGING) || (=
alert->state =3D=3D A_RECOVERED))) {
+               if (recip->noalerts && ((alert->state =3D=3D A_PAGING) || (=
alert->state =3D=3D A_RECOVERED) || (alert->state =3D=3D A_DISABLED))) {
                       traceprintf("Recipient '%s' dropped (NOALERT)\n", r=
ecip->recipient);
                       continue;
               }
@@ -408,7 +419,7 @@
                       }
                       alertcount++;
               }
-               else if (alert->state =3D=3D A_RECOVERED) {
+               else if ((alert->state =3D=3D A_RECOVERED) || (alert->state=
=3D=3D A_DISABLED)) {
                       /* RECOVERED messages require that we've sent out a=
n alert before */
                       repeat_t *rpt =3D NULL;
@@ -463,7 +474,7 @@
                                                       timestamp, alert->h=
ostname, alert->testname,
                                                       alert->ip, mailreci=
p, recip->cfid,
                                                       (long)now, servicec=
ode(alert->testname));
-                                               if (alert->state =3D=3D A_R=
ECOVERED) {
+                                               if ((alert->state =3D=3D A_=
RECOVERED) || (alert->state =3D=3D A_DISABLED)) {
                                                       fprintf(logfd, " %l=
d\n", (long)(now - alert->eventstart));
                                               }
                                               else {
@@ -561,7 +572,17 @@
                                       putenv(bbcolorlevel);
                                       recovered =3D (char *)malloc(strlen=
("RECOVERED=3D") + 2);
-                                       sprintf(recovered, "RECOVERED=3D%d"=
, ((alert->state =3D=3D A_RECOVERED) ? 1 : 0));
+                                       switch (alert->state) {
+                                         case A_RECOVERED:
+                                               strcpy(recovered, "RECOVERE=
D=3D1");
+                                               break;
+                                         case A_DISABLED:
+                                               strcpy(recovered, "RECOVERE=
D=3D2");
+                                               break;
+                                         default:
+                                               strcpy(recovered, "RECOVERE=
D=3D0");
+                                               break;
+                                       }
                                       putenv(recovered);
                                       downsecs =3D (char *)malloc(strlen(=
"DOWNSECS=3D") + 20);
@@ -572,7 +593,7 @@
                                       sprintf(eventtstamp, "EVENTSTART=3D=
%ld", (long)alert->eventstart);
                                       putenv(eventtstamp);
-                                       if (alert->state =3D=3D A_RECOVERED=
) {
+                                       if ((alert->state =3D=3D A_RECOVERE=
D) || (alert->state =3D=3D A_DISABLED)) {
                                               downsecsmsg =3D (char *)mal=
loc(strlen("DOWNSECSMSG=3DEvent duration :") + 20);
                                               sprintf(downsecsmsg, "DOWNS=
ECSMSG=3DEvent duration : %ld", (long)(getcurrenttime(NULL) - alert->events=
tart));
                                       }
@@ -628,7 +649,7 @@
                                                       timestamp, alert->h=
ostname, alert->testname,
                                                       alert->ip, scriptre=
cip, (long)now,
                                                       servicecode(alert->=
testname));
-                                               if (alert->state =3D=3D A_R=
ECOVERED) {
+                                               if ((alert->state =3D=3D A_=
RECOVERED) || (alert->state =3D=3D A_DISABLED)) {
                                                       fprintf(logfd, " %l=
d\n", (long)(now - alert->eventstart));
                                               }
                                               else {
This e-mail message and any attached files are confidential and are intende=
d solely for the use of the addressee(s) named above. If you are not the in=
tended recipient, any review, use, or distribution of this e-mail message a=
nd any attached files is strictly prohibited.
This communication may contain material protected by Federal privacy regula=
tions, attorney-client work product, or other privileges. If you have recei=
ved this confidential communication in error, please notify the sender imme=
diately by reply e-mail message and permanently delete the original message=
.  To reply to our email administrator directly, send an email to:  postmas=
user-06e12ddf8aed@xymon.invalid .
If this e-mail message concerns a contract matter, be advised that no emplo=
yee or agent is authorized to conclude any binding agreement on behalf of O=
rlando Health by e-mail without express written confirmation by an officer =
of the corporation. Any views or opinions presented in this e-mail are sole=
ly those of the author and do not necessarily represent those of Orlando He=
alth.