Blame contrib/cisco_ipaccounting/cisco_ip_acc_collect.pl

Packit 667938
#!/usr/bin/perl
Packit 667938
Packit 667938
##############################################################################
Packit 667938
#
Packit 667938
# cisco_ip_acc_collect.pl 
Packit 667938
# (c) 1999 by Dolphins Network Systems, Matthias Cramer <cramer@dolphins.ch>
Packit 667938
#
Packit 667938
# Licence: LGPL
Packit 667938
#
Packit 667938
##############################################################################
Packit 667938
#
Packit 667938
# This Script is very loosly based on whodo from Tony Farr
Packit 667938
#
Packit 667938
# This Script gets IP-accounting data from a Cisco Router
Packit 667938
# In the network file you can define networks which you like to analyse.
Packit 667938
#
Packit 667938
# Special modules : Net::Netmask, SNMP_util
Packit 667938
#
Packit 667938
##############################################################################
Packit 667938
#
Packit 667938
# Version History
Packit 667938
#  V0.9            First Public Release
Packit 667938
#
Packit 667938
##############################################################################
Packit 667938
Packit 667938
Packit 667938
use Getopt::Std;
Packit 667938
use File::Basename;
Packit 667938
use Net::Netmask;
Packit 667938
use strict;
Packit 667938
use Socket;
Packit 667938
Packit 667938
# Adjust this path to where you MRTG resides, so that SNMP_util
Packit 667938
# can be found.
Packit 667938
Packit 667938
use lib "/usr/local/mrtg";
Packit 667938
use SNMP_util;
Packit 667938
Packit 667938
#
Packit 667938
# Some variables to adjust.
Packit 667938
#
Packit 667938
Packit 667938
# The write community of your router
Packit 667938
my $HOST= 'writecommunity@router';
Packit 667938
Packit 667938
# Where is your network file
Packit 667938
my $NETWORK = "/usr/local/mrtg/cisco_ipaccounting/networks";
Packit 667938
Packit 667938
# Where to write the accounting info
Packit 667938
my $OUTDIR  = "/usr/local/mrtg/cisco_ipaccounting/";
Packit 667938
Packit 667938
Packit 667938
# Below here you should have to be changed
Packit 667938
Packit 667938
my %network;
Packit 667938
my %in;
Packit 667938
my %out;
Packit 667938
Packit 667938
open (NET, $NETWORK);
Packit 667938
my $line;
Packit 667938
my $block;
Packit 667938
Packit 667938
while ($line = <NET>) {
Packit 667938
  $line =~ /(.+?)[\s]+(.+)/;
Packit 667938
  my $name = $2;
Packit 667938
  $block=new Net::Netmask($1);
Packit 667938
  $block->storeNetblock();
Packit 667938
  $in{$block->base()}=0;
Packit 667938
  $out{$block->base()}=0;
Packit 667938
  $network{$name} .= $block->base() . ":";
Packit 667938
}
Packit 667938
Packit 667938
&checkpoint_stats($HOST);
Packit 667938
&get_stats($HOST);
Packit 667938
Packit 667938
# print "Base       \tIn\tOut\n";
Packit 667938
#   print "$base\t$in{$base}\t$out{$base}\n";
Packit 667938
Packit 667938
foreach my $k_network (keys %network) {
Packit 667938
   my @base = split(/:/, $network{$k_network});
Packit 667938
   my $base_in = 0;
Packit 667938
   my $base_out = 0;
Packit 667938
   foreach my $i_base (@base) {
Packit 667938
     $base_in  += $in{$i_base};
Packit 667938
     $base_out += $out{$i_base};
Packit 667938
   }
Packit 667938
Packit 667938
   open(OUT, ">$OUTDIR"."log_"."$k_network");
Packit 667938
Packit 667938
   print OUT "$base_in\n";
Packit 667938
   print OUT "$base_out\n";
Packit 667938
   print OUT "\n";
Packit 667938
   print OUT "$k_network\n";
Packit 667938
Packit 667938
   close (OUT);
Packit 667938
}
Packit 667938
Packit 667938
sub checkpoint_stats {
Packit 667938
# Take a checkpoint on IP accounting on the given router & return the duration
Packit 667938
# The checkpoint is done by doing a get  then a set on actCheckPoint
Packit 667938
        my ($age);
Packit 667938
Packit 667938
        # Find how long since the last checkpoint
Packit 667938
        ($age) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.8.0');
Packit 667938
        warn "No actAge returned.\n" unless $age;
Packit 667938
Packit 667938
        # Check to see if we've lost any data
Packit 667938
        ($_) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.6.0');
Packit 667938
        warn "Accounting table overflow - $_ bytes lost.\n" if $_ > 0;
Packit 667938
Packit 667938
        # Do a new checkpoint
Packit 667938
        ($_) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.11.0');
Packit 667938
        die "No actCheckPoint returned.\n" unless defined;
Packit 667938
        snmpset ($_[0], '1.3.6.1.4.1.9.2.4.11.0', 'integer', $_);
Packit 667938
        $age;
Packit 667938
}
Packit 667938
Packit 667938
Packit 667938
sub get_stats {
Packit 667938
# Summarise the checkpoint by destination network (not host).
Packit 667938
# Summary is placed into %traffictab - a hash of hashes indexed by
Packit 667938
# source device & destination network.
Packit 667938
Packit 667938
	my($src, $dst,$traffic);
Packit 667938
	my @response = snmpwalk ($_[0], '1.3.6.1.4.1.9.2.4.9.1.4' );
Packit 667938
Packit 667938
	foreach $_ (@response) {
Packit 667938
		/(\d+\.\d+\.\d+\.\d+)\.(\d+\.\d+\.\d+\.\d+):(\d+)/ ||
Packit 667938
			die "Cannot parse response from walk.\n";
Packit 667938
		$dst=$2;
Packit 667938
		$src=$1;
Packit 667938
		$traffic=$3;
Packit 667938
		$block = findNetblock($src);
Packit 667938
		if ($block) {
Packit 667938
                   $out{$block->base()} += $traffic;
Packit 667938
                }
Packit 667938
		$block = findNetblock($dst);
Packit 667938
		if ($block) {
Packit 667938
                   $in{$block->base()} += $traffic;
Packit 667938
                }
Packit 667938
	}
Packit 667938
}
Packit 667938
Packit 667938