X-Git-Url: http://git.sven.stormbind.net/?p=sven%2Fpflogsumm.git;a=blobdiff_plain;f=pflogsumm.pl;h=a5f93efd0dd29cc9765df4fc2ee5f3b0c324b3fb;hp=12b703de1f201ab0bac1ec7bd5ac2932476bf274;hb=511b588e53615c5fe2cfdf7fa096ef3e21602a5e;hpb=80016b92950431352612eb3f713acd5f5a7a0e81 diff --git a/pflogsumm.pl b/pflogsumm.pl index 12b703d..a5f93ef 100755 --- a/pflogsumm.pl +++ b/pflogsumm.pl @@ -6,20 +6,18 @@ eval 'exec perl -S $0 "$@"' pflogsumm.pl - Produce Postfix MTA logfile summary -Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. +Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.4 =head1 SYNOPSIS pflogsumm.pl -[eq] [-d ] [--detail ] - [--bounce_detail ] [--deferral_detail ] - [-h ] [-i|--ignore_case] [--iso_date_time] [--mailq] - [-m|--uucp_mung] [--no_bounce_detail] [--no_deferral_detail] - [--no_no_msg_size] [--no_reject_detail] [--no_smtpd_warnings] - [--problems_first] [--rej_add_from] [--reject_detail ] - [--smtp_detail ] [--smtpd_stats] - [--smtpd_warning_detail ] [--syslog_name=string] - [-u ] [--verbose_msg_detail] [--verp_mung[=]] - [--zero_fill] [file1 [filen]] + [--bounce-detail ] [--deferral-detail ] + [-h ] [-i|--ignore-case] [--iso-date-time] [--mailq] + [-m|--uucp-mung] [--no-no-msg-size] [--problems-first] + [--rej-add-from] [--reject-detail ] [--smtp-detail ] + [--smtpd-stats] [--smtpd-warning-detail ] + [--syslog-name=string] [-u ] [--verbose-msg-detail] + [--verp-mung[=]] [--zero-fill] [file1 [filen]] pflogsumm.pl -[help|version] @@ -38,7 +36,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. =head1 OPTIONS - --bounce_detail + --bounce-detail Limit detailed bounce reports to the top . 0 to suppress entirely. @@ -46,14 +44,14 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. -d today generate report for just today -d yesterday generate report for just "yesterday" - --deferral_detail + --deferral-detail Limit detailed deferral reports to the top . 0 to suppress entirely. --detail - Sets all --*_detail, -h and -u to . Is + Sets all --*-detail, -h and -u to . Is over-ridden by individual settings. --detail 0 suppresses *all* detail. @@ -71,7 +69,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. 0 = none. - See also: "-u" and "--*_detail" options for further + See also: "-u" and "--*-detail" options for further report-limiting options. --help Emit short usage message and bail out. @@ -81,7 +79,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. know: lame.) -i - --ignore_case Handle complete email address in a case-insensitive + --ignore-case Handle complete email address in a case-insensitive manner. Normally pflogsumm lower-cases only the host and @@ -89,14 +87,14 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. option causes the entire email address to be lower- cased. - --iso_date_time + --iso-date-time For summaries that contain date or time information, use ISO 8601 standard formats (CCYY-MM-DD and HH:MM), rather than "Mon DD CCYY" and "HHMM". -m modify (mung?) UUCP-style bang-paths - --uucp_mung + --uucp-mung This is for use when you have a mix of Internet-style domain addresses and UUCP-style bang-paths in the log. @@ -120,9 +118,9 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. --no_deferral_detail --no_reject_detail - These switches are depreciated in favour of - --bounce_detail, --deferral_detail and - --reject_detail, respectively. + These switches are deprecated in favour of + --bounce-detail, --deferral-detail and + --reject-detail, respectively. Suppresses the printing of the following detailed reports, respectively: @@ -134,7 +132,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. See also: "-u" and "-h" for further report-limiting options. - --no_no_msg_size + --no-no-msg-size Do not emit report on "Messages with no size data". @@ -147,21 +145,21 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. normally reported by pflogsumm as "Messages with no size data." - --no_smtpd_warnings + --no-smtpd-warnings - This switch is depreciated in favour of - smtpd_warning_detail + This switch is deprecated in favour of + smtpd-warning-detail On a busy mail server, say at an ISP, SMTPD warnings can result in a rather sizeable report. This option turns reporting them off. - --problems_first + --problems-first Emit "problems" reports (bounces, defers, warnings, etc.) before "normal" stats. - --rej_add_from + --rej-add-from For those reject reports that list IP addresses or host/domain names: append the email from address to each listing. (Does not apply to "Improper use of @@ -172,17 +170,17 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. note: headings for warning, fatal, and "master" messages will always be printed. - --reject_detail + --reject-detail Limit detailed smtpd reject, warn, hold and discard reports to the top . 0 to suppress entirely. - --smtp_detail + --smtp-detail Limit detailed smtp delivery reports to the top . 0 to suppress entirely. - --smtpd_stats + --smtpd-stats Generate smtpd connection statistics. @@ -190,14 +188,14 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. reports. For multiple-day reports: "per-hour" numbers are daily averages (reflected in the report heading). - --smtpd_warning_detail + --smtpd-warning-detail Limit detailed smtpd warnings reports to the top . 0 to suppress entirely. - --syslog_name=name + --syslog-name=name - Set syslog_name to look for for Postfix log entries. + Set syslog-name to look for for Postfix log entries. By default, pflogsumm looks for entries in logfiles with a syslog name of "postfix," the default. @@ -210,18 +208,18 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. -u top to display in user reports. 0 == none. - See also: "-h" and "--*_detail" options for further + See also: "-h" and "--*-detail" options for further report-limiting options. - --verbose_msg_detail + --verbose-msg-detail For the message deferral, bounce and reject summaries: display the full "reason", rather than a truncated one. Note: this can result in quite long lines in the report. - --verp_mung do "VERP" generated address (?) munging. Convert - --verp_mung=2 sender addresses of the form + --verp-mung do "VERP" generated address (?) munging. Convert + --verp-mung=2 sender addresses of the form "list-return-NN-someuser=some.dom@host.sender.dom" to "list-return-ID-someuser=some.dom@host.sender.dom" @@ -242,7 +240,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. --version Print program name and version and bail out. - --zero_fill "Zero-fill" certain arrays so reports come out with + --zero-fill "Zero-fill" certain arrays so reports come out with data in columns that that might otherwise be blank. =head1 RETURN VALUE @@ -336,9 +334,9 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. (rejected / (delivered + rejected + discarded)) * 100 - There are some issues with the use of --syslog_name. The problem is - that, even with $syslog_name set, Postfix will sometimes still log - things with "postfix" as the syslog_name. This is noted in + There are some issues with the use of --syslog-name. The problem is + that, even with Postfix' $syslog_name set, it will sometimes still + log things with "postfix" as the syslog_name. This is noted in /etc/postfix/sample-misc.cf: # Beware: a non-default syslog_name setting takes effect only @@ -367,7 +365,7 @@ Copyright (C) 1998-2010 by James S. Seymour, Release 1.1.3. =head1 REQUIREMENTS - For certain options (e.g.: --smtpd_stats), Pflogsumm requires the + For certain options (e.g.: --smtpd-stats), Pflogsumm requires the Date::Calc module, which can be obtained from CPAN at http://www.perl.com. @@ -404,7 +402,7 @@ eval { require Date::Calc }; my $hasDateCalc = $@ ? 0 : 1; my $mailqCmd = "mailq"; -my $release = "1.1.3"; +my $release = "1.1.4"; # Variables and constants used throughout pflogsumm use vars qw( @@ -488,55 +486,60 @@ for (0 .. 23) { $smtpdPerHr[$_] = [0,0,0]; } -$progName = "pflogsumm.pl"; +($progName = $0) =~ s/^.*\///; + $usageMsg = "usage: $progName -[eq] [-d ] [--detail ] - [--bounce_detail ] [--deferral_detail ] - [-h ] [-i|--ignore_case] [--iso_date_time] [--mailq] - [-m|--uucp_mung] [--no_bounce_detail] [--no_deferral_detail] - [--no_no_msg_size] [--no_reject_detail] [--no_smtpd_warnings] - [--problems_first] [--rej_add_from] [--reject_detail ] - [--smtp_detail ] [--smtpd_stats] - [--smtpd_warning_detail ] [--syslog_name=string] - [-u ] [--verbose_msg_detail] [--verp_mung[=]] - [--zero_fill] [file1 [filen]] + [--bounce-detail ] [--deferral-detail ] + [-h ] [-i|--ignore-case] [--iso-date-time] [--mailq] + [-m|--uucp-mung] [--no-no-msg-size] [--problems-first] + [--rej-add-from] [--reject-detail ] [--smtp-detail ] + [--smtpd-stats] [--smtpd-warning-detail ] + [--syslog-name=string] [-u ] [--verbose-msg-detail] + [--verp-mung[=]] [--zero-fill] [file1 [filen]] $progName --[version|help]"; +# Accept either "_"s or "-"s in --switches +foreach (@ARGV) { + last if($_ eq "--"); + tr/_/-/ if(/^--\w/); +} + # Some pre-inits for convenience $isoDateTime = 0; # Don't use ISO date/time formats GetOptions( - "bounce_detail=i" => \$opts{'bounceDetail'}, + "bounce-detail=i" => \$opts{'bounceDetail'}, "d=s" => \$opts{'d'}, - "deferral_detail=i" => \$opts{'deferralDetail'}, + "deferral-detail=i" => \$opts{'deferralDetail'}, "detail=i" => \$opts{'detail'}, "e" => \$opts{'e'}, "help" => \$opts{'help'}, "h=i" => \$opts{'h'}, - "ignore_case" => \$opts{'i'}, + "ignore-case" => \$opts{'i'}, "i" => \$opts{'i'}, - "iso_date_time" => \$isoDateTime, + "iso-date-time" => \$isoDateTime, "mailq" => \$opts{'mailq'}, "m" => \$opts{'m'}, - "no_bounce_detail" => \$opts{'noBounceDetail'}, - "no_deferral_detail" => \$opts{'noDeferralDetail'}, - "no_no_msg_size" => \$opts{'noNoMsgSize'}, - "no_reject_detail" => \$opts{'noRejectDetail'}, - "no_smtpd_warnings" => \$opts{'noSMTPDWarnings'}, - "problems_first" => \$opts{'pf'}, + "no-bounce-detail" => \$opts{'noBounceDetail'}, + "no-deferral-detail" => \$opts{'noDeferralDetail'}, + "no-no-msg-size" => \$opts{'noNoMsgSize'}, + "no-reject-detail" => \$opts{'noRejectDetail'}, + "no-smtpd-warnings" => \$opts{'noSMTPDWarnings'}, + "problems-first" => \$opts{'pf'}, "q" => \$opts{'q'}, - "rej_add_from" => \$opts{'rejAddFrom'}, - "reject_detail=i" => \$opts{'rejectDetail'}, - "smtp_detail=i" => \$opts{'smtpDetail'}, - "smtpd_stats" => \$opts{'smtpdStats'}, - "smtpd_warning_detail=i" => \$opts{'smtpdWarnDetail'}, - "syslog_name=s" => \$opts{'syslogName'}, + "rej-add-from" => \$opts{'rejAddFrom'}, + "reject-detail=i" => \$opts{'rejectDetail'}, + "smtp-detail=i" => \$opts{'smtpDetail'}, + "smtpd-stats" => \$opts{'smtpdStats'}, + "smtpd-warning-detail=i" => \$opts{'smtpdWarnDetail'}, + "syslog-name=s" => \$opts{'syslogName'}, "u=i" => \$opts{'u'}, - "uucp_mung" => \$opts{'m'}, - "verbose_msg_detail" => \$opts{'verbMsgDetail'}, - "verp_mung:i" => \$opts{'verpMung'}, + "uucp-mung" => \$opts{'m'}, + "verbose-msg-detail" => \$opts{'verbMsgDetail'}, + "verp-mung:i" => \$opts{'verpMung'}, "version" => \$opts{'version'}, - "zero_fill" => \$opts{'zeroFill'} + "zero-fill" => \$opts{'zeroFill'} ) || die "$usageMsg\n"; # internally: 0 == none, undefined == -1 == all @@ -551,19 +554,19 @@ $opts{'rejectDetail'} = -1 unless(defined($opts{'rejectDetail'})); # These go away eventually if(defined($opts{'noBounceDetail'})) { $opts{'bounceDetail'} = 0; - warn "$progName: \"no_bounce_detail\" is depreciated, use \"bounce_detail=0\" instead\n" + warn "$progName: \"no_bounce_detail\" is deprecated, use \"bounce-detail=0\" instead\n" } if(defined($opts{'noDeferralDetail'})) { $opts{'deferralDetail'} = 0; - warn "$progName: \"no_deferral_detail\" is depreciated, use \"deferral_detail=0\" instead\n" + warn "$progName: \"no_deferral_detail\" is deprecated, use \"deferral-detail=0\" instead\n" } if(defined($opts{'noRejectDetail'})) { $opts{'rejectDetail'} = 0; - warn "$progName: \"no_reject_detail\" is depreciated, use \"reject_detail=0\" instead\n" + warn "$progName: \"no_reject_detail\" is deprecated, use \"reject-detail=0\" instead\n" } if(defined($opts{'noSMTPDWarnings'})) { $opts{'smtpdWarnDetail'} = 0; - warn "$progName: \"no_smtpd_warnings\" is depreciated, use \"smtpd_warning_detail=0\" instead\n" + warn "$progName: \"no_smtpd_warnings\" is deprecated, use \"smtpd-warning-detail=0\" instead\n" } # If --detail was specified, set anything that's not enumerated to it @@ -595,11 +598,11 @@ if($hasDateCalc) { *Delta_DHMS = *Date::Calc::Delta_DHMS; } elsif(defined($opts{'smtpdStats'})) { - # If user specified --smtpd_stats but doesn't have Date::Calc + # If user specified --smtpd-stats but doesn't have Date::Calc # installed, die with friendly help message. die <) { } else { # RFC 3339 timestamp format? next unless((($msgYr, $msgMon, $msgDay, $msgHr, $msgMin, $msgSec, $logRmdr) = - /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:[\+\-](?:\d{2}):(?:\d{2})|Z) \S+ (.+)$/o) == 10); + /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:[\+\-](?:\d{2}):(?:\d{2})|Z) \S+ (.+)$/o) == 10); # RFC 3339 months start at "1", we index from 0 --$msgMon; } - unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)/([^\[:]*).*?: ([^:\s]+)#o) == 2 || + unless((($cmd, $qid) = $logRmdr =~ m#^(?:postfix|$syslogName)(?:/(?:smtps|submission))?/([^\[:]*).*?: ([^:\s]+)#o) == 2 || (($cmd, $qid) = $logRmdr =~ m#^((?:postfix)(?:-script)?)(?:\[\d+\])?: ([^:\s]+)#o) == 2) { #print UNPROCD "$_"; @@ -719,6 +722,8 @@ while(<>) { ++${$msgsPerDay{$revMsgDateStr}}[0]; ++$msgsRcvd; $rcvdMsg{$qid} = gimme_domain($1); # Whence it came + # DEBUG DEBUG DEBUG + #print STDERR "Received: $qid\n"; } elsif(my($rejSubTyp) = $logRmdr =~ /\[\d+\]: \w+: (reject(?:_warning)?|hold|discard): /o) { if($rejSubTyp eq 'reject') { proc_smtpd_reject($logRmdr, \%rejects, \$msgsRjctd, @@ -845,6 +850,8 @@ while(<>) { ++$dlvPerHr[$msgHr]; ++${$msgsPerDay{$revMsgDateStr}}[1]; ++$msgsDlvrd; + # DEBUG DEBUG DEBUG + #print STDERR "Delivered: $qid\n"; if($msgSizes{$qid}) { ${$recipDom{$domAddr}}[$msgSizeI] += $msgSizes{$qid}; ${$recipUser{$addr}}[$msgSizeI] += $msgSizes{$qid}; @@ -1421,7 +1428,7 @@ sub normalize_host { if((my @octets = ($norm1 =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/o)) == 4) { # Dotted-quad IP address - return(pack('C4', @octets)); + return(pack('U4', @octets)); } else { # Possibly hostname or user@dom.ain return(join( '', map { lc $_ } reverse split /[.@]/, $norm1 ));