|
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:
|