Log-Saftpresse
view release on metacpan or search on metacpan
lib/Log/Saftpresse/CountersOutput/Pflogsumm.pm view on Meta::CPAN
} else { # string
@yaxis = sort { $row->{$b} cmp $row->{$a} } keys %$row;
}
if( $limit > 0 && scalar @yaxis > $limit ) { @yaxis = @yaxis[0 .. ($limit-1) ] };
} else { # simple sort by key
my @all_keys = map { keys %$_ } @hashes;
my %uniq = map { $_ => 1 } @all_keys;
if( $sort eq 'decimal' ) {
@yaxis = sort { $a <=> $b } keys %uniq;
} else { # string
@yaxis = sort { $a cmp $b } keys %uniq;
}
}
foreach my $row ( @yaxis ) {
$self->print_table_row( $row, $lw, $cw,
map { $_->{$row} } @hashes );
}
print "\n";
return;
}
sub print_table_row {
my ( $self, $ylabel, $lw, $cw, @values ) = @_;
printf("%".$lw."s", $ylabel);
foreach my $value ( @values ) {
if( ! defined $value ) { $value = '-'; }
printf(" %".$cw."s", $value);
}
print "\n";
return;
}
sub print_table_header {
my ( $self, $legend, $lw, $cw, @headers ) = @_;
$self->print_table_row( $legend, $lw, $cw, @headers);
my $width = $lw + (( $cw + 1 ) * scalar @headers);
print( ("-" x $width)."\n");
return;
}
sub print_domain_summaries {
my ( $self, $cnt ) = @_;
my $top_cnt = $self->top_domains_cnt;
my $pf_cnt = $cnt->{'Postfix'};
foreach my $table ( 'sent', 'recieved' ) {
print_subsect_title("Host/Domain Summary: Message Delivery (top $top_cnt $table)");
$self->print_table_from_hashes( 'host/domain',
[ 'sent cnt', 'decimal', $top_cnt ], 25, 10,
[ 'sent cnt', $pf_cnt->get_node($table, 'by_domain') ],
[ 'bytes', $pf_cnt->get_node($table, 'size', 'by_domain') ],
$table eq 'sent' ? (
# TODO
#[ 'defers', $delivered->get_node('busy', 'per_day') ],
[ 'avg delay', $self->hash_calc_avg( 2,
$pf_cnt->get_node('sent', $table, 'delay', 'by_domain'),
$pf_cnt->get_node('sent', $table, 'by_domain'),
), ],
[ 'max. delay', $pf_cnt->get_node('sent', $table, 'max_delay', 'by_domain'), ],
) : (),
);
}
return;
}
sub print_smtpd_summaries {
my ( $self, $cnt ) = @_;
my $params = {
'day' => [ 'Per-Day', 'per_day', 'string', 15 ],
'hour' => [ 'Per-Hour', 'per_hr', 'decimal', 15 ],
'domain' => [ 'Per-Hour', 'per_domain', [ 'connections', 'decimal', 20 ], 25 ],
};
foreach my $table ( 'day', 'hour', 'domain' ) {
my ( $title, $key, $sort, $len ) = @{$params->{ $table }};
print_subsect_title("$title SMTPD Connection Summary");
$self->print_table_from_hashes( $table, $sort, $len, 10,
[ 'connections', $cnt->get_node('conn', $key) ],
[ 'time conn.', $cnt->get_node('conn', 'busy', $key) ],
[ 'avg./conn.', $self->hash_calc_avg( 2,
$cnt->get_node('conn', 'busy', $key),
$cnt->get_node('conn', $key),
), ],
[ 'max. time', $cnt->get_node('conn', 'busy', 'max_'.$key ), ],
);
}
return;
}
sub print_traffic_summaries {
my ( $self, $cnt ) = @_;
my $pf_cnt = $cnt->{'Postfix'};
my $params = {
'day' => [ 'Per-Day', 'per_day', 'string' ],
'hour' => [ 'Per-Hour', 'per_hr', 'decimal' ],
};
foreach my $table ('day', 'hour') {
my ( $title, $key, $sort ) = @{$params->{ $table }};
print_subsect_title( "$title Traffic Summary" );
$self->print_table_from_hashes( $table, $sort, 15, 10,
[ 'recieved', $pf_cnt->get_node('incoming', $key) ],
[ 'delivered', $pf_cnt->get_node('sent', $key) ],
[ 'deffered', $pf_cnt->get_node('deferred', $key), ],
[ 'bounced', $pf_cnt->get_node('bounced', $key), ],
[ 'rejected', $pf_cnt->get_node('reject', $key) ],
);
}
return;
}
sub print_totals {
my ( $self, $cnt ) = @_;
my $pf_cnt = $cnt->{'Postfix'};
my $smtpdConnCnt = 0;
# PostfixRejects
my $msgsRjctd = $pf_cnt->get_value_or_zero('reject', 'total', 'reject');
my $msgsDscrdd = $pf_cnt->get_value_or_zero('reject', 'total', 'discard');
my $msgsWrnd = $pf_cnt->get_value_or_zero('reject', 'total', 'warning');
my $msgsHld = $pf_cnt->get_value_or_zero('reject', 'total', 'hold');
# PostfixRecieved
my $msgsRcvd = $pf_cnt->get_value_or_zero('incoming', 'total');
my $msgsDlvrd = $pf_cnt->get_value_or_zero('sent', 'total');
my $msgsDfrd = $pf_cnt->get_value_or_zero('deferred', 'total');
my $msgsFwdd = $pf_cnt->get_value_or_zero('forwarded');
my $msgsBncd = $pf_cnt->get_value_or_zero('bounced', 'total');
my $sizeRcvd = $pf_cnt->get_value_or_zero('recieved', 'size', 'total');
my $sizeDlvrd = $pf_cnt->get_value_or_zero('sent', 'size', 'total');
my $sendgUserCnt = $pf_cnt->get_key_count('recieved', 'by_sender');
my $sendgDomCnt = $pf_cnt->get_key_count('recieved', 'by_domain');
my $recipUserCnt =$pf_cnt->get_key_count('sent', 'by_rcpt');
my $recipDomCnt = $pf_cnt->get_key_count('sent', 'by_domain');
# Calculate percentage of messages rejected and discarded
my $msgsRjctdPct = 0;
my $msgsDscrddPct = 0;
if(my $msgsTotal = $msgsDlvrd + $msgsRjctd + $msgsDscrdd) {
$msgsRjctdPct = int(($msgsRjctd/$msgsTotal) * 100);
$msgsDscrddPct = int(($msgsDscrdd/$msgsTotal) * 100);
}
print "Postfix log summaries generated on ".Time::Piece->new->ymd."\n";
print_subsect_title("Grand Totals");
print "messages\n\n";
printf " %6d%s received\n", adj_int_units($msgsRcvd);
printf " %6d%s delivered\n", adj_int_units($msgsDlvrd);
printf " %6d%s forwarded\n", adj_int_units($msgsFwdd);
printf " %6d%s deferred", adj_int_units($msgsDfrd);
#printf " (%d%s deferrals)", adj_int_units($msgsDfrdCnt) if($msgsDfrdCnt);
print "\n";
printf " %6d%s bounced\n", adj_int_units($msgsBncd);
printf " %6d%s rejected (%d%%)\n", adj_int_units($msgsRjctd), $msgsRjctdPct;
printf " %6d%s reject warnings\n", adj_int_units($msgsWrnd);
printf " %6d%s held\n", adj_int_units($msgsHld);
printf " %6d%s discarded (%d%%)\n", adj_int_units($msgsDscrdd), $msgsDscrddPct;
print "\n";
printf " %6d%s bytes received\n", adj_int_units($sizeRcvd);
printf " %6d%s bytes delivered\n", adj_int_units($sizeDlvrd);
printf " %6d%s senders\n", adj_int_units($sendgUserCnt);
printf " %6d%s sending hosts/domains\n", adj_int_units($sendgDomCnt);
printf " %6d%s recipients\n", adj_int_units($recipUserCnt);
printf " %6d%s recipient hosts/domains\n", adj_int_units($recipDomCnt);
print "\n";
return;
}
sub print_smtpd_stats {
my ( $self, $cnt ) = @_;
my $smtpdConnCnt = $cnt->get_value_or_zero('conn', 'total');
print "\nsmtpd\n\n";
printf " %6d%s connections\n",
adj_int_units($smtpdConnCnt);
printf " %6d%s hosts/domains\n",
adj_int_units(int(keys %{$cnt->get_node('conn', 'per_domain')}));
printf " %6d avg. connect time (seconds)\n",
$smtpdConnCnt > 0 ?
($cnt->get_value_or_zero('conn', 'busy', 'total')
/ $smtpdConnCnt ) + .5
: 0;
{
my ($sec, $min, $hr) = get_smh($cnt->get_value_or_zero('conn', 'busy', 'total'));
printf " %2d:%02d:%02d total connect time\n",
$hr, $min, $sec;
}
return;
}
sub print_problems_reports {
my ( $self, $cnt ) = @_;
if($self->deferral_detail != 0) {
$self->print_nested_hash( $cnt->get_node('deferred'),
"message deferral detail",
$self->deferral_detail );
}
if($self->bounce_detail != 0) {
$self->print_nested_hash( $cnt->get_node('bounced'),
"message bounce detail (by relay)",
$self->bounce_detail );
}
if($self->reject_detail != 0) {
foreach my $key ( 'reject', 'warning', 'hold', 'discard') {
$self->print_nested_hash($cnt->get_node('reject', $key),
"message $key detail",
$self->reject_detail );
}
}
if( my $smtp_cnt = $cnt->{'PostfixSmtp'} ) {
my $messages = $smtp_cnt->get_node('messages');
if( defined $messages ) {
$self->print_nested_hash($messages, "smtp delivery failures",
$self->smtp_detail );
}
}
if( my $msg_cnt = $cnt->{'PostfixMessages'} ) {
if($self->smtpd_warn_detail != 0) {
$self->print_nested_hash($msg_cnt->get_node('warning'),
"Warnings",
$self->smtpd_warn_detail );
}
$self->print_nested_hash($msg_cnt->get_node('fatal'),
"Fatal Errors", 0 );
$self->print_nested_hash($msg_cnt->get_node('panic'),
"Panics", 0 );
$self->print_hash_by_cnt_vals($msg_cnt->get_node('master'),
"Master daemon messages", 0 );
}
}
sub print_tls_stats {
my ( $self, $cnt ) = @_;
my $smtpdConnCnt;
if( defined $cnt->get_node('conn') ) {
$smtpdConnCnt = $cnt->get_value_or_zero('conn', 'total');
}
my $msgs_rcvd = $cnt->get_value_or_zero('incoming', 'total');
my $msgs_sent = $cnt->get_value_or_zero('sent', 'total');
print_subsect_title("TLS Statistics");
( run in 0.576 second using v1.01-cache-2.11-cpan-97f6503c9c8 )