]> git.sven.stormbind.net Git - sven/pflogsumm.git/blobdiff - pflogsumm.pl
releasing version 1.1.4-1
[sven/pflogsumm.git] / pflogsumm.pl
index 12b703de1f201ab0bac1ec7bd5ac2932476bf274..a5f93efd0dd29cc9765df4fc2ee5f3b0c324b3fb 100755 (executable)
@@ -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 <today|yesterday>] [--detail <cnt>]
-       [--bounce_detail <cnt>] [--deferral_detail <cnt>]
-       [-h <cnt>] [-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 <cnt>]
-       [--smtp_detail <cnt>] [--smtpd_stats]
-       [--smtpd_warning_detail <cnt>] [--syslog_name=string]
-       [-u <cnt>] [--verbose_msg_detail] [--verp_mung[=<n>]]
-       [--zero_fill] [file1 [filen]]
+       [--bounce-detail <cnt>] [--deferral-detail <cnt>]
+       [-h <cnt>] [-i|--ignore-case] [--iso-date-time] [--mailq]
+       [-m|--uucp-mung] [--no-no-msg-size] [--problems-first]
+       [--rej-add-from] [--reject-detail <cnt>] [--smtp-detail <cnt>]
+       [--smtpd-stats] [--smtpd-warning-detail <cnt>]
+       [--syslog-name=string] [-u <cnt>] [--verbose-msg-detail]
+       [--verp-mung[=<n>]] [--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 <cnt>
+    --bounce-detail <cnt>
 
                   Limit detailed bounce reports to the top <cnt>.  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 <cnt>
+    --deferral-detail <cnt>
 
                   Limit detailed deferral reports to the top <cnt>.  0
                   to suppress entirely.
 
     --detail <cnt>
     
-                   Sets all --*_detail, -h and -u to <cnt>.  Is
+                   Sets all --*-detail, -h and -u to <cnt>.  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 <cnt>
+    --reject-detail <cnt>
 
                   Limit detailed smtpd reject, warn, hold and discard
                   reports to the top <cnt>.  0 to suppress entirely.
 
-    --smtp_detail <cnt>
+    --smtp-detail <cnt>
 
                   Limit detailed smtp delivery reports to the top <cnt>.
                   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 <cnt>
+    --smtpd-warning-detail <cnt>
 
                   Limit detailed smtpd warnings reports to the top <cnt>.
                   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 <cnt>       top <cnt> 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 <today|yesterday>] [--detail <cnt>]
-       [--bounce_detail <cnt>] [--deferral_detail <cnt>]
-       [-h <cnt>] [-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 <cnt>]
-       [--smtp_detail <cnt>] [--smtpd_stats]
-       [--smtpd_warning_detail <cnt>] [--syslog_name=string]
-       [-u <cnt>] [--verbose_msg_detail] [--verp_mung[=<n>]]
-       [--zero_fill] [file1 [filen]]
+       [--bounce-detail <cnt>] [--deferral-detail <cnt>]
+       [-h <cnt>] [-i|--ignore-case] [--iso-date-time] [--mailq]
+       [-m|--uucp-mung] [--no-no-msg-size] [--problems-first]
+       [--rej-add-from] [--reject-detail <cnt>] [--smtp-detail <cnt>]
+       [--smtpd-stats] [--smtpd-warning-detail <cnt>]
+       [--syslog-name=string] [-u <cnt>] [--verbose-msg-detail]
+       [--verp-mung[=<n>]] [--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 <<End_Of_HELP_DATE_CALC;
 
-The option "--smtpd_stats" does calculations that require the
+The option "--smtpd-stats" does calculations that require the
 Date::Calc Perl module, but you don't have this module installed.
 If you want to use this extended functionality of Pflogsumm, you
 will have to install this module.  If you have root privileges
@@ -631,12 +634,12 @@ while(<>) {
     } 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 ));