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

SNMP编程

开发平台:

C/C++

  1. #!/opt/gnu/bin/perl
  2. # -*- mode: Perl -*-
  3. ##################################################################
  4. # Config file creator
  5. ##################################################################
  6. # Cloned form cfgmaker Mark Trettin <mkt@lucent.com>
  7. # Created by Tobias Oetiker <oetiker@ee.ethz.ch>
  8. # this produces a config file for one router, by bulling info
  9. # off the router via snmp
  10. #################################################################
  11. #
  12. # Distributed under the GNU copyleft
  13. #
  14. # $Id: atmmaker,v 1.1.1.1 2002/02/26 10:16:31 oetiker Exp $
  15. #
  16. use SNMP_Session;
  17. use BER;
  18. use Socket;
  19. use strict;
  20. %snmpget::OIDS = (  'sysDescr' => '1.3.6.1.2.1.1.1.0',
  21.     'sysContact' => '1.3.6.1.2.1.1.4.0',
  22.     'sysName' => '1.3.6.1.2.1.1.5.0',
  23.     'sysLocation' => '1.3.6.1.2.1.1.6.0',
  24.     'sysUptime' => '1.3.6.1.2.1.1.3.0',
  25.     'ifNumber' =>  '1.3.6.1.2.1.2.1.0',
  26.     ###################################
  27.     # add the ifNumber ....
  28.     'ifDescr' => '1.3.6.1.2.1.2.2.1.2',
  29.     'ifType' => '1.3.6.1.2.1.2.2.1.3',
  30.     'ifIndex' => '1.3.6.1.2.1.2.2.1.1',
  31.     'ifSpeed' => '1.3.6.1.2.1.2.2.1.5', 
  32.     'ifOperStatus' => '1.3.6.1.2.1.2.2.1.8',  
  33.     'ifAdminStatus' => '1.3.6.1.2.1.2.2.1.7',  
  34.     # up 1, down 2, testing 3
  35.     'ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
  36.     'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
  37.     'sysObjectID' => '1.3.6.1.2.1.1.2.0',
  38.     'CiscolocIfDescr' => '1.3.6.1.4.1.9.2.2.1.1.28',
  39.     # asx port group info
  40.     'asxPortAdmnStat' => '1.3.6.1.4.1.326.2.2.2.1.2.2.1.2',
  41.     'asxPortOperStat' => '1.3.6.1.4.1.326.2.2.2.1.2.2.1.3',
  42.     'asxPortRemoteIpAddress'=> '1.3.6.1.4.1.326.2.2.2.1.2.2.1.6',
  43.     'asxPortILMIRemoteIpAddress' => '1.3.6.1.4.1.326.2.2.2.1.2.2.1.22',
  44.     'asxPortMaxBandwidthIn' => '1.3.6.1.4.1.326.2.2.2.1.2.2.1.9',
  45.     'asxhwPortName' => '1.3.6.1.4.1.326.2.2.1.1.2.3.1.13',
  46.     'asxPortNumber' => '1.3.6.1.4.1.326.2.2.2.1.2.2.1.1',
  47.  );
  48. sub main {
  49.   my(%ifType_d)=('1'=>'Other',
  50.  '2'=>'regular1822',
  51.  '3'=>'hdh1822',
  52.  '4'=>'ddnX25',
  53.  '5'=>'rfc877x25',
  54.  '6'=>'ethernetCsmacd',
  55.  '7'=>'iso88023Csmacd',
  56.  '8'=>'iso88024TokenBus',
  57.  '9'=>'iso88025TokenRing',
  58.  '10'=>'iso88026Man',
  59.  '11'=>'starLan',
  60.  '12'=>'proteon10Mbit',
  61.  '13'=>'proteon80Mbit',
  62.  '14'=>'hyperchannel',
  63.  '15'=>'fddi',
  64.  '16'=>'lapb',
  65.  '17'=>'sdlc',
  66.  '18'=>'ds1',
  67.  '19'=>'e1',
  68.  '20'=>'basicISDN',
  69.  '21'=>'primaryISDN',
  70.  '22'=>'propPointToPointSerial',
  71.  '23'=>'ppp',
  72.  '24'=>'softwareLoopback',
  73.  '25'=>'eon',
  74.  '26'=>'ethernet-3Mbit',
  75.  '27'=>'nsip',
  76.  '28'=>'slip',
  77.  '29'=>'ultra',
  78.  '30'=>'ds3',
  79.  '31'=>'sip',
  80.  '32'=>'frame-relay',
  81.  '33'=>'rs232',
  82.  '34'=>'para',
  83.  '35'=>'arcnet',
  84.  '36'=>'arcnetPlus',
  85.  '37'=>'atm',
  86.  '38'=>'miox25',
  87.  '39'=>'sonet',
  88.  '40'=>'x25ple',
  89.  '41'=>'iso88022llc',
  90.  '42'=>'localTalk',
  91.  '43'=>'smdsDxi',
  92.  '44'=>'frameRelayService',
  93.  '45'=>'v35',
  94.  '46'=>'hssi',
  95.  '47'=>'hippi',
  96.  '48'=>'modem',
  97.  '49'=>'aal5',
  98.  '50'=>'sonetPath',
  99.  '51'=>'sonetVT',
  100.  '52'=>'smdsIcip',
  101.  '53'=>'propVirtual',
  102.  '54'=>'propMultiplexor',
  103.  '55'=>'100BaseVG'
  104.  );
  105.   my($community,$router) = split /@/, $ARGV[0];
  106.   die <<USAGE  unless $community && $router;
  107. USAGE: cfgmaker 'community'@'router'
  108. EXAMPLE:  cfgmaker public@ezwf7.ethz.ch >>mrtg.cfg
  109. USAGE
  110.   
  111.   my($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) =
  112.     snmpget($router,$community,
  113.     'sysDescr','sysContact','sysName', 'sysLocation', 'ifNumber',
  114.     'sysObjectID');
  115.    $sysDescr =~ s/r/<BR>/g;  # Change returns to <BR>
  116.    my($cisco_router_sysid) = '1.3.6.1.4.1.9';
  117.    my($ciscobox) = ($sysObjectID =~ /^$cisco_router_sysid/);
  118.    my($foreasx_switch_sysid) = '1.3.6.1.4.1.326';
  119.    my($foreasx) = ($sysObjectID =~ /^$foreasx_switch_sysid/);
  120.     print <<ECHO;
  121. ######################################################################
  122. # Description: $sysDescr
  123. #     Contact: $sysContact
  124. # System Name: $sysName
  125. #    Location: $sysLocation
  126. #.....................................................................
  127. ECHO
  128.   my @ipadent = snmpgettable($router,$community, 'ipAdEntAddr');
  129.   my @ipadentif = snmpgettable($router,$community, 'ipAdEntIfIndex');
  130.   my(%ipaddr, %iphost,$index);
  131.   while (scalar @ipadentif){
  132.     $index = shift @ipadentif;
  133.     $ipaddr{$index} = shift @ipadent;
  134.     $iphost{$index} = 
  135.       gethostbyaddr(pack('C4',split(/./,$ipaddr{$index})), AF_INET);
  136.     if ($iphost{$index} eq ''){
  137.  $iphost{$index} = 'No hostname defined for IP address';
  138.     }
  139.   }
  140.   my(@ifdescr) = snmpgettable($router,$community, 'ifDescr');
  141.   my(@iftype) = snmpgettable($router,$community, 'ifType');
  142.   my(@ifspeed) = snmpgettable($router,$community, 'ifSpeed');
  143.   my(@ifadminstatus) = snmpgettable($router,$community, 'ifAdminStatus');
  144.   my(@ifoperstatus) = snmpgettable($router,$community, 'ifOperStatus');
  145.   my(@ifindex) = snmpgettable($router,$community, 'ifIndex');
  146.   # Get the user configurable interface description entered in the config 
  147.   # if it's a cisco-box
  148.   my @ciscodescr;
  149.   if ($ciscobox) {
  150.       @ciscodescr = snmpgettable($router,$community, 'CiscolocIfDescr');
  151.   }
  152.   if ($foreasx) {
  153.       # Get the FORE ATM Switch port configurations
  154.       # if it's a ASX Switch
  155.       my @asxipaddress;
  156.       my @asxilmiaddress;
  157.       my @asxifadminstatus;
  158.       my @asxifoperstatus;
  159.       my @asxifilmiaddress;
  160.       my @asxifipaddress;
  161.       my @asxmaxbandwidthin;
  162.       my @asxhwportname;
  163.       my @asxportnumber;
  164.       @asxportnumber = snmpgettable($router,$community, 'asxPortNumber');
  165.       @asxhwportname = snmpgettable($router,$community, 'asxhwPortName');
  166.       @asxipaddress = snmpgettable($router,$community, 'asxPortRemoteIpAddress');
  167.       @asxilmiaddress = snmpgettable($router,$community, 'asxPortILMIRemoteIpAddress');
  168.       @asxmaxbandwidthin = snmpgettable($router,$community, 'asxPortMaxBandwidthIn');
  169.       @asxifadminstatus = snmpgettable($router,$community, 'asxPortAdmnStat');
  170.       @asxifoperstatus = snmpgettable($router,$community, 'asxPortOperStat');
  171.       my(%ipaddr, %iphost,%ipiladdr, %ipilhost);
  172.       my(%sportnumber, %sportname, %sifadminstatus, %sifoperstatus, %smaxbandwidth);
  173.       while (scalar @asxportnumber) {
  174.     $index = shift @asxportnumber;
  175.     $sportnumber{$index} = $index;
  176.     $sportname{$index} = shift @asxhwportname;
  177.     $smaxbandwidth{$index} = shift @asxmaxbandwidthin;
  178.     $sifadminstatus{$index} = shift @asxifadminstatus;
  179.     $sifoperstatus{$index} = shift @asxifoperstatus;
  180.     $ipaddr{$index} = shift @asxipaddress;
  181.     $ipiladdr{$index} = shift @asxilmiaddress;
  182.     $iphost{$index} = 
  183.       gethostbyaddr(pack('C4',split(/./,$ipaddr{$index})), AF_INET);
  184.     if ($iphost{$index} eq ''){
  185.  $iphost{$index} = $ipaddr{$index};
  186.     }
  187.     $ipilhost{$index} = 
  188.       gethostbyaddr(pack('C4',split(/./,$ipiladdr{$index})), AF_INET);
  189.     if ($ipilhost{$index} eq ''){
  190.  $ipilhost{$index} = $ipiladdr{$index};
  191.     }
  192.       }
  193.       foreach $index (keys %sportnumber) {
  194.   my $c;
  195. my $speed = int($smaxbandwidth{$index}*53); # cells to bytes
  196.   my $speed_str=&fmi($speed);
  197. my $name="$router.$index";
  198. if (($sifoperstatus{$index} != 1)
  199. && ($sifadminstatus{$index} == 3)) {
  200.     print <<ECHO;
  201. ########
  202. ######## This Interface is one of the following
  203. ######## - administratively not UP
  204. ######## - it is in test mode
  205. ######## - it is a softwareLoopback interface
  206. ######## - has a unrealistic speed setting
  207. ######## It is commented out for this reason.
  208. ########
  209. ECHO
  210.     $c="# ";
  211. } else {
  212.     $c = '';
  213. }
  214.     
  215. print <<ECHO;
  216. ${c}
  217. ${c}Target[$name]: CellsRcvd.$index&CellsTrans.$index:$community@$router * 53
  218. ${c}MaxBytes[$name]: $speed
  219. ${c}Options[$name]: growright
  220. ${c}WithPeak[$name]: dwmy
  221. ${c}Title[$name]: $sysName ($iphost{$index}): $sportname{$index}
  222. ${c}PageTop[$name]: <H1>Traffic Analysis for $sportname{$index}
  223. ${c} </H1>
  224. ${c} <TABLE>
  225. ${c}   <TR><TD>System:</TD><TD>$sysName in $sysLocation</TD></TR>
  226. ${c}   <TR><TD>Maintainer:</TD><TD>$sysContact</TD></TR>
  227. ${c}   <TR><TD>Interface:</TD><TD>$sportname{$index} ($index)</TD></TR>
  228. ECHO
  229. print <<ECHO if $iphost{$index}!="255.255.255.255";
  230. ${c}   <TR><TD>Remote IP:</TD><TD>$iphost{$index} ($ipaddr{$index})</TD></TR>
  231. ECHO
  232. print <<ECHO if $ipilhost{$index}!="255.255.255.255";
  233. ${c}   <TR><TD>Remote ILMI IP:</TD><TD>$ipilhost{$index} ($ipiladdr{$index})</TD></TR>
  234. ECHO
  235. print <<ECHO;
  236. ${c}   <TR><TD>Max Speed:</TD>
  237. ${c}       <TD>$speed_str (Sonet)</TD></TR>
  238. ${c}  </TABLE>
  239. ${c}
  240. #---------------------------------------------------------------
  241. ECHO
  242.     }
  243.   }
  244.   else {
  245.   my(%sifdesc,%siftype,%sifspeed,%sifadminstatus,%sifoperstatus,%sciscodescr);
  246.   while (scalar @ifindex) {
  247.   # as these arrays get filled from the bottom, 
  248.   # we need to empty them from the botom as well ...
  249.   # fifo
  250.     $index = shift @ifindex;
  251.     $sifdesc{$index} = shift @ifdescr;
  252.     $siftype{$index} = shift @iftype;
  253.     print STDERR $siftype{$index};
  254.     $sifspeed{$index} = shift @ifspeed;
  255.     $sifadminstatus{$index} = shift @ifadminstatus;
  256.     $sifoperstatus{$index} = shift @ifoperstatus;
  257.     # especially since cisco does not return a if
  258.     # descr for each interface it has ...
  259.     $sciscodescr{$index} = "<BR>" . (shift @ciscodescr) if @ciscodescr;
  260. }
  261. foreach $index (keys %sifdesc) {
  262. my $c;
  263. my $speed = int($sifspeed{$index} / 8); # bits to byte
  264.   my $speed_str=&fmi($speed);
  265. my $name="$router.$index";
  266. if (($sifadminstatus{$index} != 1)
  267. || ($siftype{$index} == 24)
  268. || ($speed == 0 ) 
  269. || ($speed > 400 * 10**6)  #speeds of 400 MByte/s are not realistic
  270. || ($sifoperstatus{$index} == 3)) {
  271. print <<ECHO;
  272. ########
  273. ######## This Interface is one of the following
  274. ######## - administratively not UP
  275. ######## - it is in test mode
  276. ######## - it is a softwareLoopback interface
  277. ######## - has a unrealistic speed setting
  278. ######## It is commented out for this reason.
  279. ########
  280. ECHO
  281.   $c="# ";
  282.   }else {
  283.     $c = '';
  284.   }
  285.     
  286.   print <<ECHO;
  287. ${c}
  288. ${c}Target[$name]: $index:$community@$router
  289. ${c}MaxBytes[$name]: $speed
  290. ${c}Options[$name]: growright
  291. ${c}WithPeak[$name]: dwmy
  292. ${c}Title[$name]: $sysName ($iphost{$index}): $sifdesc{$index}
  293. ${c}PageTop[$name]: <H1>Traffic Analysis for $sifdesc{$index}
  294. ${c} $sciscodescr{$index}</H1>
  295. ${c} <TABLE>
  296. ${c}   <TR><TD>System:</TD><TD>$sysName in $sysLocation</TD></TR>
  297. ${c}   <TR><TD>Maintainer:</TD><TD>$sysContact</TD></TR>
  298. ${c}   <TR><TD>Interface:</TD><TD>$sifdesc{$index} ($index)</TD></TR>
  299. ${c}   <TR><TD>IP:</TD><TD>$iphost{$index} ($ipaddr{$index})</TD></TR>
  300. ${c}   <TR><TD>Max Speed:</TD>
  301. ${c}       <TD>$speed_str ($ifType_d{$siftype{$index}})</TD></TR>
  302. ${c}  </TABLE>
  303. ${c}
  304. #---------------------------------------------------------------
  305. ECHO
  306.   }
  307.  }
  308. }
  309.   
  310. main;
  311. exit(0);
  312. sub snmpget{  
  313.   my($host,$community,@vars) = @_;
  314.   my(@enoid, $var,$response, $bindings, $binding, $value, $inoid,$outoid,
  315.      $upoid,$oid,@retvals);
  316.   foreach $var (@vars) {
  317.     die "Unknown SNMP var $varn" 
  318.       unless $snmpget::OIDS{$var};
  319.     push @enoid,  encode_oid((split /./, $snmpget::OIDS{$var}));
  320.   }
  321.   srand();
  322.   my $session = SNMP_Session->open ($host ,
  323.                                  $community, 
  324.                                  161);
  325.   if ($session->get_request_response(@enoid)) {
  326.     $response = $session->pdu_buffer;
  327.     ($bindings) = $session->decode_get_response ($response);
  328.     $session->close ();    
  329.     while ($bindings) {
  330.       ($binding,$bindings) = decode_sequence ($bindings);
  331.       ($oid,$value) = decode_by_template ($binding, "%O%@");
  332.       my $tempo = pretty_print($value);
  333.       $tempo=~s/t/ /g;
  334.       $tempo=~s/n/ /g;
  335.       $tempo=~s/^s+//;
  336.       $tempo=~s/s+$//;
  337.       push @retvals,  $tempo;
  338.     }
  339.     
  340.     return (@retvals);
  341.   } else {
  342.     die "No answer from $ARGV[0]. You may be using the wrong communityn";
  343.   }
  344. }
  345. sub snmpgettable{
  346.   my($host,$community,$var) = @_;
  347.   my($next_oid,$enoid,$orig_oid, 
  348.      $response, $bindings, $binding, $value, $inoid,$outoid,
  349.      $upoid,$oid,@table,$tempo);
  350.   die "Unknown SNMP var $varn" 
  351.     unless $snmpget::OIDS{$var};
  352.   
  353.   $orig_oid = encode_oid(split /./, $snmpget::OIDS{$var});
  354.   $enoid=$orig_oid;
  355.   srand();
  356.   my $session = SNMP_Session->open ($host ,
  357.                                  $community, 
  358.                                  161);
  359.   for(;;)  {
  360.     if ($session->getnext_request_response(($enoid))) {
  361.       $response = $session->pdu_buffer;
  362.       ($bindings) = $session->decode_get_response ($response);
  363.       ($binding,$bindings) = decode_sequence ($bindings);
  364.       ($next_oid,$value) = decode_by_template ($binding, "%O%@");
  365.       # quit once we are outside the table
  366.       last unless BER::encoded_oid_prefix_p($orig_oid,$next_oid);
  367.       $tempo = pretty_print($value);
  368.       #print "$var: '$tempo'n";
  369.       $tempo=~s/t/ /g;
  370.       $tempo=~s/n/ /g;
  371.       $tempo=~s/^s+//;
  372.       $tempo=~s/s+$//;
  373.       push @table, $tempo;
  374.      
  375.     } else {
  376.       die "No answer from $ARGV[0]n";
  377.     }
  378.     $enoid=$next_oid;
  379.   }
  380.   $session->close ();    
  381.   return (@table);
  382. }
  383. sub fmi {
  384.   my($number) = $_[0];
  385.   my(@short);
  386.   @short = ("Bytes/s","kBytes/s","MBytes/s","GBytes/s","TBytes/s");
  387.   my $digits=length("".$number);
  388.   my $divm=0;
  389.   while ($digits-$divm*3 > 4) { $divm++; }
  390.   my $divnum = $number/10**($divm*3);
  391.   return sprintf("%1.1f %s",$divnum,$short[$divm]);
  392. }