|
Packit |
667938 |
#!/usr/bin/perl -w
|
|
Packit |
667938 |
|
|
Packit |
667938 |
# Changes in revision 1.9
|
|
Packit |
667938 |
|
|
Packit |
667938 |
# Added an option for --range, which may be "current" for month-to-date or "previous" for last month
|
|
Packit |
667938 |
# Changed default date range to 00:00:00 on 1st of month to 23:59:59 at end of month
|
|
Packit |
667938 |
# Changed the default units to MB, more relevant to non-datacentre users :-)
|
|
Packit |
667938 |
# Added the option for units=GB, to allow for previous behaviour of this script
|
|
Packit |
667938 |
# Changed default minimum to 0, to report any info that is available by default
|
|
Packit |
667938 |
# Updated help section with the above changes, fixed a couple of typos
|
|
Packit |
667938 |
|
|
Packit |
667938 |
|
|
Packit |
667938 |
use strict;
|
|
Packit |
667938 |
use Getopt::Long;
|
|
Packit |
667938 |
use Pod::Usage;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
BEGIN {
|
|
Packit |
667938 |
# Automatic OS detection ... do NOT touch
|
|
Packit |
667938 |
if ( $^O =~ /^(?:(ms)?(dos|win(32|nt)?))/i ) {
|
|
Packit |
667938 |
$main::OS = 'NT';
|
|
Packit |
667938 |
$main::SL = '\\';
|
|
Packit |
667938 |
$main::PS = ';';
|
|
Packit |
667938 |
} elsif ( $^O =~ /^VMS$/i ) {
|
|
Packit |
667938 |
$main::OS = 'VMS';
|
|
Packit |
667938 |
$main::SL = '.';
|
|
Packit |
667938 |
$main::PS = ':';
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
$main::OS = 'UNIX';
|
|
Packit |
667938 |
$main::SL = '/';
|
|
Packit |
667938 |
$main::PS = ':';
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
use FindBin;
|
|
Packit |
667938 |
use lib "${FindBin::Bin}";
|
|
Packit |
667938 |
use lib "${FindBin::Bin}${main::SL}..${main::SL}lib${main::SL}mrtg2";
|
|
Packit |
667938 |
use MRTG_lib "2.090017";
|
|
Packit |
667938 |
use POSIX qw(mktime);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
'$Revision: 1.9 $ ' =~ /Revision: (\S*)/;
|
|
Packit |
667938 |
my $Revision = $1;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
my $sendmail = "/usr/lib/sendmail";
|
|
Packit |
667938 |
$sendmail = "/usr/sbin/sendmail" if -x "/usr/sbin/sendmail";
|
|
Packit |
667938 |
|
|
Packit |
667938 |
# main loop
|
|
Packit |
667938 |
my %opt = (
|
|
Packit |
667938 |
'catch' => '(?:description|port name):\s*\s*([^<\s]+[^<]*?)\s*
|
|
Packit |
667938 |
# 'catch' => 'td>\s*([^<\s]+COLO[^<]*?)\s*
|
|
Packit |
667938 |
'min' => 0,
|
|
Packit |
667938 |
'range' => "previous",
|
|
Packit |
667938 |
'units' => "MB"
|
|
Packit |
667938 |
);
|
|
Packit |
667938 |
sub walklog ($$$$$);
|
|
Packit |
667938 |
sub sumlog($$$);
|
|
Packit |
667938 |
sub mailout($$);
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub main()
|
|
Packit |
667938 |
{
|
|
Packit |
667938 |
# parse options
|
|
Packit |
667938 |
GetOptions(\%opt, 'min=i','help|h', 'catch=s', 'email=s','version','range=s','units=s') or exit(1);
|
|
Packit |
667938 |
if($opt{help}) { pod2usage(1) }
|
|
Packit |
667938 |
if($opt{man}) { pod2usage(-exitstatus => 0, -verbose => 2) }
|
|
Packit |
667938 |
if($opt{version}) { print "mrtg-traffic-sum $Revision\n"; exit(0) }
|
|
Packit |
667938 |
my $cfgfile = shift @ARGV;
|
|
Packit |
667938 |
pod2usage(1) unless $cfgfile and -r $cfgfile;
|
|
Packit |
667938 |
my %rcfg;
|
|
Packit |
667938 |
my %cfg;
|
|
Packit |
667938 |
my @routers;
|
|
Packit |
667938 |
my @target;
|
|
Packit |
667938 |
my $report = "Subject: Traffic total for '$cfgfile' ($Revision) ";
|
|
Packit |
667938 |
readcfg($cfgfile,\@routers,\%cfg,\%rcfg);
|
|
Packit |
667938 |
cfgcheck(\@routers, \%cfg, \%rcfg, \@target);
|
|
Packit |
667938 |
walklog \@routers, \%cfg, \%rcfg,\$report,\%opt;
|
|
Packit |
667938 |
if ($opt{email}) {
|
|
Packit |
667938 |
mailout \$report,$opt{email};
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
print $report;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
main;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub walklog ($$$$$){
|
|
Packit |
667938 |
my $routers = shift;
|
|
Packit |
667938 |
my $cfg = shift;
|
|
Packit |
667938 |
my $rcfg = shift;
|
|
Packit |
667938 |
my $report = shift;
|
|
Packit |
667938 |
my $opt = shift;
|
|
Packit |
667938 |
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(time);
|
|
Packit |
667938 |
my $start = mktime(0, 0, 0, 1, $mon-1, $year, 0, 0, 0);
|
|
Packit |
667938 |
my $end = mktime(0, 0, 0, 1, $mon, $year, 0, 0, 0)-1;
|
|
Packit |
667938 |
if ($opt{range} eq "previous") {
|
|
Packit |
667938 |
$start = mktime(0, 0, 0, 1, $mon-1, $year, 0, 0, 0);
|
|
Packit |
667938 |
$end = mktime(0, 0, 0, 1, $mon, $year, 0, 0, 0)-1;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
if ($opt{range} eq "current") {
|
|
Packit |
667938 |
$start = mktime(0, 0, 0, 1, $mon, $year, 0, 0, 0);
|
|
Packit |
667938 |
$end = mktime(0, 0, 0, 1, $mon+1, $year, 0, 0, 0)-1;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
my($m,$y) = (localtime($start))[4,5];
|
|
Packit |
667938 |
$y += 1900;
|
|
Packit |
667938 |
$m ++;
|
|
Packit |
667938 |
$$report .= sprintf "%04d/%02d\n\n", $y,$m;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
$$report .= "Start: ".localtime($start)."\n";
|
|
Packit |
667938 |
$$report .= "End: ".localtime($end)."\n";
|
|
Packit |
667938 |
if ($opt{'units'} eq "GB") {
|
|
Packit |
667938 |
$$report .= sprintf "%-40s %15s\n","Interface","In+Out in GB";
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
$$report .= sprintf "%-40s %15s\n","Interface","In+Out in MB";
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
$$report .= ("-" x 78)."\n";
|
|
Packit |
667938 |
foreach my $r (@$routers) {
|
|
Packit |
667938 |
my $label;
|
|
Packit |
667938 |
if ($rcfg->{pagetop}{$r} =~ /$opt{catch}/i ) {
|
|
Packit |
667938 |
$label = $1;
|
|
Packit |
667938 |
$label .= " $2" if $2;
|
|
Packit |
667938 |
my ($in,$out) = sumlog $cfg->{logdir}.$rcfg->{directory}{$r}."$r.log",$start,$end;
|
|
Packit |
667938 |
my $sum = ($in+$out)/(10**6);
|
|
Packit |
667938 |
if ($opt{'units'} eq "GB") {
|
|
Packit |
667938 |
$sum = ($in+$out)/(10**9);
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
$sum = ($in+$out)/(10**6);
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
next if $sum < $opt{'min'};
|
|
Packit |
667938 |
$$report .= sprintf "%-40s %15.0f\n",$label,$sum;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub sumlog ($$$) {
|
|
Packit |
667938 |
my $log = shift;
|
|
Packit |
667938 |
my $start = shift;
|
|
Packit |
667938 |
my $end = shift;
|
|
Packit |
667938 |
my $in = 0.0;
|
|
Packit |
667938 |
my $out = 0.0;
|
|
Packit |
667938 |
if (open L, "<",$log){
|
|
Packit |
667938 |
my @this=($end+1,0,0);
|
|
Packit |
667938 |
my @prev;
|
|
Packit |
667938 |
while (<L>) {
|
|
Packit |
667938 |
chomp;
|
|
Packit |
667938 |
@prev = @this;
|
|
Packit |
667938 |
@this = (split /\s+/)[0,1,2];
|
|
Packit |
667938 |
|
|
Packit |
667938 |
if ($prev[0] <= $end) {
|
|
Packit |
667938 |
my $diff = $prev[0] - $this[0];
|
|
Packit |
667938 |
$in += $diff * $prev[1];
|
|
Packit |
667938 |
$out += $diff * $prev[2];
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
last if $this[0] <= $start;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
close L;
|
|
Packit |
667938 |
} else {
|
|
Packit |
667938 |
warn "WARN Skipping $log\n";
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
return $in,$out;
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
|
|
Packit |
667938 |
sub mailout ($$) {
|
|
Packit |
667938 |
my $data = shift;
|
|
Packit |
667938 |
my $rec = shift;
|
|
Packit |
667938 |
open S, "|-" or exec $sendmail,'-f',$rec,$rec;
|
|
Packit |
667938 |
print S <
|
|
Packit |
667938 |
From: $rec
|
|
Packit |
667938 |
To: $rec
|
|
Packit |
667938 |
$$data
|
|
Packit |
667938 |
MESSAGE
|
|
Packit |
667938 |
close S;
|
|
Packit |
667938 |
|
|
Packit |
667938 |
}
|
|
Packit |
667938 |
1
|
|
Packit |
667938 |
|
|
Packit |
667938 |
__END__
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 NAME
|
|
Packit |
667938 |
|
|
Packit |
667938 |
mrtg-traffic-sum - Builds monthly traffic summary from mrtg log files
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 SYNOPSIS
|
|
Packit |
667938 |
|
|
Packit |
667938 |
B<mrtg-traffic-sum> [I<options>...] B<config-file>
|
|
Packit |
667938 |
|
|
Packit |
667938 |
--man show man-page and exit
|
|
Packit |
667938 |
-h, --help display this help and exit
|
|
Packit |
667938 |
--version output version information and exit
|
|
Packit |
667938 |
--catch=regexp filter out things that match this in PageTop
|
|
Packit |
667938 |
--email=address email the result
|
|
Packit |
667938 |
--min=gigabytes minimal number of gigabites required for report
|
|
Packit |
667938 |
--range=<when> Specify "current" for month-to-date, "previous" for last complete month
|
|
Packit |
667938 |
--units=[GB|MB] Display results in gigabytes (default is MB)
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 DESCRIPTION
|
|
Packit |
667938 |
|
|
Packit |
667938 |
The mrtg-traffic-sum goes through the mrtg logs for the targets in the
|
|
Packit |
667938 |
the config file specified and builds the traffic total for the last
|
|
Packit |
667938 |
month in Giga Bytes. (Note in communications Giga is 10^9).
|
|
Packit |
667938 |
|
|
Packit |
667938 |
The result of this analysis can be sent via email to an address of
|
|
Packit |
667938 |
your choice using the B<--email> option.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
With the B<--catch> option you can specify a regular expression which
|
|
Packit |
667938 |
will be matched against the contents of the PageTop settings. The
|
|
Packit |
667938 |
regular expression should return a value into $1 and possibly into
|
|
Packit |
667938 |
$2. This will then be used as description for the appropriate traffic
|
|
Packit |
667938 |
sum. By default the catch is set to:
|
|
Packit |
667938 |
|
|
Packit |
667938 |
(?:description|port name):\s*\s*([^< ]*?[^<]*?)\s*
|
|
Packit |
667938 |
|
|
Packit |
667938 |
By default, all traffic which is over one megabyte gets reported. Use the
|
|
Packit |
667938 |
B<--min> switch to change this number.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 COPYRIGHT
|
|
Packit |
667938 |
|
|
Packit |
667938 |
Copyright (c) 2002 by Tobias Oetiker. All rights reserved.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 LICENSE
|
|
Packit |
667938 |
|
|
Packit |
667938 |
This program is free software; you can redistribute it and/or modify
|
|
Packit |
667938 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
667938 |
the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
667938 |
(at your option) any later version.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
667938 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
667938 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
667938 |
GNU General Public License for more details.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
You should have received a copy of the GNU General Public License
|
|
Packit |
667938 |
along with this program; if not, write to the Free Software
|
|
Packit |
667938 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 AUTHOR
|
|
Packit |
667938 |
|
|
Packit |
667938 |
Tobias Oetiker E<lt>tobi@oetiker.chE<gt>,
|
|
Packit |
667938 |
Keith Dunnett E<lt>keith@dunnett.nameE<gt>
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=head1 HISTORY
|
|
Packit |
667938 |
|
|
Packit |
667938 |
2002-07-13 to Initial Version
|
|
Packit |
667938 |
2009-12-38 kd New features
|
|
Packit |
667938 |
|
|
Packit |
667938 |
=cut
|
|
Packit |
667938 |
|
|
Packit |
667938 |
# Emacs Configuration
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# Local Variables:
|
|
Packit |
667938 |
# mode: cperl
|
|
Packit |
667938 |
# eval: (cperl-set-style "PerlStyle")
|
|
Packit |
667938 |
# mode: flyspell
|
|
Packit |
667938 |
# mode: flyspell-prog
|
|
Packit |
667938 |
# End:
|
|
Packit |
667938 |
#
|
|
Packit |
667938 |
# vi: sw=4 et
|