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 )