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

SNMP编程

开发平台:

C/C++

  1. #!/usr/local/bin/perl5
  2. # -*- mode: Perl -*-
  3. ##################################################################
  4. # Config file creator
  5. ##################################################################
  6. # Created by Laurie Gellatly <gellatly@one.net.au>
  7. # this produces an array of ip address and system names for each
  8. # ip address passed to it, by pulling info
  9. # off the device via snmp
  10. #################################################################
  11. #
  12. # Distributed under the GNU copyleft
  13. #
  14. # $Id: ovmrtg.pm,v 1.1.1.1 2002/02/26 10:16:36 oetiker Exp $
  15. #
  16. package ovmrtg;
  17. use Socket;
  18. use strict;
  19. use vars qw(@ISA @EXPORT $VERSION);
  20. use Exporter;
  21. $VERSION = '0.00';
  22. @ISA = qw(Exporter);
  23. @EXPORT = qw(ovsysnms ovcols);
  24. sub ovsysnms(@);
  25. sub ovcols(@);
  26. my $DEBUG = 0;
  27. my($router,$routerip,@res,@result,$cnt); 
  28. my($op,$vendor); 
  29. %snmpget::OIDS = (  'sysDescr' => '1.3.6.1.2.1.1.1.0',
  30.     'sysContact' => '1.3.6.1.2.1.1.4.0',
  31.     'sysName' => '1.3.6.1.2.1.1.5.0',
  32.     'sysLocation' => '1.3.6.1.2.1.1.6.0',
  33.     'sysUptime' => '1.3.6.1.2.1.1.3.0',
  34.     'ifNumber' =>  '1.3.6.1.2.1.2.1.0',
  35.     ###################################
  36.     # add the ifNumber ....
  37.     'ifDescr' => '1.3.6.1.2.1.2.2.1.2',
  38.     'ifType' => '1.3.6.1.2.1.2.2.1.3',
  39.     'ifIndex' => '1.3.6.1.2.1.2.2.1.1',
  40.     'ifSpeed' => '1.3.6.1.2.1.2.2.1.5', 
  41.     'ifOperStatus' => '1.3.6.1.2.1.2.2.1.8',             
  42.     'ifAdminStatus' => '1.3.6.1.2.1.2.2.1.7',            
  43.     # up 1, down 2, testing 3
  44.     'ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
  45.     'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
  46.     'sysObjectID' => '1.3.6.1.2.1.1.2.0',
  47.     'CiscolocIfDescr' => '1.3.6.1.4.1.9.2.2.1.1.28',
  48.     'ifAlias' => '1.3.6.1.2.1.31.1.1.1.18'
  49.  );
  50. sub ovcols(@) {
  51.    my @args = @_;  
  52.    my @r;
  53.    $op = $args[0];
  54.    shift @args;
  55.    if ($op eq "+"){
  56.       $op = "C";
  57.    } else {
  58.       $op = "XC";
  59.    }
  60.    while($router=$args[0]){
  61.   my($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) =
  62.     snmpget($router,
  63.     'sysDescr','sysContact','sysName',  'sysLocation', 'ifNumber', 'sysObjectID');
  64.    my ($sint2mon);
  65.    my $cc = " ";
  66.    $sysDescr =~ s/r/<BR>/g;  # Change returns to <BR>
  67.    my($ciscobox) = ($sysObjectID =~ /cisco/);
  68.    my($portmaster) = ($sysObjectID =~ /livingston/);
  69.    $vendor = ($ciscobox || $portmaster) ;
  70.    my($ifInErrors) = '1.3.6.1.2.1.2.2.1.14';
  71.    my($ifOutErrors) = '1.3.6.1.2.1.2.2.1.20';
  72.   my @ipadent = snmpgettable($router, 'ipAdEntAddr');
  73.   print STDERR "Got Addressesn" if $DEBUG;
  74.   my @ipadentif = snmpgettable($router, 'ipAdEntIfIndex');
  75.   print STDERR "Got IfTablen" if $DEBUG;
  76.   my(%ipaddr, %iphost,$index);
  77.   while (scalar @ipadentif){
  78.     $index = shift @ipadentif;
  79.     $ipaddr{$index} = shift @ipadent;
  80.     $iphost{$index} = 
  81.       gethostbyaddr(pack('C4',split(/./,$ipaddr{$index})), AF_INET);
  82.     if ($iphost{$index} eq ''){
  83.  $iphost{$index} = $ipaddr{$index};
  84.     }   
  85.     
  86.   }
  87.   my(@ifdescr) = snmpgettable($router, 'ifDescr');
  88.   print STDERR "Got IfDescrn" if $DEBUG;
  89.   my(@iftype) = snmpgettable($router, 'ifType');
  90.   print STDERR "Got IfTypen" if $DEBUG;
  91.   my(@ifspeed) = snmpgettable($router, 'ifSpeed');
  92.   print STDERR "Got IfSpeedn" if $DEBUG;
  93.   my(@ifadminstatus) = snmpgettable($router, 'ifAdminStatus');
  94.   print STDERR "Got IfStatusn" if $DEBUG;
  95.   my(@ifoperstatus) = snmpgettable($router, 'ifOperStatus');
  96.   print STDERR "Got IfOperStatusn" if $DEBUG;
  97.   my(@ifindex) = snmpgettable($router, 'ifIndex');
  98.   print STDERR "Got IfIndexn" if $DEBUG;
  99.   my(%sifdesc,%siftype,%sifspeed,%sifadminstatus,%sifoperstatus,%sciscodescr);
  100.   ### May need the cisco IOS version number so we know which oid to use
  101.   ###   to get the cisco description.
  102.   ###
  103.   ### - mjd 2/5/98 (Mike Diehn) (mdiehn@mindspring.net)
  104.   ###
  105.   my ($cisco_ver, $cisco_descr_oid, @ciscodescr);
  106.   if ( $ciscobox ) {
  107.     ($cisco_ver) = ($sysDescr =~ /Versions+([d.]+)/);
  108.     $cisco_descr_oid = ($cisco_ver ge "11.3") ? "ifAlias" : "CiscolocIfDescr";
  109.   }
  110.   
  111.   while (scalar @ifindex) {
  112.   # as these arrays get filled from the bottom, 
  113.   # we need to empty them from the botom as well ...
  114.   # fifo
  115.     $index = shift @ifindex;
  116.     $sifdesc{$index} = shift @ifdescr;
  117.     $siftype{$index} = shift @iftype;
  118.     $sifspeed{$index} = shift @ifspeed;
  119.     $sifadminstatus{$index} = shift @ifadminstatus;
  120.     $sifoperstatus{$index} = shift @ifoperstatus;
  121.     if ($portmaster) {
  122.       # Trying to extract extra info livingston
  123.       # We can only approximate speeds
  124.       # 
  125.       # so we think that ppp can do 76800 bit/s, and slip 38400.
  126.       # (actualy, slip is a bit faster, but usualy users with newer modems
  127.       # use ppp). Alternatively, you can set async speed to 115200 or
  128.       # 230400 (the maximum speed supported by portmaster).
  129.       # 
  130.       # But if the interface is ptpW (sync), max speed is 128000
  131.       # change it to your needs. On various Portmasters there are
  132.       # various numbers of sync interfaces, so modify it.
  133.       # 
  134.       #  The most commonly used PM-2ER has only one sync.
  135.       # 
  136.       #  Paul Makeev (mac@redline.ru)
  137.       # 
  138.       if ($siftype{$index} eq 'ppp') {
  139.       if ($sifdesc{$index} eq 'ptpW1') {
  140.       $sifspeed{$index} = 128000;
  141.       } else {
  142.       $sifspeed{$index} = 76800;
  143.       }
  144.       } elsif ($siftype{$index} eq 'slip') {
  145.       $sifspeed{$index} = 38400;
  146.       } elsif ($siftype{$index} eq 'ethernetCsmacd') {
  147.       $sifspeed{$index} = 10000000;
  148.       }
  149.     }
  150.     ### Move this section south so we know what type of
  151.     ###  circuit we're looking at before we retrieve
  152.     ###  the cisco interface alias.
  153.     ###
  154.     ### This whole cicso thing should be re-written, but since
  155.     ###   this script doesn't need to run quickly...
  156.     ###
  157.     ###  - mjd 2/5/98
  158.     ###
  159.     # Get the user configurable interface description entered in the config 
  160.     # if it's a cisco-box
  161.     #
  162.     if ($ciscobox) {
  163. my ($enoid, @descr);
  164. $enoid = $snmpget::OIDS{"$cisco_descr_oid"} . "." . $index;
  165. if ( $cisco_ver ge "11.2" or $siftype{$index} ne 'frame-relay' ) {
  166.   ### This is either not a frame-relay sub-interface or
  167.   ###  this router is running IOS 11.2+ and interface
  168.   ###  type won't matter. In either of these cases, it's
  169.   ###  ok to try getting the ifAlias or ciscoLocIfDesc.
  170.   ###
  171.   @descr = snmpget($router, $enoid);
  172. } else {
  173.   ### This is a frame-relay sub-interface *and* the router
  174.   ###  is running an IOS older than 11.2. Therefore, we can
  175.   ###  get neither ifAlias nor ciscoLocIfDesc. Do something
  176.   ###  useful.
  177.   ###
  178.   @descr = ("Cisco PVCs descriptions require IOS 11.2+.");
  179. } # end if else
  180. ### Put whatever I got into the array we'll use later to append the result
  181. ###   of this operation onto the results from the ifDescr fetch.
  182. ###
  183. push @ciscodescr, shift @descr;
  184.     } # end if ($ciscobox)
  185.     # especially since cisco does not return a if
  186.     # descr for each interface it has ...
  187.     ## JB 2/8/97 - sometimes IOS inserts E1 controllers in the standard-MIB
  188.     ## interface table, but not in the local interface table. This puts the
  189.     ## local interface description table out-of-sync. the following 
  190.     ## modification skips over E1 cards as interfaces.
  191.     #
  192.     ### I suspect that the mod I made above, to use the ifAlias
  193.     ###   oid if possible, may cause problems here. If it seems
  194.     ###   that your descriptions are out of sync, try commenting
  195.     ###   out the "if ( condition )" and it's closing right brace
  196.     ###   so that the "shift @ciscodescr" get executed for *all*
  197.     ###   iterations of this loop.
  198.     ###
  199.     ### - mjd 2/5/95
  200.     ###
  201.     if ($ciscobox && $siftype{$index} ne 'ds1') {
  202.   $sciscodescr{$index} = "<BR>" . (shift @ciscodescr) if @ciscodescr;
  203.     }
  204. }
  205.   foreach $index ( sort { $a <=> $b } keys %sifdesc) {
  206.     my $speed = int($sifspeed{$index} / 8); # bits to byte
  207. # LJG Change to report in Bits
  208. #    my $speed_str=&fmi($speed);
  209.     my $speed_str=&fmi($sifspeed{$index});
  210.     my $name="$router.$index";
  211.     my $namerr="$router.$index.err";
  212.   if (($sifadminstatus{$index} ne "up")
  213. # this check added by Josh - don't query E1-stack controllers
  214.       || ($siftype{$index} eq 'ds1')
  215. || ($siftype{$index} eq 'softwareLoopback')
  216. || ($speed == 0 ) 
  217. # LJG Change to report all in Bits
  218. # || ($speed > 400 * 10**6)  #speeds of 400 MByte/s are not realistic
  219. || ($speed > 3200 * 10**6)  #speeds of 400 MByte/s are not realistic
  220.         || ($sifoperstatus{$index} eq 'down')
  221.         || (($sifdesc{$index}=~ /Dialer/) && ($ciscobox))) {
  222. ########
  223. ######## This Interface is one of the following
  224. ######## - administratively not UP
  225. ######## - it is in test mode
  226. ######## - it is a softwareLoopback interface
  227. ######## - has a unrealistic speed setting
  228. ######## It is commented out for this reason.
  229. ########
  230.   }else {
  231.     $sint2mon = $sint2mon .$cc.$index;
  232.     $cc = ",";
  233.   }
  234.   }
  235.   if ($ciscobox){
  236.       $r[@r]="MIB .1.3.6.1.4.1.9.2.1.58 avgBusy5 units INTEGER R";
  237.       $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263 ALL -";
  238.    }
  239.   $r[@r]="MIB .1.3.6.1.2.1.1.3 sysUpTime units TIMETICKS R";
  240.   $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263  ALL -";
  241.   $r[@r]="MIB .1.3.6.1.2.1.2.2.1.10 IfInOctets units/sec COUNTER R";
  242.   $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263 LIST $sint2mon";
  243.   $r[@r]="MIB .1.3.6.1.2.1.2.2.1.16 IfOutOctets units/sec COUNTER R";
  244.   $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263 LIST $sint2mon";
  245.   $r[@r]="MIB .1.3.6.1.2.1.2.2.1.14 IfInErrors units/sec COUNTER R";
  246.   $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263 LIST $sint2mon";
  247.   $r[@r]="MIB .1.3.6.1.2.1.2.2.1.20 IfOutErrors units/sec COUNTER R";
  248.   $r[@r]="$op $router .1.3.6.1.* 300 > 0 1 <= 0 1 xA s 58720263 LIST $sint2mon";
  249.   shift @args;
  250.    }
  251.    return (@r);
  252. }
  253.   
  254. sub snmpgettable{
  255.   my($host,$var) = @_;
  256.   my($next_oid,$enoid,$orig_oid, 
  257.      $response, $bindings, $binding, $t1, $t2,$outoid,
  258.      $upoid,$oid,@table,$tempo);
  259.   die "Unknown SNMP var $varn" 
  260.     unless $snmpget::OIDS{$var};
  261.   
  262.   $orig_oid = $snmpget::OIDS{$var}." ";
  263.   $enoid=$orig_oid;
  264.   open(SNMPG, "snmpwalk $host $orig_oid |");
  265. #  print STDERR $orig_oid;
  266.   while ($tempo =<SNMPG>){
  267. #      print STDERR $tempo;
  268.       ($t1, $t2, $tempo ) = split /:/ , $tempo ,3;
  269.       if (!$tempo){
  270.  if ($t2){
  271.     $t1 = $t1 .":".$t2;
  272.  }
  273.  $tempo = pop(@table)." ".$t1 ;
  274.       }
  275.       $tempo=~s/t/ /g;
  276.       $tempo=~s/n/ /g;
  277.       $tempo=~s/^s+//;
  278.       $tempo=~s/s+$//;
  279.       push @table, $tempo;
  280.      
  281.   }
  282.  close (SNMPG);    
  283.   return (@table);
  284. }
  285. sub fmi {
  286.   my($number) = $_[0];
  287.   my(@short);
  288. # LJG Change to report in Bits
  289. #  @short = ("Bytes/s","kBytes/s","MBytes/s","GBytes/s");
  290.   @short = ("Bits/s","kBits/s","MBits/s","GBits/s");
  291.   my $digits=length("".$number);
  292.   my $divm=0;
  293.   while ($digits-$divm*3 > 3) { $divm++; }
  294.   my $divnum = $number/10**($divm*3);
  295.   return sprintf("%1.1f %s",$divnum,$short[$divm]);
  296. }
  297. sub ovsysnms (@){
  298. my @args = @_;  
  299.   while($router = $args[0]){
  300.   my($sysName)= snmpget($router, 'sysName');
  301. ### The next three lines can be deleted once Someone gives this box a name
  302.   if ($router eq '10.26.254.1') {
  303.       $sysName = 'nrgiga';
  304.   }
  305.   if ($sysName eq ""){
  306.      $sysName = $router;
  307.   }
  308. #  $sysName =~ tr/[A-Z]/[a-z]/;
  309. # Don't like to do it this way but...
  310. #  @res=`ovtopodump $router`;
  311. #  for ($cnt = 0 ; $cnt < @res; $cnt++){
  312. #     $_ = $res[$cnt];
  313. #     if (/IP ADDR: (.*)/){
  314.    @res=`ping $router -n 1`;
  315.    for ($cnt = 0 ; $cnt < @res; $cnt++){
  316.       $_ = $res[$cnt];
  317.       if (/from (.*):.*/) {
  318.          $routerip = $1; 
  319.          last;
  320.      }
  321.    }
  322.    @res= `ovobjprint -a "IP Hostname" "SNMP sysName"=$sysName`;
  323.    $_ = $res[4];
  324.    if(!/NO FIELD VALUES FOUND/){
  325.       ($router) = ($res[4] =~ m@"(.*)"@ );
  326.    }
  327.   $result[@result]= $routerip.",".$sysName.",".$router;
  328.   shift @args;
  329.   }
  330.   return @result;
  331. }
  332.   
  333. sub snmpget{  
  334.   my($host,@vars) = @_;
  335.   my(@enoid, $var,$response, $bindings, $binding, $value, $inoid,$outoid,
  336.      $upoid,$oid,@retvals,$t1,$t2,@resp,$tempo);
  337.   my($hackcisco);
  338.   foreach $var (@vars) {
  339.     die "Unknown SNMP var $varn" 
  340.       unless $snmpget::OIDS{$var} || $var =~ /^d+[.d+]*.d+$/;
  341.     if ($var =~ /^d+[.d+]*.d+/) {
  342. $value = $value.$var." ";
  343. $hackcisco = 1;
  344.     } else {
  345. $value = $value.$snmpget::OIDS{$var}." ";
  346. $hackcisco = 0;
  347.     }
  348.   }
  349.   open(SNMPG, "snmpget $host $value |");
  350.   while ($tempo =<SNMPG>){
  351.       ($t1, $t2, $tempo ) = split /:/ , $tempo, 3;
  352.       if (!$tempo){
  353.  if ($t2){
  354.     $t1 = $t1 .":".$t2;
  355.  }
  356.  $tempo = pop(@retvals)." ".$t1 ;
  357.       }
  358.       $tempo=~s/t/ /g;
  359.       $tempo=~s/n/ /g;
  360.       $tempo=~s/^s+//;
  361.       $tempo=~s/s+$//;
  362.       push @retvals,  $tempo;
  363.   }
  364.   close (SNMPG);    
  365.     return (@retvals);
  366. }
  367. 1;