#!/usr/bin/perl # -*- perl -*- # v0.22 -- 1999.04.11 added support for delivery sorting within messages # v0.21 -- 1999.03.29 added //s to match . to newlines in the paragraph ??? # Author: Monte Mitzelfelt $version = '0.22' ; use Getopt::Long ; $res = GetOptions( "grep=s", \$grep, "nogrep=s", \$nogrep, "follow", \$follow, "help", \$help, ) ; if ( $res == 0 || $help == 1 ) { print STDERR "\n" if $res == 0 ; ( $0 ) = $0 =~ m!([^/]+)$! ; die <<"USAGE" ; usage: $0 [--grep string] [--nogrep string] [--follow] [file1 ...] version: $version USAGE } # set autoflush $| = 1 ; @ARGV = qw( /var/log/maillog ) unless @ARGV ; %uncompress = ( '.Z' => 'uncompress -c', '.gz' => 'gunzip -c', '.bz2' => 'bzip2 -c', ) ; $zipexts = join "|", map { quotemeta } keys %uncompress ; @ARGV = map { /($zipexts)$/o ? "$uncompress{$1} $_|" : $_ } @ARGV ; FOLLOW: while (1) { if ( @ARGV > 0 ) { $FILE = shift @ARGV ; open FILE or die "open $FILE: $!\n" ; } while () { ## KEV # next unless / qmail:/ ; if ( ( $type, $msgnum ) = /(\w+) msg (\d+)/ ) { if ( $type eq 'new' ) { $hash{$msgnum}{MSG} = $_ ; } elsif ( $type eq 'end' ) { printmsg( $msgnum, $_ ) ; } else { $hash{$msgnum}{MSG} .= $_ ; } } elsif ( ($delivery, $msgnum ) = /delivery (\d+): msg (\d+)/ ) { $d2m{$delivery} = $msgnum ; $hash{$msgnum}{$delivery} .= $_ ; push @{ $hash{$msgnum}{DELI} }, $delivery ; } elsif ( ( $delivery ) = /delivery (\d+)/ ) { $hash{$d2m{$delivery}}{$delivery} .= $_ ; } } if ( $follow && @ARGV == 0 ) { # wait three seconds sleep 3 ; # and reset eof! seek FILE, 0, 1 or die "bad seek on FILE: $!\n" ; } else { close FILE ; while ( ($key,$_) = each %hash ) { printmsg( $key ) ; } undef %hash ; last FOLLOW if @ARGV == 0 ; } } # while(1) sub printmsg { my( $msgnum, $txt, ) = @_ ; my( $delivery, ) ; $txt = "$hash{$msgnum}{MSG}$txt" ; foreach $delivery ( @{ $hash{$msgnum}{DELI} } ) { $txt .= $hash{$msgnum}{$delivery} ; } delete $hash{$msgnum} ; next if $grep && $txt !~ /$grep/sio ; next if $nogrep && $txt =~ /$nogrep/sio ; print "$txt\n" ; }