X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/3ce625884681ded8f7e08565dc76ea42a19e3652..783b385fe846f97aa5d7a7675cc0600e917b8795:/src/src/exigrep.src diff --git a/src/src/exigrep.src b/src/src/exigrep.src index 0f9fc6908..2d3b40cbf 100644 --- a/src/src/exigrep.src +++ b/src/src/exigrep.src @@ -1,9 +1,8 @@ #! PERL_COMMAND -w -# $Cambridge: exim/src/src/exigrep.src,v 1.9 2007/03/13 16:37:57 ph10 Exp $ use strict; -# Copyright (c) 2007 University of Cambridge. +# Copyright (c) 2007-2014 University of Cambridge. # See the file NOTICE for conditions of use and distribution. # Except when they appear in comments, the following placeholders in this @@ -125,6 +124,54 @@ elsif ( ($invert && (($insensitive && !/$pattern/io) || !/$pattern/o)) || { print "$_\n"; } } +# Rotated log files are frequently compressed and there are a variety of +# formats it could be compressed with. Rather than use just one that is +# detected and hardcoded at Exim compile time, detect and use what the +# logfile is compressed with on the fly. +# +# List of known compression extensions and their associated commands: +my $compressors = { + gz => { cmd => 'zcat', args => '' }, + bz2 => { cmd => 'bzcat', args => '' }, + xz => { cmd => 'xzcat', args => '' }, + lzma => { cmd => 'lzma', args => '-dc' } +}; +my $csearch = 0; + +sub detect_compressor_bin + { + my $ext = shift(); + my $c = $compressors->{$ext}->{cmd}; + $compressors->{$ext}->{bin} = `which $c 2>/dev/null`; + chomp($compressors->{$ext}->{bin}); + } + +sub detect_compressor_capable + { + my $filename = shift(); + map { &detect_compressor_bin($_) } keys %$compressors + if (!$csearch); + $csearch = 1; + return undef + unless (grep {$filename =~ /\.(?:$_)$/} keys %$compressors); + # Loop through them, figure out which one it detected, + # and build the commandline. + my $cmdline = undef; + foreach my $ext (keys %$compressors) + { + if ($filename =~ /\.(?:$ext)$/) + { + # Just die if compressor not found; if this occurrs 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 ''); + $cmdline = $compressors->{$ext}->{bin} ." ". + $compressors->{$ext}->{args}; + last; + } + } + return $cmdline; + } # 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 @@ -155,6 +202,11 @@ if (@ARGV) open(LOG, "ZCAT_COMMAND $filename |") || die "Unable to zcat $filename: $!\n"; } + elsif (my $cmdline = &detect_compressor_capable($filename)) + { + open(LOG, "$cmdline $filename |") || + die "Unable to decompress $filename: $!\n"; + } else { open(LOG, "<$filename") || die "Unable to open $filename: $!\n";