|
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 |
|