monit-dev
[Top][All Lists]
Advanced

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

Re: [PATCH] ICMP with optional host parameter


From: Martin Pala
Subject: Re: [PATCH] ICMP with optional host parameter
Date: Thu, 20 Jan 2005 21:17:23 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050105 Debian/1.7.5-1

Thanks for patch, however i think you can reach the same result using either dependency on 'host' service or exec action. For example:


I.) process 'ipsec' depends on host availability - in the case that the host is not available, restart action is triggered in 'theotherside' service, which is inherited by all child services (even though the host service has no own start/stop script):

--8<--
check process ipsec with pidfile /var/run/ipsec.pid
 start program = "/etc/init.d/ipsec start"
 stop program = "/etc/init.d/ipsec stop"
 depends on theotherside

check host theotherside with address the.other.side
 if failed icmp type echo with timeout 15 seconds then restart
--8<--

action chain:
1.) stop 'theotherside' service (stop method is undefined)
2.) stop 'ipsec' service
3.) start 'ipsec' service
4.) start 'theotherside' service (start method is undefined)



II.) the service 'ipsec' is independent, however in the case that 'theotherside' service fails, monit will call exec action which will instruct monit to restart 'ipsec' service:

--8<--
check process ipsec with pidfile /var/run/ipsec.pid
 start program = "/etc/init.d/ipsec start"
 stop program = "/etc/init.d/ipsec stop"

check host theotherside with address the.other.side
 if failed icmp type echo
    with timeout 15 seconds
    then exec "/bin/bash -c '/bin/monit restart ipsec'"
--8<--

action chain:
1.) monit daemon executes monit with restart option on 'ipsec' service
2.) executed monit connects back to running monit daemon (i.e. to the same instance which detected the failure and triggered exec action) - the daemon will perform clean restart of 'ipsec'


I think the process service container should be kept only for process properties (icmp testis is logicaly not related to the process).

However maybe it could be useful to:

- extend restart and similar monit actions by optional argument which may specify monit's service name (to bypass the exec trick)

- allow to specify list of actions


Possible syntax:

  IF FAILED <test> THEN {<action> [<service>], ...}

Example:

--8<--
check process ipsec with pidfile /var/run/ipsec.pid
 start program = "/etc/init.d/ipsec start"
 stop program = "/etc/init.d/ipsec stop"

check host theotherside with address the.other.side
  if failed icmp type echo then alert, restart ipsec
--8<--

(i.e. monit will send alert for service 'theotherside' && restart service named 'ipsec')


What do you think?

Martin


Michel Marti wrote:
Hello,

Attached is a patch (against monit-cvs) that adds an optional "host" parameter to the ICMP test and enables the use of "if failed icmp" for services of type "process".

With the patch applied, you could e.g. do something like this:

check process ipsec with pidfile /var/run/ipsec.pid
  start program = "/etc/init.d/ipsec start"
  stop program = "/etc/init.d/ipsec stop"
if failed icmp host theotherside type echo with timeout 15 seconds then restart


Cheers,

Michel


------------------------------------------------------------------------

diff -urN --exclude=CVS monit-cvs-start/gc.c monit-cvs/gc.c
--- monit-cvs-start/gc.c        2005-01-06 21:51:49.000000000 +0100
+++ monit-cvs/gc.c      2005-01-20 18:02:32.000000000 +0100
@@ -377,6 +377,7 @@
   if((*i)->action)
     _gc_eventaction(&(*i)->action);
+ FREE((*i)->host);
   FREE(*i);
}
diff -urN --exclude=CVS monit-cvs-start/http/cervlet.c monit-cvs/http/cervlet.c
--- monit-cvs-start/http/cervlet.c      2005-01-06 21:51:50.000000000 +0100
+++ monit-cvs/http/cervlet.c    2005-01-20 19:22:31.000000000 +0100
@@ -1733,7 +1733,7 @@
static void print_service_params_icmp(HttpResponse res, Service_T s) { - if(s->type == TYPE_HOST && s->icmplist) {
+  if((s->type == TYPE_HOST || s->type == TYPE_PROCESS) && s->icmplist) {
Icmp_T i; @@ -1748,11 +1748,11 @@
         if(!i->is_available) {
           out_print(res,
             "<tr><td>ICMP Response time</font></td><td><font color='#ff0000'>"
-            "connection failed [%s]</font></td></tr>", icmpnames[i->type]);
+            "connection failed for %s [%s]</font></td></tr>", i->host, 
icmpnames[i->type]);
         } else {
           out_print(res,
-            "<tr><td>ICMP Response time</td><td>%.3fs [%s]</td></tr>",
-            i->response, icmpnames[i->type]);
+            "<tr><td>ICMP Response time</td><td>%.3fs for %s [%s]</td></tr>",
+            i->response, i->host, icmpnames[i->type]);
         }
       }
     }
@@ -2199,13 +2199,13 @@
                  "cpu percent total", s->inf->total_cpu_percent/10.0);
       }
     }
-    if(s->type == TYPE_HOST && s->icmplist) {
+    if( (s->type == TYPE_HOST || s->type == TYPE_PROCESS) && s->icmplist) {
       Icmp_T i;
       for(i= s->icmplist; i; i= i->next) {
        out_print(res,
-                 "  %-33s %.3fs [%s]\n",
+                 "  %-33s %.3fs to %s [%s]\n",
                  "icmp response time", i->is_available?i->response:-1.,
-                 icmpnames[i->type]);
+                 i->host, icmpnames[i->type]);
       }
     }
     if((s->type == TYPE_HOST || s->type == TYPE_PROCESS) && s-> portlist) {
diff -urN --exclude=CVS monit-cvs-start/monitor.h monit-cvs/monitor.h
--- monit-cvs-start/monitor.h   2005-01-06 21:51:49.000000000 +0100
+++ monit-cvs/monitor.h 2005-01-20 18:01:59.000000000 +0100
@@ -471,6 +471,7 @@
/** Defines a ICMP object */
 typedef struct myicmp {
+  char *host;                                 /**< host to "ping" (optional) */
   int type;                                              /**< ICMP type used */
   int timeout;              /**< The timeout in seconds to wait for response */
   int is_available;                     /**< TRUE if the server is available */
diff -urN --exclude=CVS monit-cvs-start/p.y monit-cvs/p.y
--- monit-cvs-start/p.y 2005-01-20 19:25:44.000000000 +0100
+++ monit-cvs/p.y       2005-01-20 18:45:47.000000000 +0100
@@ -301,6 +301,7 @@
                 | ppid
                 | connection
                 | connectionunix
+                | icmp
                 | timeout
                 | alert
                 | every
@@ -374,7 +375,7 @@
 opthost         : start
                 | stop
                 | connection
-               | icmp
+                | icmp
                 | timeout
                 | alert
                 | every
@@ -692,10 +693,10 @@
                 ;
-icmp : IF FAILED ICMP icmptype nettimeout THEN action1 recovery {
-                   icmpset.type= $<number>4;
-                   icmpset.timeout= $<number>5;
-                   addeventaction(&(icmpset).action, $<number>7, $<number>8);
+icmp            : IF FAILED ICMP icmphost icmptype nettimeout THEN action1 
recovery {
+                   icmpset.type= $<number>5;
+                   icmpset.timeout= $<number>6;
+                   addeventaction(&(icmpset).action, $<number>8, $<number>9);
                    addicmp(&icmpset);
                   }
                 ;
@@ -709,6 +710,19 @@
                 | HOST STRING { check_hostname($2); portset.hostname= $2; }
                ;
+icmphost : /* EMPTY */ {
+                    if(current->type == TYPE_HOST) {
+                      icmpset.host= xstrdup(current->path);
+                    } else {
+                      icmpset.host= xstrdup(LOCALHOST);
+                    }
+                  }
+ | HOST STRING { + check_hostname($2); + icmpset.host= $2; + }
+               ;
+
 port            : PORT NUMBER { portset.port= $2; portset.family= AF_INET; }
                 ;
@@ -1899,6 +1913,7 @@
     ASSERT(is);
NEW(icmp);
+    icmp->host= is->host;
     icmp->type= is->type;
     icmp->timeout= is->timeout;
     icmp->action= is->action;
@@ -2702,6 +2717,7 @@
  * Reset the ICMP set to default values
  */
 static void reset_icmpset() {
+  icmpset.host = NULL;
   icmpset.type= ICMP_ECHO;
   icmpset.timeout= NET_TIMEOUT;
   icmpset.action= NULL;
diff -urN --exclude=CVS monit-cvs-start/util.c monit-cvs/util.c
--- monit-cvs-start/util.c      2005-01-20 19:25:44.000000000 +0100
+++ monit-cvs/util.c    2005-01-20 18:03:14.000000000 +0100
@@ -684,9 +684,9 @@
     for(i= s->icmplist; i; i= i->next) {
       EventAction_T a= i->action;
- printf(" %-20s = if failed %s with timeout %d seconds then %s "
+      printf(" %-20s = if failed %s to %s with timeout %d seconds then %s "
         "else if recovered then %s\n",
-        "ICMP", icmpnames[i->type], i->timeout, actionnames[a->failed->id],
+        "ICMP", icmpnames[i->type], i->host, i->timeout, 
actionnames[a->failed->id],
         actionnames[a->passed->id]);
     }
diff -urN --exclude=CVS monit-cvs-start/validate.c monit-cvs/validate.c
--- monit-cvs-start/validate.c  2005-01-20 19:25:44.000000000 +0100
+++ monit-cvs/validate.c        2005-01-20 18:39:15.000000000 +0100
@@ -171,7 +171,6 @@
 int check_process(Service_T s) {
pid_t pid= -1;
-  Port_T pp= NULL;
   Resource_T pr= NULL;
ASSERT(s);
@@ -204,10 +203,8 @@
} - /* Test each host:port and protocol in the service's portlist */
-  if(s->portlist)
-    for(pp= s->portlist; pp; pp= pp->next)
-      check_connection(s, pp);
+  /* Test each host:port and protocol and ICMP */
+  check_remote_host(s);
return TRUE; @@ -395,8 +392,9 @@ switch(icmp->type) {
       case ICMP_ECHO:
-
-        icmp->response= icmp_echo(s->path, icmp->timeout);
+        DEBUG("'%s' sending ICMP echo request to host '%s' with timeout %d\n",
+            s->name, icmp->host, icmp->timeout);
+        icmp->response=icmp_echo(icmp->host, icmp->timeout);
if(icmp->response < 0) {
           icmp->is_available= FALSE;


------------------------------------------------------------------------

_______________________________________________
monit-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/monit-dev




reply via email to

[Prev in Thread] Current Thread [Next in Thread]