#!/usr/bin/perl

$Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'};
$IgnoreUnmatched = $ENV{'vsftpd_ignore_unmatched'};
$TotalBytesOut = 0;
$TotalBytesIn = 0;

while (defined($ThisLine = <STDIN>)) {
   if ( ( $ThisLine =~ /CONNECT/ ) or
        ( $ThisLine =~ /MKDIR/ ) ){
      # We don't care about these
   }				 
   elsif ( ($IP,$Email) = ( $ThisLine =~ /OK LOGIN: Client \"(.*)\", anon password \"(.*)\"$/ ) ) {
      $Temp = "    (" . $IP . "): " . $Email . " - ";
      $AnonLogins{$Temp}++;
   }
   elsif ( ($PID, $User,$IP) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] OK LOGIN: Client \"(.*)\"$/ ) ) {
      $Temp = "    (" . $IP . "): " . $User . " - ";
      $UserLogins{$Temp}++;
   }
   elsif ( ($PID,$User,$IP) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] FAIL LOGIN: Client \"(.*)\"$/ ) ) {
      $Temp = " (" . $IP . "): " . $User . " - ";
      $FailedLogins{$Temp}++;
   }
   elsif ( ($PID,$User,$IP,$FileName,$FileSize) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] OK UPLOAD: Client \"(.*)\", \"(.*)\", ([0123456789]+) bytes/ ) ) {
      $Temp = "   " . $FileName . " <- " . $IP . " (User: " . $User . ")\n";
      $TotalBytesIn+= $FileSize;
      push @UploadedFiles,$Temp;
   }
   elsif ( ($PID,$User,$IP,$FileName,$FileSize) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] FAIL UPLOAD: Client \"(.*)\", \"(.*)\", ([0123456789]+) bytes/ ) ) {
      $Temp = "   " . $FileName . " <- " . $IP . " (User: " . $User . ")\n";
      $TotalBytesIn+= $FileSize;
      push @FailedUploadedFiles,$Temp;
   }
   elsif ( ($PID,$User,$IP,$FileName,$FileSize) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] OK DOWNLOAD: Client \"(.*)\", \"(.*)\", ([0123456789]+) bytes/ ) ) {
      $Temp = "   " . $FileName . " -> " . $IP . " (User: " . $User . ")\n";
      $TotalBytesOut+= $FileSize;
      push @DownloadedFiles,$Temp;
   }
   elsif ( ($PID,$User,$IP,$FileName,$FileSize) = ( $ThisLine =~ /\[(.*)\] \[(.*)\] FAIL DOWNLOAD: Client \"(.*)\", \"(.*)\", ([0123456789]+) bytes/ ) ) {
      $Temp = "   " . $FileName . " -> " . $IP . " (User: " . $User . ")\n";
      $TotalBytesOut+= $FileSize;
      push @FailedDownloadedFiles,$Temp;
   }
   else {
# Report any unmatched entries...
      push @OtherList,$ThisLine;
   }
}

if ( 
      ( (keys %AnonLogins) and ($Detail >= 5 ) ) or
      ( (keys %FailedLogins) and ($Detail >= 5 ) ) or
      ( @OtherList ) or
      ( keys %UserLogins ) or
      ( @FailedUploadedFiles ) or
      ( @FailedDownloadedFiles ) or
      ( @UploadedFiles ) or
      ( @DownloadedFiles )
   ) {		

   print "\n\n --------------------- vsftpd-messages Begin ------------------------ \n";

   if ( (keys %AnonLogins) and ($Detail >= 5) ) {
      print "\nAnonymous FTP Logins:\n";
      foreach $ThisOne (keys %AnonLogins) {
         print $ThisOne . $AnonLogins{$ThisOne} . " Time(s)\n";
      }
   }

   if (keys %UserLogins) {
      print "\nUser FTP Logins:\n";
      foreach $ThisOne (keys %UserLogins) {
         print $ThisOne . $UserLogins{$ThisOne} . " Time(s)\n";
      }
   }

   if (keys %FailedLogins) {
      print "\nFailed FTP Logins:\n";
      foreach $ThisOne (keys %FailedLogins) {
         print $ThisOne . $FailedLogins{$ThisOne} . " Time(s)\n";
      }
   }

    $TotalKBytesOut = int $TotalBytesOut/1024;
    $TotalKBytesIn = int $TotalBytesIn/1024;
    $TotalMBytesOut = int $TotalKBytesOut/1024;
    $TotalMBytesIn = int $TotalKBytesIn/1024;

   if ( ( $#UploadedFiles >= 0 ) or
      ( $#FailedUploadedFiles >= 0 ) ) {
      if ( $#UploadedFiles >= 0) {
         print "\nIncoming FTP Files:\n";
         print @UploadedFiles;
      }
      if ( $#FailedUploadedFiles >= 0) {
         print "\nFailed Uploads\n";
         print @FailedUploadedFiles;
      }
      print "\nTOTAL KB IN: " . $TotalKBytesIn . "KB (" . $TotalMBytesIn . "MB)\n";
   }

   if ( ( $#DownloadedFiles >= 0 ) or
      ( $#FailedDownloadedFiles >=0 ) ) {
      if ( $#DownloadedFiles >= 0) {
         print "\nOutgoing FTP Files:\n";
         print @DownloadedFiles;
      }
      if ( $#FailedDownloadedFiles >= 0) {
         print "\nFailed Downloads\n";
         print @FailedDownloadedFiles;
      }
      print "\nTOTAL KB OUT: " . $TotalKBytesOut . "KB (" . $TotalMBytesOut . "MB)\n";
   }

   if (($#OtherList >= 0) and (not $IngoreUnmatched)){
      print "\n**Unmatched Entries**\n";
      print @OtherList;
   }

   print "\n\n ---------------------- vsftpd-messages End ------------------------- \n\n";

}

exit(0);


