# SNMP::Info::Entity # $Id$ # # Copyright (c) 2008 Max Baker changes from version 0.8 and beyond. # # Copyright (c) 2003 Regents of the University of California # All rights reserved. # # 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::Entity; use strict; use Exporter; use SNMP::Info; @SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/; @SNMP::Info::Entity::EXPORT_OK = qw//; use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/; $VERSION = '3.56'; %MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' ); %GLOBALS = (); %FUNCS = ( 'e_alias' => 'entPhysicalAlias', 'e_class' => 'entPhysicalClass', 'e_descr' => 'entPhysicalDescr', 'e_fwver' => 'entPhysicalFirmwareRev', 'e_fru' => 'entPhysicalIsFRU', 'e_hwver' => 'entPhysicalHardwareRev', 'e_id' => 'entPhysicalAssetID', 'e_map' => 'entAliasMappingIdentifier', 'e_model' => 'entPhysicalModelName', 'e_name' => 'entPhysicalName', 'e_parent' => 'entPhysicalContainedIn', 'e_pos' => 'entPhysicalParentRelPos', 'e_serial' => 'entPhysicalSerialNum', 'e_swver' => 'entPhysicalSoftwareRev', 'e_type' => 'entPhysicalVendorType', 'e_vendor' => 'entPhysicalMfgName', ); %MUNGE = ( 'e_type' => \&SNMP::Info::munge_e_type, ); # entPhysicalIndex is not-accessible. Create to facilitate emulation methods # in other classes sub e_index { my $entity = shift; my $partial = shift; # Force use of MIB leaf to avoid inheritance issues in psuedo classes my $e_descr = $entity->entPhysicalDescr($partial); return unless ($e_descr); my %e_index; foreach my $iid ( keys %$e_descr ) { $e_index{$iid} = $iid; } return \%e_index; } sub e_port { my $entity = shift; my $partial = shift; my $e_map = $entity->e_map($partial); my %e_port; foreach my $e_id ( keys %$e_map ) { my $id = $e_id; $id =~ s/\.0$//; my $iid = $e_map->{$e_id}; $iid =~ s/.*\.//; $e_port{$id} = $iid; } return \%e_port; } sub entity_derived_serial { my $entity = shift; my $e_parent = $entity->e_parent() || {}; my $e_class = $entity->e_class() || {}; # Sort keys to return a consistent result between runs foreach my $iid ( sort keys %$e_parent ) { my $parent = $e_parent->{$iid}; my $class = $e_class->{$iid} || ''; # Only consider serial numbers for entries without a parent, or # if they are of type "chassis" if ( $parent eq '0' or $class eq 'chassis') { my $serial = $entity->e_serial($iid); if ( $serial && $serial->{$iid} ) { return $serial->{$iid}; } else { my $descr = $entity->e_descr($iid); if ( $descr and $descr->{$iid} =~ /serial#?:\s*([a-z0-9]+)/i ) { return $1; } } } } return; } sub entity_derived_os_ver { my $entity = shift; my $e_parent = $entity->e_parent() || {}; my $e_class = $entity->e_class() || {}; # Sort keys to return a consistent result between runs foreach my $iid ( sort keys %$e_parent ) { my $parent = $e_parent->{$iid}; my $class = $e_class->{$iid} || ''; # Only consider serial numbers for entries without a parent, or # if they are of type "chassis" if ( $parent eq '0' or $class eq 'chassis') { my $os_ver = $entity->e_swver($iid); if ( $os_ver && $os_ver->{$iid} ) { return $os_ver->{$iid}; } } } return; } 1; __END__ =head1 NAME SNMP::Info::Entity - SNMP Interface to data stored in F. RFC 2737 =head1 AUTHOR Max Baker =head1 SYNOPSIS # Let SNMP::Info determine the correct subclass for you. my $entity = new SNMP::Info( AutoSpecify => 1, Debug => 1, DestHost => 'myswitch', Community => 'public', Version => 2 ) or die "Can't connect to DestHost.\n"; my $class = $entity->class(); print "SNMP::Info determined this device to fall under subclass : $class\n"; =head1 DESCRIPTION F is used by Layer 2 devices from Brocade, Cisco, HP, and more. See RFC 2737 for full details. Create or use a device subclass that inherit this class. Do not use directly. For debugging purposes you can call this class directly as you would SNMP::Info my $entity = new SNMP::Info::Entity (...); =head2 Inherited Classes none. =head2 Required MIBs =over =item F =back MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz =head1 GLOBALS none. =head1 TABLE METHODS These are methods that return tables of information in the form of a reference to a hash. =over =item $entity->entity_derived_serial() Tries to determine the device serial number from the F. Only considers serial numbers for entries without a parent, or if they are of type chassis. Looks at C and then C for serial number. =item $entity->entity_derived_os_ver() Tries to determine the device OS version from the F. Only considers serial numbers for entries without a parent, or if they are of type chassis. Looks at C for the version. =back =head2 Entity Table =over =item $entity->e_index() Index (C) =item $entity->e_alias() Human entered, not usually used. (C) =item $entity->e_class() Stack, Module, Container, Port ... (C) =item $entity->e_descr() Human Friendly (C) =item $entity->e_fwver() (C) =item $entity->e_fru() BOOLEAN. Is a Field Replaceable unit? (C) =item $entity->e_hwver() (C) =item $entity->e_id() This is human entered and not normally used. (C) =item $entity->e_map() See MIB. (C) =item $entity->e_model() Model Name of Entity. (C) =item $entity->e_name() More computer friendly name of entity. Parse me. (C) =item $entity->e_parent() 0 if root. (C) =item $entity->e_port() Maps Entity Table entries to the Interface Table (C) using $entity->e_map() =item $entity->e_pos() The relative position among all entities sharing the same parent. (C) =item $entity->e_serial() (C) =item $entity->e_swver() (C) =item $entity->e_type() This is an OID, which gets munged into the object name if the right MIB is loaded. (C) =item $entity->e_vendor() Vendor of Module. (C) =back =cut