Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:sysadmin:tools:mailgrep

Mailgrep (Script zur Suche im Maillog)

Durchsuche Maillog nach Suchstring (z.B. Teil einer Mailadresse), zeige alle Logeinträge mit der passenden Message-ID.

Klappt bei allen sendmail-kompatiblen Logs, zum Beispiel auch Postfix.

#!/usr/bin/perl
 
# Aufruf:
#     mailgrep suchbegriff maillogdatei
# oder
#     mailgrep suchbegriff     (INPUT STDIN)
 
# Durchsucht maillog nach suchbegriff und gibt
# Zeilen mit passender mail-id aus
 
# Hella Breitkopf 2003-02-19, www.unixwitch.de
# kleine Aenderungen (statusmeldungen) 2007-10-09
 
@oldbuffer="";
 
# OLDBUFFERSIZE
# Bei Fund des Suchbegriffs wird so viele Zeilen in der
# Vergangenheit des Logfiles nach zutreffenden Mailids gesucht
$OLDBUFFERSIZE=50;
 
# messageidregex
# rollierender Mailid-Buffer
# (wenn leer, werden erst mal alle Mails gefunden,
# deswegen Vorfuellung mit XXXX... )
$messageidregex="XXXXXXXXXXXXXXX";
 
# MAXINTERLEAVE;
# Groesse des "rollierenden Mailid-Buffers"
# (je groesser, desto mehr Treffer - auch falsche, wenn die Mailids
# recycled werden)
# (( Anmerkung 2003-03-06: bei sendmail 8.12.8 sind die IDs laenger
# und werden deswegen vermutlich seltener recycled ))
# Erhoehung dieses Werts kostet Zeit
$MAXINTERLEAVE=3;
 
 
$suchbegriff=$ARGV[0];
 
# kein Dateiname -> input von stdin
if (! $ARGV[1]) { $ARGV[1] = "STDIN"; }
$dateiname=$ARGV[1];
 
if ($dateiname ne "STDIN"  && ! open(NEUEDATEI,$dateiname))
{
  die "Kann Datei $dateiname nicht oeffnen: $!\n";
}
else
{
  $DATEI = $dateiname eq "STDIN" ? STDIN : NEUEDATEI;
}
 
 
while ( <$DATEI> )
{
  # neue zeile in den Buffer, aelteste Zeile hinten rauswerfen
  push @oldbuffer,$_ ;
  if ( $#oldbuffer > $OLDBUFFERSIZE ) { $garbage = shift @oldbuffer };
 
  if ( /$suchbegriff/ )
  {
    # die message id steht an 6ter Stelle - so lange sie vom Mailserver
    # verarbeitet wird, kann man die Mail daran identifizieren
    $messageid = (split /\s+/ )[5];
 
    # wenn die message-id noch nicht bekannt ist, haben wir eine neue
    # mail-transaktion mit dem Suchbegriff gefunden
    # es kommt aber auch vor, dass im  6ten Feld gar keine message-id
    # sondern irgendeine statusmeldung steht ...
    if (not( $messageid =~ /$messageidregex/ ) and
        not ( $messageid =~ /NOQUEUE/) and
        not ( $messageid =~ /connect/) and
        not ( $messageid =~ /disconnect/) and
        not ( $messageid =~ /warning/) and
        not ( $messageid =~ /Greylist/) and
        not ( $messageid =~ /lost/)
        )
    {
      print " \n --- Aktuelle Message-ID: $messageid -- ";
      print " RegEx der zu suchenden Message-IDs: $messageidregex \n";
 
      #Die gefundene Messageid an die Messageid-suchliste
      #anhaengen
      $messageidregex .= "|" . $messageid;
      # Wenn die Messageid-Suchliste zu lange ist, den aeltesten
      # Eintrag rauswerfen
      @messageidlist = ( split /\|/ , $messageidregex );
      if ($#messageidlist >= $MAXINTERLEAVE )
      {
        $garbage = shift @messageidlist;
        #print "===> $messageidlist[0]  $messageidlist[2] <===\n";
        $messageidregex = join '|' , @messageidlist
 
      }
 
      # suche, ob wir im vorher eingelesenen Buffer
      #eine passende message id finden
      foreach $oldline (@oldbuffer)
      {
        print "<| $oldline" if ($oldline =~ /$messageid/);
      }
 
    # bei neuem match ist die gefundene Zeile auch im oldbuffer und
    # wurde schon gedruckt
 
    }
    else # message id schon bekannt oder statusmeldung
    {
      #drucke gefundene Zeile
      print "=| $_";
    }
 
  }
  else
    # suchbegriff ist nicht enthalten,
    # aber vielleicht finden wir ja eine schon bekannte message-id
  {
    if ( /$messageidregex/ )
      { print ">| $_"}
  }
};

Trivia

  • Sollte eigentlich mailloggrep heissen, aber wer will das immer eintippen …
  • eins meiner ersten produktiven Perl-Scripts

de/sysadmin/tools/mailgrep.txt · Zuletzt geändert: 2008-08-27 21:01 von hella

Seiten-Werkzeuge