X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fexigrep.src;h=e8857126e77f9beb546960b3d4425173ac987249;hb=cf0812d57c63b531e2e73187508c7ae99156043c;hp=d22d36294d816b34f5418ad7900b558e7cbb5a94;hpb=89b68021dc688d91f57e0e20432477a57bfcf5ec;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/exigrep.src b/src/src/exigrep.src index d22d36294..e8857126e 100644 --- a/src/src/exigrep.src +++ b/src/src/exigrep.src @@ -1,8 +1,9 @@ -#! PERL_COMMAND -w +#! PERL_COMMAND +use warnings; use strict; -# Copyright (c) 2007 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 +61,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 +96,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 +175,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 +187,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 +225,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";