[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
plans
From: |
Jan-Henrik Haukeland |
Subject: |
plans |
Date: |
Mon, 23 Jun 2003 17:57:23 +0200 |
User-agent: |
Gnus/5.1002 (Gnus v5.10.2) XEmacs/21.4 (Civil Service, linux) |
Hi
I'm working with the external command function. It's a bit complicated
to integrate this. You may rememeber that we originally planned to
first include this in an alert statement like: alert `/bin/xyzzy .. `
After hacking around in the monit code I think it is a better idea to
create a standalone statement for this. This statement can then also
be combined with other statements as a regular action.
The new statement can be called 'exec' and will look much like the
alert statement in standalone form. Here's the syntax:
EXEC program [{events}]
An example in free-form would look like:
check ...
exec "/bin/xyzzy -option 1 ... -option N argument1.. argumentN" on {
timeout, restart, checksum, resource, stop, timestamp }
Coupled with on of the "if" tests it would look like (notice that
[{events}] will not be a part in this context):
if timestamp /usr/local/apache/conf/httpd.conf was changed then
exec "/bin/xyzzy -option 1 ... -option N argument1.. argumentN"
if cpu usage > 99% then exec "/sbin/shutdown -t 1 bye, bye"
ACTIONS:
-------
1)
Implementing this will make use of all the calls to smtp_alert_xxx and
the smtp_alert(Service_T s, int event, char *optmsg, va_list ap)
function that now dispatch alerts will have a test equal to the
maillist test for execs as in this function skeleton:
static void smtp_alert(Service_T s, int event, char *optmsg, va_list ap) {
ASSERT(s);
if(s->maillist) {
for(all objects in s->maillist)
if(event == maillist[i].events) then
do smtp alerts
}
NEW:
if(s->execlist) {
for(all objects in s->execlist)
if(event == execlist[i].events) then
do spawn program
}
}
2)
Since alert.c will be used in a more general term I suggest that we
change the function names from smtp_alert_xxx to simply alert_xxxx
3)
Change the Mail_T object and extract the events into a standalone
object so they can be reused in the new Exec_T object. Changes:
/** Defines a mailinglist object */
typedef struct mymail {
char *to; /**< Mail address for alert notification */
char *from; /**< The mail from address */
char *subject; /**< The mail subject */
char *message; /**< The mail message */
char *opt_message; /**< An optional message used in alerts */
int alert_on_timeout; /**< If TRUE, alert user when service timeout */
int alert_on_restart; /**< If TRUE, alert user when the service restarts */
int alert_on_checksum; /**< If TRUE, alert user when the checksum fail */
int alert_on_resource; /**< If TRUE, alert user when resources exceed */
int alert_on_stop; /**< If TRUE, alert user when service stopped */
int alert_on_timestamp; /**< If TRUE, alert user when the timestamp fail */
/** For internal use */
struct mymail *next; /**< next recipient in chain */
} *Mail_T;
is changed to:
/** Defines an alert object */
typedef struct myalert {
int alert_on_timeout; /**< If TRUE, alert user when service timeout */
int alert_on_restart; /**< If TRUE, alert user when the service restarts */
int alert_on_checksum; /**< If TRUE, alert user when the checksum fail */
int alert_on_resource; /**< If TRUE, alert user when resources exceed */
int alert_on_stop; /**< If TRUE, alert user when service stopped */
int alert_on_timestamp; /**< If TRUE, alert user when the timestamp fail */
} Alert_T;
/** Defines a mailinglist object */
typedef struct mymail {
char *to; /**< Mail address for alert notification */
char *from; /**< The mail from address */
char *subject; /**< The mail subject */
char *message; /**< The mail message */
char *opt_message; /**< An optional message used in alerts */
Alert_T alerts; /*< Alerts defined for this mail object */
/** For internal use */
struct mymail *next; /**< next recipient in chain */
} *Mail_T;
And here is the new preliminary exec object:
/** Defines an alien program to execute upon alert or an action. */
typedef struct myexec {
Alert_T events; /**< Events triggering this program to be executed */
Command_T program; /**< The external program to call */
/** For internal use */
struct myexec *next; /**< next external program in chain */
} *Exec_T;
4)
All this requires changes "all over the place" and if you have
anything to checkin please let me know now.
5)
If someone feels for it a cleanup of monit.pod would be nice and also
adding a GRAMMAR SECTION defining the grammar would maybe also be nice
or what do you think?
Opinions on this plan, anyone?
--
Jan-Henrik Haukeland
- plans,
Jan-Henrik Haukeland <=
- Re: plans, Jan-Henrik Haukeland, 2003/06/24