Blame bin/mrtg-traffic-sum

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