X-Git-Url: https://git.hcoop.net/hcoop/debian/exim4.git/blobdiff_plain/493d55f6840d04ef186778724fc67530b1600113..0baa7b9df9e8d0188307c635776394b0db691e7d:/src/exigrep.src diff --git a/src/exigrep.src b/src/exigrep.src index 2d3b40c..faa5cb7 100644 --- a/src/exigrep.src +++ b/src/exigrep.src @@ -1,8 +1,10 @@ -#! PERL_COMMAND -w +#! PERL_COMMAND +use warnings; use strict; +BEGIN { pop @INC if $INC[-1] eq '.' }; -# Copyright (c) 2007-2014 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 +62,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 +97,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, @@ -161,7 +176,7 @@ sub detect_compressor_capable { if ($filename =~ /\.(?:$ext)$/) { - # Just die if compressor not found; if this occurrs in the middle of + # Just die if compressor not found; if this occurs in the middle of # two valid files with a lot of matches, error could easily be missed. die("Didn't find $ext decompressor for $filename\n") if ($compressors->{$ext}->{bin} eq ''); @@ -173,16 +188,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 +226,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";