From: Todd Lyons Date: Fri, 12 Sep 2014 13:22:24 +0000 (-0700) Subject: Bug 1216: Add -M (related) to exigrep. X-Git-Tag: exim-4_85_RC1~56 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/0eb51736637f6c93a2fd6cb65316f8ae11f0a0be Bug 1216: Add -M (related) to exigrep. Thanks to Arkadiusz for pointing out that this was never merged. --- 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 ] [-v] []...\n" +die "usage: exigrep [-I] [-l] [-M] [-t ] [-v] []...\n" if ($#ARGV < 0); $pattern = shift @ARGV;