From: Steve Campbell Date: Mon, 20 Dec 2004 13:12:32 +0000 (+0000) Subject: 1.34 - allow eximstats to parse syslog lines as well as mainlog lines X-Git-Tag: exim-4_50~74 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/8974000dc980f267a8ef178cfd2d79554853a04e 1.34 - allow eximstats to parse syslog lines as well as mainlog lines 1.35 - bugfix such that pie charts by volume are generated correctly --- diff --git a/src/src/eximstats.src b/src/src/eximstats.src index 200f9d524..533098459 100644 --- a/src/src/eximstats.src +++ b/src/src/eximstats.src @@ -1,5 +1,5 @@ #!PERL_COMMAND -w -# $Cambridge: exim/src/src/eximstats.src,v 1.2 2004/11/24 14:43:57 ph10 Exp $ +# $Cambridge: exim/src/src/eximstats.src,v 1.3 2004/12/20 13:12:32 steve Exp $ # Copyright (c) 2001 University of Cambridge. # See the file NOTICE for conditions of use and distribution. @@ -187,11 +187,17 @@ # 2004-07-15 V1.33 Steve Campbell # Documentation update - I've converted the subroutine # documentation from POD to comments. +# +# 2004-12-10 V1.34 Steve Campbell +# Eximstats can now parse syslog lines as well as mainlog lines. +# +# 2004-12-20 V1.35 Andreas Metzler +# Pie charts by volume were actually generated by count. Fixed. =head1 NAME -eximstats - generates statistics from Exim mainlog files. +eximstats - generates statistics from Exim mainlog or syslog files. =head1 SYNOPSIS @@ -360,7 +366,7 @@ title! =head1 DESCRIPTION -Eximstats parses exim mainlog files and outputs a statistical +Eximstats parses exim mainlog and syslog files to output a statistical analysis of the messages processed. By default, a text analysis is generated, but you can request an html analysis by using the B<-html> flag. See the help (B<-help>) to learn @@ -413,7 +419,7 @@ use vars qw($COLUMN_WIDTHS); @days_per_month = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); $gig = 1024 * 1024 * 1024; -$VERSION = '1.33'; +$VERSION = '1.35'; # How much space do we allow for the Hosts/Domains/Emails/Edomains column headers? $COLUMN_WIDTHS = 8; @@ -1081,7 +1087,11 @@ else { @chartdatanames = (); @chartdatavals = (); $chartotherval = 0; +my $use_gig = 0; foreach $key (top_n_sort($topcount,$m_data_gigs,$m_data,$m_count)) { + if ($$m_data_gigs{$key}) { + $use_gig = 1; + } if ($html) { $htmlkey = $key; $htmlkey =~ s/>/\>\;/g; @@ -1092,16 +1102,22 @@ foreach $key (top_n_sort($topcount,$m_data_gigs,$m_data,$m_count)) { printf($format, $$m_count{$key}, volume_rounded($$m_data{$key},$$m_data_gigs{$key}), $key); } - if (scalar @chartdatanames < $ntopchart) - { - push(@chartdatanames, $key); - push(@chartdatavals, $$m_count{$key}); + if (scalar @chartdatanames < $ntopchart) { + if ($use_gig) { + if ($$m_data_gigs{$key}) { + push(@chartdatanames, $key); + push(@chartdatavals, $$m_data_gigs{$key}); + } } - else - { - $chartotherval += $$m_count{$key}; + else { + push(@chartdatanames, $key); + push(@chartdatavals, $$m_data{$key}); } } + else { + $chartotherval += ($use_gig) ? $$m_data_gigs{$key} : $$m_data{$key}; + } +} push(@chartdatanames, "Other"); push(@chartdatavals, $chartotherval); @@ -1117,7 +1133,7 @@ if ($html) { my $graph = GD::Graph::pie->new(300, 300); $graph->set( x_label => 'Name', - y_label => 'Volume', + y_label => 'Volume' , title => 'By Volume', ); my $gd = $graph->plot(\@data) or warn($graph->error); @@ -1288,8 +1304,8 @@ Usage: eximstats [Options] mainlog1 mainlog2 ... > report.txt eximstats -merge [Options] report.1.txt report.2.txt ... > weekly_rep.txt eximstats -merge -html [Options] report.1.html ... > weekly_rep.html -Parses exim mainlog files and generates a statistical analysis of -the messages processed. Valid options are: +Parses exim mainlog or syslog files and generates a statistical analysis +of the messages processed. Valid options are: -h histogram divisions per hour. The default is 1, and 0 suppresses histograms. Other valid values are: @@ -1356,10 +1372,13 @@ sub generate_parser { my($ip,$host,$email,$edomain,$domain,$thissize,$size,$old,$new); my($tod,$m_hour,$m_min,$id,$flag); while (<$fh>) { - next if length($_) < 38; - # PH/FANF - # next unless /^(\\d{4}\\-\\d\\d-\\d\\d\\s(\\d\\d):(\\d\\d):\\d\\d)/; + # Convert syslog lines to mainlog format. + if (! /^\\d{4}/) { + next unless s/^.*? exim\\b.*?: //; + } + + next if length($_) < 38; next unless /^(\\d{4}\\-\\d\\d-\\d\\d\\s(\\d\\d):(\\d\\d):\\d\\d( [-+]\\d\\d\\d\\d)?)/o; ($tod,$m_hour,$m_min) = ($1,$2,$3); @@ -2152,7 +2171,7 @@ sub parse_old_eximstat_reports { # Fill in $report_totals{Received|Delivered}{Volume|Messages|Hosts|Domains|...|Delayed|DelayedPercent|Failed|FailedPercent} my(@fields); while (<$fh>) { - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. s/At least one addr//g; #Another part of the HTML output we don't want. # TOTAL Volume Messages Hosts Domains Delayed Failed @@ -2180,7 +2199,7 @@ sub parse_old_eximstat_reports { while (<$fh>) { last if (/Total/); } #Wait until we get the table headers. while (<$fh>) { print STDERR "Parsing $_" if $debug; - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. if (/^\s*(.*?)\s+(\d+)\s*$/) { $report_totals{patterns}{$1} = {} unless (defined $report_totals{patterns}{$1}); add_to_totals($report_totals{patterns}{$1},['Total'],$2); @@ -2200,7 +2219,7 @@ sub parse_old_eximstat_reports { while (<$fh>) { last if (/Volume/); } #Wait until we get the table headers. while (<$fh>) { print STDERR "Parsing $_" if $debug; - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. if (/(\S+)\s+(\d+\S*\s+\d+)/) { $report_totals{transport}{$1} = {} unless (defined $report_totals{transport}{$1}); add_to_totals($report_totals{transport}{$1},['Volume','Messages'],$2); @@ -2250,7 +2269,7 @@ sub parse_old_eximstat_reports { my $bin_aref = ($1 eq 'all messages') ? \@queue_bin : \@remote_queue_bin; my $reached_table = 0; while (<$fh>) { - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. $reached_table = 1 if (/^\s*Under/); next unless $reached_table; my $previous_seconds_on_queue = 0; @@ -2357,7 +2376,7 @@ sub parse_old_eximstat_reports { my $reached_table = 0; while (<$fh>) { - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. $reached_table = 1 if (/^\s*\d/); next unless $reached_table; if (/^\s*(\d+)\s+(\S+)\s*(.*?)\s*$/) { @@ -2433,7 +2452,7 @@ sub parse_old_eximstat_reports { next unless $reached_table; s/^
  • (\d+) -/$1/; #Convert an HTML line to a text line. - $_ = html2txt($_); #Convert general HTML markup to text. + $_ = html2txt($_); #Convert general HTML markup to text. if (/\t\s*(.*)/) { $error .= ' ' . $1; #Join a multiline error. @@ -2658,7 +2677,7 @@ while (@ARGV > 0 && substr($ARGV[0], 0, 1) eq '-') } elsif ($ARGV[0] =~ /^-chartdir$/) { $chartdir = $ARGV[1]; shift; $charts_option_specified = 1; } elsif ($ARGV[0] =~ /^-chartrel$/) { $chartrel = $ARGV[1]; shift; $charts_option_specified = 1; } - elsif ($ARGV[0] =~ /^-cache$/) { } #Not currently used. + elsif ($ARGV[0] =~ /^-cache$/) { } #Not currently used. elsif ($ARGV[0] =~ /^-byhost$/) { $do_sender{Host} = 1 } elsif ($ARGV[0] =~ /^-bydomain$/) { $do_sender{Domain} = 1 } elsif ($ARGV[0] =~ /^-byemail$/) { $do_sender{Email} = 1 }