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

SNMP编程

开发平台:

C/C++

  1. #!/usr/local/bin/perl
  2. #######################################################
  3. # switchmaker for MRTG
  4. #######################################################
  5. #   Author: Markley Dykeman - 04/27/99
  6. #  Purpose: This program makes an MRTG configuration 
  7. #           file for Cisco 5500 switches.
  8. #    Usage: switchmaker <fqdm> <snmpRO>
  9. # Requires: SNMP-Util-1.6 and SNMP-1.8
  10. #######################################################
  11. my $testing = 0;
  12. # Libraries
  13. use SNMP::Util;
  14. use Socket;
  15. use strict;
  16. # Environment
  17. $ENV{'MAX_LOG_LEVEL'} = 'status';
  18. # Usage display
  19. if (@ARGV < 1){
  20.    print "Usage: n";
  21.    print "      switchmaker <IP> <community string>n";
  22.    print "n";
  23.    print "       IP = IP address or Switch namen";
  24.    print "       comm = defaults to hostnamen";
  25.    exit;
  26. }
  27. # Arrays
  28. my(%iftype)=( '1'=>'other',
  29. '2'=>'cddi',
  30. '3'=>'fddi',
  31. '4'=>'tppmd',
  32. '5'=>'mlt3',
  33. '6'=>'sddi',
  34. '7'=>'smf',
  35. '8'=>'e10BaseT',
  36. '9'=>'e10BaseF',
  37. '10'=>'scf',
  38. '11'=>'e100BaseTX',
  39. '12'=>'e100BaseT4',
  40. '13'=>'e100BaseF',
  41. '14'=>'atmOc3mmf',
  42. '15'=>'atmOc3smf',
  43. '16'=>'atmOc3utp',
  44. '17'=>'e100BaseFsm',
  45. '18'=>'e10a100BaseTX',
  46. '19'=>'mii',
  47. '20'=>'vlanRouter',
  48. '22'=>'tokenring',
  49. '23'=>'atmOc12mmf',
  50. '24'=>'atmOc12smf',
  51. '25'=>'atmDs3',
  52. '26'=>'tokenringMmf',
  53. '27'=>'e1000BaseLX'
  54. );
  55. # Declare working variables
  56. my ($sysDescr, $sysName, $sysIpAddr, %portGrp, $portIfIndex, $interfacecnt, @result, @oid_list, $iphost);
  57. my (@oid_cutoff, $i);  
  58. # Get command line arguments
  59. my $IP = $ARGV[0];
  60. my $Comm_string = $ARGV[1];
  61. # Open connection to device
  62. my $snmp = new SNMP::Util(-device    => $IP,
  63.                        -community => $Comm_string);
  64. ########################
  65. # Get system information
  66. ########################
  67. @result = $snmp->next( 'ne', '1.3.6.1.2.1.1.1'); #sysDescr
  68. $sysDescr = $result[1];
  69. @result = $snmp->next( 'ne', '1.3.6.1.2.1.1.5'); #sysName
  70. $sysName = $result[1];
  71. @result = $snmp->next( 'ne', '1.3.6.1.4.1.9.5.1.1.2'); #sysIpAddr
  72. $sysIpAddr = $result[1];
  73. $iphost = gethostbyaddr(pack('C4',split(/./,$sysIpAddr)), AF_INET); #iphost
  74. if (!defined $iphost || ($iphost eq '')){
  75.    $iphost = 'Unknown DNS name';
  76. }
  77. #########################
  78. # Walk through ports
  79. #########################
  80. @oid_list = ( '1.3.6.1.4.1.9.5.1.4.1.1.11', #portIfIndex
  81. '1.3.6.1.4.1.9.5.1.4.1.1.5',  #portType
  82. '1.3.6.1.4.1.9.5.1.4.1.1.10', #portDuplex
  83. '1.3.6.1.4.1.9.5.1.4.1.1.1',  #portModuleIndex
  84. '1.3.6.1.4.1.9.5.1.4.1.1.2',  #portIndex
  85. '1.3.6.1.4.1.9.5.1.4.1.1.4',  #portName
  86. );
  87. @oid_cutoff =  '1.3.6.1.4.1.9.5.1.4.1.1.11';
  88. # Walk the MIBs...
  89. my ($more) = 1;
  90. while ($more) {
  91.    @result = $snmp->next( -format => 'one',
  92. -oids => @oid_list,
  93.                      );
  94.    # Are we done walking?
  95.    if (@result[0] !~ /@oid_cutoff/) {
  96.      $more = 0;
  97.    }
  98.    # if not, process the data
  99.    if ($more) {
  100.       $portIfIndex = $result[2];
  101.       $interfacecnt = $result[2];
  102.       $portGrp{$portIfIndex}{'portIfIndex'} = $result[2];
  103.       $portGrp{$portIfIndex}{'portType'} = $result[5];
  104.       $portGrp{$portIfIndex}{'portDuplex'} = $result[8];
  105.       $portGrp{$portIfIndex}{'portModuleIndex'} = $result[11];
  106.       $portGrp{$portIfIndex}{'portIndex'} = $result[14];
  107.       $portGrp{$portIfIndex}{'portName'} = $result[17];
  108.    }
  109.    # Update OID for snmp->next
  110.    @oid_list = ($result[0],$result[3],$result[6],$result[9],$result[12],$result[15]);
  111. }
  112. ##############################
  113. # Walk through MIB2 interfaces 
  114. ##############################
  115. @oid_list = ( '1.3.6.1.2.1.2.2.1.1', #ifIndex
  116. '1.3.6.1.2.1.2.2.1.2', #ifDescr
  117. '1.3.6.1.2.1.2.2.1.3', #ifType
  118. '1.3.6.1.2.1.2.2.1.5', #ifSpeed
  119. '1.3.6.1.2.1.2.2.1.7', #ifAdminStatus
  120. '1.3.6.1.2.1.2.2.1.8', #ifOperStatus
  121. );
  122. @oid_cutoff = '1.3.6.1.2.1.2.2.1.1';
  123. # Walk the MIBs...
  124. my ($more) = 1;
  125. while ($more) {
  126.    @result = $snmp->next( -format => 'one',
  127.       -oids => @oid_list,
  128.                      );
  129.    # Are we done walking?
  130.    if (@result[0] !~ /@oid_cutoff/) {
  131.      $more = 0;
  132.    }
  133.    # if not, process the data
  134.    if ($more) {
  135.       $portIfIndex = $result[2];
  136.       # deal with non-workgroup ports (1 & 2
  137.       if ($portGrp{$portIfIndex}{'portIfIndex'} eq "") {
  138.          $portGrp{$portIfIndex}{'portIfIndex'} = $result[2];
  139.          if ($portIfIndex eq "1") {
  140.             $portGrp{$portIfIndex}{'portName'} =  $iphost
  141.          } else {
  142.             $portGrp{$portIfIndex}{'portName'} = $result[5];
  143.             $portGrp{$portIfIndex}{'ifDescr'} = $result[8];
  144.          }
  145.       }
  146.       $portGrp{$portIfIndex}{'ifDescr'} = $result[5] if (!($portGrp{$portIfIndex}{'ifDescr'} eq $result[8]));
  147.       $portGrp{$portIfIndex}{'ifType'} = $result[8];
  148.       $portGrp{$portIfIndex}{'ifSpeed'} = $result[11];
  149.       $portGrp{$portIfIndex}{'ifAdminStatus'} = $result[14];
  150.       $portGrp{$portIfIndex}{'ifOperStatus'} = $result[17];
  151.    }
  152.    # Update OID for snmp->next
  153.    @oid_list = ($result[0],$result[3],$result[6],$result[9],$result[12],$result[15]);
  154. }
  155. if ($testing) {
  156.    print "Summary for $sysName ($sysIpAddr), $sysDescrn";
  157.    for ($i = 1;$i <= $interfacecnt; $i++) {
  158.       print "$portGrp{$i}{'portIfIndex'} ";
  159.       print "$portGrp{$i}{'portType'} ";
  160.       print "$portGrp{$i}{'portDuplex'} ";
  161.       print "$portGrp{$i}{'portModuleIndex'}/";
  162.       print "$portGrp{$i}{'portIndex'} ";
  163.       print "$portGrp{$i}{'portName'}n";
  164.       print "$portGrp{$i}{'ifDescr'} ";
  165.       print "$portGrp{$i}{'ifType'} ";
  166.       print "$portGrp{$i}{'ifSpeed'} ";
  167.       print "$portGrp{$i}{'ifAdminStatus'} ";
  168.       print "$portGrp{$i}{'ifOperStatus'}n";
  169.    }
  170. }
  171. #######################################
  172. # Start creating the configuration file
  173. #######################################
  174. print "# Add a WorkDir: /some/path line to this filenn";
  175. for ($i = 1;$i <= $interfacecnt; $i++) {
  176.    my $slash;
  177.    if ($portGrp{$i}{'portModuleIndex'} eq '') {
  178.       $slash = " ";
  179.    } else {
  180.       $slash = "/";
  181.    }
  182.    my $c;
  183.    my $ifSpeed = $portGrp{$i}{'ifSpeed'};
  184.    my $speedStr = &fmi($ifSpeed);
  185.    if (!($portGrp{$i}{'ifAdminStatus'} eq "up")) {
  186.       print <<ECHO;
  187. ########
  188. ######## This Interface is one of the following
  189. ######## - administratively not UP
  190. ######## - it is in test mode
  191. ######## - it is a softwareLoopback interface
  192. ######## - has a unrealistic speed setting
  193. ######## It is commented out for this reason.
  194. ########
  195. ECHO
  196.       $c="# ";
  197.    } else {
  198.       $c = '';
  199.    }
  200.    print <<ECHO;
  201. ${c}
  202. ${c}Target[$iphost.$i]: $i:$Comm_string@$sysIpAddr
  203. ${c}MaxBytes[$iphost.$i]: $ifSpeed
  204. ${c}Title[$iphost.$i]: $portGrp{$i}{'portModuleIndex'}$slash$portGrp{$i}{'portIndex'} $portGrp{$i}{'portName'} -- $portGrp{$i}{'ifDescr'}
  205. ${c}Options[$iphost.$i]: growright, bits
  206. ${c}PageTop[$iphost.$i]: <H1>Traffic Analysis for $portGrp{$i}{'portModuleIndex'}$slash$portGrp{$i}{'portIndex'} $portGrp{$i}{'portName'} </H1>
  207. ${c} <TABLE>
  208. ${c}   <TR><TD>System:</TD><TD>$iphost.$i</TD></TR>
  209. ${c}   <TR><TD>Interface:</TD><TD> $portGrp{$i}{'portModuleIndex'}$slash$portGrp{$i}{'portIndex'} $portGrp{$i}{'portName'} -- $portGrp{$i}{'ifDescr'} ($i)</TD></TR>
  210. ${c}   <TR><TD>Max Speed:</TD>
  211. ${c}       <TD> $speedStr ($portGrp{$i}{'portType'}) ($portGrp{$i}{'portDuplex'})</TD></TR>
  212. ${c}  </TABLE>
  213. ${c}
  214. ##---------------------------------------------------------------
  215. ECHO
  216. }
  217. ##############################
  218. # Any errors?
  219. ##############################
  220. my $error = $snmp->error;
  221. if ($error){
  222.    print "error = $errorn";
  223. }
  224. sub fmi {
  225.   my($number) = $_[0];
  226.   my(@short);
  227.   $number=$number;
  228.   @short = ("b/s","kb/s","Mb/s","Gb/s");
  229.   my $digits=length("".$number);
  230.   my $divm=0;
  231.   while ($digits-$divm*3 > 4) { $divm++; }
  232.   my $divnum = $number/10**($divm*3);
  233.   return sprintf("%1.1f %s",$divnum,$short[$divm]);
  234. }