ipacc
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:4k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. #
  3. #  This is just a hack, but it works fine for me.
  4. #  I'm using the ip accounting kernel rules to feed the mrtg.
  5. #  You need to have IP accounting compiled in your kernel(2.0), or IPChains
  6. #  support if you are running 2.1 or 2.2
  7. #  Anyway I'm not using the ipchains in here as there's no need to.
  8. #  The old ipfwadm will do just fine.
  9. #  So for 2.1 or 2.2 you'll need the ipfwadm-wrapper.
  10. #
  11. #
  12. #  Cristian Caramida <brick@bbs.ro>
  13. #             but very soon <brick@pcnet.ro>
  14. #  
  15. # Usage:
  16. #  You need to have IP accounting compiled in your kernel, and than just add 
  17. #  to the mrtg.cfg
  18. #  Target[ip_addr]: `ipacc [mode] [-S aaa.bbb.ccc.ddd[/net_bits]] [port1 port2 ...] [-D aaa.bbb.ccc.ddd[/net_bits]] [port1 port2 ...]`
  19. #  where
  20. #  - mode - is one of "in" or "out" in lowercase 
  21. #  - aaa.bbb.ccc.ddd - is a dotted IP address (not a host/net name)
  22. #  - net_bits - is the number of bits used by the network portion of the IP
  23. #                (eg. 24 for a whole C class, or 25 for half of a C class)
  24. #  - port1 port2 ... - the ports you want to plot trafic on
  25. # I haven't tryied to call it without any parameters!
  26. # It will probably make accounting for all trafic.
  27. $ipfwadm='/sbin/ipfwadm';   # <-------- ATTENTION
  28. $host="com.bbs.ro";
  29. #If you are running with ipchains (kernel 2.1, 2.2 or later) you may 
  30. #either symlink the ipfwadm-wrapper to that location or simply modify the value
  31. #---------------------------------------------------------------------------
  32. # Modify this only if you know what you are doing !!! :-)
  33. $mode='both';
  34. $remote='';
  35. $port='8889';
  36. if(!($ARGV[0] =~ /^-/)){ ($mode)=@ARGV; shift @ARGV;}
  37. if($mode eq 'in') {$mode='in ';}
  38. $mode=($mode eq 'in')?'in ':$mode;
  39. $source_ip='0.0.0.0/0';
  40. $source_port='';
  41. $dest_ip='0.0.0.0/0';
  42. $dest_port='';
  43. $prot='all';
  44. $inBytes=0;
  45. $outBytes=0;
  46. $upTime=0;
  47. while ($ARGV[0] =~ /^-/)
  48.     if($ARGV[0] eq '-S') 
  49.     {
  50.   shift @ARGV; 
  51. ($source_ip)=@ARGV;
  52. shift @ARGV;
  53. while ($ARGV[0] =~ /[0123456789]+/) 
  54. {     
  55.     $source_port.="$ARGV[0] ";
  56.     shift @ARGV;
  57. }
  58.     }
  59.     elsif($ARGV[0] eq '-D')
  60.     {
  61. shift @ARGV;
  62. ($dest_ip)=@ARGV;
  63. shift @ARGV;
  64. while ($ARGV[0] =~ /[0123456789]+/)
  65.        {
  66.    $dest_port.="$ARGV[0] ";
  67.    shift @ARGV;
  68.        }
  69.     }
  70. else {
  71.     die "Error: Unknown parameter $ARGV[0] n";
  72. }
  73. }
  74. chop $source_port;
  75. chop $dest_port;
  76. if($source_port.$dest_port ne '') { $prot='tcp';}
  77. if($mode eq 'both') 
  78. {
  79.     $exec_line="$ipfwadm -A out -a -P $prot -S $source_ip $source_port -D $dest_ip $dest_port; $ipfwadm -A in -a -P $prot -S $dest_ip $dest_port -D $source_ip $source_port";
  80. }
  81. else {
  82.     $exec_line="$ipfwadm -A $mode -a -P $prot -S $source_ip $source_port -D $dest_ip $dest_port";
  83. }
  84. $new_sp=($source_port eq '')?'*':join(',',split(/ /,$source_port));
  85. $new_dp=($dest_port eq '')?'*':join(',',split(/ /,$dest_port));
  86. $ports=($source_port.$dest_port eq '')?""n/a"":""".$new_sp." -> ".$new_dp.""";
  87. if($mode eq 'both') 
  88. {
  89.     $stats_line=($source_port.$dest_port eq '')?"$ipfwadm -A -l -x -n| grep $prot |grep $source_ip |grep $dest_ip | grep "n/a"":"$ipfwadm -A -l -x -n| grep $prot |grep $source_ip |grep $dest_ip | grep "$new_sp" | grep "$new_dp"";
  90. }
  91. else 
  92. {
  93.     $stats_line="$ipfwadm -A -l -x -n |grep "$mode $prot  $source_ip" | grep $dest_ip | grep $ports ";
  94. }
  95. open(DATA,$stats_line."|");
  96. @info=<DATA>;
  97. close <DATA>;
  98. $probe=($mode eq 'both')?2:1;
  99. $mode=($mode eq 'in ')?'in':$mode;
  100. if(@info<$probe) 
  101.     system($exec_line);
  102. }
  103. else
  104. {
  105.     if($probe%2) 
  106.     {
  107. eval "$$mode"."Bytes=(split(/ +/,$info[0]))[2]";
  108.     }
  109.     else
  110.     {
  111. if($info[0] =~ /in /) { $inBytes=(split(/ +/,$info[0]))[2]; }
  112. elsif($info[0] =~ /out /) { $outBytes=(split(/ +/,$info[0]))[2];}
  113. if($info[1] =~ /in /) { $inBytes=(split(/ +/,$info[1]))[2]; }
  114. elsif($info[1] =~ /out /) { $outBytes=(split(/ +/,$info[1]))[2];}
  115.     }
  116. }
  117. open(UPTIME,"uptime |cut -b 13-26|");
  118. $upTime=<UPTIME>;
  119. close(UPTIME);
  120. printf "$inBytesn$outBytesn$upTimen$host";