Blame scripts/services/imapd

Packit 57988d
##########################################################################
Packit 57988d
# $Id$
Packit 57988d
##########################################################################
Packit 57988d
Packit 57988d
########################################################
Packit 57988d
# The imap script was written by:
Packit 57988d
#    Pawe³ Go³aszewski <blues@gda.pl>
Packit 57988d
########################################################
Packit 57988d
Packit 57988d
#####################################################
Packit 57988d
## Copyright (c) 2008 Pawe³ Go³aszewski
Packit 57988d
## Covered under the included MIT/X-Consortium License:
Packit 57988d
##    http://www.opensource.org/licenses/mit-license.php
Packit 57988d
## All modifications and contributions by other persons to
Packit 57988d
## this script are assumed to have been donated to the
Packit 57988d
## Logwatch project and thus assume the above copyright
Packit 57988d
## and licensing terms.  If you want to make contributions
Packit 57988d
## under your own copyright or a different license this
Packit 57988d
## must be explicitly stated in the contribution an the
Packit 57988d
## Logwatch project reserves the right to not accept such
Packit 57988d
## contributions.  If you have made significant
Packit 57988d
## contributions to this script and want to claim
Packit 57988d
## copyright please contact logwatch-devel@lists.sourceforge.net.
Packit 57988d
#########################################################
Packit 57988d
Packit 57988d
my $Debug = $ENV{'LOGWATCH_DEBUG'};
Packit 57988d
my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'};
Packit 57988d
Packit 57988d
if ( $Debug >= 5 ) {
Packit 57988d
    print STDERR "\n\nDEBUG \n\n";
Packit 57988d
}
Packit 57988d
Packit 57988d
while (defined($ThisLine = <STDIN>)) {
Packit 57988d
   if (
Packit 57988d
      ($ThisLine =~ /^Initializing */) or
Packit 57988d
      ($ThisLine =~ /^spgetpwnam: can't find user: */) or
Packit 57988d
      ($ThisLine =~ /^couriertls: read: Connection reset by peer/ ) or
Packit 57988d
      # timeouts are reported in some other scripts - maybe it should be here too?
Packit 57988d
      ($ThisLine =~ /^couriertls: read: Connection timed out/ ) or
Packit 57988d
      ($ThisLine =~ /^LOGOUT, ip=\[.*\], rcvd=\d+, sent=\d+$/) or
Packit 57988d
      ($ThisLine =~ /^Disconnected, ip=\[.*\]/) or
Packit 57988d
      # uw-imapd
Packit 57988d
      ($ThisLine =~ /^Moved \d+ bytes of new mail to.*$/) or
Packit 57988d
      ($ThisLine =~ /^Unexpected client disconnect, while reading line.*$/)
Packit 57988d
   ) {
Packit 57988d
      # Don't care about these...
Packit 57988d
   } elsif ( ($User, $Host) = ( $ThisLine =~ /^Login user=(.*?) host=(.*\[.*\])$/ ) ) {
Packit 57988d
      $Login{$User}{$Host}++;
Packit 57988d
   } elsif ( ($User, $Host) = ( $ThisLine =~ /^LOGIN, user=(.*?), ip=\[([^ ,]+)\](?:, port=\[\d+\])?, protocol=IMAP$/o ) ) {
Packit 57988d
      $Login{$User}{$Host}++;
Packit 57988d
   } elsif ( ($User,$Host) = ( $ThisLine =~ /^Authenticated user=(.*) host=(.*\[.*\]).*$/ ) ) {
Packit 57988d
      $Login{$User}{$Host}++;
Packit 57988d
   } elsif ( ($User,$Host) = ( $ThisLine =~ /^Preauthenticated user=(.*) host=(.*)$/ ) ) {
Packit 57988d
      $Login{$User}{$Host}++;
Packit 57988d
   } elsif ( ($Host) = ( $ThisLine =~ /^imap service init from (.*)$/ ) ) {
Packit 57988d
      $ConnectionNonSSL{$Host}++;
Packit 57988d
      $Connection{$Host}++;
Packit 57988d
   } elsif ( ($Host) = ( $ThisLine =~ /^imaps SSL service init from (.*)$/ ) ) {
Packit 57988d
      $ConnectionSSL{$Host}++;
Packit 57988d
      $Connection{$Host}++;
Packit 57988d
   } elsif ( ($Host) = ( $ThisLine =~ /^Connection, ip=\[(.*)\]$/o ) ) {
Packit 57988d
      $Connection{$Host}++;
Packit 57988d
#   } elsif ( ($User,$Downloaded,$DownloadSize,$Left,$LeftSize) = ( $ThisLine =~ /^Stats: (.*?) (.*?) (.*?) (.*?) (.*?)$/) ) {
Packit 57988d
#      $DownloadedMessages{$User} += $Downloaded;
Packit 57988d
#      $DownloadedMessagesSize{$User} += $DownloadSize;
Packit 57988d
#      $MessagesLeft{$User} = $Left;
Packit 57988d
#      $MboxSize{$User} = $LeftSize;
Packit 57988d
#   } elsif ( ($User,$Host) = ( $ThisLine =~ /^authentication failed for user (.*?) - (.*)/ ) ) {
Packit 57988d
#      $LoginFailed{"$Host ($User)"}++;
Packit 57988d
   } elsif ( ($User, $Host) = ( $ThisLine =~ /^Logout user=(.*?) host=(.*\[.*\])$/) ) {
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
   # More generic pattern for uw-imapd
Packit 57988d
   } elsif ( ($User, $Host) = ( $ThisLine =~ /^Logout user=(.*?) host=(.*)$/) ) {
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
   } elsif ( ($dummy, $User, $Host, $DownloadSize1, $DownloadSize2) = ( $ThisLine =~ /^(LOGOUT|TIMEOUT|DISCONNECTED), user=(.*?), ip=\[([^ ,]+)\](?:, port=\[\d+\])?, headers=(\d+), body=(\d+)/o ) ) {
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
      $DownloadedMessagesSize{$User} += $DownloadSize1 + $DownloadSize2;
Packit 57988d
      if ( ( $ThisLine =~ /, starttls=1/o ) ) {
Packit 57988d
         $ConnectionSSL{$Host}++;
Packit 57988d
      } else {
Packit 57988d
         $Connection{$Host}++;
Packit 57988d
      }
Packit 57988d
   } elsif ( ($User,$Host) = ( $ThisLine =~ /^Autologout user=(.*) host=(.*\[.*\])$/ ) ) {
Packit 57988d
      $AutoLogout{$User}{$Host}++;
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
   } elsif ( ($Reason,$User,$Host) = ( $ThisLine =~ /^Killed (.*) user=(.*) host=(.*\[.*\])$/ ) ) {
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
      $KilledSession{$User}{$Reason}++;
Packit 57988d
   } elsif (
Packit 57988d
      (($User,$Host) = ( $ThisLine =~ /^Broken pipe, while reading line user=(.*) host=(.*\[.*\])$/ )) or
Packit 57988d
      (($User,$Host) = ( $ThisLine =~ /^Command stream end of file, while reading line user=(.*) host=(.*\[.*\])$/ )) or
Packit 57988d
      (($User,$Host) = ( $ThisLine =~ /^Connection (?:reset by peer|timed out), while reading line user=(.*) host=(.*\[.*\])$/ )) or
Packit 57988d
      (($User,$Host) = ( $ThisLine =~ /^No route to host, while reading line user=(.*) host=(.*\[.*\])$/ )) or
Packit 57988d
      (($User,$Host) = ( $ThisLine =~ /^Unexpected client disconnect, while reading line user=(.*) host=(.*\[.*\])$/ ))
Packit 57988d
   ) {
Packit 57988d
      $Logout{$User}{$Host}++;
Packit 57988d
      $Logout2{$User}++;
Packit 57988d
      $SocketErrors{$Host}++;
Packit 57988d
   } else {
Packit 57988d
      # Report any unmatched entries...
Packit 57988d
      # remove PID from named messages
Packit 57988d
Packit 57988d
      $ThisLine =~ s/^(client [.0-9]+)\S+/$1/;
Packit 57988d
      chomp($ThisLine);
Packit 57988d
      $OtherList{$ThisLine}++;
Packit 57988d
   }
Packit 57988d
   $LastLine = $ThisLine;
Packit 57988d
}
Packit 57988d
Packit 57988d
################################################
Packit 57988d
Packit 57988d
Packit 57988d
if ( ( $Detail >= 0 ) and (keys %LoginFailed)) {
Packit 57988d
   print    "\n\n[IMAPd] Login failures:".
Packit 57988d
            "\n=========================".
Packit 57988d
            "\n                                                  Host (user) |          # ".
Packit 57988d
            "\n------------------------------------------------------------- | -----------";
Packit 57988d
Packit 57988d
   $ConnCount = 0;
Packit 57988d
   foreach $Host (sort keys %LoginFailed) {
Packit 57988d
      $Conns = $LoginFailed{$Host};
Packit 57988d
      $HostLength = length($Host);
Packit 57988d
      $HostSpaceLength = 61 - $HostLength;
Packit 57988d
      $CountLength = length("$Conns");
Packit 57988d
      $CountSpaceLength = 12 - $CountLength;
Packit 57988d
      print "\n" ." " x $HostSpaceLength . $Host . " |" . " " x $CountSpaceLength .  $Conns . "";
Packit 57988d
      $ConnCount += $Conns;
Packit 57988d
   }
Packit 57988d
   $CountLength = length("$ConnCount");
Packit 57988d
   $CountSpaceLength = 75 - $CountLength;
Packit 57988d
   print "\n" . "-" x 75;
Packit 57988d
   print "\n" . " " x $CountSpaceLength . "$ConnCount\n\n\n";
Packit 57988d
}
Packit 57988d
Packit 57988d
if ( ( $Detail >= 5 ) and (keys %Connection)) {
Packit 57988d
   print     "\n[IMAPd] Connections:".
Packit 57988d
             "\n=========================".
Packit 57988d
             "\n                                  Host | Connections |    SSL   |   Total  ".
Packit 57988d
             "\n-------------------------------------- | ----------- | -------- | ---------";
Packit 57988d
Packit 57988d
   $ConnCount = 0;
Packit 57988d
   $SSLConn = 0;
Packit 57988d
   $TotalConn = 0;
Packit 57988d
   foreach $Host (sort keys %Connection) {
Packit 57988d
      $Total = $Connection{$Host};
Packit 57988d
      if (defined ($ConnectionNonSSL{$Host})) {
Packit 57988d
         $Conns = $ConnectionNonSSL{$Host};
Packit 57988d
      } else {
Packit 57988d
         $Conns = 0;
Packit 57988d
      }
Packit 57988d
      if (defined ($ConnectionSSL{$Host})) {
Packit 57988d
         $SSL = $ConnectionSSL{$Host};
Packit 57988d
      } else {
Packit 57988d
         $SSL = 0;
Packit 57988d
      }
Packit 57988d
      $HostLength = length($Host);
Packit 57988d
      $HostSpaceLength = 38 - $HostLength;
Packit 57988d
      $CountLength = length("$Conns");
Packit 57988d
      $CountSpaceLength = 12 - $CountLength;
Packit 57988d
      $SSLLength = length("$SSL");
Packit 57988d
      $SSLSpaceLength = 9 - $SSLLength;
Packit 57988d
      $TotalLenght = length("$Total");
Packit 57988d
      $TotalSpaceLength = 10 - $TotalLenght;
Packit 57988d
      print "\n" ." " x $HostSpaceLength . $Host . " |" . " " x $CountSpaceLength .  $Conns .
Packit 57988d
            " |" . " " x $SSLSpaceLength . $SSL . " |" . " " x $TotalSpaceLength . $Total;
Packit 57988d
      $NonSSLCount += $Conns;
Packit 57988d
      $SSLCount += $SSL;
Packit 57988d
      $TotalCount += $Total;
Packit 57988d
   }
Packit 57988d
   $NonSSLLength = length("$NonSSLCount");
Packit 57988d
   $NonSSLSpaceLength = 52 - $NonSSLLength;
Packit 57988d
   $SSLLength = length("$SSLCount");
Packit 57988d
   $SSLSpaceLength = 9 - $SSLLength;
Packit 57988d
   $TotalLength = length("$TotalCount");
Packit 57988d
   $totalSpaceLength = 10 - $TotalLength;
Packit 57988d
   print "\n" . "-" x 75;
Packit 57988d
   print "\n" . " " x $NonSSLSpaceLength . $NonSSLCount . " |" . " " x $SSLSpaceLength . $SSLCount .
Packit 57988d
                " |" . " " x $totalSpaceLength . $TotalCount . "\n\n\n";
Packit 57988d
}
Packit 57988d
Packit 57988d
Packit 57988d
Packit 57988d
if (keys %Logout2) {
Packit 57988d
   print     "\n[IMAPd] Logout stats:".
Packit 57988d
             "\n====================".
Packit 57988d
             "\n                                   User | Logouts | Downloaded |  Mbox Size".
Packit 57988d
             "\n--------------------------------------- | ------- | ---------- | ----------";
Packit 57988d
Packit 57988d
   $ConnCount = 0;
Packit 57988d
   $SizeAll = 0;
Packit 57988d
   $DownAll = 0;
Packit 57988d
   foreach $User (sort keys %Logout2) {
Packit 57988d
      $Conns = $Logout2{$User};
Packit 57988d
      $UserLength = length($User);
Packit 57988d
      $UserSpaceLength = 39 - $UserLength;
Packit 57988d
      $CountLength = length("$Conns");
Packit 57988d
      $CountSpaceLength = 8 - $CountLength;
Packit 57988d
      $Down = $DownloadedMessagesSize{$User};
Packit 57988d
      if (! defined $Down) {
Packit 57988d
         $Down = 0; #Hack
Packit 57988d
      }
Packit 57988d
      $DownSpaceLength = 11 - length($Down);
Packit 57988d
      #$Size = $MboxSize{$User};
Packit 57988d
      $Size = 0; #Hack
Packit 57988d
      $SizeSpaceLength = 11 - length($Size);
Packit 57988d
      print "\n" ." " x $UserSpaceLength . $User . " |" . " " x $CountSpaceLength .  $Conns . " |" .
Packit 57988d
                  " " x $DownSpaceLength . $Down . " |" . " " x $SizeSpaceLength . $Size;
Packit 57988d
      $ConnCount += $Conns;
Packit 57988d
      $SizeAll += $Size;
Packit 57988d
      $DownAll += $Down;
Packit 57988d
   }
Packit 57988d
   $CountLength = length("$ConnCount");
Packit 57988d
   $CountSpaceLength = 49 - $CountLength;
Packit 57988d
   $DownLength = length($DownAll);
Packit 57988d
   $DownSpaceLength = 11 - $DownLength;
Packit 57988d
   $SizeLength = length($SizeAll);
Packit 57988d
   $SizeSpaceLength = 11 - $SizeLength;
Packit 57988d
   print "\n" . "-" x 75;
Packit 57988d
   print "\n" . " " x $CountSpaceLength . "$ConnCount" . " |" . " " x $DownSpaceLength . $DownAll . " |" .
Packit 57988d
                " " x $SizeSpaceLength  .  $SizeAll    . "\n\n\n";
Packit 57988d
}
Packit 57988d
Packit 57988d
Packit 57988d
if ( ( $Detail >= 10 ) and (keys %Login)) {
Packit 57988d
   print "\n[IMAPd] Successful Logins:\n";
Packit 57988d
   $LoginCount = 0;
Packit 57988d
   foreach my $User (sort keys %Login) {
Packit 57988d
      print "  User $User: \n";
Packit 57988d
      $UserCount = 0;
Packit 57988d
      foreach $Host (keys %{$Login{$User}}) {
Packit 57988d
         $HostCount = $Login{$User}{$Host};
Packit 57988d
         print "    From $Host: $HostCount Time(s)\n";
Packit 57988d
         $UserCount += $HostCount;
Packit 57988d
      }
Packit 57988d
      $LoginCount += $UserCount;
Packit 57988d
      print "  Total $UserCount Time(s)\n";
Packit 57988d
      print "\n";
Packit 57988d
   }
Packit 57988d
   print "Total $LoginCount successful logins\n\n";
Packit 57988d
}
Packit 57988d
Packit 57988d
if ( ( $Detail >= 10 ) and (keys %AutoLogout)) {
Packit 57988d
   print "\nAutologout:\n";
Packit 57988d
   foreach $User (sort {$a cmp $b} keys %AutoLogout) {
Packit 57988d
      print "   $User:\n";
Packit 57988d
      foreach $Host (sort {$a cmp $b} keys %{$AutoLogout{$User}}) {
Packit 57988d
         print "      $Host: $AutoLogout{$User}{$Host} Time(s)\n";
Packit 57988d
      }
Packit 57988d
   }
Packit 57988d
}
Packit 57988d
Packit 57988d
if ( ( $Detail >= 10 ) and (keys %KilledSession)) {
Packit 57988d
   print "\nKilled IMAP sessions:\n";
Packit 57988d
   foreach $User (sort {$a cmp $b} keys %KilledSession) {
Packit 57988d
      print "   $User:\n";
Packit 57988d
      foreach $Reason (sort {$a cmp $b} keys %{$KilledSession{$User}}) {
Packit 57988d
         print "      $Reason: $KilledSession{$User}{$Reason} Time(s)\n";
Packit 57988d
      }
Packit 57988d
   }
Packit 57988d
}
Packit 57988d
Packit 57988d
if ( ( $Detail >= 10 ) and (keys %SocketErrors)) {
Packit 57988d
   print "\nSocket Errors in connections with:\n";
Packit 57988d
   foreach $Host (sort {$a cmp $b} keys %SocketErrors) {
Packit 57988d
      print "   $Host: $SocketErrors{$Host} Time(s)\n";
Packit 57988d
   }
Packit 57988d
}
Packit 57988d
Packit 57988d
if (keys %OtherList) {
Packit 57988d
   print "\n**Unmatched Entries**\n";
Packit 57988d
   foreach $line (sort {$a cmp $b} keys %OtherList) {
Packit 57988d
      print "   $line: $OtherList{$line} Time(s)\n";
Packit 57988d
   }
Packit 57988d
}
Packit 57988d
Packit 57988d
exit(0);
Packit 57988d
Packit 57988d
Packit 57988d
# vi: shiftwidth=3 tabstop=3 syntax=perl et
Packit 57988d
# Local Variables:
Packit 57988d
# mode: perl
Packit 57988d
# perl-indent-level: 3
Packit 57988d
# indent-tabs-mode: nil
Packit 57988d
# End: