cisco_ip_acc_collect.pl
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:3k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. ##############################################################################
  3. #
  4. # cisco_ip_acc_collect.pl 
  5. # (c) 1999 by Dolphins Network Systems, Matthias Cramer <cramer@dolphins.ch>
  6. #
  7. # Licence: LGPL
  8. #
  9. ##############################################################################
  10. #
  11. # This Script is very loosly based on whodo from Tony Farr
  12. #
  13. # This Script gets IP-accounting data from a Cisco Router
  14. # In the network file you can define networks which you like to analyse.
  15. #
  16. # Special modules : Net::Netmask, SNMP_util
  17. #
  18. ##############################################################################
  19. #
  20. # Version History
  21. #  V0.9            First Public Release
  22. #
  23. ##############################################################################
  24. use Getopt::Std;
  25. use File::Basename;
  26. use Net::Netmask;
  27. use strict;
  28. use Socket;
  29. # Adjust this path to where you MRTG resides, so that SNMP_util
  30. # can be found.
  31. use lib "/usr/local/mrtg";
  32. use SNMP_util;
  33. #
  34. # Some variables to adjust.
  35. #
  36. # The write community of your router
  37. my $HOST= 'writecommunity@router';
  38. # Where is your network file
  39. my $NETWORK = "/usr/local/mrtg/cisco_ipaccounting/networks";
  40. # Where to write the accounting info
  41. my $OUTDIR  = "/usr/local/mrtg/cisco_ipaccounting/";
  42. # Below here you should have to be changed
  43. my %network;
  44. my %in;
  45. my %out;
  46. open (NET, $NETWORK);
  47. my $line;
  48. my $block;
  49. while ($line = <NET>) {
  50.   $line =~ /(.+?)[s]+(.+)/;
  51.   my $name = $2;
  52.   $block=new Net::Netmask($1);
  53.   $block->storeNetblock();
  54.   $in{$block->base()}=0;
  55.   $out{$block->base()}=0;
  56.   $network{$name} .= $block->base() . ":";
  57. }
  58. &checkpoint_stats($HOST);
  59. &get_stats($HOST);
  60. # print "Base       tIntOutn";
  61. #   print "$baset$in{$base}t$out{$base}n";
  62. foreach my $k_network (keys %network) {
  63.    my @base = split(/:/, $network{$k_network});
  64.    my $base_in = 0;
  65.    my $base_out = 0;
  66.    foreach my $i_base (@base) {
  67.      $base_in  += $in{$i_base};
  68.      $base_out += $out{$i_base};
  69.    }
  70.    open(OUT, ">$OUTDIR"."log_"."$k_network");
  71.    print OUT "$base_inn";
  72.    print OUT "$base_outn";
  73.    print OUT "n";
  74.    print OUT "$k_networkn";
  75.    close (OUT);
  76. }
  77. sub checkpoint_stats {
  78. # Take a checkpoint on IP accounting on the given router & return the duration
  79. # The checkpoint is done by doing a get  then a set on actCheckPoint
  80.         my ($age);
  81.         # Find how long since the last checkpoint
  82.         ($age) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.8.0');
  83.         warn "No actAge returned.n" unless $age;
  84.         # Check to see if we've lost any data
  85.         ($_) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.6.0');
  86.         warn "Accounting table overflow - $_ bytes lost.n" if $_ > 0;
  87.         # Do a new checkpoint
  88.         ($_) = snmpget ($_[0], '1.3.6.1.4.1.9.2.4.11.0');
  89.         die "No actCheckPoint returned.n" unless defined;
  90.         snmpset ($_[0], '1.3.6.1.4.1.9.2.4.11.0', 'integer', $_);
  91.         $age;
  92. }
  93. sub get_stats {
  94. # Summarise the checkpoint by destination network (not host).
  95. # Summary is placed into %traffictab - a hash of hashes indexed by
  96. # source device & destination network.
  97. my($src, $dst,$traffic);
  98. my @response = snmpwalk ($_[0], '1.3.6.1.4.1.9.2.4.9.1.4' );
  99. foreach $_ (@response) {
  100. /(d+.d+.d+.d+).(d+.d+.d+.d+):(d+)/ ||
  101. die "Cannot parse response from walk.n";
  102. $dst=$2;
  103. $src=$1;
  104. $traffic=$3;
  105. $block = findNetblock($src);
  106. if ($block) {
  107.                    $out{$block->base()} += $traffic;
  108.                 }
  109. $block = findNetblock($dst);
  110. if ($block) {
  111.                    $in{$block->base()} += $traffic;
  112.                 }
  113. }
  114. }