Bug 1216: Add -M (related) to exigrep.
authorTodd Lyons <tlyons@exim.org>
Fri, 12 Sep 2014 13:22:24 +0000 (06:22 -0700)
committerTodd Lyons <tlyons@exim.org>
Fri, 12 Sep 2014 13:22:24 +0000 (06:22 -0700)
Thanks to Arkadiusz for pointing out that this was never merged.

doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/exigrep.src

index d4ce57307a45afee2a13af99e79cced77104d27f..28597c352adf9bb70eec3316f84687778bc12bf3 100644 (file)
@@ -35273,9 +35273,11 @@ given message, or all mail for a given user, or for a given host, for example.
 The input files can be in Exim log format or syslog format.
 If a matching log line is not associated with a specific message, it is
 included in &'exigrep'&'s output without any additional lines. The usage is:
+.new
 .display
-&`exigrep [-t<`&&'n'&&`>] [-I] [-l] [-v] <`&&'pattern'&&`> [<`&&'log file'&&`>] ...`&
+&`exigrep [-t<`&&'n'&&`>] [-I] [-l] [-M] [-v] <`&&'pattern'&&`> [<`&&'log file'&&`>] ...`&
 .endd
+.wen
 If no log file names are given on the command line, the standard input is read.
 
 The &%-t%& argument specifies a number of seconds. It adds an additional
@@ -35295,6 +35297,21 @@ regular expression.
 The &%-v%& option inverts the matching condition. That is, a line is selected
 if it does &'not'& match the pattern.
 
+.new
+The &%-M%& options means &"related messages"&. &'exigrep'& will show messages
+that are generated as a result/response to a message that &'exigrep'& matched
+normally.
+
+Example of &%-M%&:
+user_a sends a message to user_b, which generates a bounce back to user_b. If
+&'exigrep'& is used to search for &"user_a"&, only the first message will be
+displayed.  But if &'exigrep'& is used to search for &"user_b"&, the first and
+the second (bounce) message will be displayed. Using &%-M%& with &'exigrep'&
+when searching for &"user_a"& will show both messages since the bounce is
+&"related"& to or a &"result"& of the first message that was found by the
+search term.
+.wen
+
 If the location of a &'zcat'& command is known from the definition of
 ZCAT_COMMAND in &_Local/Makefile_&, &'exigrep'& automatically passes any file
 whose name ends in COMPRESS_SUFFIX through &'zcat'& as it searches it.
index 49211bc5661ac08528cc0f186248797cd76b334a..53c5cc6be32998f9ad1bc11f062aacf6f6a00f98 100644 (file)
@@ -32,6 +32,8 @@ JH/03 Support secondary-separator specifier for MX, SRV, TLSA lookups.
 
 JH/04 Add ${sort {list}{condition}{extractor}} expansion item.
 
+TL/04 Bugzilla 1216: Add -M (related messages) option to exigrep.
+
 
 Exim version 4.84
 -----------------
index 2d3b40cbff57044c2e1ea21d60556ebec5af0c50..419fcb54ccf711121d46fea1afd985b6f4c979f8 100644 (file)
@@ -60,6 +60,11 @@ return $seconds;
 
 my (%saved, %id_list, $pattern, $queue_time, $insensitive, $invert);
 
+# If using "related" option, have to track extra message IDs
+my $related;
+my $related_re='';
+my @Mids = ();
+
 sub do_line {
 
 # Convert syslog lines to mainlog format, as in eximstats.
@@ -90,8 +95,16 @@ if (defined $id)
     }
   else
     {
-    $id_list{$id} = 1 if defined $id_list{$id} ||
-      ($insensitive && /$pattern/io) || /$pattern/o;
+    if (defined $id_list{$id} ||
+      ($insensitive && /$pattern/io) || /$pattern/o)
+      {
+      $id_list{$id} = 1;
+      get_related_ids($id) if $related;
+      }
+    elsif ($related && $related_re)
+      {
+      grep_for_related($_, $id);
+      }
     }
 
   # See if this is a completion for some message. If it is interesting,
@@ -173,16 +186,30 @@ sub detect_compressor_capable
   return $cmdline;
   }
 
+sub grep_for_related {
+  my ($line,$id) = @_;
+  $id_list{$id} = 1 if $line =~ m/$related_re/;
+}
+
+sub get_related_ids {
+  my ($id) = @_;
+  push @Mids, $id unless grep /\b$id\b/, @Mids;
+  my $re = join '|', @Mids;
+  $related_re = qr/$re/;
+}
+
 # The main program. Extract the pattern and make sure any relevant characters
 # are quoted if the -l flag is given. The -t flag gives a time-on-queue value
-# which is an additional condition.
+# which is an additional condition. The -M flag will also display "related"
+# loglines (msgid from matched lines is searched in following lines).
 
-getopts('Ilvt:',\my %args);
+getopts('Ilvt:M',\my %args);
 $queue_time  = $args{'t'}? $args{'t'} : -1;
 $insensitive = $args{'I'}? 0 : 1;
 $invert      = $args{'v'}? 1 : 0;
+$related     = $args{'M'}? 1 : 0;
 
-die "usage: exigrep [-I] [-l] [-t <seconds>] [-v] <pattern> [<log file>]...\n"
+die "usage: exigrep [-I] [-l] [-M] [-t <seconds>] [-v] <pattern> [<log file>]...\n"
   if ($#ARGV < 0);
 
 $pattern = shift @ARGV;