summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Lyons <tlyons@exim.org>2014-09-12 06:22:24 -0700
committerTodd Lyons <tlyons@exim.org>2014-09-12 06:22:24 -0700
commit0eb51736637f6c93a2fd6cb65316f8ae11f0a0be (patch)
treedcc0e135d69b01d4044ed77471c875ab829e608f
parent6f5d1ca3b1563d0ed580a43ba711b3534b19234e (diff)
Bug 1216: Add -M (related) to exigrep.
Thanks to Arkadiusz for pointing out that this was never merged.
-rw-r--r--doc/doc-docbook/spec.xfpt19
-rw-r--r--doc/doc-txt/ChangeLog2
-rw-r--r--src/src/exigrep.src37
3 files changed, 52 insertions, 6 deletions
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index d4ce57307..28597c352 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -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.
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 49211bc56..53c5cc6be 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -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
-----------------
diff --git a/src/src/exigrep.src b/src/src/exigrep.src
index 2d3b40cbf..419fcb54c 100644
--- a/src/src/exigrep.src
+++ b/src/src/exigrep.src
@@ -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;