X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fexigrep.src;h=bb994d7697f35ead2e493a354677eba7aeb24c37;hb=3481c572b379260a57ebfafb46eee0600780add3;hp=7b35da8664dc07b25bd14ff1617fb60cf318df2d;hpb=bc338899110ea22098559081f77cbd0f7a8044bd;p=exim.git diff --git a/src/src/exigrep.src b/src/src/exigrep.src index 7b35da866..bb994d769 100644 --- a/src/src/exigrep.src +++ b/src/src/exigrep.src @@ -2,7 +2,7 @@ use strict; -# Copyright (c) 2007-2013 University of Cambridge. +# Copyright (c) 2007-2015 University of Cambridge. # See the file NOTICE for conditions of use and distribution. # Except when they appear in comments, the following placeholders in this @@ -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; @@ -197,7 +224,7 @@ if (@ARGV) foreach (@ARGV) { my $filename = $_; - if ($filename =~ /\.(?:COMPRESS_SUFFIX)$/o) + if (-x 'ZCAT_COMMAND' && $filename =~ /\.(?:COMPRESS_SUFFIX)$/o) { open(LOG, "ZCAT_COMMAND $filename |") || die "Unable to zcat $filename: $!\n";