Hi!

Here is the second preliminary log matching support patch:

1.) cosmetics are corrected

2.) documentation has been updated

3.) parse buffer is 511 byte long

4.) the output is more verbose:

'foobar.log' content line matches regular expression!
Regular expression:
^[a-z]*$
Content:
foobar123

5.) the statement has been extended:

IF [NOT] MATCH {regex|path} THEN action

and

IGNORE [NOT] MATCH {regex|path}

- IGNORE has precedence over IF
- lines matching an IGNORE rule is not anymore checked
- all not empty lines in a file where path points to is added to the match
  list (either IGNORE or IF)
- NOT inverts the IF or IGNORE matching rule accordingly

=> you can do online logchecking with nearly the power of logcheck!

still todo:

* find a regex library which can be shipped with monit source
  (licences,...).  Any ideas?
* examples in the docs

Have fun with it,


Christian

--
Christian Hopp                                email: [EMAIL PROTECTED]
Institut für Elektrische Informationstechnik             fon: +49-5323-72-2113
TU Clausthal, Leibnizstr. 28, 38678 Clausthal-Zellerf.   fax: +49-5323-72-3197
                             pgpkey: https://www.iei.tu-clausthal.de/pgp-keys/
diff --exclude CVS -ur monit/event.c monit.orig/event.c
--- monit/event.c       2005-07-29 12:25:27.000000000 +0200
+++ monit.orig/event.c  2005-01-06 21:51:49.000000000 +0100
@@ -59,7 +59,6 @@
   {EVENT_PERMISSION, "Permission failed",      "Permission passed"},
   {EVENT_RESOURCE,   "Resource limit matched", "Resource limit passed"},
   {EVENT_SIZE,       "Size failed",            "Size passed"},
-  {EVENT_MATCH,      "Regex match",            "No regex match"},
   {EVENT_TIMEOUT,    "Timeout",                "Timeout recovery"},
   {EVENT_TIMESTAMP,  "Timestamp failed",       "Timestamp passed"},
   {EVENT_UID,        "UID failed",             "UID passed"},
diff --exclude CVS -ur monit/event.h monit.orig/event.h
--- monit/event.h       2005-07-29 12:24:29.000000000 +0200
+++ monit.orig/event.h  2005-01-06 21:51:49.000000000 +0100
@@ -38,7 +38,6 @@
 #define EVENT_EXEC         0x1000
 #define EVENT_CHANGED      0x2000
 #define EVENT_ICMP         0x4000
-#define EVENT_MATCH        0x8000
 
 #define EVENT_DESCRIPTION(E) Event_get_description(E)
 #define IS_EVENT_SET(value, mask) ((value & mask) != 0)
diff --exclude CVS -ur monit/gc.c monit.orig/gc.c
--- monit/gc.c  2005-08-02 17:58:37.000000000 +0200
+++ monit.orig/gc.c     2005-01-24 02:04:36.000000000 +0100
@@ -50,7 +50,6 @@
 static void _gc_inf(Info_T *);
 static void _gcpdl(Dependant_T *);
 static void _gcso(Size_T *);
-static void _gcmatch(Match_T *);
 static void _gcchecksum(Checksum_T *);
 static void _gcperm(Perm_T *);
 static void _gcuid(Uid_T *);
@@ -174,9 +173,6 @@
   if((*s)->sizelist)
     _gcso(&(*s)->sizelist);
 
-    if((*s)->matchlist)
-    _gcmatch(&(*s)->matchlist);
-
   if((*s)->checksum)
     _gcchecksum(&(*s)->checksum);
 
@@ -439,27 +435,6 @@
 
 }
 
-static void _gcmatch(Match_T *s) {
-  
-  ASSERT(s);
-
-  if((*s)->next)
-    _gcmatch(&(*s)->next);
-
-  if((*s)->action)
-    _gc_eventaction(&(*s)->action);
-
-  if((*s)->regex_path)
-      FREE((*s)->regex_path);
-  if((*s)->regex_string)
-      FREE((*s)->regex_string);
-  if((*s)->regex_comp)
-      FREE((*s)->regex_comp);
-  
-  FREE(*s);
-
-}
-
 
 static void _gcchecksum(Checksum_T *s) {
   
diff --exclude CVS -ur monit/http/cervlet.c monit.orig/http/cervlet.c
--- monit/http/cervlet.c        2005-08-02 17:16:04.000000000 +0200
+++ monit.orig/http/cervlet.c   2005-04-05 21:52:57.000000000 +0200
@@ -111,7 +111,6 @@
 static void print_service_rules_timestamp(HttpResponse, Service_T);
 static void print_service_rules_device(HttpResponse, Service_T);
 static void print_service_rules_size(HttpResponse, Service_T);
-static void print_service_rules_match(HttpResponse, Service_T);
 static void print_service_rules_checksum(HttpResponse, Service_T);
 static void print_service_rules_process(HttpResponse, Service_T);
 static void print_service_params_port(HttpResponse, Service_T);
@@ -122,7 +121,6 @@
 static void print_service_params_timestamp(HttpResponse, Service_T);
 static void print_service_params_device(HttpResponse, Service_T);
 static void print_service_params_size(HttpResponse, Service_T);
-static void print_service_params_match(HttpResponse, Service_T);
 static void print_service_params_checksum(HttpResponse, Service_T);
 static void print_service_params_process(HttpResponse, Service_T);
 static void print_status(HttpRequest, HttpResponse);
@@ -776,7 +774,6 @@
     print_service_params_timestamp(res, s);
     print_service_params_device(res, s);
     print_service_params_size(res, s);
-    print_service_params_match(res, s);
     print_service_params_checksum(res, s);
     print_service_params_process(res, s);
 
@@ -789,7 +786,6 @@
     print_service_rules_timestamp(res, s);
     print_service_rules_device(res, s);
     print_service_rules_size(res, s);
-    print_service_rules_match(res, s);
     print_service_rules_checksum(res, s);
     print_service_rules_process(res, s);
 
@@ -1309,8 +1305,6 @@
          out_print(res, "Resource ");
       if(IS_EVENT_SET(r->events, EVENT_SIZE))
          out_print(res, "Size ");
-      if(IS_EVENT_SET(r->events, EVENT_MATCH))
-         out_print(res, "Match ");
       if(IS_EVENT_SET(r->events, EVENT_TIMEOUT))
          out_print(res, "Timeout ");
       if(IS_EVENT_SET(r->events, EVENT_TIMESTAMP))
@@ -1576,28 +1570,6 @@
   }
 }
 
-static void print_service_rules_match(HttpResponse res, Service_T s) {
-
-  if(s->matchlist) {
-
-    Match_T       ml;
-    EventAction_T a;
-
-    for(ml= s->matchlist; ml; ml= ml->next) {
-
-      a= ml->action;
-
-
-      out_print(res,
-                "<tr><td>Associated regex</td><td>If %s match "
-                "\"%s\" then %s</td></tr>",
-                ml->not?"not ":"", ml->regex_string,
-                actionnames[a->failed->id]);
-      
-    }
-  }
-}
-
 
 static void print_service_rules_checksum(HttpResponse res, Service_T s) {
 
@@ -1991,25 +1963,6 @@
   }
 }
 
-static void print_service_params_match(HttpResponse res, Service_T s) {
-
-  if(s->type == TYPE_FILE) {
-
-    if(!Util_hasServiceStatus(s)) {
-
-      out_print(res,
-        "<tr><td>Match regex</td><td>-</font></td></tr>");
-
-    } else {
-
-      out_print(res,
-        "<tr><td>Match regex</td><td><font%s>%s</td></tr>",
-        (s->error & EVENT_MATCH)?" color='#ff0000'":"",
-        (s->error & EVENT_MATCH)?"yes":"no");
-    }
-  }
-}
-
 
 static void print_service_params_checksum(HttpResponse res, Service_T s) {
 
diff --exclude CVS -ur monit/l.l monit.orig/l.l
--- monit/l.l   2005-08-02 16:23:23.000000000 +0200
+++ monit.orig/l.l      2005-04-03 13:56:51.000000000 +0200
@@ -234,9 +234,6 @@
 perm(ission)?     { return PERMISSION; }
 exec(ute)?        { return EXEC; }
 size              { return SIZE; }
-match             { return MATCH; }
-not               { return NOT; }
-ignore            { return IGNORE; }
 connection        { return CONNECTION; }
 unmonitor         { return UNMONITOR; }
 icmp              { return ICMP; }
diff --exclude CVS -ur monit/monit.pod monit.orig/monit.pod
--- monit/monit.pod     2005-08-02 18:32:39.000000000 +0200
+++ monit.orig/monit.pod        2005-04-05 21:52:57.000000000 +0200
@@ -1237,56 +1237,7 @@
  check file su with path /bin/su
        if size != 95564 then exec "/sbin/ifconfig eth0 down"
 
-=head2 SPACE TESTING
-
-The match statement allows to check lines of file content against
-a regular expression (regex).  In case of a match a action like
-an alarm is triggered.  Syntax (keywords are in capital):
-
-=over 4
-
-=item IF [NOT] MATCH {regex|path} THEN action
-
-=back
-
-I<regex> is a string containing the extended regular expression.
-See also regex(7).
-
-I<path> is an absolute path to a file containing extended
-regular expression on every line. See also regex(7).
-
-I<action> is a choice of "ALERT", "RESTART", "START", "STOP",
-"EXEC" or "UNMONITOR".
-
-You can use the I<NOT> statement to invert a match.
-
-The content is only being checked every cycle.  If content is
-being added and removed during between two check they are 
-unnoticed.  
-
-On startup the read position is the file end.  Upon file size 
-decrease and inode change the read position is set to the file
-start.
-
-Only lines ending with a newline character are inspected.  Thus,
-lines are being ignored until they have been completed with this
-character.
-
-Only the first 511 characters of a line are inspected any 
-following is omitted.
-
-=over 4
-
-=item IGNORE [NOT] MATCH {regex|path}
-
-=back
-
-Lines matching an I<IGNORE> are not inspected for later matches.
-I<IGNORE MATCH> has always precedence over I<IF MATCH>.
 
-In first all I<IGNORE MATCH> statements are evaluated in the 
-order of there appearance.  In second all I<IF MATCH> statements
-are evaluated.
 
 =head2 SPACE TESTING
 
@@ -3449,8 +3400,7 @@
 
 =head1 SEE ALSO
 
-GNU text utilities;  md5sum(1);  sha1sum(1);  openssl(1);  glob(7);
-regex(7)
+GNU text utilities;  md5sum(1);  sha1sum(1);  openssl(1);  glob(7)
 
 
 =cut
diff --exclude CVS -ur monit/monitor.h monit.orig/monitor.h
--- monit/monitor.h     2005-08-02 16:27:47.000000000 +0200
+++ monit.orig/monitor.h        2005-04-23 02:48:40.000000000 +0200
@@ -553,21 +553,6 @@
   EventAction_T action;  /**< Description of the action upon event occurence */
 } *Perm_T;
 
-/** Defines match object */
-typedef struct mymatch {
-  int     ignore;                                          /**< Ignore match */
-  int     not;                                             /**< Invert match */
-  char    *regex_string;                                   /**< Match string */
-  char    *regex_path;                         /**< File with matching rules */
-#ifdef HAVE_REGEX_H
-  regex_t *regex_comp;                                    /**< Match compile */
-#endif
-  EventAction_T action;  /**< Description of the action upon event occurence */
- 
-  /** For internal use */
-  struct mymatch *next;                             /**< next match in chain */
-} *Match_T;
-
 
 /** Defines uid object */
 typedef struct myuid {
@@ -603,7 +588,6 @@
   mode_t  st_mode;                                           /**< Permission */
   uid_t   st_uid;                                           /**< Owner's uid */
   gid_t   st_gid;                                           /**< Owner's gid */
-  ino_t   st_ino;                                                 /**< Inode */
   time_t  timestamp;                                          /**< Timestamp */
 
   /* Device specific */
@@ -621,8 +605,6 @@
 
   /* File specific */
   size_t st_size;                                                  /**< Size */
-  size_t readpos;                           /**< Position for regex matching */
-  ino_t  st_ino_prev;                 /**< Previous inode for regex matching */
   char  *cs_sum;                                               /**< Checksum */
 
   /* Process specific */
@@ -639,6 +621,7 @@
   int    cpu_percent;                                    /**< pecentage * 10 */
   int    total_cpu_percent;                              /**< pecentage * 10 */
   time_t uptime;                                         /**< Process uptime */
+
 } *Info_T;
 
 
@@ -677,7 +660,6 @@
   Port_T      portlist; /**< Portnumbers to check, either local or at a host */
   Resource_T  resourcelist;                          /**< Resouce check list */
   Size_T      sizelist;                                 /**< Size check list */
-  Match_T     matchlist;                             /**< Content Match list */
   Timestamp_T timestamplist;                       /**< Timestamp check list */
   Uid_T       uid;                                            /**< Uid check */
   
diff --exclude CVS -ur monit/monitrc monit.orig/monitrc
--- monit/monitrc       2005-07-29 17:28:55.000000000 +0200
+++ monit.orig/monitrc  2005-04-01 10:07:33.000000000 +0200
@@ -121,8 +121,6 @@
 #   
 #   size           -- Must be followed by compare operator, number, optional
 #                     a size unit and an action. 
-#
-#   match          -- Must be followed by a regular expression and an action. 
 #   
 #   every          -- Only check the service at every n cycles.
 #
diff --exclude CVS -ur monit/p.y monit.orig/p.y
--- monit/p.y   2005-08-02 18:24:50.000000000 +0200
+++ monit.orig/p.y      2005-04-03 13:56:51.000000000 +0200
@@ -150,7 +150,6 @@
   static struct myuid uidset;
   static struct myperm permset;
   static struct mysize sizeset;
-  static struct mymatch matchset;
   static struct myicmp icmpset;
   static struct mymail mailset;
   static struct myport portset;
@@ -189,8 +188,6 @@
   static gid_t get_gid(char *, gid_t);
   static void  addchecksum(Checksum_T);
   static void  addperm(Perm_T);
-  static void  addmatch(Match_T, int);
-  static void  addmatchpath(Match_T, int);
   static void  adduid(Uid_T);
   static void  addgid(Gid_T);
   static void  addeuid(uid_t);
@@ -260,7 +257,7 @@
 %token TIMESTAMP CHANGED SECOND MINUTE HOUR DAY
 %token SSLAUTO SSLV2 SSLV3 TLSV1 CERTMD5
 %token BYTE KILOBYTE MEGABYTE GIGABYTE
-%token INODE SPACE PERMISSION SIZE MATCH NOT IGNORE
+%token INODE SPACE PERMISSION SIZE
 %token EXEC UNMONITOR ICMP ICMPECHO NONEXIST INVALID DATA RECOVERED
 %token URL CONTENT PID PPID
 %token <url> URLOBJECT
@@ -328,7 +325,6 @@
                | gid
                | checksum
                 | size
-                | match
                | mode
                | group
                 | depend
@@ -974,7 +970,6 @@
                 | PERMISSION { eventset |= EVENT_PERMISSION; }
                 | RESOURCE   { eventset |= EVENT_RESOURCE; }
                 | SIZE       { eventset |= EVENT_SIZE; }
-                | MATCH      { eventset |= EVENT_MATCH; }
                 | TIMEOUT    { eventset |= EVENT_TIMEOUT; }
                 | TIMESTAMP  { eventset |= EVENT_TIMESTAMP; }
                 | UID        { eventset |= EVENT_UID; }
@@ -1254,43 +1249,8 @@
                  }
                 ;
 
-match           : IF matchflagnot MATCH PATH THEN action1 {
-                    matchset.ignore= FALSE;
-                    matchset.regex_path= xstrdup($4);
-                    matchset.regex_string= NULL;
-                    addmatchpath(&matchset, $<number>6);
-                 }
-                | IF matchflagnot MATCH STRING THEN action1 {
-                    matchset.ignore= FALSE;
-                    matchset.regex_path= NULL;
-                    matchset.regex_string= xstrdup($4);
-                    addmatch(&matchset, $<number>6);
-                 }
-                | IGNORE matchflagnot MATCH PATH {
-                    matchset.ignore= TRUE;
-                    matchset.regex_path= xstrdup($4);
-                    matchset.regex_string= NULL;
-                    addmatchpath(&matchset, ACTION_IGNORE);
-                 }
-                | IGNORE matchflagnot MATCH STRING {
-                    matchset.ignore= TRUE;
-                    matchset.regex_path= NULL;
-                    matchset.regex_string= xstrdup($4);
-                    addmatch(&matchset, ACTION_IGNORE);
-                 }
-                ;
-
-matchflagnot      : /* empty */ {
-                  matchset.not= FALSE;
-                  }
-                | NOT {
-                  matchset.not= TRUE;
-                  }
-                ;
-
-
 size            : IF SIZE operator NUMBER unit THEN action1 recovery {
-                   sizeset.operator= $<number>4;
+                   sizeset.operator= $<number>3;
                    sizeset.size= ((unsigned long)$4 * $<number>5);
                     addeventaction(&(sizeset).action, $<number>7, $<number>8);
                    addsize(&sizeset, FALSE);
@@ -1937,98 +1897,6 @@
 
 }
 
-/*
- * Set Match object in the current service
- */
-static void addmatch(Match_T ms, int actionnumber) {
-
-  Match_T m;
-  Match_T ml;
-  int     reg_return;
-  
-  ASSERT(ms);
-
-#ifdef HAVE_REGEX_H
-  NEW(m);
-  NEW(m->regex_comp);
-
-  m->regex_string= ms->regex_string;
-  m->regex_path= ms->regex_path;
-  m->action= ms->action;
-  m->not= ms->not;
-  m->ignore= ms->ignore;
-  m->next=NULL;
-
-  addeventaction(&(m->action), actionnumber, ACTION_IGNORE);
-
-  reg_return= regcomp(m->regex_comp, ms->regex_string, REG_NOSUB|REG_EXTENDED);
-
-  if (reg_return!=0) {
-    char errbuf[STRLEN];
-    regerror(reg_return, ms->regex_comp, errbuf, STRLEN);
-    yyerror2("regex parsing error:%s", errbuf);
-  }
-
-  if (current->matchlist) {
-    /* Find the end of the list */
-    for(ml=current->matchlist; ml->next; ml=ml->next);
-
-    ml->next= m;
-    
-  } else {
-
-    current->matchlist= m;
-        
-  }
-
-#else
-  yyerror2("regex matching requires regex support!", );
-#endif
-}
-
-static void addmatchpath(Match_T ms, int actionnumber) {
-
-  FILE *handle;
-  char buf[STRLEN];
-
-  ASSERT(ms->regex_path);
-
-  handle=fopen(ms->regex_path, "r");
-
-  if ( handle==NULL ) {
-
-    yyerror2("cannot read regex match file (%s)", ms->regex_path);
-    
-  }
-  
-  while (!feof(handle)) {
-    
-    
-    if (! fgets(buf, STRLEN, handle)) {
-
-      continue;
-      
-    }
-
-    if (strlen(buf)==0 || buf[0]=='\n') {
-
-      continue;
-
-    }
-
-    if(buf[strlen(buf)-1]=='\n') {
-
-      buf[strlen(buf)-1]=0;
-      
-    }
-
-    ms->regex_string= xstrdup(buf);
-    addmatch(ms, actionnumber);
-  }
-
-  fclose(handle);
-
-}
 
 /*
  * Set Uid object in the current service
diff --exclude CVS -ur monit/util.c monit.orig/util.c
--- monit/util.c        2005-08-02 17:17:36.000000000 +0200
+++ monit.orig/util.c   2005-04-12 00:27:53.000000000 +0200
@@ -603,7 +603,6 @@
   Resource_T q;
   Timestamp_T t;
   Size_T sl;
-  Match_T ml;
   Dependant_T d;
   char string[STRLEN];
 
@@ -759,15 +758,6 @@
     
   }
 
-  for(ml= s->matchlist; ml; ml= ml->next) {
-    EventAction_T a= ml->action;
-    
-    printf(" %-20s = if%s match \"%s\" then %s\n",
-           "Regex", ml->not?" not":"",ml->regex_string,
-           actionnames[a->failed->id]);
-    
-  }
-  
   for(dl= s->devicelist; dl; dl= dl->next) {
     EventAction_T a= dl->action;
     
@@ -1539,12 +1529,10 @@
  */
 void Util_resetInfo(Service_T s) {
   memset(s->inf, 0, sizeof *(s->inf));
-  s->inf->_pid=        -1;
-  s->inf->_ppid=       -1;
-  s->inf->pid=         -1;
-  s->inf->ppid=        -1;
-  s->inf->st_ino_prev=  0;
-  s->inf->readpos=      0;
+  s->inf->_pid=  -1;
+  s->inf->_ppid= -1;
+  s->inf->pid=   -1;
+  s->inf->ppid=  -1;
 }
 
 
diff --exclude CVS -ur monit/validate.c monit.orig/validate.c
--- monit/validate.c    2005-08-02 17:33:29.000000000 +0200
+++ monit.orig/validate.c       2005-05-11 23:28:02.000000000 +0200
@@ -102,7 +102,6 @@
 static void check_gid(Service_T);
 static void check_size(Service_T);
 static void check_perm(Service_T);
-static void check_match(Service_T);
 static int  check_skip(Service_T);
 static int  check_timeout(Service_T);
 static void check_checksum(Service_T);
@@ -119,7 +118,6 @@
 ProcessTree_T *oldptree=NULL;  
 int            oldptreesize=0; 
 
-#define MATCH_LINE_LENGTH 512
 
 /* ---------------------------------------------------------------- Public */
 
@@ -284,13 +282,6 @@
     return FALSE;
   } else {
     s->inf->st_mode= stat_buf.st_mode;
-    if (s->inf->st_ino==0) {
-      s->inf->st_ino_prev= stat_buf.st_ino;
-      s->inf->readpos= stat_buf.st_size;
-    } else {
-      s->inf->st_ino_prev= s->inf->st_ino;
-    }
-    s->inf->st_ino= stat_buf.st_ino;
     s->inf->st_uid= stat_buf.st_uid;
     s->inf->st_gid= stat_buf.st_gid;
     s->inf->st_size= stat_buf.st_size;
@@ -328,9 +319,6 @@
   if(s->timestamplist)
     check_timestamp(s);
 
-  if(s->matchlist)
-    check_match(s);
-
   return TRUE;
 
 }
@@ -962,162 +950,6 @@
   }
 }
 
-/**
- * Match content
- */
-static void check_match(Service_T s) {
-  Match_T ml;
-  char    line[MATCH_LINE_LENGTH];
-  FILE    *file;
-  int     regex_return;
-  int     inode_checked=FALSE;
-  int     advance=0;
-  int     ignore;
-    
-  ASSERT(s && s->matchlist);
-
-  /* did inode change -> read position = 0 */
-  if((inode_checked==FALSE) && (s->inf->st_ino != s->inf->st_ino_prev)) {
-    s->inf->readpos= 0;
-  }
-  inode_checked= TRUE;
-  
-  /* did file decrease (readpos > file_size) -> read position = 0 */
-  if(s->inf->readpos > s->inf->st_size) {
-    s->inf->readpos= 0;
-  }
-
-  /* Do we need to match? (readpos < file_size) */
-  if(!(s->inf->readpos < s->inf->st_size)){
-    return;
-  }
-
-  /* Open the file */
-  if(NULL==(file=fopen(s->path, "r"))) {
-    /* We can't open the file */
-    DEBUG("FILE: cannot open file %s: %s!\n", s->path, strerror(errno));
-    return;
-  }
-
-  while (TRUE) {
-    ignore=FALSE;
-    
-    /* Seek to the read position */
-    if (fseek(file, s->inf->readpos, SEEK_SET)!=0) {
-      /* We can not seek to the read position */
-      DEBUG("FILE: cannot seek file %s: %s!\n", s->path, strerror(errno));
-      goto final;
-    }
-
-    if(NULL==fgets(line, MATCH_LINE_LENGTH, file)) {
-      /* We can not read the content! */
-      if (!feof(file)) {
-        DEBUG("FILE: cannot read file %s: %s!\n", s->path, strerror(errno));
-      }
-      goto final;
-    }
-    
-    /* Close the file */
-    
-    /* Empty line? Should not happen... but who knows */
-    if (strlen(line) == 0) {
-      /* ==> ERROR */
-      goto final;
-    }
-
-    /* Complete line oder just beginning? (igore full buffers) */
-    if ((strlen(line)<(MATCH_LINE_LENGTH)-1) &&
-        (line[strlen(line)-1] != '\n')) {
-      /* we gonna read it next time */
-      goto final;
-    }
-
-    advance=strlen(line);
-    
-    /*
-      Does this line end with '\n'? Otherwise ignore and check it
-      as soon as it is complete
-    */
-    if (strlen(line)==(MATCH_LINE_LENGTH)-1) {
-      int  rv=0;
-
-      while (((unsigned char) rv != '\n') && (rv!=EOF)) {
-        rv=fgetc(file);
-        advance++;
-      }
-
-      if (rv==EOF) {
-        break;
-      }
-    }
-
-    /* Set read position to the end of last read */
-    s->inf->readpos+=advance;
-
-    /* Remove appending newline */
-    if (line[strlen(line)-1] == '\n') {
-      line[strlen(line)-1] = 0;
-    }
-    
-    /* Check ignores */
-    for(ml= s->matchlist; ml; ml= ml->next) {
-      if (ml->ignore) {
-        regex_return=regexec(ml->regex_comp,
-                             line,
-                             0,
-                             NULL,
-                             0);
-        
-        if((regex_return==0)  ^ (ml->not)) {
-          /* We match! -> line is ignored! */
-          DEBUG("FILE: Regular expression %s\"%s\" "
-                "ignore match on content line\n",
-                ml->not?"not ":"",
-                ml->regex_string);
-          ignore=TRUE;
-          break;
-        }
-      }
-    }
-
-    if(ignore)
-        continue;
-    
-    /* Check rest */
-    for(ml= s->matchlist; ml; ml= ml->next) {
-      if (!(ml->ignore)) {
-        regex_return=regexec(ml->regex_comp,
-                             line,
-                             0,
-                             NULL,
-                             0);
-        
-        if((regex_return==0) ^ (ml->not)) {
-          /* We match! */
-          Event_post(s, EVENT_MATCH, TRUE, ml->action,
-                     "'%s' content line matches regular expression!\n"
-                     "Regular expression:\n"
-                     "%s\n"
-                     "Content:\n"
-                     "%s",
-                     s->name, ml->regex_string, line);
-          
-          /* ==> more talkative! */
-        } else {
-          DEBUG("FILE: Regular expression %s\"%s\" "
-                "does not match on content line\n",
-                ml->not?"not ":"",
-                ml->regex_string);
-        }
-      }
-    }
-
-  }
-
-  final:
-  
-  fclose(file);
-}
 
 /**
  * Device test
_______________________________________________
monit-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/monit-dev

Reply via email to