Initial import - support for Dell Power Connect switches
This commit is contained in:
		
							
								
								
									
										389
									
								
								Info/Layer3/Dell.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										389
									
								
								Info/Layer3/Dell.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,389 @@ | |||||||
|  | # SNMP::Info::Layer3::Dell - SNMP Interface to Dell devices | ||||||
|  | # Eric Miller | ||||||
|  | # | ||||||
|  | # Copyright (c) 2006 Eric Miller | ||||||
|  | #  | ||||||
|  | # Redistribution and use in source and binary forms, with or without  | ||||||
|  | # modification, are permitted provided that the following conditions are met: | ||||||
|  | #  | ||||||
|  | #     * Redistributions of source code must retain the above copyright notice, | ||||||
|  | #       this list of conditions and the following disclaimer. | ||||||
|  | #     * Redistributions in binary form must reproduce the above copyright notice, | ||||||
|  | #       this list of conditions and the following disclaimer in the documentation | ||||||
|  | #       and/or other materials provided with the distribution. | ||||||
|  | #     * Neither the name of the University of California, Santa Cruz nor the  | ||||||
|  | #       names of its contributors may be used to endorse or promote products  | ||||||
|  | #       derived from this software without specific prior written permission. | ||||||
|  | #  | ||||||
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||||
|  | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  | ||||||
|  | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  | ||||||
|  | # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | ||||||
|  | # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||||
|  | # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  | ||||||
|  | # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||||||
|  | # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  | ||||||
|  | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  | ||||||
|  | # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
|  | package SNMP::Info::Layer3::Dell; | ||||||
|  | # $Id$ | ||||||
|  |  | ||||||
|  | use strict; | ||||||
|  |  | ||||||
|  | use Exporter; | ||||||
|  | use SNMP::Info::Layer3; | ||||||
|  |  | ||||||
|  | use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/; | ||||||
|  |  | ||||||
|  | $VERSION = '1.05'; | ||||||
|  |  | ||||||
|  | @SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::Layer3 Exporter/; | ||||||
|  | @SNMP::Info::Layer3::Dell::EXPORT_OK = qw//; | ||||||
|  |  | ||||||
|  | %MIBS = ( %SNMP::Info::Layer3::MIBS, | ||||||
|  |           'RADLAN-Physicaldescription-MIB'   => 'rlPhdStackReorder', | ||||||
|  |           'RADLAN-rlInterfaces'              => 'rlIfNumOfLoopbackPorts', | ||||||
|  |           'RADLAN-HWENVIROMENT'              => 'rlEnvPhysicalDescription', | ||||||
|  |           'Dell-Vendor-MIB'                  => 'productIdentificationVersion', | ||||||
|  |         ); | ||||||
|  |  | ||||||
|  | %GLOBALS = ( | ||||||
|  |             %SNMP::Info::Layer3::GLOBALS, | ||||||
|  |             'os_ver'        => 'productIdentificationVersion', | ||||||
|  |             'dell_id_name'  => 'productIdentificationDisplayName', | ||||||
|  |            ); | ||||||
|  |  | ||||||
|  | %FUNCS   = ( | ||||||
|  |             %SNMP::Info::Layer3::FUNCS, | ||||||
|  |             # RADLAN-rlInterfaces:swIfTable | ||||||
|  |             'dell_duplex_admin' => 'swIfDuplexAdminMode', | ||||||
|  |             'dell_duplex'       => 'swIfDuplexOperMode', | ||||||
|  |             'dell_tag_mode'     => 'swIfTaggedMode', | ||||||
|  |             'dell_i_type'            => 'swIfType', | ||||||
|  |             'dell_fc_admin'     => 'swIfFlowControlMode', | ||||||
|  |             'dell_speed_admin'  => 'swIfSpeedAdminMode', | ||||||
|  |             'dell_auto'         => 'swIfSpeedDuplexAutoNegotiation', | ||||||
|  |             'dell_fc'           => 'swIfOperFlowControlMode', | ||||||
|  |             # RADLAN-Physicaldescription-MIB:rlPhdUnitGenParamTable | ||||||
|  |             'dell_unit'      => 'rlPhdUnitGenParamStackUnit', | ||||||
|  |             'dell_sw_ver'    => 'rlPhdUnitGenParamSoftwareVersion',            | ||||||
|  |             'dell_fw_ver'    => 'rlPhdUnitGenParamFirmwareVersion', | ||||||
|  |             'dell_hw_ver'    => 'rlPhdUnitGenParamHardwareVersion', | ||||||
|  |             'dell_serial_no' => 'rlPhdUnitGenParamSerialNum', | ||||||
|  |             'dell_asset_no'  => 'rlPhdUnitGenParamAssetTag', | ||||||
|  |             # RADLAN-COPY-MIB:rlCopyTable | ||||||
|  |             'dell_cp_idx'     => 'rlCopyIndex', | ||||||
|  |             'dell_cp_sloc'    => 'rlCopySourceLocation',            | ||||||
|  |             'dell_cp_sip'     => 'rlCopySourceIpAddress', | ||||||
|  |             'dell_cp_sunit'   => 'rlCopySourceUnitNumber', | ||||||
|  |             'dell_cp_sfile'   => 'rlCopySourceFileName', | ||||||
|  |             'dell_cp_stype'   => 'rlCopySourceFileType', | ||||||
|  |             'dell_cp_dloc'    => 'rlCopyDestinationLocation', | ||||||
|  |             'dell_cp_dip'     => 'rlCopyDestinationIpAddress',            | ||||||
|  |             'dell_cp_dunit'   => 'rlCopyDestinationUnitNumber', | ||||||
|  |             'dell_cp_dfile'   => 'rlCopyDestinationFileName', | ||||||
|  |             'dell_cp_dtype'   => 'rlCopyDestinationFileType', | ||||||
|  |             'dell_cp_state'   => 'rlCopyOperationState', | ||||||
|  |             'dell_cp_bkgnd'   => 'rlCopyInBackground', | ||||||
|  |             'dell_cp_rstatus' => 'rlCopyRowStatus', | ||||||
|  |             # RADLAN-HWENVIROMENT:rlEnvMonSupplyStatusTable | ||||||
|  |             'dell_pwr_src'    => 'rlEnvMonSupplySource', | ||||||
|  |             'dell_pwr_state'  => 'rlEnvMonSupplyState',            | ||||||
|  |             'dell_pwr_desc'   => 'rlEnvMonSupplyStatusDescr', | ||||||
|  |             # RADLAN-HWENVIROMENT:rlEnvMonFanStatusTable | ||||||
|  |             'dell_fan_state' => 'rlEnvMonFanState', | ||||||
|  |             'dell_fan_desc'  => 'rlEnvMonFanStatusDescr', | ||||||
|  |             # Normal BRIDGE-MIB not working?  Use Q-BRIDGE-MIB for macsuck | ||||||
|  |             'fw_port'      => 'dot1qTpFdbPort', | ||||||
|  |            ); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %MUNGE = ( | ||||||
|  |             %SNMP::Info::Layer3::MUNGE, | ||||||
|  |          ); | ||||||
|  |  | ||||||
|  | # Method OverRides | ||||||
|  |  | ||||||
|  | sub bulkwalk_no { 1; } | ||||||
|  |  | ||||||
|  | sub model { | ||||||
|  |     my $dell = shift; | ||||||
|  |  | ||||||
|  |     my $name = $dell->dell_id_name(); | ||||||
|  |      | ||||||
|  |     if ($name =~ m/(\d+)/){ | ||||||
|  |         return $1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return undef; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub vendor { | ||||||
|  |  | ||||||
|  |     return 'dell'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub os { | ||||||
|  |  | ||||||
|  |     return 'dell'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub serial { | ||||||
|  |     my $dell    = shift; | ||||||
|  |  | ||||||
|  |     my $numbers = $dell->dell_serial_no(); | ||||||
|  |      | ||||||
|  |     foreach my $key (keys %$numbers){ | ||||||
|  |         my $serial = $numbers->{$key};   | ||||||
|  |         return $serial if (defined $serial and $serial !~ /^\s*$/); | ||||||
|  |         next; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return undef; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # Descriptions are all the same, so use name instead | ||||||
|  | sub interfaces { | ||||||
|  |     my $dell = shift; | ||||||
|  |  | ||||||
|  |     my $interfaces = $dell->i_index(); | ||||||
|  |     my $names = $dell->orig_i_name(); | ||||||
|  |  | ||||||
|  |     my %interfaces = (); | ||||||
|  |     foreach my $iid (keys %$interfaces){ | ||||||
|  |         my $name = $names->{$iid}; | ||||||
|  |         next unless defined $name; | ||||||
|  |  | ||||||
|  |         $interfaces{$iid} = $name; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return \%interfaces; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub i_duplex_admin { | ||||||
|  |     my $dell = shift; | ||||||
|  |      | ||||||
|  |     my $interfaces  = $dell->interfaces(); | ||||||
|  |     my $dell_duplex = $dell->dell_duplex_admin(); | ||||||
|  |     my $dell_auto   = $dell->dell_auto(); | ||||||
|  |   | ||||||
|  |     my %i_duplex_admin; | ||||||
|  |     foreach my $if (keys %$interfaces){ | ||||||
|  |         my $duplex = $dell_duplex->{$if}; | ||||||
|  |         next unless defined $duplex; | ||||||
|  |         my $auto = $dell_auto->{$if}||'false'; | ||||||
|  |      | ||||||
|  |         $duplex = 'half' if ($duplex =~ /half/i and $auto =~ /false/i); | ||||||
|  |         $duplex = 'full' if ($duplex =~ /half/i and $auto =~ /false/i); | ||||||
|  |         $duplex = 'auto' if $auto =~ /true/i; | ||||||
|  |         $i_duplex_admin{$if}=$duplex;  | ||||||
|  |     } | ||||||
|  |     return \%i_duplex_admin; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | sub i_vlan { | ||||||
|  |     my $dell = shift; | ||||||
|  |  | ||||||
|  |     my $qb_i_vlan = $dell->qb_i_vlan_t(); | ||||||
|  |     if (defined $qb_i_vlan and scalar(keys %$qb_i_vlan)){ | ||||||
|  |         return $qb_i_vlan; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # dot1qTpFdbAddress doesn't return values but is used as the index for the table | ||||||
|  | # so extract mac from index of dot1qTpFdbPort | ||||||
|  | sub fw_mac { | ||||||
|  |     my $dell = shift; | ||||||
|  |      | ||||||
|  |     my $dell_fw_port  = $dell->fw_port(); | ||||||
|  |   | ||||||
|  |     my %fw_mac; | ||||||
|  |     foreach my $iid (keys %$dell_fw_port){ | ||||||
|  |         # iid is dot1qFdbId.dot1qTpFdbAddress so strip dot1qFdbId | ||||||
|  |         my $mac = $iid; | ||||||
|  |         $mac =~ s/^\d+\.//; | ||||||
|  |         # Convert the remaining 0.254.123.456 index entry to a MAC address. | ||||||
|  |         $mac = join(':',map {sprintf("%02x",$_)} split(/\./,$mac)); | ||||||
|  |         next unless defined $mac; | ||||||
|  |          | ||||||
|  |         $fw_mac{$iid}=$mac;  | ||||||
|  |     } | ||||||
|  |     return \%fw_mac; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 1; | ||||||
|  | __END__ | ||||||
|  |  | ||||||
|  | =head1 NAME | ||||||
|  |  | ||||||
|  | SNMP::Info::Layer3::Dell - Perl5 Interface to Dell Power Connect Network Devices | ||||||
|  |  | ||||||
|  | =head1 AUTHOR | ||||||
|  |  | ||||||
|  | Eric Miller | ||||||
|  |  | ||||||
|  | =head1 SYNOPSIS | ||||||
|  |  | ||||||
|  |  # Let SNMP::Info determine the correct subclass for you.  | ||||||
|  |  my $dell = new SNMP::Info( | ||||||
|  |                           AutoSpecify => 1, | ||||||
|  |                           Debug       => 1, | ||||||
|  |                           # These arguments are passed directly on to SNMP::Session | ||||||
|  |                           DestHost    => 'myswitch', | ||||||
|  |                           Community   => 'public', | ||||||
|  |                           Version     => 1 | ||||||
|  |                         )  | ||||||
|  |     or die "Can't connect to DestHost.\n"; | ||||||
|  |  | ||||||
|  |  my $class      = $dell->class(); | ||||||
|  |  | ||||||
|  |  print "SNMP::Info determined this device to fall under subclass : $class\n"; | ||||||
|  |  | ||||||
|  | =head1 DESCRIPTION | ||||||
|  |  | ||||||
|  | Provides abstraction to the configuration information obtainable from an  | ||||||
|  | Dell Power Connect device through SNMP.  | ||||||
|  |  | ||||||
|  | For speed or debugging purposes you can call the subclass directly, but not after determining | ||||||
|  | a more specific class using the method above.  | ||||||
|  |  | ||||||
|  | my $dell = new SNMP::Info::Layer3::Dell(...); | ||||||
|  |  | ||||||
|  | =head2 Inherited Classes | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item SNMP::Info::Layer3 | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head2 Required MIBs | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item Dell-Vendor-MIB | ||||||
|  |  | ||||||
|  | =item RADLAN-Physicaldescription-MIB | ||||||
|  |  | ||||||
|  | =item RADLAN-rlInterfaces | ||||||
|  |  | ||||||
|  | =item RADLAN-HWENVIROMENT | ||||||
|  |  | ||||||
|  | =item Inherited Classes' MIBs | ||||||
|  |  | ||||||
|  | See classes listed above for their required MIBs. | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head1 GLOBALS | ||||||
|  |  | ||||||
|  | These are methods that return scalar value from SNMP | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item $dell->os_ver() | ||||||
|  |  | ||||||
|  | (B<productIdentificationVersion>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_id_name() | ||||||
|  |  | ||||||
|  | (B<productIdentificationDisplayName>) | ||||||
|  |  | ||||||
|  | =item $dell->model() | ||||||
|  |  | ||||||
|  | Returns model type.  Returns numeric from (B<productIdentificationDisplayName>). | ||||||
|  |  | ||||||
|  | =item $dell->vendor() | ||||||
|  |  | ||||||
|  | Returns dell | ||||||
|  |  | ||||||
|  | =item $dell->os() | ||||||
|  |  | ||||||
|  | Returns dell | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head2 Overrides | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item $dell->bulkwalk_no | ||||||
|  |  | ||||||
|  | Return C<1>.  Bulkwalk is currently turned off for this class. | ||||||
|  |  | ||||||
|  | =item $dell->serial() | ||||||
|  |  | ||||||
|  | Returns serial number. (B<rlPhdUnitGenParamSerialNum>) | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head2 Globals imported from SNMP::Info::Layer3 | ||||||
|  |  | ||||||
|  | See documentation in SNMP::Info::Layer3 for details. | ||||||
|  |  | ||||||
|  | =head1 TABLE ENTRIES | ||||||
|  |  | ||||||
|  | These are methods that return tables of information in the form of a reference | ||||||
|  | to a hash. | ||||||
|  |  | ||||||
|  | =head2 RADLAN Interface Table (B<swIfTable>) | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item $dell->dell_duplex_admin() | ||||||
|  |  | ||||||
|  | (B<swIfDuplexAdminMode>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_duplex() | ||||||
|  |  | ||||||
|  | (B<swIfDuplexOperMode>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_tag_mode() | ||||||
|  |  | ||||||
|  | (B<swIfTaggedMode>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_i_type() | ||||||
|  |  | ||||||
|  | (B<swIfType>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_fc_admin() | ||||||
|  |  | ||||||
|  | (B<swIfFlowControlMode>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_speed_admin() | ||||||
|  |  | ||||||
|  | (B<swIfSpeedAdminMode>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_auto() | ||||||
|  |  | ||||||
|  | (B<swIfSpeedDuplexAutoNegotiation>) | ||||||
|  |  | ||||||
|  | =item $dell->dell_fc() | ||||||
|  |  | ||||||
|  | (B<swIfOperFlowControlMode>) | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head2 Overrides | ||||||
|  |  | ||||||
|  | =over | ||||||
|  |  | ||||||
|  | =item $dell->interfaces() | ||||||
|  |  | ||||||
|  | Returns the map between SNMP Interface Identifier (iid) and physical port name. | ||||||
|  | Uses name instead of description since descriptions are not unique. | ||||||
|  |  | ||||||
|  | Only returns those iids that have a name listed in $l3->i_name() | ||||||
|  |  | ||||||
|  | =item $dell->i_duplex_admin() | ||||||
|  |  | ||||||
|  | Returns reference to hash of iid to current link administrative duplex setting. | ||||||
|  |  | ||||||
|  | =back | ||||||
|  |  | ||||||
|  | =head2 Table Methods imported from SNMP::Info::Layer3 | ||||||
|  |  | ||||||
|  | See documentation in SNMP::Info::Layer3 for details. | ||||||
|  |  | ||||||
|  | =cut | ||||||
		Reference in New Issue
	
	Block a user
	 Eric Miller
					Eric Miller