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

SNMP编程

开发平台:

C/C++

  1. #! /usr/bin/perl
  2. # -*- mode: Perl -*-
  3. ##################################################################
  4. # New MRTG 2.8.12 Based -- Config file creator
  5. ##################################################################
  6. # Created by Tobias Oetiker <oetiker@ee.ethz.ch>
  7. # this produces a config file for one router, by pulling info
  8. # off the router via snmp
  9. # Modified by Graziano Sommariva <Graziano.Sommariva@elsag.it>
  10. # to monitor DLCI's and to include some code from newer release(2.9.12).
  11. # NOTE: IPONLY has been disabled.
  12. #       Added --ip option
  13. #################################################################
  14. #
  15. # Distributed under the GNU copyleft
  16. require 5.004;
  17. use strict;
  18. BEGIN {
  19.     # Automatic OS detection ... do NOT touch
  20.     if ( $^O =~ /^(?:(ms)?(dos|win(32|nt)?))/i ) {
  21.         $main::OS = 'NT';
  22.         $main::SL = '\';
  23.         $main::PS = ';';
  24.     } elsif ( $^O =~ /^VMS$/i ) {
  25.         $main::OS = 'VMS';
  26.         $main::SL = '.';
  27.         $main::PS = ':';
  28.     } else {
  29.         $main::OS = 'UNIX';
  30.         $main::SL = '/';
  31.         $main::PS = ':';
  32.     }
  33. }
  34. use FindBin;
  35. use lib "${FindBin::Bin}";
  36. use lib "${FindBin::Bin}${main::SL}..${main::SL}lib${main::SL}mrtg2";
  37. use BER "0.57";
  38. use SNMP_Session "0.59";
  39. use SNMP_util "0.57";
  40. use Getopt::Long;
  41. use Socket;
  42. use strict;
  43. use vars '$DEBUG';
  44. my $DEBUG = 0;
  45. my (%optctl) = ();
  46. my ($session, %ipaddr, %iphost);
  47. sub main {
  48.     snmpmapOID('ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
  49.        'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
  50.        'sysObjectID' => '1.3.6.1.2.1.1.2.0',
  51.        'CiscolocIfDescr' => '1.3.6.1.4.1.9.2.2.1.1.28',
  52.        'ifAlias' => '1.3.6.1.2.1.31.1.1.1.18');
  53.   my(%ifType_d)=('1'=>'Other',
  54.  '2'=>'regular1822',
  55.  '3'=>'hdh1822',
  56.  '4'=>'ddnX25',
  57.  '5'=>'rfc877x25',
  58.  '6'=>'ethernetCsmacd',
  59.  '7'=>'iso88023Csmacd',
  60.  '8'=>'iso88024TokenBus',
  61.  '9'=>'iso88025TokenRing',
  62.  '10'=>'iso88026Man',
  63.  '11'=>'starLan',
  64.  '12'=>'proteon10Mbit',
  65.  '13'=>'proteon80Mbit',
  66.  '14'=>'hyperchannel',
  67.  '15'=>'fddi',
  68.  '16'=>'lapb',
  69.  '17'=>'sdlc',
  70.  '18'=>'ds1',
  71.  '19'=>'e1',
  72.  '20'=>'basicISDN',
  73.  '21'=>'primaryISDN',
  74.  '22'=>'propPointToPointSerial',
  75.  '23'=>'ppp',
  76.  '24'=>'softwareLoopback',
  77.  '25'=>'eon',
  78.  '26'=>'ethernet-3Mbit',
  79.  '27'=>'nsip',
  80.  '28'=>'slip',
  81.  '29'=>'ultra',
  82.  '30'=>'ds3',
  83.  '31'=>'sip',
  84.  '32'=>'frame-relay',
  85.  '33'=>'rs232',
  86.  '34'=>'para',
  87.  '35'=>'arcnet',
  88.  '36'=>'arcnetPlus',
  89.  '37'=>'atm',
  90.  '38'=>'miox25',
  91.  '39'=>'sonet',
  92.  '40'=>'x25ple',
  93.  '41'=>'iso88022llc',
  94.  '42'=>'localTalk',
  95.  '43'=>'smdsDxi',
  96.  '44'=>'frameRelayService',
  97.  '45'=>'v35',
  98.  '46'=>'hssi',
  99.  '47'=>'hippi',
  100.  '48'=>'modem',
  101.  '49'=>'aal5',
  102.  '50'=>'sonetPath',
  103.  '51'=>'sonetVT',
  104.  '52'=>'smdsIcip',
  105.  '53'=>'propVirtual',
  106.  '54'=>'propMultiplexor',
  107.  '55'=>'100BaseVG',
  108.              '56'=>'Fibre Channel',
  109.              '57'=>'HIPPI Interface',
  110.              '58'=>'Obsolete for FrameRelay',
  111.              '59'=>'ATM Emulation of 802.3 LAN',
  112.              '60'=>'ATM Emulation of 802.5 LAN',
  113.              '61'=>'ATM Emulation of a Circuit',
  114.              '62'=>'FastEthernet (100BaseT)',
  115.              '63'=>'ISDN & X.25',
  116.              '64'=>'CCITT V.11/X.21',
  117.              '65'=>'CCITT V.36',
  118.              '66'=>'CCITT G703 at 64Kbps',
  119.              '67'=>'Obsolete G702 see DS1-MIB',
  120.              '68'=>'SNA QLLC',
  121.              '69'=>'Full Duplex Fast Ethernet (100BaseFX)',
  122.              '70'=>'Channel',
  123.              '71'=>'Radio Spread Spectrum (802.11)',
  124.                  '72'=>'IBM System 360/370 OEMI Channel',
  125.                  '73'=>'IBM Enterprise Systems Connection',
  126.                  '74'=>'Data Link Switching',
  127.                  '75'=>'ISDN S/T Interface',
  128.                  '76'=>'ISDN U Interface',
  129.                  '77'=>'Link Access Protocol D (LAPD)',
  130.                  '78'=>'IP Switching Opjects',
  131.                  '79'=>'Remote Source Route Bridging',
  132.                  '80'=>'ATM Logical Port',
  133.                  '81'=>'AT&T DS0 Point (64 Kbps)',
  134.                  '82'=>'AT&T Group of DS0 on a single DS1',
  135.                  '83'=>'BiSync Protocol (BSC)',
  136.                  '84'=>'Asynchronous Protocol',
  137.                  '85'=>'Combat Net Radio',
  138.                  '86'=>'ISO 802.5r DTR',
  139.                  '87'=>'Ext Pos Loc Report Sys',
  140.                  '88'=>'Apple Talk Remote Access Protocol',
  141.                  '89'=>'Proprietary Connectionless Protocol',
  142.                  '90'=>'CCITT-ITU X.29 PAD Protocol',
  143.                  '91'=>'CCITT-ITU X.3 PAD Facility',
  144.                  '92'=>'MultiProtocol Connection over Frame/Relay',
  145.                  '93'=>'CCITT-ITU X213',
  146.                  '94'=>'Asymetric Digitial Subscriber Loop (ADSL)',
  147.                  '95'=>'Rate-Adapt Digital Subscriber Loop (RDSL)',
  148.                  '96'=>'Symetric Digitial Subscriber Loop (SDSL)',
  149.                  '97'=>'Very High Speed Digitial Subscriber Loop (HDSL)',
  150.                  '98'=>'ISO 802.5 CRFP',
  151.                  '99'=>'Myricom Myrinet',
  152.                  '100'=>'Voice recEive and transMit (voiceEM)',
  153.                  '101'=>'Voice Foreign eXchange Office (voiceFXO)',
  154.                  '102'=>'Voice Foreign eXchange Station (voiceFXS)',
  155.                  '103'=>'Voice Encapulation',
  156.                  '104'=>'Voice Over IP Encapulation',
  157.                  '105'=>'ATM DXI',
  158.                  '106'=>'ATM FUNI',
  159.                  '107'=>'ATM IMA',
  160.                  '108'=>'PPP Multilink Bundle',
  161.                  '109'=>'IBM IP over CDLC',
  162.                  '110'=>'IBM Common Link Access to Workstation',
  163.                  '111'=>'IBM Stack to Stack',
  164.                  '112'=>'IBM Virtual IP Address (VIPA)',
  165.                  '113'=>'IBM Multi-Protocol Channel Support',
  166.                  '114'=>'IBM IP over ATM',
  167.                  '115'=>'ISO 802.5j Fiber Token Ring',
  168.                  '116'=>'IBM Twinaxial Data Link Control (TDLC)',
  169.                  '117'=>'Gigabit Ethernet',
  170.                  '118'=>'Higher Data Link Control (HDLC)',
  171.                  '119'=>'Link Access Protocol F (LAPF)',
  172.                  '120'=>'CCITT V.37',
  173.                  '121'=>'CCITT X.25 Multi-Link Protocol',
  174.                  '122'=>'CCITT X.25 Hunt Group',
  175.                  '123'=>'Transp HDLC',
  176.                  '124'=>'Interleave Channel',
  177.                  '125'=>'Fast Channel',
  178.                  '126'=>'IP (for APPN HPR in IP Networks)',
  179.                  '127'=>'CATV MAC Layer',
  180.                  '128'=>'CATV Downstream Interface',
  181.                  '129'=>'CATV Upstream Interface',
  182.                  '130'=>'Avalon Parallel Processor',
  183.                  '131'=>'Encapsulation Interface',
  184.                  '132'=>'Coffee Pot',
  185.                  '133'=>'Circuit Emulation Service',
  186.                  '134'=>'ATM Sub Interface',
  187.                  '135'=>'Layer 2 Virtual LAN using 802.1Q',
  188.                  '136'=>'Layer 3 Virtual LAN using IP',
  189.                  '137'=>'Layer 3 Virtual LAN using IPX',
  190.                  '138'=>'IP Over Power Lines',
  191.                  '139'=>'Multi-Media Mail over IP',
  192.                  '140'=>'Dynamic synchronous Transfer Mode (DTM)',
  193.                  '141'=>'Data Communications Network',
  194.                  '142'=>'IP Forwarding Interface',
  195.                  '162'=>'Cisco Express Forwarding Interface'
  196.                  );
  197.   my($vendor)=0;
  198. #  my($iponly)=0;
  199.   my($workdir)=0;
  200.   my($ip)=0;
  201.   my($community,$router,%defaults);
  202.   my($res);
  203.   # Just need to make sure that all perl installations have the GetOpt module
  204.   #   - fwo@obsidian.co.za
  205.   #
  206. #  $res = GetOptions(%optctl,"vendor","iponly","workdir=s","options=s","ip=s");
  207.   $res = GetOptions(%optctl,"vendor","workdir=s","options=s","ip=s");
  208.   if($res == 0 ) {
  209.       print "nError in arguments. Please run cfgmaker with no arguments for help!nn";
  210.       exit 1;
  211.   }
  212.   if($optctl{"vendor"})   { $vendor = 1; }
  213. #  if($optctl{"iponly"})   { $iponly = 1; }
  214.   if($optctl{"workdir"})  { $workdir = $optctl{"workdir"}; }
  215.   if($optctl{"ip"})  { $ip = $optctl{"ip"}; }
  216.   if($optctl{"options"}) { 
  217.       foreach $res(split(',',$optctl{"options"})) {
  218.   chomp($res);
  219.   next if($res eq "growright");
  220.   next if($res eq "bits");
  221.   next if($res eq "perminute");
  222.   next if($res eq "perhour");
  223.   next if($res eq "noinfo");
  224.   next if($res eq "nopercent");
  225.   next if($res eq "transparent");
  226.   next if($res eq "integer");
  227.   next if($res eq "dorelpercent");
  228.   next if($res eq "gauge");
  229.   next if($res eq "absolute");
  230.   next if($res eq "unknaszero");
  231.   print "nERROR:$res is not a valid option for --options, exiting!n";
  232.   exit 1;
  233.       }
  234.   }
  235.   $res = 0;
  236. #TODO: check for conflicting info in options - l->r and r->l
  237. #  print STDERR "iponly=$iponlyn" if $DEBUG;
  238.   print STDERR "vendor=$vendorn" if $DEBUG;
  239.   print STDERR "workdir=$workdirn" if $DEBUG;
  240.   ($community,$router) = ($1,$2) if $ARGV[0] =~ /(.*)@(.*)/;
  241.   if(!($community) && !($router)) {
  242.   print <<USAGE;
  243. USAGE: cfgmaker [--vendor] [other options] 'community'@'router'
  244. use the --vendor option to try and wrestle some better information
  245.     from willing livingston and cisco routers ... (may not work)
  246. [other options] can be one of the following:
  247. #use the --iponly option to force the targets to the ip adress of the router 
  248. #    being queried. Also note that the 'router' option must be the ip address
  249. #    and not the symbolic name.
  250. use the --workdir '/some/path' option to add the WorkDir option to the cfg file 
  251.     being generated.
  252. use the --ip 'IP Address' to use in SNMP requests 
  253. use the --options 'defaults' to set default options for each target. defaults 
  254.     is a comma seperated list and can contain the following :
  255.         growright bits perminute perhour noinfo nopercent transparent
  256. integer dorelpercent gauge absolute unknaszero
  257.     See the mrtg.cfg doccumentation for descriptions of the above options.
  258.     NOTE: no checking for conflicting options are done at the moment.
  259. EXAMPLE:  cfgmaker public@ezwf7.ethz.ch >>mrtg.cfg
  260. USAGE
  261.     exit 1;
  262.   }
  263. #  if($iponly) { 
  264. #      # We only want to work with ip numbers and not names
  265. #      # Check to see whether the name is a valid ip address
  266. #      # If not bail - we do not want to deal with reverse dns
  267. #      #    issues - fwo@obsidian.co.za 2000/01/17
  268. #      chomp($router);
  269. #      if(!($router =~ /^[0-9]{1,3}.([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/)){
  270. #   print "nERROR: when specifying --iponly, please use a validn";
  271. #   print "ip address for the router. Do not use a symbolic name.nn";
  272. #   exit 1;
  273. #      }
  274. #  }
  275.     print "IconDir: /mrtgicons/nn";
  276.   if($workdir) {
  277.    print "WorkDir: $workdirnn";
  278.   } else {
  279.    print "# Add a WorkDir: /html line to this filenn";
  280.   }
  281.   my($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID);
  282.   my($sysDescr_orig,$cisco_router_sysid,$livingston_router_sysid,$ciscobox,$portmaster);
  283.   if($optctl{"ip"}) {
  284.      $session = SNMP_Session->open ($ip, $community, 161)
  285. || die "Error opening SNMP session to $ip";
  286.      ($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) = snmpget("$community@$ip",'sysDescr','sysContact','sysName','sysLocation','ifNumber', 'sysObjectID');
  287.      $sysDescr_orig=$sysDescr;
  288.      $sysDescr_orig =~ s/[rn ]+/ /g;
  289.      $sysDescr =~ s/[rn]+/<BR>/g;  # Change returns to <BR>
  290.      $cisco_router_sysid = '1.3.6.1.4.1.9';
  291.      $livingston_router_sysid = '1.3.6.1.4.1.307';
  292.      $ciscobox = ($sysObjectID =~ /^$cisco_router_sysid/);
  293.      $portmaster = ($sysObjectID =~ /^$livingston_router_sysid/);
  294.   } else { 
  295.      $session = SNMP_Session->open ($router, $community, 161)
  296. || die "Error opening SNMP session to $router";
  297.      ($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) = snmpget("$community@$router",'sysDescr','sysContact','sysName','sysLocation','ifNumber', 'sysObjectID');
  298.      $sysDescr_orig=$sysDescr;
  299.      $sysDescr_orig =~ s/[rn ]+/ /g;
  300.      $sysDescr =~ s/[rn]+/<BR>/g;  # Change returns to <BR>
  301.      $cisco_router_sysid = '1.3.6.1.4.1.9';
  302.      $livingston_router_sysid = '1.3.6.1.4.1.307';
  303.      $ciscobox = ($sysObjectID =~ /^$cisco_router_sysid/);
  304.      $portmaster = ($sysObjectID =~ /^$livingston_router_sysid/);
  305.   } 
  306.   print <<ECHO;
  307. ######################################################################
  308. # Description: $sysDescr_orig
  309. #     Contact: $sysContact
  310. # System Name: $sysName
  311. #    Location: $sysLocation
  312. #.....................................................................
  313. ECHO
  314.   $session->map_table ([[1,3,6,1,2,1,4,20,1,1], # ipAdEntAddr
  315. [1,3,6,1,2,1,4,20,1,2]], # ipAdEntIf
  316.        sub ($@) {
  317.    my ($index, $ipadentaddr, $ipadentif) = @_;
  318.    grep (defined $_ && ($_=pretty_print $_),
  319.  ($ipadentif, $ipadentaddr));
  320.    $ipaddr{$ipadentif} = $ipadentaddr;
  321.    $iphost{$ipadentif} = 
  322.        gethostbyaddr(pack('C4',split(/./,$ipaddr{$ipadentif})), AF_INET);
  323.    if (!defined $iphost{$ipadentif} || ($iphost{$ipadentif} eq '')){
  324.        $iphost{$ipadentif} = 'No hostname defined for IP address';
  325.    }
  326.        });
  327.   print STDERR "Got Addressesn" if $DEBUG;
  328.   print STDERR "Got IfTablen" if $DEBUG;
  329.   my(%sifdesc,%siftype,%sifspeed,%sifadminstatus,%sifoperstatus,%sciscodescr);
  330.   ### May need the cisco IOS version number so we know which oid to use
  331.   ###   to get the cisco description.
  332.   ###
  333.   ### - mjd 2/5/98 (Mike Diehn) (mdiehn@mindspring.net)
  334.   ###
  335.   my ($cisco_ver, $cisco_descr_oid, @ciscodescr);
  336.   if ( $ciscobox ) {
  337.     ($cisco_ver) = ($sysDescr =~ m/Versions+([d.]+)(d/o);
  338.     $cisco_descr_oid = ($cisco_ver ge "11.2") ? "ifAlias" : "CiscolocIfDescr";
  339.   }
  340. $session->map_table ([[1,3,6,1,2,1,2,2,1,1], # ifIndex
  341.       [1,3,6,1,2,1,2,2,1,2], # ifDescr
  342.       [1,3,6,1,2,1,2,2,1,3], # ifType
  343.       [1,3,6,1,2,1,2,2,1,5], # ifSpeed
  344.       [1,3,6,1,2,1,2,2,1,7], # ifAdminStatus
  345.       [1,3,6,1,2,1,2,2,1,8]], # ifOperStatus
  346. sub ($@) {
  347.     my ($rowindex,$index,$ifdescr,$iftype,$ifspeed,$ifadminstatus,$ifoperstatus) = @_;
  348.     grep (defined $_ && ($_=pretty_print $_),
  349.   ($index,$ifdescr,$iftype,$ifspeed,$ifadminstatus,$ifoperstatus));
  350.     $sifdesc{$index} = $ifdescr;
  351.     $siftype{$index} = $iftype;
  352.     $sifspeed{$index} = $ifspeed;
  353.     $sifadminstatus{$index} = $ifadminstatus;
  354.     $sifoperstatus{$index} = $ifoperstatus;
  355.     if ($portmaster && $vendor) {
  356.       
  357.       # We can only approximate speeds
  358.       # 
  359.       # so we think that ppp can do 76800 bit/s, and slip 38400.
  360.       # (actualy, slip is a bit faster, but usualy users with newer modems
  361.       # use ppp). Alternatively, you can set async speed to 115200 or
  362.       # 230400 (the maximum speed supported by portmaster).
  363.       # 
  364.       # But if the interface is ptpW (sync), max speed is 128000
  365.       # change it to your needs. On various Portmasters there are
  366.       # various numbers of sync interfaces, so modify it.
  367.       # 
  368.       #  The most commonly used PM-2ER has only one sync.
  369.       # 
  370.       #  Paul Makeev (mac@redline.ru)
  371.       # 
  372.       if ($siftype{$index} eq '23') {
  373.               if ($sifdesc{$index} eq 'ptpW1') {
  374.                       $sifspeed{$index} = 128000;
  375.               } else {
  376.                       $sifspeed{$index} = 76800;
  377.               }
  378.       } elsif ($siftype{$index} eq '28') {
  379.               $sifspeed{$index} = 38400;
  380.       } elsif ($siftype{$index} eq '6') {
  381.               $sifspeed{$index} = 10000000;
  382.       }
  383.     }
  384.     ### Move this section south so we know what type of
  385.     ###  circuit we're looking at before we retrieve
  386.     ###  the cisco interface alias.
  387.     ###
  388.     ### This whole cicso thing should be re-written, but since
  389.     ###   this script doesn't need to run quickly...
  390.     ###
  391.     ###  - mjd 2/5/98
  392.     ###
  393.     # Get the user configurable interface description entered in the config 
  394.     # if it's a cisco-box
  395.     #
  396.     my($cisco_descr_oid);
  397.     if ($ciscobox && $vendor) {
  398. my ($enoid, @descr);
  399. $enoid = $cisco_descr_oid . "." . $index;
  400. if ( $cisco_ver ge "11.2" or $siftype{$index} != '32' ) {
  401.   ### This is either not a frame-relay sub-interface or
  402.   ###  this router is running IOS 11.2+ and interface
  403.   ###  type won't matter. In either of these cases, it's
  404.   ###  ok to try getting the ifAlias or ciscoLocIfDesc.
  405.   ###
  406.   @descr = snmpget("$community@$router", $enoid);
  407. } else {
  408.   ### This is a frame-relay sub-interface *and* the router
  409.   ###  is running an IOS older than 11.2. Therefore, we can
  410.   ###  get neither ifAlias nor ciscoLocIfDesc. Do something
  411.   ###  useful.
  412.   ###
  413.   @descr = ("Cisco PVCs descriptions require IOS 11.2+.");
  414. } # end if else
  415. ### Put whatever I got into the array we'll use later to append the result
  416. ###   of this operation onto the results from the ifDescr fetch.
  417. ###
  418. push @ciscodescr, shift @descr;
  419.     } # end if ($cisco_box && $vendor)
  420.     # especially since cisco does not return a if
  421.     # descr for each interface it has ...
  422.     ## JB 2/8/97 - sometimes IOS inserts E1 controllers in the standard-MIB
  423.     ## interface table, but not in the local interface table. This puts the
  424.     ## local interface description table out-of-sync. the following 
  425.     ## modification skips over E1 cards as interfaces.
  426.     #
  427.     ### I suspect that the mod I made above, to use the ifAlias
  428.     ###   oid if possible, may cause problems here. If it seems
  429.     ###   that your descriptions are out of sync, try commenting
  430.     ###   out the "if ( condition )" and it's closing right brace
  431.     ###   so that the "shift @ciscodescr" get executed for *all*
  432.     ###   iterations of this loop.
  433.     ###
  434.     ### - mjd 2/5/95
  435.     ###
  436.     if ($ciscobox && $siftype{$index} != 18) {
  437.           $sciscodescr{$index} = "<BR>" . (shift @ciscodescr) if @ciscodescr;
  438.     }
  439. });
  440.   my $index;
  441.   foreach $index ( sort { $a <=> $b } keys %sifdesc) {
  442.     my $c;
  443.     my $speed = int($sifspeed{$index} / 8); # bits to byte
  444.     my $speed_str=&fmi($speed);
  445.     my $name="$iphost{$index}";
  446. #    $name = "$router.int.$index" if not $name or $name =~ /s/ or $iponly;
  447.     $name = "$router.int.$index";
  448.   my $err_msg;
  449.     
  450.   $err_msg .= "######## - administratively not UPn" if ($sifadminstatus{$index} != 1);
  451. # this check added by Josh - don't query E1-stack controllers
  452.   $err_msg .= "######## - DS1 typen" 
  453.   if ($siftype{$index} == 18);
  454. # i might be mistaken on this one - fwo@obsidian.co.za
  455.   $err_msg .= "######## - E1 typen" 
  456.   if ($siftype{$index} == 19);
  457.   $err_msg .= "######## - it is a softwareLoopback interfacen" 
  458.   if ($siftype{$index} == 24);
  459.   $err_msg .= "######## - it is a a DS3 contorllern" 
  460.   if ($siftype{$index} == 30);
  461.   $err_msg .= "######## - it is a ISDN S/T Interfacen" 
  462.   if ($siftype{$index} == 75);
  463.   $err_msg .= "######## - it is a AT&T DS0 Point (64 Kbps)n" 
  464.   if ($siftype{$index} == 81);
  465.   $err_msg .= "######## - it is a CEF Sub-interfacen" 
  466.   if ($siftype{$index} == 162);
  467.   $err_msg .= "######## - has an unrealistic speed settingn" 
  468.   if (($speed == 0 ) || ($speed > 400 * 10**6));  
  469.   $err_msg .= "######## - administratively not UPn" 
  470.   if ($sifoperstatus{$index} == 3) ;
  471.   if($err_msg ne "") {
  472.     print <<ECHO;
  473. ########
  474. ######## This Interface not configured :
  475. $err_msg######## It is commented out for this reason.
  476. ########
  477. ECHO
  478.     $c="# ";
  479.   }else {
  480.     $c = '';
  481.   }
  482.     
  483.   print <<ECHO;
  484. ${c}
  485. ECHO
  486. if($optctl{"ip"}) {
  487.   print "${c}Target[$name]: $index:$community@$ipn";
  488. } else {
  489.   print "${c}Target[$name]: $index:$community@$routern";
  490. }
  491. print <<ECHO;
  492. #${c}MaxBytes[$name]: $speed
  493. ${c}MaxBytes[$name]: 1250000
  494. ${c}YSize[$name]: 300
  495. ${c}XSize[$name]: 600
  496. ${c}Suppress[$name]: y
  497. ${c}Title[$name]: $sysName ($iphost{$index}): $sifdesc{$index}
  498. ${c}Options[$name]: bits, growright, nopercent
  499. ECHO
  500. #if($optctl{"options"}) {
  501. #    print "${c}Options[$name]: $optctl{'options'}n";
  502. #}
  503. print <<ECHO;
  504. ${c}PageTop[$name]: <H1>Traffic Analysis for $sifdesc{$index}
  505. ${c} $sciscodescr{$index}</H1>
  506. ${c} <TABLE>
  507. ${c}   <TR><TD>System:</TD><TD>$sysName in $sysLocation</TD></TR>
  508. ${c}   <TR><TD>Maintainer:</TD><TD>$sysContact</TD></TR>
  509. ${c}   <TR><TD>Interface:</TD><TD>$sifdesc{$index} ($index)</TD></TR>
  510. ${c}   <TR><TD>IP:</TD><TD>$iphost{$index} ($ipaddr{$index})</TD></TR>
  511. ${c}   <TR><TD>Max Speed:</TD>
  512. ${c}       <TD>$speed_str ($ifType_d{$siftype{$index}})</TD></TR>
  513. ${c}  </TABLE>
  514. ${c}
  515. #---------------------------------------------------------------
  516. ECHO
  517.   }
  518. #
  519. # Frame-Relay
  520. #
  521.   my(%circuits);
  522.   $session->map_table ([[1,3,6,1,2,1,10,32,2,1,1], # Ifindex
  523.                         [1,3,6,1,2,1,10,32,2,1,2]],# DLCI
  524.   sub ($@) {
  525.       my ($rwindex,$crindex,$dlci) = @_;
  526.       grep (defined $_ && ($_=pretty_print $_),
  527.      ($rwindex,$crindex,$dlci) );
  528.       my($tmpindex);
  529.       $tmpindex = $crindex.".".$dlci;
  530.       $circuits{$tmpindex} = $tmpindex;
  531.   });
  532.   foreach $index ( sort { $a <=> $b } keys %circuits) {
  533.     my ($tmpname) = $router.".dlci.".$index;
  534.     printf "nn";
  535.     printf "Options[%s]: bits, noinfo, growright, nopercentn",$tmpname;
  536.     printf "YSize[%s]: 300n",$tmpname;
  537.     printf "XSize[%s]: 600n",$tmpname;
  538.     printf "YLegend[%s]: Bits per Secondn",$tmpname;
  539.     printf "Suppress[%s]: yn",$tmpname;
  540.     if($optctl{"ip"}) {
  541.        printf "Target[%s]: .1.3.6.1.2.1.10.32.2.1.9.%s&.1.3.6.1.2.1.10.32.2.1.7.%s:%s@%sn",$tmpname,$index,$index,$community,$ip;
  542.     } else {
  543.        printf "Target[%s]: .1.3.6.1.2.1.10.32.2.1.9.%s&.1.3.6.1.2.1.10.32.2.1.7.%s:%s@%sn",$tmpname,$index,$index,$community,$router;
  544.     }
  545.     printf "MaxBytes[%s]: 1250000n",$tmpname;
  546.     printf "Title[%s]: Traffic Analysis for DLCI %sn",$tmpname,$index;
  547.     printf "PageTop[%s]: <H1>Traffic Analysis for DLCI %s</H1>n",$tmpname,$index;
  548.     printf " <TABLE>";
  549.     printf "  <TR><TD>System:</TD><TD>%s in %s</TD></TR>",$sysName,$sysLocation;
  550.     printf "  <TR><TD>Maintainer:</TD><TD>%s</TD></TR>",$sysContact;
  551.     printf "  <TR><TD>InterfaceID.DLCI:</TD><TD>%s</TD></TR>",$tmpname;
  552.     printf " </TABLE>";
  553.   }
  554. }
  555.   
  556. main;
  557. exit(0);
  558. sub fmi {
  559.   my($number) = $_[0];
  560.   my(@short);
  561.   @short = ("Bytes/s","kBytes/s","MBytes/s","GBytes/s");
  562.   my $digits=length("".$number);
  563.   my $divm=0;
  564.   while ($digits-$divm*3 > 4) { $divm++; }
  565.   my $divnum = $number/10**($divm*3);
  566.   return sprintf("%1.1f %s",$divnum,$short[$divm]);
  567. }