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

SNMP编程

开发平台:

C/C++

  1. #!/usr/drwho/local/bin/perl
  2. # -*- mode: Perl -*-
  3. ##################################################################
  4. # Config file creator
  5. ##################################################################
  6. # Created by Tobias Oetiker <oetiker@ee.ethz.ch>
  7. # this produces a config file for one router, by bulling info
  8. # off the router via snmp
  9. #################################################################
  10. #
  11. # Distributed under the GNU copyleft
  12. #
  13. # $Id: cfgmaker_atm.pl,v 1.1.1.1 2002/02/26 10:16:31 oetiker Exp $
  14. #
  15. use SNMP_Session "0.56";
  16. use BER "0.54";
  17. use Socket;
  18. use strict;
  19. use vars '$DEBUG';
  20. my $DEBUG = 0;
  21. %snmpget::OIDS = (  'sysDescr' => '1.3.6.1.2.1.1.1.0',
  22.     'sysContact' => '1.3.6.1.2.1.1.4.0',
  23.     'sysName' => '1.3.6.1.2.1.1.5.0',
  24.     'sysLocation' => '1.3.6.1.2.1.1.6.0',
  25.     'sysUptime' => '1.3.6.1.2.1.1.3.0',
  26.     'ifNumber' =>  '1.3.6.1.2.1.2.1.0',
  27.     ###################################
  28.     # add the ifNumber ....
  29.     'ifDescr' => '1.3.6.1.2.1.2.2.1.2',
  30.     'ifType' => '1.3.6.1.2.1.2.2.1.3',
  31.     'ifIndex' => '1.3.6.1.2.1.2.2.1.1',
  32.     'ifSpeed' => '1.3.6.1.2.1.2.2.1.5', 
  33.     'ifOperStatus' => '1.3.6.1.2.1.2.2.1.8',  
  34.     'ifAdminStatus' => '1.3.6.1.2.1.2.2.1.7',  
  35.     # up 1, down 2, testing 3
  36.     'ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
  37.     'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
  38.     'sysObjectID' => '1.3.6.1.2.1.1.2.0',
  39.     'CiscolocIfDescr' => '1.3.6.1.4.1.9.2.2.1.1.28',
  40.     'ifAlias' => '1.3.6.1.2.1.31.1.1.1.18',
  41.              'ifAtmLecConfigEntry' =>    '1.3.6.1.4.1.18.3.5.9.5.20.1.1.8',
  42.  'ifAtmLecConfigName' =>    '1.3.6.1.4.1.18.3.5.9.5.20.1.1.3',
  43.              'ifAtmVclConfEntry' =>      '1.3.6.1.4.1.18.3.4.23.1.5.1.22',
  44.              'ifAtmVclConf2'     =>      '1.3.6.1.4.1.18.3.4.23.1.5.1.2',
  45.              'ifAtmVclConf3'     =>      '1.3.6.1.4.1.18.3.4.23.1.5.1.4',
  46.              'ifAtmizerVclStatsEntry' => '1.3.6.1.4.1.18.3.4.23.3.4.1.7',
  47.              'ifAtmizerVclStatsEntr1' => '1.3.6.1.4.1.18.3.4.23.3.4.1.1',
  48.              'ifAtmizerVclStatsEntr2' => '1.3.6.1.4.1.18.3.4.23.3.4.1.3',
  49.                     
  50.  );
  51. sub main {
  52.   my(%ifType_d)=('1'=>'Other',
  53.  '2'=>'regular1822',
  54.  '3'=>'hdh1822',
  55.  '4'=>'ddnX25',
  56.  '5'=>'rfc877x25',
  57.  '6'=>'ethernetCsmacd',
  58.  '7'=>'iso88023Csmacd',
  59.  '8'=>'iso88024TokenBus',
  60.  '9'=>'iso88025TokenRing',
  61.  '10'=>'iso88026Man',
  62.  '11'=>'starLan',
  63.  '12'=>'proteon10Mbit',
  64.  '13'=>'proteon80Mbit',
  65.  '14'=>'hyperchannel',
  66.  '15'=>'fddi',
  67.  '16'=>'lapb',
  68.  '17'=>'sdlc',
  69.  '18'=>'ds1',
  70.  '19'=>'e1',
  71.  '20'=>'basicISDN',
  72.  '21'=>'primaryISDN',
  73.  '22'=>'propPointToPointSerial',
  74.  '23'=>'ppp',
  75.  '24'=>'softwareLoopback',
  76.  '25'=>'eon',
  77.  '26'=>'ethernet-3Mbit',
  78.  '27'=>'nsip',
  79.  '28'=>'slip',
  80.  '29'=>'ultra',
  81.  '30'=>'ds3',
  82.  '31'=>'sip',
  83.  '32'=>'frame-relay',
  84.  '33'=>'rs232',
  85.  '34'=>'para',
  86.  '35'=>'arcnet',
  87.  '36'=>'arcnetPlus',
  88.  '37'=>'atm',
  89.  '38'=>'miox25',
  90.  '39'=>'sonet',
  91.  '40'=>'x25ple',
  92.  '41'=>'iso88022llc',
  93.  '42'=>'localTalk',
  94.  '43'=>'smdsDxi',
  95.  '44'=>'frameRelayService',
  96.  '45'=>'v35',
  97.  '46'=>'hssi',
  98.  '47'=>'hippi',
  99.  '48'=>'modem',
  100.  '49'=>'aal5',
  101.  '50'=>'sonetPath',
  102.  '51'=>'sonetVT',
  103.  '52'=>'smdsIcip',
  104.  '53'=>'propVirtual',
  105.  '54'=>'propMultiplexor',
  106.  '55'=>'100BaseVG'
  107.  );
  108.   my($vendor)=0;
  109.   if ($ARGV[0] eq '--vendor') {
  110. $vendor = 1; shift @ARGV};
  111.   my($community,$router) = split /@/, $ARGV[0];
  112.   die <<USAGE  unless $community && $router;
  113. USAGE: cfgmaker [--vendor] 'community'@'router'
  114. use the --vendor option to try and wrestle some better information
  115. from willing livingston and cisco routers ... (may not work)
  116. EXAMPLE:  cfgmaker public@ezwf7.ethz.ch >>mrtg.cfg
  117. USAGE
  118.   
  119.   
  120.   my($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) =
  121.     snmpget($router,$community,
  122.     'sysDescr','sysContact','sysName', 'sysLocation', 'ifNumber', 'sysObjectID');
  123.    $sysDescr =~ s/r/<BR>/g;  # Change returns to <BR>
  124.    my($cisco_router_sysid) = '1.3.6.1.4.1.9';
  125.    my($livingston_router_sysid) = '1.3.6.1.4.1.307';
  126.    my($ciscobox) = ($sysObjectID =~ /^$cisco_router_sysid/);
  127.    my($portmaster) = ($sysObjectID =~ /^$livingston_router_sysid/);
  128.     print <<ECHO;
  129. WorkDir: d:\mrtg\pub\www\stats\mrtg
  130. ######################################################################
  131. # Description: $sysDescr
  132. #     Contact: $sysContact
  133. # System Name: $sysName
  134. #    Location: $sysLocation
  135. #.....................................................................
  136. ECHO
  137.   my @ipadent = snmpgettable($router,$community, 'ipAdEntAddr');
  138.   print  "Got Addressesn" if $DEBUG;
  139.   my @ipadentif = snmpgettable($router,$community, 'ipAdEntIfIndex');
  140.   print  "Got IfTablen" if $DEBUG;
  141.   my @ifatmlec = snmpgettable($router,$community, 'ifAtmLecConfigEntry');
  142.     print  "Got ifAtmLecConfigEntryn" if $DEBUG;
  143.   my @ifatmlecName = snmpgettable($router,$community, 'ifAtmLecConfigName');
  144.     print  "Got ifatmlecNamen" if $DEBUG;
  145.   my @ifatmvcl = snmpgettable($router,$community, 'ifAtmVclConfEntry');
  146.     print  "Got ifAtmVclConfEntryn" if $DEBUG;
  147.   my @ifatmpvc = snmpgettable($router,$community, 'ifAtmizerVclStatsEntry');
  148.     print  "Got ifAtmizerVclStatsEntryn" if $DEBUG;
  149.   my @ifatmVclConf2 = snmpgettable($router,$community, 'ifAtmVclConf2');
  150.     print  "Got ifAtmVclConf2n" if $DEBUG; 
  151.  my @ifatmVclConf3 = snmpgettable($router,$community, 'ifAtmVclConf3');
  152.     print  "Got ifAtmVclConf3n" if $DEBUG;
  153. my @ifatmpvc1 = snmpgettable($router,$community, 'ifAtmizerVclStatsEntr1');
  154.     print  "Got ifatmpvc1n" if $DEBUG;
  155. my @ifatmpvc2 = snmpgettable($router,$community, 'ifAtmizerVclStatsEntr2');
  156.     print  "Got ifatmpvc2n" if $DEBUG;
  157. # get circuit name  'ifAtmVclConf2'
  158. # get atm Interface number  'ifAtmVclConf3'
  159. # get atm interface -> atm_name  'ifAtmVclConfEntry'
  160.   my(%ipaddr, %iphost,$index);
  161.   while (scalar @ipadentif){
  162.     $index = shift @ipadentif;
  163.     $ipaddr{$index} = shift @ipadent;
  164.  #   $iphost{$index} = 
  165.  #     gethostbyaddr(pack('C4',split(/./,$ipaddr{$index})), AF_INET);
  166.  #   if ($iphost{$index} eq ''){
  167.  $iphost{$index} = ' '; 
  168.  #   }
  169.   }
  170.   my(@ifdescr) = snmpgettable($router,$community, 'ifDescr');
  171.   print  "Got IfDescrn" if $DEBUG;
  172.   my(@iftype) = snmpgettable($router,$community, 'ifType');
  173.   print  "Got IfTypen" if $DEBUG;
  174.   my(@ifspeed) = snmpgettable($router,$community, 'ifSpeed');
  175.   print  "Got IfSpeedn" if $DEBUG;
  176.   my(@ifadminstatus) = snmpgettable($router,$community, 'ifAdminStatus');
  177.   print  "Got IfAdminStatusn" if $DEBUG;
  178.   my(@ifoperstatus) = snmpgettable($router,$community, 'ifOperStatus');
  179.   print  "Got IfOperStatusn" if $DEBUG;
  180.   my(@ifindex) = snmpgettable($router,$community, 'ifIndex');
  181.   print  "Got IfIndexn" if $DEBUG;
  182.   my(%sifdesc,%siftype,%sifspeed,%sifadminstatus,%sifoperstatus,%sciscodescr);
  183.   ### May need the cisco IOS version number so we know which oid to use
  184.   ###   to get the cisco description.
  185.   ###
  186.   ### - mjd 2/5/98 (Mike Diehn) (mdiehn@mindspring.net)
  187.   ###
  188.   my ($cisco_ver, $cisco_descr_oid, @ciscodescr);
  189.  my (%atmindex, %atmindex2, %atmCir, %atmindex5, $atmindex2);
  190.   if ( $ciscobox ) {
  191.     ($cisco_ver) = ($sysDescr =~ m/Versions+([d.]+)(d+)w*?,/o);
  192.     $cisco_descr_oid = ($cisco_ver ge "11.2") ? "ifAlias" : "CiscolocIfDescr";
  193.   }
  194. print  "Print from ifatmlecname n" if $DEBUG;
  195.   while (scalar @ifatmlecName) {
  196.     $index = shift @ifatmlecName;
  197.     $sifdesc{$index} = shift @ifatmlec;
  198.     $siftype{$index} = '';
  199.     $sifspeed{$index} = '';
  200.     $sifadminstatus{$index} = '';
  201.     $sifoperstatus{$index} = '';
  202.     my $atm_Index = $index;
  203.     my $name = "$router.$index";
  204.     my $name2 = "$router.$sifdesc{$index}";
  205. print  "$sifdesc{$index}: '$sifdesc{$index}'n" if $DEBUG;
  206. print  "$index: $atm_Index: $name:  $name2:  $sifdesc{$index}n" if $DEBUG;
  207.  
  208.     }
  209.  my $jet2;
  210.   
  211.    print  " sifdesc  n" if $DEBUG; 
  212. foreach $jet2 (%sifdesc) {
  213. print  "$jet2  n" if $DEBUG; 
  214. }
  215. print  "Print from ifatmpvc1 n" if $DEBUG;
  216.     while  (scalar @ifatmpvc2) {
  217.    $index = shift @ifatmpvc2;
  218.     $atmindex{$index} = $index;
  219.     $atmCir{$index} = shift @ifatmpvc1;
  220.     my $atm_Index_Base = $index;
  221.     my $atm_Index = $atmindex{$index};
  222.     my $name = $atmCir{$index};
  223.     my $atm_index2 = $atmindex2{$index};
  224. print  "$index: $atm_Index_Base: $atm_Index:  $name: $atm_index2n" if $DEBUG;
  225.  
  226. print  "$index: '$index'n" if $DEBUG;
  227. print  "$atmindex{$index}: '$atmindex{$index}'n" if $DEBUG;
  228. print  "$atmCir{$index}: '$atmCir{$index}'n" if $DEBUG;
  229. print  "$atmindex2{$index}: '$atmindex2{$index}'n" if $DEBUG;    
  230. }
  231.     while  (scalar @ifatmVclConf3) {
  232.    $index = shift @ifatmVclConf3;
  233.    $atmindex2{$index} = shift @ifatmvcl;
  234. }
  235.    print  " atmindex  n" if $DEBUG; 
  236.  foreach $jet2 (%atmindex) {
  237. print  "$jet2  n" if $DEBUG; 
  238. }
  239.    print  " atmCir  n" if $DEBUG; 
  240. foreach $jet2 (%atmCir) {
  241. print  "$jet2  n" if $DEBUG; 
  242. }
  243.    print  " atmindex2 n" if $DEBUG; 
  244. foreach $jet2 (%atmindex2) {
  245. print  "$jet2  n" if $DEBUG; 
  246. }
  247. print  "Print from ifatmVclconf3 n" if $DEBUG;
  248.   while (scalar @ifindex) {
  249.   # as these arrays get filled from the bottom, 
  250.   # we need to empty them from the botom as well ...
  251.   # fifo
  252.     $index = shift @ifindex;
  253.     $sifdesc{$index} = shift @ifdescr;
  254.     $siftype{$index} = shift @iftype;
  255.     $sifspeed{$index} = shift @ifspeed;
  256.     $sifadminstatus{$index} = shift @ifadminstatus;
  257.     $sifoperstatus{$index} = shift @ifoperstatus;
  258.     if ($portmaster && $vendor) {
  259.       
  260.       # We can only approximate speeds
  261.       # 
  262.       # so we think that ppp can do 76800 bit/s, and slip 38400.
  263.       # (actualy, slip is a bit faster, but usualy users with newer modems
  264.       # use ppp). Alternatively, you can set async speed to 115200 or
  265.       # 230400 (the maximum speed supported by portmaster).
  266.       # 
  267.       # But if the interface is ptpW (sync), max speed is 128000
  268.       # change it to your needs. On various Portmasters there are
  269.       # various numbers of sync interfaces, so modify it.
  270.       # 
  271.       #  The most commonly used PM-2ER has only one sync.
  272.       # 
  273.       #  Paul Makeev (mac@redline.ru)
  274.       # 
  275.       if ($siftype{$index} eq '23') {
  276.               if ($sifdesc{$index} eq 'ptpW1') {
  277.                       $sifspeed{$index} = 128000;
  278.               } else {
  279.                       $sifspeed{$index} = 76800;
  280.               }
  281.       } elsif ($siftype{$index} eq '28') {
  282.               $sifspeed{$index} = 38400;
  283.       } elsif ($siftype{$index} eq '6') {
  284.               $sifspeed{$index} = 10000000;
  285.       }
  286.     }
  287.     ### Move this section south so we know what type of
  288.     ###  circuit we're looking at before we retrieve
  289.     ###  the cisco interface alias.
  290.     ###
  291.     ### This whole cicso thing should be re-written, but since
  292.     ###   this script doesn't need to run quickly...
  293.     ###
  294.     ###  - mjd 2/5/98
  295.     ###
  296.     # Get the user configurable interface description entered in the config 
  297.     # if it's a cisco-box
  298.     #
  299.     if ($ciscobox && $vendor) {
  300. my ($enoid, @descr);
  301. $enoid = $snmpget::OIDS{"$cisco_descr_oid"} . "." . $index;
  302. if ( $cisco_ver ge "11.2" or $siftype{$index} != '32' ) {
  303.   ### This is either not a frame-relay sub-interface or
  304.   ###  this router is running IOS 11.2+ and interface
  305.   ###  type won't matter. In either of these cases, it's
  306.   ###  ok to try getting the ifAlias or ciscoLocIfDesc.
  307.   ###
  308.   @descr = snmpget($router,$community, $enoid);
  309. } else {
  310.   ### This is a frame-relay sub-interface *and* the router
  311.   ###  is running an IOS older than 11.2. Therefore, we can
  312.   ###  get neither ifAlias nor ciscoLocIfDesc. Do something
  313.   ###  useful.
  314.   ###
  315.   @descr = ("Cisco PVCs descriptions require IOS 11.2+.");
  316. } # end if else
  317. ### Put whatever I got into the array we'll use later to append the result
  318. ###   of this operation onto the results from the ifDescr fetch.
  319. ###
  320. push @ciscodescr, shift @descr;
  321.     } # end if ($cisco_box && $vendor)
  322.     # especially since cisco does not return a if
  323.     # descr for each interface it has ...
  324.     ## JB 2/8/97 - sometimes IOS inserts E1 controllers in the standard-MIB
  325.     ## interface table, but not in the local interface table. This puts the
  326.     ## local interface description table out-of-sync. the following 
  327.     ## modification skips over E1 cards as interfaces.
  328.     #
  329.     ### I suspect that the mod I made above, to use the ifAlias
  330.     ###   oid if possible, may cause problems here. If it seems
  331.     ###   that your descriptions are out of sync, try commenting
  332.     ###   out the "if ( condition )" and it's closing right brace
  333.     ###   so that the "shift @ciscodescr" get executed for *all*
  334.     ###   iterations of this loop.
  335.     ###
  336.     ### - mjd 2/5/95
  337.     ###
  338.     if ($ciscobox && $siftype{$index} != 18) {
  339.           $sciscodescr{$index} = "<BR>" . (shift @ciscodescr) if @ciscodescr;
  340.     }
  341. }
  342.  my $jet;
  343.    print  " atmindex2  n" if $DEBUG; 
  344.  foreach $jet (%atmindex2) {
  345. print  "$jet  n" if $DEBUG; 
  346. }
  347.    print  " sifdesc  n" if $DEBUG; 
  348. foreach $jet (%sifdesc) {
  349. print  "$jet  n" if $DEBUG; 
  350. }
  351.    print  " atmCir  n" if $DEBUG; 
  352. foreach $jet (%atmCir) {
  353. print  "$jet  n" if $DEBUG; 
  354. }
  355.    print  " atmindex n" if $DEBUG; 
  356. foreach $jet (%atmindex) {
  357. print  "$jet  n" if $DEBUG; 
  358. }
  359. print  " Possible Targets  n" if $DEBUG; 
  360.   foreach $index ( sort { $atmindex2{$a} <=> $atmindex2{$b} } keys %atmindex2) {
  361.     my $c;
  362. my $index2 = $atmindex2{$index}; 
  363. #        my $name = "$router.$sifdesc{$index2}.$atmindex2{$index}.$index";
  364.         my $name = "$router.$index2.$index";
  365. my $target1 = "1.3.6.1.4.1.18.3.4.23.3.4.1.7.$atmCir{$index}.0.$index";
  366. my $target2 = "1.3.6.1.4.1.18.3.4.23.3.4.1.21.$atmCir{$index}.0.$index";
  367. print  "$index: $index2: $name: $target1: $target2:  n" if $DEBUG;
  368.    $c = '';
  369.     
  370.   print <<ECHO;
  371. ${c}
  372. ${c}Target[$name]: $target1&$target2:$community@$router * 53
  373. ${c}MaxBytes[$name]: 19400000 
  374. ${c}Title[$name]: $sysName ($iphost{$index}):  $index2 <- $index $sifdesc{$index2}
  375. ${c}PageTop[$name]: <H1>Traffic Analysis for $index2 <- $index $sifdesc{$index2}
  376. ${c} $sciscodescr{$index}</H1>
  377. ${c} <TABLE>
  378. ${c}   <TR><TD>System:</TD><TD>$sysName in $sysLocation</TD></TR>
  379. ${c}   <TR><TD>Maintainer:</TD><TD>$sysContact</TD></TR>
  380. ${c}   <TR><TD>Interface:</TD><TD>$sifdesc{$index} ($index)</TD></TR>
  381. ${c}   <TR><TD>IP:</TD><TD>$iphost{$index} ($ipaddr{$index})</TD></TR>
  382. ${c}   <TR><TD>Max Speed:</TD>
  383. ${c}       <TD>19.4MB ($ifType_d{$siftype{$index}})</TD></TR>
  384. ${c}  </TABLE>
  385. ${c}
  386. #---------------------------------------------------------------
  387. ECHO
  388.   }
  389. }
  390.   
  391. main;
  392. exit(0);
  393. sub snmpget{  
  394.   my($host,$community,@vars) = @_;
  395.   my(@enoid, $var,$response, $bindings, $binding, $value, $inoid,$outoid,
  396.      $upoid,$oid,@retvals);
  397.   my($hackcisco);
  398.   foreach $var (@vars) {
  399.     die "Unknown SNMP var $varn" 
  400.       unless $snmpget::OIDS{$var} || $var =~ /^d+[.d+]*.d+$/;
  401.     if ($var =~ /^d+[.d+]*.d+/) {
  402. push @enoid,  encode_oid((split /./, $var));
  403. $hackcisco = 1;
  404.     } else {
  405. push @enoid,  encode_oid((split /./, $snmpget::OIDS{$var}));
  406. $hackcisco = 0;
  407.     }
  408.   }
  409.   srand();
  410.   my $session = SNMP_Session->open ($host ,
  411.                                  $community, 
  412.                                  161);
  413.   if ($session->get_request_response(@enoid)) {
  414.     $response = $session->pdu_buffer;
  415.     ($bindings) = $session->decode_get_response ($response);
  416.     $session->close ();    
  417.     while ($bindings) {
  418.       ($binding,$bindings) = decode_sequence ($bindings);
  419.       ($oid,$value) = decode_by_template ($binding, "%O%@");
  420.       my $tempo = pretty_print($value);
  421.       $tempo=~s/t/ /g;
  422.       $tempo=~s/n/ /g;
  423.       $tempo=~s/^s+//;
  424.       $tempo=~s/s+$//;
  425.       push @retvals,  $tempo;
  426.     }
  427.     
  428.     return (@retvals);
  429.   } else {
  430.       if ($hackcisco) {
  431.   return ("");
  432.       } else {
  433.   die "No answer from $ARGV[0]. You may be using the wrong communityn";
  434.       }
  435.   }
  436. }
  437. sub snmpgettable{
  438.   my($host,$community,$var) = @_;
  439.   my($next_oid,$enoid,$orig_oid, 
  440.      $response, $bindings, $binding, $value, $inoid,$outoid,
  441.      $upoid,$oid,@table,$tempo);
  442.   die "Unknown SNMP var $varn" 
  443.     unless $snmpget::OIDS{$var};
  444.   
  445.   $orig_oid = encode_oid(split /./, $snmpget::OIDS{$var});
  446.   $enoid=$orig_oid;
  447.   srand();
  448.   my $session = SNMP_Session->open ($host ,
  449.                                  $community, 
  450.                                  161);
  451.   for(;;)  {
  452.     if ($session->getnext_request_response(($enoid))) {
  453.       $response = $session->pdu_buffer;
  454.       ($bindings) = $session->decode_get_response ($response);
  455.       ($binding,$bindings) = decode_sequence ($bindings);
  456.       ($next_oid,$value) = decode_by_template ($binding, "%O%@");
  457.       # quit once we are outside the table
  458.       last unless BER::encoded_oid_prefix_p($orig_oid,$next_oid);
  459.       $tempo = pretty_print($value);
  460.       print  "$var: '$tempo'n" if $DEBUG;
  461.       
  462.       $tempo=~s/t/ /g;
  463.       $tempo=~s/n/ /g;
  464.       $tempo=~s/^s+//;
  465.       $tempo=~s/s+$//;
  466.       push @table, $tempo;
  467.      
  468.     } else {
  469.       warn "No sensible answer from $ARGV[0] for $var ... results may be wrong!n";
  470. last;
  471.     }
  472.     $enoid=$next_oid;
  473.   }
  474.   $session->close ();    
  475.   return (@table);
  476. }
  477. sub fmi {
  478.   my($number) = $_[0];
  479.   my(@short);
  480.   @short = ("Bytes/s","kBytes/s","MBytes/s","GBytes/s");
  481.   my $digits=length("".$number);
  482.   my $divm=0;
  483.   while ($digits-$divm*3 > 4) { $divm++; }
  484.   my $divnum = $number/10**($divm*3);
  485.   return sprintf("%1.1f %s",$divnum,$short[$divm]);
  486. }