Compare commits

..

436 Commits

Author SHA1 Message Date
Oliver Gorwits
14bf6b84d3 bump version for release 2012-07-15 17:27:42 +01:00
Eric A. Miller
5c22a29e40 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-14 08:01:09 -04:00
Eric A. Miller
f1806f227b Add check required due to default partial 2012-07-14 07:56:24 -04:00
Oliver Gorwits
025e7b72b5 bump version for release; push_ver deletes .orig files 2012-07-10 17:54:54 +01:00
Jeroen van Ingen
97b398051f Fix BlueCoat serial 2012-07-09 13:53:26 +02:00
Eric A. Miller
e21d8516fb Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-08 21:48:29 -04:00
Eric A. Miller
2972c70177 [3541442] Change L2::Catalyst port names to what is reported in CDP 2012-07-08 21:45:13 -04:00
Eric A. Miller
50b4274f68 [2132349] Add an additional check to get Foundry OS version 2012-07-08 21:29:56 -04:00
Oliver Gorwits
75dc93f2c0 update MANIFEST for Kentrox, BlueCoatSG, SonicWall, APC 2012-07-07 19:34:45 +01:00
Oliver Gorwits
73fd627815 bump version for release; fixes for POD and Perl::Critic 2012-07-07 19:32:13 +01:00
Eric A. Miller
9e84141983 Fix reporting of base MAC and get OS version of more devices in Juniper 2012-07-04 09:37:21 -04:00
Eric A. Miller
bd6591db7b Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-07-04 08:23:48 -04:00
Eric A. Miller
515e876491 POD fix 2012-07-03 21:10:58 -04:00
Eric A. Miller
6105046ae9 Add pseudo ENTITY-MIB methods for hardware information 2012-07-03 21:09:12 -04:00
Jeroen van Ingen
f0eb0a9ded Updated MODEL_MAP in L2::HP, added 2620 and 3800 series 2012-07-02 17:06:14 +02:00
Jeroen van Ingen
a227db586b Added Cat6k/Sup2T to L3::C6500 class, bit more comments around the checks that result in L3::C6500 classification 2012-06-29 15:17:59 +02:00
Jeroen van Ingen
04eafd3e61 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-06-28 13:07:44 +02:00
Eric A. Miller
3b25711e1f * Add method to report current transmit power of the radio
interface, dot11_cur_tx_pwr_mw(), in Airespace class
* Correct reporting of SSID broadcast status in Airespace class
2012-06-27 20:48:26 -04:00
Eric A. Miller
63687b5f8f [3323842] Juniper EX/SRX correct VLAN tag support - i_vlan() fix 2012-06-27 00:23:16 -04:00
Eric A. Miller
cac2224fa1 LLDP bug fixes 2012-06-27 00:19:05 -04:00
Jeroen van Ingen
44da7544b7 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-06-25 09:54:38 +02:00
Eric A. Miller
13478343cd Don't assume that lldpRemLocalPortNum is the same as ifIndex, try to cross reference lldpLocPortDesc with ifDescr to get ifIndex first. Revert commit eb5a492, patch request 3297786, and deal with timeMark by setting partial fetch to zero by default which should be a valid value according to RFC 2021. 2012-06-24 23:19:53 -04:00
Jeroen van Ingen
a7aeae0aa2 Add very basic support for Blue Coat SG series devices. Not tested yet. 2012-06-15 15:02:38 +02:00
Carlos Vicente
876fb9946b Bump version number in Juniper.pm 2012-06-05 14:57:01 -04:00
Carlos Vicente
e5853962b5 Wrong section of the Changelog 2012-06-05 14:56:48 -04:00
Carlos Vicente
3eaa2ae230 Updated Changelog 2012-06-05 14:08:59 -04:00
Carlos Vicente
cd1acd023e Include LLDP information in output from cdp methods in C6500.pm. Same strategy as in HP.pm 2012-06-05 13:11:55 -04:00
Carlos Vicente
e2a314b553 Added patch #3523320 (New vlan methods for Layer3/Juniper.pm) 2012-05-22 15:02:08 -04:00
Jeroen van Ingen
102a2a03e8 Reverting commit b3fb18e (SF #3076592) since it seems to break retrieving tables using v2 & bulkwalk 2012-04-19 17:57:42 +02:00
Brian De Wolf
8be0f9e06f Merge branch 'bldewolf-L3-root_ip'
This commit makes the Layer3 root_ip determination a little more picky about
the OSPF ID.  My initial patch that Oliver committed would blindly accept the
OSPF ID if it was set.  Instead, we check if it's actually a route advertised
by the device (in case someone uses OSPF IDs that aren't actually related to
the device), otherwise we fall back to picking the first /32 in the routing
table.
2012-04-13 10:44:20 -07:00
Jeroen van Ingen
40239ea078 [3497004] AutoSpecify defaults to "off", reflect that in POD (a2w)
and update README to be in line with Info.PM POD clarifications
2012-04-13 10:20:29 +02:00
Oliver Gorwits
47032cbb4a [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist) 2012-04-12 15:47:23 +01:00
Oliver Gorwits
11dbeb2741 [3497004] Clarify POD description of default values (a2w) 2012-04-12 15:44:02 +01:00
Oliver Gorwits
5242d16e02 [3472052] moduleSerialNumber support for Cisco Stack (Slava) 2012-04-12 15:38:25 +01:00
Oliver Gorwits
428c007543 [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson) 2012-04-12 15:29:08 +01:00
Oliver Gorwits
d0fbfdea86 [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits) 2012-04-12 15:25:16 +01:00
Oliver Gorwits
b3fb18eee6 [3076592] Not an ARRAY reference in Info.pm (Oliver Gorwits) 2012-04-12 15:19:59 +01:00
Oliver Gorwits
7d470fd0e8 [2986858] Fix the patch from this ticket (Oliver Gorwits) 2012-04-12 15:02:31 +01:00
Oliver Gorwits
295e6fb283 [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf) 2012-04-12 14:50:38 +01:00
Oliver Gorwits
9e545e8cf8 fix overly liberal Version parsing - thanks LT 2012-04-12 14:24:46 +01:00
Oliver Gorwits
182589745f [2037444] os_ver fails on some Extreme versions (Robert Kerr) 2012-04-12 14:14:09 +01:00
Oliver Gorwits
bdfc430564 [3469527] Netgear LLDP Support (Nic Bernstein) 2012-04-12 10:56:53 +01:00
Oliver Gorwits
2da37f06ea [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin) 2012-04-12 10:27:55 +01:00
Oliver Gorwits
eb5a492eb9 [3297786] LLDP INDEX munged to ignore TimeMark component (David Baldwin) 2012-04-12 10:10:51 +01:00
Oliver Gorwits
e79f031cb7 [3286549] Dell LLDP Support (Nico Giefing) 2012-04-12 09:52:26 +01:00
Oliver Gorwits
86909ae236 [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek) 2012-04-12 09:26:34 +01:00
Oliver Gorwits
69861e7660 [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek) 2012-04-12 08:32:43 +01:00
Oliver Gorwits
5054b1b5b5 update DeviceMatrix for Kentrox 2012-04-12 08:32:29 +01:00
Oliver Gorwits
a2496a536d [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek) 2012-04-12 08:24:03 +01:00
Oliver Gorwits
f4ebe6a102 forgot to git-add SonicWALL.pm 2012-04-11 14:55:44 +01:00
Oliver Gorwits
b10b922aa0 [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek) 2012-04-11 14:47:35 +01:00
Jeroen van Ingen
a8673cc076 Small fix to L7::APC to silence Netdisco error that POWERNET-MIB couldn't be found 2011-11-11 13:18:21 +01:00
Jeroen van Ingen
2dd1cdc281 Add vendor-based & layer-based fallback classification for Layer7 2011-11-11 10:44:16 +01:00
Jeroen van Ingen
ccd03ae6d2 Add Layer7::APC class for basic APC UPS device support 2011-11-11 10:39:45 +01:00
Jeroen van Ingen
7e0771e065 Add Layer7 base class 2011-11-11 10:38:02 +01:00
Oliver Gorwits
e9fd3731a9 [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr) 2011-10-05 10:43:57 +01:00
Oliver Gorwits
a5f242c28f new ChangeLog stub entry 2011-09-28 11:19:45 +01:00
Oliver Gorwits
43d1718618 bump ver for release, remove VERSION_CVS variable
update MANIFEST
2011-09-28 11:17:26 +01:00
Oliver Gorwits
d64f0d4a5e added doc stubs for two new classes HPVC and AdslLine 2011-09-28 11:08:18 +01:00
Alexander Hartmaier
4a13ee8991 switched ChangeLog format to Moose style 2011-09-27 11:05:06 +02:00
Alexander Hartmaier
8764916086 Support for ADSL-LINE-MIB in new class AdslLine 2011-09-27 10:19:17 +02:00
Alexander Hartmaier
78b0b77e38 Added i_stack_status method that can be used for finding the parent interface for e.g. ADSL interface speed determination 2011-09-27 10:11:26 +02:00
Jeroen van Ingen
8a7376f6df Update ChangeLog wrt patch SF #3408506 2011-09-23 11:54:07 +02:00
Michael Borgelt
c9a36f12e6 Fix Use of uninitialized value in substr at /usr/share/perl5/SNMP/Info/IPv6.pm line 113. It is caused by an empty mac in local loopback interface on cisco devices.
Signed-off-by: Jeroen van Ingen <jeroen@utwente.nl>
2011-09-23 11:41:53 +02:00
Michael Borgelt
8199e2a973 Fix failure in POD.
Signed-off-by: Jeroen van Ingen <jeroen@utwente.nl>
2011-09-22 17:21:50 +02:00
Jeroen van Ingen
e1f3fb3a44 Fix generic device classification bug for devices w/o L1-L3 support
Commit 52275e92 made a small change in generic device classification
based on sysObjectID for devices that don't report Layer1 - Layer3
capabilities, in order to skip generic assignment if a more specific
class had already been determined. However this change contained an
error causing generic classification to fail.
Nex fix explicitly checks if class isn't more specific than SNMP::Info
before attempting to classify based on sysObjectID.
2011-09-21 17:04:48 +02:00
Jeroen van Ingen
52275e92af New class L2::HPVC for VirtualConnect blade switches
HP VirtualConnect product family includes ethernet-switch-like products
with their own MIBs. This new class adds basic support for these devices.
2011-09-09 17:49:52 +02:00
Jeroen van Ingen
5d9eec0992 New Layer3::Mikrotik class added to MANIFEST
The Layer3/Mikrotik.pm file should be in MANIFEST for the next release.
2011-09-09 17:42:54 +02:00
Jeroen van Ingen
cd9c637ba5 test_class.pl script: also test devices without layers / sysServices
The test_class.pl script refused to test devices that don't implement
sysServices. Since SNMP::Info has been modified to check connectivity
by testing sysDescr as well, test_class.pl should follow that behaviour.
2011-09-09 17:14:01 +02:00
Jeroen van Ingen
0bc405792a Updated changelog to reflect previous 2 commits 2011-09-05 12:43:14 +02:00
Jeroen van Ingen
8fb36625bc Add proper classing for Cisco blade switches to Layer2 section as well, for CBS devices reporting L2 capability only 2011-09-05 11:35:32 +02:00
Jeroen van Ingen
674eca23b9 POD clarification on how i_speed() is munged to human friendly values 2011-09-05 10:06:31 +02:00
Jeroen van Ingen
cfc1ead848 New L3::Mikrotik class for Mikrotik devices running RouterOS. Initial, very basic version. 2011-08-31 15:11:13 +02:00
Jeroen van Ingen
c41ffdfd2d Documentation fix: add reference to Layer3::PacketFront class in POD 2011-08-30 13:17:35 +02:00
Jeroen van Ingen
df4708383b Updated ChangeLog to reflect chages from commits 2c2f4a9e and 497c81a0 2011-08-15 17:16:16 +02:00
Jeroen van Ingen
497c81a0c6 Updates to Layer2::HP class to get os_ver & serial from web managed
HP ProCurve switches. Based on patch & bug report from J R Binks,
SF #3344843.
2011-08-11 14:37:42 +02:00
Jeroen van Ingen
2c2f4a9ea1 Add Layer3::PacketFront device class to support PacketFront DRG devices 2011-08-05 12:26:34 +02:00
Brian De Wolf
feffa6d47e Fix grep statement in L3 root_ip
The grep statement was comparing the router_ip with the SNMP OID-looking keys
instead of the values which were just the IPs.
2011-07-07 10:42:00 -07:00
Brian De Wolf
3bb33fa8d4 Fix syntax errors in L3 changes
Fix some syntax errors in my improvement code for L3 so that it actually runs.
2011-06-27 16:06:56 -07:00
Brian De Wolf
30a73c035a Prefer OSPF router ID in L3 root_ip
The previous behavior of root_ip meant that whatever /32 hosted by the device
that got listed first would be chosen as the root_ip.  If the device only
serves one /32 this works fine, but if there are multiple /32s we could easily
pick the one that is not the intended address meant for management.

Instead, before we pick whatever /32 may exist, we now try to pick the /32 that
is also the OSPF router ID (the router ID is a 32-bit unique identifier which,
while not guaranteed, tends to be an IPv4 address unique to the device).
Otherwise we fall back to the previous method of finding the root_ip.
2011-06-24 01:44:20 -07:00
Brian De Wolf
5c44fc0b28 Fix ordering in Info::CiscoStats POD
The header for a section got moved away from its content.
2011-06-23 13:57:25 -07:00
Brian De Wolf
a54b446dae Avoid Perl warnings in Info::CiscoStack
These two points in CiscoStack use a value from a hash in a numerical
comparison without verifying they exist.  If they don't, Perl warnings get
emitted.  Instead, we check for existence first, then compare the value.
2011-06-23 13:51:43 -07:00
Oliver Gorwits
631010ed3f prep for 2.05 CPAN release 2011-06-23 21:12:27 +01:00
Brian De Wolf
8506638e5c Promote L2::Aruba to L3::Aruba
Aruba controllers can act as L3 devices and provide L3 information through the
standard MIBs.  This change makes Aruba devices get recognized as such.
Layer2.pm and Layer3.pm provide roughly the same functionality so there should
be little to no impact for Aruba devices only acting as L2 entities.
2011-06-23 12:40:36 -07:00
Brian De Wolf
c0f3a8eb2b Fix call in L2::Aironet
A call to a function in Aironet was wrong and has been corrected.
2011-06-22 13:35:26 -07:00
Oliver Gorwits
662d870ad7 added Oliver to the AUTHORS list 2011-04-25 07:44:03 +00:00
Jeroen van Ingen
08746d6b10 Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
(forgot to commit the updated Changelog when committing the patch to Info.pm)
2011-03-31 15:44:56 +00:00
Oliver Gorwits
bc8c8a6061 prep for 2.04 release 2011-03-31 08:34:57 +00:00
Oliver Gorwits
d09e5de229 renamed Ipv6.pm to IPv6.pm 2011-03-31 08:24:29 +00:00
Oliver Gorwits
1df1bda641 change from Ipv6 to IPv6 everywhere 2011-03-31 08:04:52 +00:00
Jeroen van Ingen
e8612e3779 Method i_speed_raw didn't return raw values; patch by Alexander Hartmaier. 2011-03-30 12:39:00 +00:00
Carlos Vicente
a58d060310 Adding missing method for mapping v6 addresses with prefixes 2011-02-23 04:32:14 +00:00
Brian de Wolf
a77c539f38 These are actually listed as not-accessible so they shoudn't be defined. Their information has to be extracted from n2p_paddr instead. 2011-01-19 00:04:07 +00:00
Oliver Gorwits
b5107b5634 shorten abstract for Ipv6.pm 2011-01-09 20:42:41 +00:00
Oliver Gorwits
6c880bb7b3 add doc links to Info.pm for new Ipv6 and Pf modules 2011-01-09 18:55:31 +00:00
Jeroen van Ingen
9297c70d11 Added switch models 2915, 2615, 2520G and 1810G to HP class. Won't be
correctly identified until hpicfoid mib is updated to include these models.
2011-01-04 15:00:22 +00:00
Eric Miller
bfafdc99d9 Update port indexing for newer code and switches (5698) 2010-11-23 13:50:16 +00:00
Eric Miller
ab111a8e93 Modify detection for newer code levels 2010-11-17 23:18:39 +00:00
Eric Miller
c2ce3d81e1 Improve os detection for newer versions. Improve forward compatibility. 2010-11-17 23:17:04 +00:00
Carlos Vicente
fb9813af51 C2970 and C2960 were not being correctly recognized if has_layer(3) was true 2010-11-16 00:41:00 +00:00
Bill Fenner
4fb63d8a7b Implement peth_port_neg_power, reporting the actual negotiated value
in CiscoPower and the max for the class in the generic PowerEthernet.
2010-11-08 07:49:40 +00:00
Jeroen van Ingen
77982188bd Match for ME340x in Layer3 section, class as L3::C3550 for proper macsuck
(ME340x requires community-based indexing)
2010-10-29 13:03:44 +00:00
Jeroen van Ingen
8748932460 Enable IPv6 support in Layer3 base class by including Layer3::Ipv6 2010-10-21 10:29:57 +00:00
Brian de Wolf
6c88df1ac0 Fix error in FWSM support patch that caused FWSMs to not be detected. 2010-10-04 23:34:14 +00:00
Carlos Vicente
cacb0777b7 POD fixes to pass tests 2010-09-22 23:18:22 +00:00
Carlos Vicente
bdf5a80868 Adding LLDP support for Juniper and C3550 classes 2010-09-22 21:45:08 +00:00
Jeroen van Ingen
ad1f1933e2 Move Cisco CBS3xxx from generic L3::Cisco to L3::C6500 (mainly for community
based indexing, to succesfully retrieve forwarding tables).
2010-09-01 16:16:43 +00:00
Carlos Vicente
d7fe49a028 Additions to extract IPv6 addresses used in device interfaces 2010-08-25 00:09:42 +00:00
Jeroen van Ingen
e802ccdc6e Revert to status of rev 1.7, "peth_port_power" sub as a placeholder didn't
work as expected (behaved as override, but should have been overridden)
2010-08-23 14:45:04 +00:00
Jeroen van Ingen
af2a881142 Fixed error in IPv6 support for Extreme 2010-08-23 12:02:10 +00:00
Jeroen van Ingen
0ccf5409ca Fixed potential warnings about "Use of uninitialized value in string eq" 2010-08-23 11:47:58 +00:00
Jeroen van Ingen
2529305803 Add placeholder method peth_port_power() to PowerEthernet class; overrides
to actually return data in Cisco, Extreme and HP classes.
2010-08-23 11:38:55 +00:00
Jeroen van Ingen
bb8fb9d01a Initial version for Info::Ipv6 class. Not to be used directly, intended
use is to be inherited by Info::Layer3.

This class provides mapping of IPv6 network addresses to Ethernet media
addresses (MACs) and interface indexes. It will try various MIBs; with
debug on, when data is returned, a message will be logged to inform which
MIB contained the relevant data.
2010-08-11 16:41:29 +00:00
Jeroen van Ingen
665f33a482 Small fix for sysServices ("layers") check 2010-07-26 14:31:41 +00:00
Jeroen van Ingen
e5f948acda Allow support for devices without sysServices 2010-07-26 11:39:37 +00:00
Jeroen van Ingen
c28bbd5728 Changes to Info.pm to support devices that don't return sysServices.0 2010-07-26 11:32:48 +00:00
Jeroen van Ingen
262fa5a3cd Incorporate patch from jrbinks to support obscure Proxim/Orinoco device (item
2688801 on SF). Fallback for all Agere (11898) devices to Orinoco class.
2010-07-23 15:39:03 +00:00
Jeroen van Ingen
a58b774443 Added "vendor_i_type()" method to HP classes as suggested by Mikat1 on SF.
Tracker artifact 2599795. Method can be used to determine more detailed
type information about a port, eg 10/100 interface, 1000Base-LX, etc.
Details are vendor specific.
2010-07-23 15:07:58 +00:00
Brian de Wolf
6deceb6bd1 Fix for C1900 bp_index not containing interfaces. 2010-05-25 23:30:20 +00:00
Max Baker
808d3fd5c6 add PF Support 2010-05-07 00:01:33 +00:00
Max Baker
b82d3b82d9 update copyright and developers 2010-05-04 20:58:32 +00:00
Jeroen van Ingen
cb8d780d70 Added os_bin() method to CiscoStats. Determines ROM version on several
Cisco switches and routers by scanning for version string in rom_id().
2010-05-04 14:18:37 +00:00
Jeroen van Ingen
01cd78c75d Added table methods to %FUNCS in CDP.pm to retrieve management addresses
of connected devices. Useful for improving neighbor detection in Netdisco.
2010-05-03 14:51:35 +00:00
Brian de Wolf
e7b289c399 Add L3::CiscoFWSM for Cisco Firewall Services Modules. 2010-04-28 17:08:32 +00:00
Bill Fenner
a9b28c2270 For Cisco WLCs, pretend to have the CISCO-DOT11-MIB for signal strengths, etc. 2010-03-23 18:00:08 +00:00
Bill Fenner
5b059e6286 "arpnip" on Airespace: use the controller's snooping on the
IP addresses of its clients, plus the knowledge of the APs'
IP and ethernet MAC addresses, to arpnip.  This is useful
when there is communication (between controller and AP,
or between wireless and wired devices) that does not cross
routers.
2010-03-23 17:58:30 +00:00
Jeroen van Ingen
2c84636b7f Update to Juniper class: use Q-BRIDGE-MIB for switch forwarding tables 2010-02-06 12:52:54 +00:00
Jeroen van Ingen
2aba8dd8f1 Moved older HP Procurve switch models to separate L2:HP4000 class. Reimplemented VLAN changing for Procurve switches; several updates to MODEL_MAP. 2009-12-03 07:55:12 +00:00
Max Baker
41d68936b0 add some recent questions to DEVELOP 2009-12-02 17:49:27 +00:00
Max Baker
cb750624f9 *** empty log message *** 2009-11-28 20:05:49 +00:00
Max Baker
bf3a37195b 2.01 update 2009-06-12 22:47:50 +00:00
Max Baker
1e37f80368 *** empty log message *** 2009-06-12 22:36:50 +00:00
Max Baker
5f9c2d3e62 pod updates 2009-06-12 22:25:32 +00:00
Max Baker
c88449151e up version to 2.01 2009-06-12 22:24:25 +00:00
Max Baker
9c4f031581 update MANIFEST 2009-06-12 22:17:22 +00:00
Max Baker
3cac59adf4 simple script to launch a single test 2009-06-12 21:59:50 +00:00
Max Baker
77bcf720d3 simple script to push out a version number to each module 2009-06-12 21:59:05 +00:00
Max Baker
e6b4c607e0 add check for package documentation in Info.pm 2009-06-12 21:58:49 +00:00
Max Baker
cbeb41c728 fix for PerlCritic 2009-06-12 20:48:44 +00:00
Max Baker
101aaa0a68 fix up spelling 2009-06-12 18:56:22 +00:00
Max Baker
2233511fad add missing POD 2009-06-12 18:36:00 +00:00
Max Baker
8efa868ca3 bring POD uptodate and clean-up module a litte 2009-06-12 18:35:06 +00:00
Max Baker
e738d502ef change inheritance order in @ISA, add POD, and remove tabs 2009-06-12 18:11:52 +00:00
Max Baker
2a7d5b51d9 update to 2009 2009-06-12 18:03:45 +00:00
Max Baker
67c4f160aa Update to sorta match 2.0 2009-06-12 18:03:03 +00:00
Max Baker
6d87313283 fix subtle bug in the loading order of CiscoVTP vs CiscoStpExtensions because of a conflict between Bridge::v_name and CiscoVTP::v_name 2009-06-11 21:49:37 +00:00
Max Baker
98e07690be add qb_v_name for completeness and to match POD 2009-06-11 21:48:11 +00:00
Max Baker
c0bc769be9 add CVS revision number to debugging output to aid future email dumps 2009-06-11 18:06:15 +00:00
Max Baker
01d9b0f291 minor pod bug 2009-06-10 16:43:50 +00:00
Max Baker
2539692016 Add Cisco FWSM detection 2009-06-08 22:06:24 +00:00
Max Baker
3a3fc548ca Added Sam's patch to support more weird cisco crap :) 2009-06-08 02:28:31 +00:00
Max Baker
84d6cd18fb [2020353] Added L3::Altiga class 2009-06-07 23:35:06 +00:00
Max Baker
2d7b94e5a7 *** empty log message *** 2009-06-07 22:52:09 +00:00
Max Baker
98eceb7c57 add cisco id by OID for vendor for some problem devices. c/o Sam Stickland 2009-06-07 22:50:04 +00:00
Max Baker
be92ec0379 fix case on mib name per alexander H 2009-06-07 01:33:12 +00:00
Bill Fenner
34d4ec66a3 Add Info/CiscoStpExtensions.pm 2009-03-27 07:14:52 +00:00
Bill Fenner
35c8ed6038 Add MBSSID-aware i_ssidlist and i_ssidbcast methods
Add CiscoConfig, remove dangling CiscoVTP
Add cd11_rateset
2009-03-23 21:29:11 +00:00
Bill Fenner
dd10a88ee2 Add Arista and EOS, also sort -f 2009-03-23 21:19:26 +00:00
Bill Fenner
71f0947988 Turn Arista vendor name to 'arista', to match, e.g., 'cisco' and 'juniper' 2009-03-23 19:30:30 +00:00
Carlos Vicente
d7cd3ff9e7 Updating copyright 2009-03-20 17:34:59 +00:00
Carlos Vicente
2567d6a5c9 Committing missing file 2009-03-20 17:13:12 +00:00
Carlos Vicente
5831d9e4ae Adding keyword for detecting C6500 with Sup32 PISA engine 2009-03-12 22:28:55 +00:00
Carlos Vicente
690bc6bfa0 Add support for other CDP/LLDP binary formatted values (ID 1909147) 2009-03-10 16:57:37 +00:00
Carlos Vicente
5f0e73bcb4 Adding support for CISCO-STP-EXTENSIONS-MIB (ID 1872450) 2009-03-10 16:52:08 +00:00
Carlos Vicente
b1a7b67ae7 Adding Cisco WLC module support (ID 2231376) 2009-03-10 01:25:52 +00:00
Max Baker
f0539d51ff update test_class.pl to add mib dirs, relative path, and more debug info 2009-03-09 19:12:55 +00:00
Bill Fenner
1af34e3e25 Patch from Thomas Ristic to recognize CIGESM as C2900. 2009-03-06 22:30:53 +00:00
Bill Fenner
0510dbfafc Add Layer3::Arista.
Work around Net-SNMP's failure to load IF-MIB because it prefers the
obsolete RFC1213-MIB more completely: add the new ifOperState values
explicitly (e.g., lowerLayerDown, dormant, notPresent,...)
2009-03-06 20:09:38 +00:00
Bill Fenner
ca35689475 Use orig_i_name, so that setting an interface description does not
change the netdisco port name.
2009-03-06 20:07:41 +00:00
Eric Miller
2ac1cc2308 update for Alcatel-Lucent additions 2008-08-02 03:31:20 +00:00
Eric Miller
0eebef47b0 Prep 2.00 2008-08-02 03:22:04 +00:00
Bill Fenner
29ef1301fb Mention Alcatel-Lucent in ChangeLog. 2008-08-01 09:28:56 +00:00
Bill Fenner
cfd5c5d9d7 perltidy 2008-08-01 08:10:47 +00:00
Bill Fenner
347e1f9f59 Add classes for Alcatel OmniSwitch and Service Router, update
Info.pm for Alcatel
2008-07-31 18:36:52 +00:00
Bill Fenner
2575320ec5 Add some spelling words. Make local_versionsync fail gracefully (instead of
planning twice) if File::Slurp isn't found.  Make spelling skip all tests
if Test::Spelling isn't found.
2008-07-31 18:35:20 +00:00
Bill Fenner
6c8ec356ec Missed a MIB when I merged my changes.
Add a commented-out reference to the Alcatel MIB that results in
 Alcatel model names getting translated.
Return the alcatel-lucent model name and OS based on sysObjectID
2008-07-31 16:57:41 +00:00
Bill Fenner
6e0712b189 Update i_name to return wlanAPFQLN if it's available.
Add i_mac to map BSSID to port.
2008-07-31 15:56:04 +00:00
Eric Miller
906b1cb52f [ 2031292 ] HP POE support - port to ifIndex mapping (Jeroen van Ingen) 2008-07-30 02:05:54 +00:00
Eric Miller
1eff8f8224 Silence warnings/errors from uninitialized variables 2008-07-29 03:23:35 +00:00
Eric Miller
6a1f6d43cf final update for 1.09 2008-07-23 02:14:25 +00:00
Eric Miller
8ab37354ff update for 1.09 2008-07-23 02:06:23 +00:00
Eric Miller
64340bf92e regenerate for 1.09 2008-07-23 02:04:27 +00:00
Eric Miller
f0d490539e POD cleanup 2008-07-23 02:03:07 +00:00
Eric Miller
808464a7d0 - Documentation updates
- C1250 and Linksys additions
2008-07-21 03:26:15 +00:00
Eric Miller
3b8b70f760 - Move _load_attr() loopdetect code below other end of table checks.
- Add another check for SNMPv1 - noSuchName where we've already seen the iid and iid is not null but the return value is null.  Don't report a loop, just exit the table.
2008-07-21 03:24:16 +00:00
Eric Miller
cb58701af2 - Require Perl 5.6+
- Account for ExtUtils::MakeMaker version
2008-07-20 03:46:08 +00:00
Eric Miller
f05fbae8fc Private test to check all version numbers match 2008-07-20 03:36:34 +00:00
Eric Miller
f1589d2ffe PBP perltidy configuration file for SNMP::Info 2008-07-20 03:32:58 +00:00
Eric Miller
2d1df6c0e4 skip config files for private tests 2008-07-20 03:31:53 +00:00
Eric Miller
158596cede perltidy 2008-07-20 03:30:56 +00:00
Eric Miller
6c7df418af SNMP is available from CPAN again, stop smoke test failures 2008-07-19 03:16:01 +00:00
Eric Miller
4e666d63b3 Update for newer Net-SNMP versions 2008-07-19 03:03:53 +00:00
Eric Miller
d1674dade2 POD coverage test 2008-07-19 02:44:42 +00:00
Eric Miller
ecb26a8b68 POD coverage 2008-07-19 02:41:59 +00:00
Eric Miller
03785c4365 POD coverage 2008-07-18 03:11:38 +00:00
Eric Miller
58c1d01b4a sp 2008-07-15 03:12:54 +00:00
Eric Miller
dc48aa08ba Move munge_e_type() to Info.pm 2008-07-15 03:09:18 +00:00
Eric Miller
53f9cc8c3d - Documentation updates
- Replace munge_ns_com_type() and munge_ns_store_type() with munge_e_type() in Info.pm
- Prefix ns_e_is_virtual() and ns_e_is_stack() with _ to indicate private method
2008-07-15 03:07:29 +00:00
Eric Miller
0db888ef88 Document serial() 2008-07-15 02:40:49 +00:00
Eric Miller
2ee8817103 EAPOL 2008-07-15 02:40:17 +00:00
Eric Miller
71b0e7c60f Add munge_caps() and munge_null() 2008-07-15 02:39:43 +00:00
Eric Miller
740707539e Documentation updates 2008-07-15 02:32:39 +00:00
Eric Miller
ba088bf717 - Move munge_null() to Info.pm
- Change munge_caps() to munge_bits() from Info.pm
2008-07-15 02:19:32 +00:00
Eric Miller
aa58a2ba56 - Document munge_power()
- Move munge_caps() and munge_null() to Info.pm
2008-07-15 02:15:59 +00:00
Eric Miller
ca9caf6e12 - Documentation updates
- Move munge_caps() to Info.pm
2008-07-15 01:56:34 +00:00
Eric Miller
5a983c9600 Document e_name() 2008-07-14 03:13:14 +00:00
Eric Miller
d02c6ab450 Document e_name() 2008-07-14 03:01:14 +00:00
Eric Miller
4284cb8ea0 Document model() 2008-07-14 02:54:39 +00:00
Eric Miller
0743d4bce9 Prefix validate_vlan_param() with _ to indicate private method. 2008-07-14 02:51:02 +00:00
Eric Miller
66ce0da9bc Document i_stp_state(), qb_i_vlan_t(), set_add_i_vlan_tagged(), set_i_pvid(), set_i_vlan(), set_remove_i_vlan_tagged(), v_index() 2008-07-14 02:48:45 +00:00
Eric Miller
3e4f700a70 - Prefix check_forbidden_ports() and validate_vlan_param() with _ to indicate private methods.
- Document v_index()
2008-07-14 02:24:42 +00:00
Eric Miller
7518408d89 set_i_speed_admin() use portAdminSpeed (Justin Hunter) 2008-07-11 19:58:46 +00:00
Eric Miller
c5caffc75e don't distribute perlcritic.rc 2008-07-09 03:08:16 +00:00
Eric Miller
086fea0349 Add Perl::Critic for Perl Best Practices compliance 2008-07-09 03:07:32 +00:00
Eric Miller
f436c9f69c P::C - don't declare variable in conditional statement 2008-07-09 02:46:37 +00:00
Eric Miller
a153913d29 PBP - lexicals 2008-07-09 02:36:03 +00:00
Eric Miller
5189871fde PBP - use bare return 2008-07-09 02:34:17 +00:00
Eric Miller
daa0162639 - PBP - never modify $_ in list functions
- PBP - use named lexicals as explicit for loop iterators
2008-07-09 02:27:39 +00:00
Eric Miller
4e6a452c87 ## no critic on string eval 2008-07-09 01:53:16 +00:00
Eric Miller
a70a895a29 PBP always return via an explicit return 2008-07-09 01:37:19 +00:00
Eric Miller
84bc3f5269 PBP always return via an explicit return 2008-07-09 01:16:42 +00:00
Eric Miller
27f2bd1b26 add linksys 2008-07-09 00:42:32 +00:00
Eric Miller
38c63a3086 - PBP compliance via Perl::Critic
- Use bare return to return failure
- No code before strictures are enabled
2008-07-09 00:41:56 +00:00
Eric Miller
2c5301b676 - PBP compliance via Perl::Critic
- Use bare return to return failure
- No code before strictures are enabled
2008-07-09 00:32:47 +00:00
Bill Fenner
1b85820314 Support Cisco 1250 and Linksys SRW2048 2008-07-08 16:38:34 +00:00
Eric Miller
3855c92564 Test POD for syntax 2008-07-07 04:12:07 +00:00
Eric Miller
ba85dc670b - POD Validation
- POD spell check
- Prep 1.09
2008-07-07 04:10:39 +00:00
Eric Miller
6221228d1f Add private tests and load test. Don't distribute private tests. 2008-07-07 03:59:47 +00:00
Eric Miller
a901d9a61c Remove VLAN set methods, not working consistently across devices 2008-07-03 02:43:54 +00:00
Eric Miller
0a0fac4ddb Remove VLAN set methods, not working consistently across devices 2008-07-03 02:33:22 +00:00
Eric Miller
0e16cfecf6 [ 1868017 ] i_vlan_membership incorrectly includes voice vlan "4096" 2008-07-03 02:12:13 +00:00
Eric Miller
838eb71a15 Query LLDP table with time filter of zero. 2008-07-03 01:59:31 +00:00
Eric Miller
e373b1f74e Added munge_port_list(), modify_port_list(), and set_multi() methods 2008-04-21 20:57:30 +00:00
Eric Miller
b03e292d95 Document fully qualifying a MIB leaf in %GLOBALS and %FUNCS 2008-04-21 20:55:52 +00:00
Eric Miller
2139cb0212 - Use munge_port_list(), modify_port_list(), and set_multi() methods
- Add set_create_vlan() method
2008-04-21 20:51:58 +00:00
Eric Miller
35392a8c5c - Modify set_i_vlan() to use set_multi()
- Use munge_port_list() and modify_port_list()
2007-12-20 04:23:58 +00:00
Eric Miller
b7fab49da2 modifications to i_vlan_membership() 2007-12-20 04:05:58 +00:00
Eric Miller
d0061b4ec9 - Added munge_port_list()
- Added modify_port_list()
- Added set_multi() to enable a SNMP set command on several new values in the one request.
2007-12-20 04:01:17 +00:00
Eric Miller
2ffa82aff9 clean up error messages 2007-12-15 04:11:17 +00:00
Eric Miller
1c33f38323 Correct sequencing and improve validation in set_i_vlan() 2007-12-15 03:56:18 +00:00
Eric Miller
4bb41fc368 [ 1849103 ] CiscoVTP.pm patch (subtracting error) (Justin Hunter) 2007-12-14 03:10:19 +00:00
Eric Miller
c666fe30d8 [ 1841131 ] Incorrect munging of stp_root (Carlos Vicente) 2007-12-08 02:51:37 +00:00
Eric Miller
1813e60cec - Add i_speed_raw() (Alexander Hartmaier)
- [ 1841131 ] Incorrect munging of stp_root (Carlos Vicente)
2007-12-08 02:50:39 +00:00
Eric Miller
4ae8f31c8f - Add a munge and IEEE8021-PAE-MIB 2007-12-07 23:13:01 +00:00
Eric Miller
df466ac2eb updates 2007-12-07 04:27:22 +00:00
Eric Miller
846b3201b7 Qualify leafs from HP-SN-SWITCH-GROUP-MIB since FDP class will load FOUNDRY-SN-SWITCH-GROUP-MIB which contains the same leaf names. 2007-12-07 04:23:37 +00:00
Eric Miller
a2ab73c24a - Support for newer models and Nortel BladeCenter Layer2-3 GbE Switch Modules.
- Support for new VLAN read methods.
2007-12-07 04:18:32 +00:00
Eric Miller
98e6693525 Add support for D-Link and the IBM BladeCenter Gigabit Ethernet Switch Module, since D-Link uses RADLAN MIB as well. 2007-12-07 04:09:47 +00:00
Eric Miller
fed85592cb - D-Link and IBM BladeCenter GbESM support (Alex Kramarov)
- Add support to specify MIB to resolve leaf names conflicts in %GLOBALS and %FUNCS.
2007-12-07 04:07:01 +00:00
Bill Fenner
2b4a296128 Document that e_type munges the OID into object name. 2007-12-02 20:01:59 +00:00
Bill Fenner
c1b0e81b6c + Use Cisco Client Association MIBs for Aironet client reporting
via fw_mac
+  Support VLANs on Aironet
+  Get the proper radio MAC address from aironet in MBSS mode
+  Additional wireless statistics from Aironet
2007-12-02 19:58:10 +00:00
Bill Fenner
9a0915f3a1 Infrastructure for SNMPv3 support:
- Save the SecName passed into the constructor
- Create an update() function, which replaces the underlying
  SNMP session using different parameters.
- Return the SecName instead of community from snmp_comm() when using
  SNMPv3.  This is a little wrong, but is probably better than returning
  undef.
2007-12-02 18:55:54 +00:00
Eric Miller
a9481c86d2 updates, bump version 1.09 2007-12-02 05:06:12 +00:00
Eric Miller
5f0148dd72 Add CISCO-PAE-MIB (Kesy) 2007-12-02 03:16:44 +00:00
Eric Miller
dedefde79f - Updates to fan, power supply, and serial number methods (Jeroen van Ingen) 2007-12-02 03:02:01 +00:00
Eric Miller
8c421d333a [ 1464654 ] HP Procurve 9315 FDP Support 2007-12-02 02:37:43 +00:00
Eric Miller
97fbd36c6a [ 1464654 ] HP Procurve 9315 FDP Support \n pod updates 2007-12-02 02:34:58 +00:00
Eric Miller
e81344c357 - bump version
- pod update
2007-11-29 02:31:13 +00:00
Eric Miller
33450039c7 - ISA Layer3 instead of Layer2 to support arpnip
- Add more models from HP-ICF-OID to map
2007-11-29 02:29:26 +00:00
Eric Miller
5849f4ce3d Silence warnings from devices which don't return values for extended VLANs (>1024) 2007-11-27 17:19:28 +00:00
Eric Miller
70f20d2330 update for 1.07 2007-11-27 03:25:53 +00:00
Eric Miller
48e9b0b030 update for 1.07 2007-11-27 03:17:36 +00:00
Eric Miller
11db00b66c update for 1.07 2007-11-27 03:05:07 +00:00
Eric Miller
89dc775392 updates for 1.07 2007-11-27 03:00:25 +00:00
Eric Miller
6d5f27fd3a add modules attribute 2007-11-27 02:59:18 +00:00
Eric Miller
e1ab8a43ba Prep 1.07 beta release 2007-11-26 04:24:52 +00:00
Eric Miller
081325c68d Accommodate for differences between AN/ARN and ASN in Pseudo ENTITY-MIB methods 2007-11-26 03:38:15 +00:00
Eric Miller
004de3d29b Add support for e_name() in Psuedo ENTITY-MIB methods 2007-11-26 03:32:11 +00:00
Eric Miller
8b5ba1e959 Airespace and CDP changes 2007-11-24 03:25:35 +00:00
Eric Miller
149e97c2d6 - [ 1663699 ] Implement vmVoiceVlanId in i_vlan_membership()
- Trunk VLANs only exist on ports which are trunking
2007-11-24 03:23:13 +00:00
Eric Miller
60cb2b8c20 Psuedo ENTITY-MIB information 2007-11-24 03:18:13 +00:00
Eric Miller
a714c46fba - [ 1780872 ] Incorrect detection of admin duplex on older HP Procurve (Robert Kerr)
- [ 1835187 ] New HP devices (perand)
2007-11-21 21:34:40 +00:00
Eric Miller
692ccd0e97 Slight logic change to c_ip() to retain backwards compatibility. 2007-11-21 20:35:58 +00:00
Eric Miller
e0aa0835cd [ 1769604 ] Include support for extended vlan membership in CiscoVTP.pm 2007-11-21 04:23:38 +00:00
Eric Miller
845a0c4121 [ 1780874 ] c_ip doesn't check cdpCacheAddressType 2007-11-21 04:20:58 +00:00
Eric Miller
57a6ec56e3 More Nortel support 2007-11-20 03:49:09 +00:00
Eric Miller
4d53aa41e2 Return "zeroDotZero" for slots and containers in e_type() 2007-11-20 03:48:20 +00:00
Eric Miller
214534b211 - Correct indexing in Psuedo ENTITY-MIB methods
- Refactor ns_e_pos() for both chassis and stackables
2007-11-20 03:45:15 +00:00
Eric Miller
5ac0d946a7 - [1833182] Info/Layer2/Baystack.pm: get model number for ERS 2500 (David Sieb�rger)
- [1833190] Info/Layer2/Baystack.pm: fix index_factor (David Sieb�rger)
- Revert 1.16, fixed issue upstream
2007-11-19 04:28:01 +00:00
Eric Miller
bd908a6952 [1833174] Info.pm: recognise new Nortel switches as Layer2::Baystack (David Sieb�rger) 2007-11-19 04:25:17 +00:00
Eric Miller
400e94ea27 - Override ip_netmask() to get masks for virtual and cpu interfaces
- rc_vlan_name() has changed to v_name() for compatibility purposes
- Silence warnings on uninitialized variables when searching for virtual management interfaces
2007-11-19 02:59:31 +00:00
Eric Miller
1d286d8388 Add rc_virt_mask and rc_cpu_mask so that we can get masks on virtual and cpu interfaces 2007-11-19 02:50:42 +00:00
Eric Miller
bf79dd333f Fix for uninitialized value errors in i_mac() 2007-11-10 17:48:58 +00:00
Eric Miller
c882e63dad whitespace 2007-11-10 17:46:12 +00:00
Eric Miller
710e7afbe6 Remove a mistaken comment in previous commit 2007-11-04 05:01:42 +00:00
Eric Miller
e51c9c1da2 - Implement v_index() and v_name() consistently across classes in support of Netdisco 0.96
- Don't query dynamic VLANs - table may be too large on some devices
2007-11-04 03:29:47 +00:00
Eric Miller
b17f04e762 Fix for uninitialized value in i_name() 2007-11-04 02:58:01 +00:00
Eric Miller
a6d16bdfc9 [ 1782392 ] Warnings from C1900.pm 2007-11-04 02:51:35 +00:00
Eric Miller
b6377596f8 Support both stackable and chassis based switches for psuedo ENTITY-MIB methods for older switches 2007-10-10 03:51:30 +00:00
Eric Miller
b5d1210f72 Make Psuedo ENTITY-MIB methods work with all routers supported by the class 2007-10-10 03:45:47 +00:00
Eric Miller
af038c491b Add chassis info to psuedo ENTITY-MIB methods 2007-10-10 03:35:11 +00:00
Eric Miller
4af016ea4f Can't point FUNC at a method, must override in a method. 2007-10-10 03:31:42 +00:00
Eric Miller
a2d94315c3 - Use Q-BRIDGE-MIB for macsuck from bridge class rather than redefining
- Model cosmetics
2007-10-10 02:38:36 +00:00
Eric Miller
e87e076b6a Use Q-BRIDGE-MIB for macsuck from bridge class rather than defining our own. 2007-10-10 02:28:00 +00:00
Eric Miller
dfbc7cfd07 Fix to avoid inheritance issues in psuedo classes with e_index() 2007-10-10 02:24:58 +00:00
Bill Fenner
696efaad82 Turn on bulkwalk - this is a big source of inefficiency for
a class that handles some of the bigger hardware.  If you need
bulkwalk off, turn it off when creating the class (e.g., with
bulkwalk_no in netdisco)
2007-10-09 17:57:23 +00:00
Bill Fenner
b435382a5e Map 207 to Layer2::Allied 2007-10-09 17:53:23 +00:00
Bill Fenner
ea65ed57af Teach Baystack's e_index() that Entity's e_index() is implemented based
on e_descr() - otherwise, Entity's e_index() will always return a mapping
even if the device doesn't implement the ENTITY-MIB.
2007-10-08 22:30:30 +00:00
Bill Fenner
f3058e4e9c Add i_vlan, copied from my L3::Cisco.pm implementation. 2007-08-13 12:52:05 +00:00
Bill Fenner
75b570af95 Include CiscoPower. 2007-07-30 15:32:18 +00:00
Bill Fenner
840d8a48ba Add PowerEthernet support. 2007-07-30 15:27:35 +00:00
Bill Fenner
b5fec8dbde Add support for POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB 2007-07-30 15:25:28 +00:00
Bill Fenner
123dc84f05 Get i_vlan from Layer3 Cisco from the sub-interface ID. 2007-07-18 16:39:11 +00:00
Bill Fenner
98ceee3212 Update the MIBs actually required and where to get them. 2007-07-18 16:37:47 +00:00
Eric Miller
ab08aa1de1 Some devices have issues with BRIDGE-MIB (duplicates and non-increasing oids). Use Q-BRIDGE-MIB for macsuck. 2007-06-26 01:35:17 +00:00
Eric Miller
e8c0a78e67 - Enterasys support
- L2::C1900 bridge group (VLAN) reporting
- CiscoStack duplex reporting improvement
2007-06-25 22:05:07 +00:00
Eric Miller
0c583b7838 Enterasys support 2007-06-25 22:02:27 +00:00
Eric Miller
7515cb0ab0 Remove propvirtual from i_ignore() so we capture VLAN interfaces and their associated MACs. 2007-06-20 03:12:20 +00:00
Eric Miller
fc4d9cac24 Remove i_ignore(), use Layer2 definition. 2007-06-20 03:09:24 +00:00
Eric Miller
8d496beceb Remove device specific i_type(), use standard IF-MIB values. 2007-06-20 03:07:41 +00:00
Eric Miller
ce1fac9e86 - Correct operational and administrative duplex reporting.
- Remove device specific i_type() use standard IF-MIB values.
- Remove PORT-SECURITY-MIB from CiscoStack as these are now in CiscoPortSecurity class.
- Move interfaces() and i_name() methods out of CiscoStack to L2::Catalyst so we can remove globs from L3:C3550 and L3::C6500.
2007-06-20 03:05:29 +00:00
Eric Miller
659d38b0db More CiscoVTP removal clean up 2007-06-20 02:52:24 +00:00
Eric Miller
56a4238632 - Remove CiscoVTP from inheritance, devices do not support it.
- Enable VLAN / bridge group reporting with i_vlan() and i_vlan_membership().
- Remove device specific i_type(), return standard IF-MIB values.
2007-06-20 02:49:26 +00:00
Eric Miller
4c9f9d9876 Method name change - Alexander Hartmaier 2007-06-19 01:52:32 +00:00
Eric Miller
533104ce55 [ 1670427 ] Info.pm modifications - allow partials on i_speed (Justin Hunter) 2007-06-19 01:48:57 +00:00
Eric Miller
06fd442dce Extreme VLAN support
Update partial table support
2007-06-14 03:34:05 +00:00
Bill Fenner
8955e25c4f Add new VLAN methods to Extreme.
Add additional powersupply and fan info.

Use the concise interface name (e.g., "1/32"), instead of description
(e.g., "RMON Port 32 on Unit 1").
2007-06-13 15:11:04 +00:00
Eric Miller
f543768c7b Fix detection of Cisco PIX and ASA. 2007-06-13 02:56:18 +00:00
Eric Miller
4c33cfecff Prep 1.05 2007-06-13 02:52:43 +00:00
Eric Miller
2070f9b9e0 Support partial table fetches on overridden table methods.
Prep 1.05
2007-06-13 02:48:44 +00:00
Eric Miller
069695f570 Sync new files 2007-06-12 03:19:31 +00:00
Eric Miller
ad300684c3 Updates for 1.05 2007-06-12 03:18:20 +00:00
Eric Miller
98d120717a [ 1681923 ] Preliminary MS Windows router support (begemot) 2007-06-11 02:45:20 +00:00
Eric Miller
1ebe34ce90 [ 1681923 ] Preliminary MS Windows router support (begemot) 2007-06-11 02:38:53 +00:00
Eric Miller
9565c908c6 Annotate that this module is deprecated. 2007-06-11 00:54:20 +00:00
Eric Miller
85f36d3831 Foundry updates.
SNMP set method updates.
2007-06-09 03:37:01 +00:00
Eric Miller
77aca4b628 Depreciate L2::Foundry, use new L3::Foundry for all Foundry devices.
Enable the use of raw mib leaf names from loaded MIBs in set operations.
Clear attribute cache on successful SNMP set.
POD updates.
2007-06-09 03:29:44 +00:00
Eric Miller
7602c30d96 Add LLDP support.
Support partial table fetches on overridden table methods.
Modification to support Foundry devices in single class.
Pod updates.
2007-06-09 03:07:49 +00:00
Eric Miller
c5b2894d23 Emulate ENTITY-MIB Physical Table methods in Passport class 2007-05-17 02:23:44 +00:00
Eric Miller
508a86b563 Emulate ENTITY-MIB Physical Table methods using RAPID-CITY MIB 2007-05-17 02:19:11 +00:00
Eric Miller
01faf96ccb Catch up on updates 2007-04-21 03:22:31 +00:00
Eric Miller
3edb813da7 Pass $attr twice to _load_attr( ) in AUTOLOAD when using a mib leaf to make sure data is cached. 2007-04-21 02:43:55 +00:00
Eric Miller
8cae0c74fb Emulate ENTITY-MIB Physical Table methods using Wellfleet-HARDWARE-MIB and Wellfleet-MODULE-MIB. 2007-04-21 02:37:14 +00:00
Eric Miller
feefe2dcee - Add new VLAN methods to include VLAN set methods. Testers needed.
-  POD updates.
2007-04-17 03:44:42 +00:00
Eric Miller
7a40aa02ed more POD 2007-04-17 03:18:58 +00:00
Eric Miller
5d9ac88750 - Add new VLAN methods to include VLAN set methods. Testers needed.
-  Support partial table fetches on overridden table methods.
-  POD updates.
2007-04-16 03:25:35 +00:00
Eric Miller
93c54da5ba [ 1577927 ] Add EIGRP Neighbor Tables (Andrew Herrick) 2007-04-15 03:39:01 +00:00
Eric Miller
d9c87bdfbd - Modify inheritance to use Cisco classes before generic classes
- [ 1670428 ] add CiscoConfig inheritance
- Remove globs which shouldn't be needed with new inheritance chain
- Add CiscoPortSecurity inheritance so we can remove port security from CiscoStack
- POD updates
2007-04-15 02:44:14 +00:00
Eric Miller
6bbc902c75 Copyright and license 2007-04-14 23:59:35 +00:00
Eric Miller
79a4a55265 entPhysicalIndex (e_index) is not-accessible. Create e_index method to facilitate emulation methods in other classes 2007-04-14 23:57:31 +00:00
Eric Miller
67081eed26 Emulate ENTITY-MIB Physical Table methods using S5-CHASSIS-MIB for older devices. 2007-04-14 20:54:57 +00:00
Eric Miller
be37a24fc9 - Modify inheritance to use Cisco classes before generic classes
- Remove globs which shouldn't be needed with new inheritance chain
- POD updates
2007-04-06 03:37:26 +00:00
Eric Miller
269d2b7be9 - Support partial table fetches on overridden table methods.
-  Use IID as key for hashes, remove unnecessary code.
-  Align with other topology classes, return all data.  c_ip() no longer returns and an array for multiple neighbors on a local port.
2007-04-06 02:10:58 +00:00
Eric Miller
749ad55af1 Add LLDP support 2007-04-06 02:00:45 +00:00
Eric Miller
866d28a36d Fix for incorrect mib leaf logic in AUTOLOAD. 2007-04-06 01:58:16 +00:00
Eric Miller
1a3b3ae009 - Patches from Alexander Hartmaier
- POD update for new LLDP class
2007-04-05 02:47:07 +00:00
Eric Miller
b5edc85a56 Initial commit - based upon the work of Bernhard Augenstein 2007-04-04 02:19:28 +00:00
Eric Miller
bb9e6f5101 [ 1670413 ] CDP.pm -- power drawn support (Justin Hunter) 2007-04-03 02:53:52 +00:00
Eric Miller
9d37614f66 [ 1670407 ] MAU.pm partials (Justin Hunter) 2007-04-03 02:40:47 +00:00
Eric Miller
669989434c - Enable calls to SUPER class to find autoloaded methods (Bernhard Augenstein)
- Modify AUTOLOAD so that single instance MIB leafs return a scalar like GLOBALS while MIB leafs in tables return reference to hash like FUNCS.  Do not access %SNMP::MIB directly to prevent autovivification.
2007-04-03 02:19:39 +00:00
Eric Miller
fb44b0b4b1 Only return MAC from munge_mac() if it actually is a MAC. Fix for netdisco where device would not be inserted in DB due to malformed MAC. 2007-04-03 01:25:22 +00:00
Bill Fenner
09f80eeed7 Translate OIDs returned by Entity MIB e_type 2007-02-26 00:19:15 +00:00
Bill Fenner
e5c81896aa Implement v_index as a function, since the OID is not-accessible and
can't be walked.
2007-02-20 03:06:04 +00:00
Bill Fenner
7ad7d1e338 Add -n for no bulkwalk.
Allow -x to be specified multiple times to go with Info.pm's new
 Debug=2 output.
2007-02-15 23:11:43 +00:00
Bill Fenner
1b0c212a95 Increased debugging in _load_attr(). The most verbose requires
Debug = 2.
Print an error in AUTOLOAD if it's called without a class; this
 is likely to be a typo in a function call in a module implementation
 and the default error message is just confusing.
2007-02-15 23:10:55 +00:00
Bill Fenner
0dc9174c83 Fix uptime fetching code.
Minor documentation fixes.
2007-02-15 21:49:59 +00:00
Bill Fenner
70197f35ee Add Layer3::NetSNMP, combining some of my work with that submitted by
Bradley Baetz in patch 1557529.
2007-02-14 23:58:31 +00:00
Eric Miller
5c0cefefba [ 1644841 ] Airespace serial number 2007-01-26 03:44:11 +00:00
Eric Miller
54633a7b99 [ 1638153 ] Add rptrAddrTrackNewLastSrcAddress to Layer1's functions 2007-01-25 04:30:38 +00:00
Eric Miller
cde34cfc99 Cisco Airespace wireless controller support 2007-01-25 03:59:38 +00:00
Bill Fenner
41dac34246 Fix typo in name of OID for e_pos. Also add pod for e_pos. 2006-12-02 04:06:27 +00:00
Bill Fenner
b1e0261216 Handle SNMPv1 noSuchName response - iid = '' and val = ''.
Getting noSuchName in response to a getnext for an empty table
 resulted in a return value of { '' => '' } instead of undef.
Fixes [1596554]
2006-11-23 06:51:38 +00:00
Bill Fenner
84b1160c23 Hook up Netgear by enterprise number. 2006-11-23 06:17:10 +00:00
Bill Fenner
0cededc7ba Add a netgear class, based on Zoltan Erszenyi's work with the
GSM 7224 and my brief encounter with an FSM 726.
2006-11-23 06:12:46 +00:00
Eric Miller
0b932064ed Cyclades terminal server support 2006-11-20 19:36:14 +00:00
Eric Miller
c4c0cbb597 Fix doc cut and paste 2006-11-20 16:29:21 +00:00
Eric Miller
24662f2352 Initial Import 2006-11-20 16:19:28 +00:00
Bill Fenner
d460c5a473 Some of the links were broken since some pages used
TABLE ENTRIES and others used TABLE METHODS.  Since
README says TABLE METHODS, let's standardize on that.
2006-11-18 00:23:26 +00:00
Bill Fenner
87063bc4d3 Update Required MIBs, GLOBALS and TABLE ENTRIES sections to
include links in cross-references to other SNMP::Info pages.
2006-11-17 00:59:33 +00:00
Bill Fenner
948921930b Remove custom ipNetToMediaTable implementations, and inherit them
from Layer3.pm
Use orig_foo() instead of custom versions
Rename 'serial' to 'serial1' so Layer3.pm's serial() sub will use it
2006-11-17 00:25:14 +00:00
Bill Fenner
dc494ff038 Implement Dot11 Transmission Power Table (dot11PhyTxPowerTable)
and a helper function, dot11_cur_tx_pwr_mw(), which performs the
 necessary dereferencing to get the current tx power level in mw.
2006-11-16 17:39:04 +00:00
Bill Fenner
a98e163c7c Add interfaces to Q-BRIDGE Filtering Database Table (dot1qFdbTable):
qb_fw_mac, qb_fw_port, qb_fw_status.  These can be used directly
 in place of fw_mac, fw_port, fw_status for devices that only
 populate dot1qFdbTable and not dot1dFdbTable.
2006-11-15 21:10:23 +00:00
Eric Miller
e6428abc0b Cached globals in set operations are bad :-( 2006-11-15 19:48:20 +00:00
Eric Miller
9597095b50 Prep 1.05 2006-11-15 19:38:20 +00:00
Eric Miller
905272a3bc Doc update 2006-11-15 19:26:27 +00:00
Eric Miller
5da4035b03 Add loop detect option and code for getnext table column walks. 2006-11-15 18:01:27 +00:00
Eric Miller
435af3cf82 - Fix for bug where an SNMP error in any operation would cause subsequent table get operations to fail in the same session, originally identified by Nicolai Petri.
- Implemented Justin Hunter's suggestion to enable dynamic methods in AUTOLOAD with MIB Leaf node names for loaded MIBs without definition in %FUNCS.
- Enable load_ methods for %GLOBALS and MIB Leaf node names.
- Allow partial table fetches with load_ methods.
- Allow a single instance partial table fetch with iid = 0, can be used to support non-table MIB Leaf node name fetches.
- Documentation updates.
2006-11-14 04:07:23 +00:00
Eric Miller
afc53b176b Changes to CiscoVTP, OSPF neighbor table, CiscoConfig class. 2006-11-04 03:27:16 +00:00
Eric Miller
8624b0d63a - Throw errors with error_throw()
- Better input parameter validation
- Only allow set_i_vlan() on access ports
- Change order of egress list processing in set_i_vlan() in case we're given the same VID
2006-11-04 03:08:38 +00:00
Eric Miller
1ac5cdd110 Fix in i_vlan() and i_vlan_membership() for newer code 2006-11-03 22:17:33 +00:00
Bill Fenner
1be0292e78 Override the Layer3 serial number fetching. 2006-11-03 19:06:43 +00:00
Bill Fenner
523deb988a If the result is a ref to an array, print the array.
(Have to be careful about becoming Data::Dumper...)
2006-11-03 16:53:10 +00:00
Eric Miller
4ae815c6f9 - Add new VLAN methods.
- Support partial table fetches on overridden table methods.
- Document new set methods and other doc updates.
2006-11-02 20:49:45 +00:00
Eric Miller
d46b124674 - Support for "write mem" and "write net" for older IOS versions
- Added appropriate debugging output and throw errors as expected
- Timeout value to prevent an infinite loop while waiting for the device to report success or failure.
2006-11-01 21:37:29 +00:00
Eric Miller
df9a335052 Initial Import
SF Patch 1555001 - CiscoConfig.pm (Justin Hunter)
2006-10-30 21:35:45 +00:00
Eric Miller
038a6c7714 Documentation updates 2006-10-30 17:57:10 +00:00
Eric Miller
301d14acf0 document recent changes 2006-10-30 03:41:34 +00:00
Eric Miller
c5a0e40065 - Add OSPF Neighbor Table, SF Patch 1577918 by Andrew Herrick
- Add OSPF Interface Table
- Documentation updates
2006-10-28 03:21:31 +00:00
Eric Miller
b8c03fa9c1 - Change inheritance - Layer2 and IEEE802dot11
- Implement i_ssidlist(), and i_80211channel() methods through IEEE802dot11 class
- Use orig_ syntax. Remove redundant items
- Support partial table fetches on overridden table methods
- Documentation updates
2006-10-27 15:23:11 +00:00
Eric Miller
3da742fa1d - Implement i_ssidlist(), i_ssidbcast(), and i_80211channel() methods.
- Use orig_ syntax. Remove redundant items.
- Support partial table fetches on overridden table methods.
- Documentation updates.
2006-10-20 20:05:22 +00:00
Eric Miller
a1199f6ff0 Initial commit 2006-10-20 18:27:16 +00:00
Max Baker
4dc43891df pod fix 2006-10-18 18:02:35 +00:00
Max Baker
7aede0a35e allow translateObj() to fail by adding default return value. fix reported warnings 2006-10-18 16:52:33 +00:00
Max Baker
8b0239fdde added 7200 series note about IOS version 2006-10-18 16:42:20 +00:00
Eric Miller
ab632849bf - Extend interfaces - Each radio interface instead of just one interface per AP. Added virtual interfaces (AP tunnel terminations).
- Implemention of additional MIB leafs and tables.
- Implement i_ssidlist(), i_ssidbcast(), and i_80211channel() methods.
- Use orig_ syntax. Remove redundant items.
- Support partial table fetches on overridden table methods.
- Documentation.
2006-10-12 21:48:32 +00:00
Bill Fenner
cec6e00384 in test_fn(), call test_global() if we get something back from the
method that's not a hash.  This enables "-p foo" on the command line
 for a foo that's not a hash.
2006-10-12 17:53:45 +00:00
Eric Miller
3656c6e42a Initial Import 2006-10-03 02:56:36 +00:00
Eric Miller
b93278fa93 Add definitions to support new VLAN methods.
Documention updates.
2006-10-03 02:24:37 +00:00
Eric Miller
ff37bab36d bp_port () definition fix - Nicolai Petri bug report 2006-10-03 01:38:36 +00:00
Eric Miller
f3783daf05 Doc updates 2006-10-01 03:16:28 +00:00
Eric Miller
8c01484a5d Support partial table fetches on overridden table methods.
Pod updates.
2006-10-01 03:08:55 +00:00
Eric Miller
d8994dc737 Rework regex again for conflicts between 8100 and 1100 series. 2006-09-29 13:56:42 +00:00
Eric Miller
88890649bf Support for dual speed 10/100 hubs 2006-09-29 03:18:57 +00:00
Eric Miller
d46842bd8e Detection of older dual speed Bay hubs.
SF Patch 1557530 - OC-48 interfaces - Bradley Baetz
2006-09-29 03:13:58 +00:00
Eric Miller
c240cfc854 Regex fix for 8110 2006-09-29 01:52:48 +00:00
Eric Miller
81f5534a6a Support partial table fetches on overridden table methods.
Add set_i_duplex_admin ( ) method.
Document new set method and other doc updates.
2006-09-29 01:42:34 +00:00
Eric Miller
e60a1a6931 Nortel ERS 1600 series < 2.1 use L3::N1600 others now use L3::Passport 2006-09-19 16:28:28 +00:00
Eric Miller
72e8f46633 ERS 1600 series code versions >= 2.1 now use this class 2006-09-19 16:24:09 +00:00
Eric Miller
d7c0959d27 Passport class detection changes 2006-09-19 15:45:23 +00:00
Max Baker
862e8b6006 Added CGESM to C2900 in device_type() 2006-09-06 17:42:05 +00:00
Max Baker
c9b47de8d1 logic inversion error 2006-09-06 17:34:29 +00:00
Max Baker
0dd90a24dd *** empty log message *** 2006-09-06 17:30:21 +00:00
Max Baker
9cfc0bcd64 added bypass of old vlan info if we already see the port is marked trunk 2006-09-06 17:28:53 +00:00
Max Baker
1820299dcf added all entries from ifEntry table in IF-MIB and their descriptions. reorderd to match in %FUNC 2006-09-06 17:17:00 +00:00
Eric Miller
acbfa7484b Override serial() as required since overridden in L2 / L3.
Doc updates.
2006-09-01 18:40:12 +00:00
Eric Miller
67fd776431 Support partial table fetches on overridden table methods.
Optimize i_duplex_admin() and i_duplex().
Override serial() as required since overridden in L3.
Document new set methods and other doc updates.
2006-09-01 15:53:43 +00:00
Eric Miller
c04dd5b3b5 Inherit from Layer3. Use orig_ syntax. Remove redundant items.
Support partial table fetches on overridden table methods.
Pod updates.
2006-09-01 02:09:51 +00:00
Eric Miller
b8b2d337d5 Pod update. 2006-08-30 17:06:25 +00:00
Eric Miller
8b0ffdf079 Use orig_ attrib, remove redundant items.
Support partial table fetches on overridden table methods.
Pod updates.
2006-08-30 17:01:55 +00:00
Eric Miller
eb8328c36d Implement i_ssidlist(), i_ssidbcast(), and i_80211channel() methods.
Inherit from Layer2.  Use orig_ syntax. Remove redundant items.
Support partial table fetches on overridden table methods.
Pod updates.
2006-08-30 03:05:37 +00:00
Eric Miller
2ab9bb0053 Add NetScreen support. SF patch ID 1507463. 2006-08-30 02:17:19 +00:00
Eric Miller
fae8e8396f Pod changes. 2006-08-30 02:07:08 +00:00
Eric Miller
cdccde0c7d Initial Import. 2006-08-30 02:02:58 +00:00
Eric Miller
ee829539c2 Use orig_ attrib, remove redundant items.
Support partial table fetches on overridden table methods.
Pod updates.
2006-08-28 19:56:31 +00:00
Eric Miller
832679ac4f Inherit from Layer2. Use orig_ syntax. Remove redundant items.
Support partial table fetches on overridden table methods.
Pod updates.
2006-08-28 19:51:52 +00:00
Eric Miller
45af60459f Basic Sun support - SF Patch 1544637 contributed by begemot 2006-08-23 19:48:47 +00:00
Eric Miller
2586fc9309 Initial import - SF Patch 1544637 contributed by begemot 2006-08-23 19:45:16 +00:00
Eric Miller
01cafebf89 Inherit from Layer3. Use orig_ syntax. Remove redundant items.
Support partial table fetches on overridden table methods.
Rework methods to use least amount of SNMP queries based upon calling context.
2006-08-23 19:34:10 +00:00
Eric Miller
9d530e2a62 Enable partial table fetches in overridden methods - Justin Hunter SF Patch ID 1542883. 2006-08-22 19:32:00 +00:00
Eric Miller
c130b9a49e Fix SNMPv1 partial table fetches, bug introduced by patch to enable single instance partial table fetches. 2006-08-22 01:42:56 +00:00
Eric Miller
c10bf98500 Add new VLAN methods and align i_vlan( ) with other classes.
Add set_i_speed_admin ( ) and set_i_duplex_admin ( ) methods.
Fix POD name.
2006-08-17 02:02:40 +00:00
Eric Miller
83fb73389a Bill's patch to allow single instance partial table fetches. 2006-08-17 01:54:27 +00:00
Eric Miller
f9933dcb4f start 1.05 documentation 2006-08-11 02:42:41 +00:00
Eric Miller
74ccc599fe Add generic device type detection using IANA assigned enterpise number extracted from sysObjectID. Add Dell switch detection. 2006-08-11 02:26:26 +00:00
Eric Miller
362acb9217 Initial import - support for Dell Power Connect switches 2006-08-10 02:36:13 +00:00
Eric Miller
a3038adbd0 Fix POD 2006-08-10 02:30:32 +00:00
112 changed files with 32732 additions and 8996 deletions

View File

@@ -1,5 +1,5 @@
All code from version 0.7 on
Copyright (c) 2003,2004 Max Baker
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
All rights reserved.
Original Code

276
ChangeLog
View File

@@ -1,5 +1,260 @@
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
ChangeLog $Id$
version 2.08 (2012-07-15)
[NEW FEATURES]
* Basic support for APC UPS devices
* [2993691] Support for SonicWALL devices in new class L3::SonicWALL (phishphreek)
* [2996795] Support for Kentrox devices in new class L2::Kentrox (phishphreek)
* [] Basic support for Blue Coat proxy devices in new class L3::BlueCoatSG (jeroenvi)
* [] Support Cisco 6500 / Sup2T in L3::C6500 class (jeroenvi)
[ENHANCEMENTS]
* Pseudo ENTITY-MIB methods added to L3::Juniper for hardware information
* Add method to report current transmit power of the radio interface,
dot11_cur_tx_pwr_mw(), in Airespace class
* [3085411] Activate L3 properties for Netgear GSM7224v2 (phishphreek)
* [3085413] SNMP OIDs for Netgear Serial and OS Ver (phishphreek)
* [3286549] Dell LLDP Support (Nico Giefing)
* [3469527] Netgear LLDP Support (Nic Bernstein)
* [3472052] moduleSerialNumber support for Cisco Stack (Slava)
* [3523320] Better VLAN support in Juniper class (Web Bulley)
* [3532261] LLDP support in C6500 and related (Carlos Vicente)
* [3538949] Updated switch models in L2::HP (jeroenvi)
[BUG FIXES]
* Get OS version for Juniper devices not reporting in sysDescr
* Correct base MAC reporting for Juniper devices
* Correct reporting of SSID broadcast status in Airespace class
* [3541442] Change L2::Catalyst port names to what is reported in CDP
* [2132349] Add an additional check to get Foundry OS version
* [2929883] [3413999] LLDP interface mapping issue
* [3297786] LLDP TimeMark component defaults to zero (David Baldwin)
* [2988163] Detect Juniper SSG firewalls as Layer3::Netscreen (R. Kerr)
* [3317739] Fix for Baystack without POE on stack member 1 (David Baldwin)
* [2037444] os_ver fails on some Extreme versions (Robert Kerr)
* [2980789] Fix root_ip to try OSPF RouterID first (Brian De Wolf)
* [2986858] Fix the patch from this ticket (Oliver Gorwits)
* [3136084] Rename Allied Telesyn to Allied Telesis (Oliver Gorwits)
* [3268104] CiscoVTP.pm i_vlan_membership() array bounds (Michael Sanderson)
* [3497004] Clarify POD description of default values (a2w)
* [3502533] Layer2/Baystack interface indexes > 513 (Robert Nyqvist)
version 2.06 (2011-09-28)
[NEW FEATURES]
* Support for PacketFront devices in new class L3::PacketFront
* Support for Mikrotik devices in new class L3::Mikrotik
* Support for HP VirtualConnect switches in new class L2::HPVC
* Support for ADSL-LINE-MIB in new class AdslLine
[ENHANCEMENTS]
* POD clarification on i_speed() munging by Info.pm
* Added i_stack_status method that can be used for finding the parent
interface for e.g. ADSL interface speed determination
[BUG FIXES]
* [3344843] Fix returning serial() and os_ver() for web-managable HP
switches, introduced by HP/HP4000 class split, reported by J R Binks
* [2809033] Put L2-only Cisco blade switches in L3::C6500
* [3408506] Fix uninitialized value in IPv6 when neighbor state is
incomplete (Michael Borgelt)
version 2.05 (2011-06-23)
+ Fix broken function call in L2::Aironet
+ Promote L2::Aruba to L3::Aruba, as Aruba devices can be L3 entities and
provide L3 information.
version 2.04 (2011-03-31)
+ Support for older HP switch models moved to new L2::HP4000 class
+ Fix VLAN changing in L2::HP and L2::HP4000 classes
* Updated model lists in HP classes
+ [2980782] Added L3::CiscoFWSM for Cisco Firewall Services Modules
(Brian De Wolf)
+ Added L3::Pf for FreeBSD PFSense Firewalls (max)
* Added specific functions for neighbor mgmt addresses to CDP class
* Implemented os_bin() method in CiscoStats
+ [2980787] Fix for C1900 bp_index not containing interfaces.
(Brian De Wolf)
+ [2599795] Added vendor_i_type() method to HP and HP4000 clases
+ [2688801] Minor modification for obscure Proxim/Orinoco device
(jrbinks)
+ [3051443] Add PoE measured power per port to Cisco, Extrme and HP
classes (jeroenvi)
* Minor tweaks to support devices without sysServices
* Added Cisco CBS3xxx blade switches to L3::C6500
* Fix for FWSMs not being detected properly. Special thanks goes to
Jukka Pirhonen for pointing it out. (Brian De Wolf)
+ Added support for IPv6 to physical address mapping
* Added ME340x to L3::C3550
* Added new ProCurve models to HP class
* Fixed i_speed_raw not returning raw values (Alexander Hartmaier)
version 2.01 (06/12/09)
+ Added CiscoStpExtensions Class (Carlos Vicente)
+ Added Layer3::Arista (fenner)
+ [2020353] Added L3::Altiga for Cisco (Altiga) VPN3000 Concentrators
(Jeroen van Ingen)
* Fixed RFC1213-MIB vs IF-MIB collision in ifOperStatus
* Updated test_class.pl for better debug info and relative path
* Add cisco vendor detection by OID in Layer3.pm (Sam Stickland)
* Fix CaSe of EtherLike-MIB in EtherLike.pm (Alexander Hartmaier)
* Added Cisco FWSM to L3::Cisco
* Added s222_rp to L3::C6500
* Added CIGESM to L2::C2900
* Added Airespace WLC to L2::Airespace
* Updated POD and DeviceMatrix quite a bit
* Added ENTITY-MIB to CiscoStats for better model handling above
* Fix networkaddress handling in LLDP-MIB
* Added CiscoConfig to L2::Aironet, L3::C3550 classes
* Better SSID capabilities for L2::Aironet
* Fix CDP vs LLDP in c_id() for HP Class
* test_class.pl improvements
version 2.00 (08/01/08)
+ Support for Alcatel-Lucent OmniSwitch via L3::AlcatelLucent
+ Support for Alcatel-Lucent Service Router via L3::Timetra
+ Support for Alcatel-Lucent OmniAccess via L2::Aruba
* Silence warnings in MAU due to uninitialized variables
version 1.09 (07/22/08) - Beta/developer release
+ Added support for HP ProCurve Foundry OEM switches, such as the 9300
series, in new class L3::HP9300 (contributions from Douglas McKeown and
Ivan Auger)
+ Added support for CISCO-PAE-MIB in CiscoPortSecurity (Kesy)
+ Support for D-Link devices through L3::Dell
+ Support for Linksys SRW2048 through L3::Dell
+ Support for IBM BladeCenter 4-Port GB Ethernet Switch Module through
L3::Dell (Alex Kramarov)
+ Support for newer Nortel Alteon switches and Nortel BladeCenter Switch
Modules in L3::AlteonAD
+ Support for Cisco 1250 series through L2::Aironet
+ Updates to fan, power supply, and serial number methods in
L2::HP (Jeroen van Ingen)
+ Use Cisco Client Association MIBs for Aironet client reporting
via fw_mac
+ Support VLANs on Aironet
+ Get the proper radio MAC address from aironet in MBSS mode
+ Additional wireless statistics from Aironet
+ Add support to specify MIB to resolve leaf names conflicts in
%GLOBALS and %FUNCS.
+ Added munge_port_list() and modify_port_list() methods to assist in
working with PortList objects.
+ Added set_multi() method to enable a SNMP set command on several new
values in one request. Required for complex set operations
on some agents.
+ Infrastructure for SNMPv3 support:
+ Save the SecName passed into the constructor
+ Create an update() function, which replaces the underlying
SNMP session using different parameters.
+ Return the SecName instead of community from snmp_comm() when using
SNMPv3.
* L2::HP now isa Layer3 instead of Layer2 to support arpnip
(Dudley Freeman)
* Silence warnings from Cisco devices which don't return values for
extended VLAN range (1024-4096)
* Documentation coverage, spelling, and syntax updates
* set_i_pvid(), set_i_vlan(), set_add_i_vlan_tagged(),
set_remove_i_vlan_tagged() removed from Bridge and HP classes due to
incompatibility across devices.
version 1.07 (11/26/07) - Beta/developer release
version 1.05 (11/25/07) - CVS only. No official release
+ Added support for LLDP in new class LLDP (contributions from Bernhard
Augenstein)
+ Added device specific support for LLDP in L2::HP, L2::Baystack,
L3::Enterasys and L3::Foundry
+ Added support for Enterasys devices as new class L3::Enterasys
+ Added support for Dell PowerConnect switches as new class L3::Dell
+ Added basic support for generic routers running Microsoft Windows OS
as new class L3::Microsoft (begemot)
+ Added basic support for Sun routers as new class L3::Sun (begemot)
+ Added basic support for Juniper NetScreen devices as new class
L3::Netscreen (Kent Hamilton)
+ Added support for Cyclades terminal servers as new class L1::Cyclades
+ Added support for Cisco (Airespace) wireless controllers as new class
L2::Airespace
+ Added support for Nortel Ethernet Routing Switch 2500 series and
Business Ethernet Switches (David Sieb<65>rger)
+ Update of L3::Foundry to support all Foundry devices including newer
switches. Depreciate L2::Foundry.
+ Added generic device type detection using IANA assigned enterpise
number extracted from sysObjectID
+ Added ifDiscards and other missing entries from IF-MIB::ifEntry (Greg King)
+ Added CGESM devices to L2::C2900 class (Alexander Hartmaier)
+ Added support for dual speed 10/100 hubs and i_speed() in L1::Bayhub
+ Added i_ssidlist(), i_ssidbcast(), and i_80211channel() methods to
L2::Aruba, Airespace, and L2::NAP222x classes
+ New class IEEE802dot11 class for generic standards based wireless AP
support to include i_ssidlist()and i_80211channel() methods.
+ L2::Orinoco inherits from new IEEE802dot11 for i_ssidlist()and
i_80211channel() support.
+ Added new VLAN methods i_pvid(), i_vlan_membership(), set_i_pvid(),
set_i_vlan(), set_add_i_vlan_tagged(), set_remove_i_vlan_tagged() to
Bridge, CiscoVTP, Extreme, HP, and RapidCity classes.
+ Added set_i_speed_admin() method to RapidCity class,
+ Added set_i_duplex_admin() method to RapidCity class,
+ Added OSPF Neighbor Tables, SF Patch 1577918 to Layer 3 (Andrew Herrick)
+ Added CiscoConfig class, SF Patch 1555001 (Justin Hunter)
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
+ Enable dynamic methods in AUTOLOAD with MIB Leaf node names for loaded
MIBs without definition in %FUNCS or %GLOBALS. Single instance mib leafs
will be treated as a GLOBAL and returna scalar while mib leafs which
reside in a table will be treated as a FUNC and return a reference to a
hash.
+ Enable load_ methods for %GLOBALS and MIB Leaf node names.
+ Add loop detect option and code for getnext table column walks.
+ Add Layer3::NetSNMP for Net-SNMP-based hosts, part of
SF patch 1557529 (Bradley Baetz).
+ Add EIGRP Neighbor Tables to L3::Cisco SF Patch 1577927 (Andrew Herrick)
+ Additions to CiscoQOS and CiscoStats (Alexander Hartmaier)
+ Emulate ENTITY-MIB Physical Table methods for devices which don't
have ENTITY-MIB support in Airespace, Bayhub, Baystack, BayRS,
NortelStack, and Passport classes.
+ Enable use of MIB Leaf node names in SNMP sets.
+ Add POWER-ETHERNET-MIB and CISCO-POWER-ETHERNET-EXT-MIB support.
* Fix for bug where an SNMP error in any operation would cause subsequent
table get operations to fail while using the same session, originally
identified by Nicolai Petri.
* Enable single instance partial table fetches (Alexander Hartmaier)
* Enable partial table fetches in overriden table methods (Justin Hunter)
* Allow partial table fetches with load_ methods.
* Fixed vlan trunk port handling bug in L2:HP (Michael Robbert)
* Correct bp_port() definition in Bridge class (Reported by Nicolai Petri)
* Remove port security definitions from CiscoStack and move into new class
CiscoPortSecurity. Needed to support devices such a L3::C4000 which
support CISCO-PORT-SECURITY-MIB, but not CISCO-STACK-MIB.
(Reported by Prakash RudraRaju)
* Correct port numbering for Nortel 8110, 1100, 1150 in L3:Passport
(Reported by David Pinkoski)
* Documentation updates
* Translate OIDs returned by Entity MIB e_type
* Modify inheritance to use Cisco classes before generic classes
* Create e_index method in ENTITY-MIB to facilitate emulation methods in
other classes as entPhysicalIndex is not-accessible.
* Only return MAC from munge_mac() if it actually is a MAC. Fix for
netdisco where device would not be inserted in DB due to malformed MAC.
* Enable SUPER class calls to find autoloaded methods (Bernhard Augenstein)
* Clear attribute cache on sucessful SNMP set.
* Improve accuracy of operational and administrative duplex reporting on
devices using CiscoStack.
* All i_type() methods now use standard IANAifType values.
* Report bridge groups (VLANs) in L2::C1900.
* Turn on bulkwalk for C6500. Users with buggy OS versions can turn
it off when creating the object.
* c_ip() now attempts to return only IPV4 addresses, use c_addr() for all
address types.
version 1.04 (07/08/06)
+ Added C1130 and C1240 to L2::Aironet (Ralf Gross)
@@ -43,7 +298,8 @@ version 1.0 (04/07/06) - CVS only. No official release
+ Added ipforwarding status to Info base class (Carlos Vicente)
+ Added STP port state to Bridge class (Alexander Barthel)
+ Added L3 support (arpnip) to Baystack class for routing capable switches
+ Added set_i_duplex_admin() and set_i_speed_admin() to C2900 class (Justin Hunter)
+ Added set_i_duplex_admin() and set_i_speed_admin() to C2900 class
(Justin Hunter)
+ Added set_i_duplex_admin() and set_i_speed_admin() to CiscoStack class
+ CDP added to Aironet class
+ Added Juniper class
@@ -89,7 +345,8 @@ verison 0.9 (11/15/04)
+ Added i_lastchange() per suggestion of Nicolai Petri
+ Added BULKWALK patch by Bradley Baetz - This should
greatly speed up requests on SNMPv2c devices.
+ Added MibDirs option to new() to allow specifying non-system MIB directories.
+ Added MibDirs option to new() to allow specifying non-system MIB
directories.
* Added C3560s to the C3550 class. Thanks to Nicolai.
* Fixed Bug where older Cisco's would append nulls to certain
@@ -144,8 +401,10 @@ version 0.4 (04/29/03)
* Added clear_cache() method
* Added NO_SUCH support for snmpget (TABLE) calls to get SNMP MIB II data
from SNMP Version 1 devices.
* Methods load_all() and all() have changed their return value. Sorry but the API had to change.
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch() to make it more OO happy.
* Methods load_all() and all() have changed their return value. Sorry but
the API had to change.
* New object methods snmp_comm(), snmp_ver(), store(), class(), nosuch()
to make it more OO happy.
* Globals are now cached
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
detected in device_type()
@@ -158,8 +417,8 @@ version 0.4 (04/29/03)
version 0.3 (03/06/03)
* Fixed HP model() warning
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE in _global
and _load_attr
* Added error checking for responses of NOSUCHOBJECT and NOSUCHINSTANCE
in _global and _load_attr
* Added more debugging
* Added info and munging for c_capabilities in SNMP::Info::CD
Thanks to Martin Lorensen <martin /at- lorensen.dk>
@@ -176,7 +435,8 @@ version 0.2 (02/19/03)
* Added Spanning Tree Protocol (STP) methods to SNMP::Info::Bridge
* Removed HP Specific MIBS in SNMP::Info::Layer2 and cleaned up model()
* Added poke for Bay 450 Switches
* Mapped HP Part Numbers to model numbers J4812A => 2512 in SNMP::Info::Layer2::HP
* Mapped HP Part Numbers to model numbers J4812A => 2512 in
SNMP::Info::Layer2::HP
version 0.1 (12/30/02)
* Initial Release

29
DEVELOP Normal file
View File

@@ -0,0 +1,29 @@
SNMP::Info Developer Guidelines
Coding Guidelines:
- tab-width of 4, no tab characters
- keep POD documentation up-to-date
- always update ChangeLog before committing
- always update DeviceMatrix.txt before committing
- check-in required mibs to netdisco-mibs and release new package if needed
Release and Testing Instructions:
- Please see misc/RELEASE in Netdisco
( http://netdisco.cvs.sourceforge.net/viewvc/netdisco/misc/RELEASE?view=markup )
and follow all testing and release guidelines
FAQ:
- Do I have to update the version number and timestamp in modified files before committing?
-> No. These are RCS tags that are automatically updated by CVS when you commit
- Should I add changes at the top of the ChangeLog?
-> Yes. The changelog is created one commit at a time. If there isn't a
section for the current version, then add one at the top and put your
changes after. You can leave the date field for the release empty ().
- What should I change the $VERSION to?
-> If you are the first person to get to a file after a release, update it
to either release++ or "release++ dash cvs".
Example: File is marked 2.01, change it to 2.02-cvs with your new changes.
Example: File is marked 2.02-cvs, no change until packaging for release when the -cvs is removed.
TODO: Is there still an odd/even scheme as introduced by Eric?

View File

@@ -6,58 +6,122 @@
# $Id$
# Allied
device-vendor: Allied Telesyn
#
# Airespace (pre-Cisco)
#
device-vendor: Airespace
cdp:no
arpnip: no
macsuck: yes
portmac: yes
duplex: both
vlan: yes
modules: yes
class: Layer2::Airespace
device-family: Allied Hubs
device-family: Airespace Wireless Controllers
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Device will only communicate with SNMP version configured in the controller.
device: 3500, 4101, 4102
#
# Alcatel-Lucent
#
device-vendor: Alcatel-Lucent
device-family: L3
class: Layer3::AlcatelLucent
device: All
device-family: Timetra
class: Layer3::Timetra
device: All
device-family: AOS
class: Layer3::Aruba
device: All
#
# Allied
#
device-vendor: Allied Telesis
cdp:no
class: Layer1::Allied
ver: 1
arpnip: no
macsuck: no
duplex: no
device-family: Allied Hubs
device: AT-3624T
device-family: AT-8000 Switches
class: Layer2::Allied
ver: 2
macsuck: yes
device: All
#
# Altiga
#
device-vendor: Altiga
class: Layer3::Altiga
note: See Cisco/Altiga
#
# Arista
#
device-vendor: Arista
class: Layer3::Arista
device-family: All
device: All
#
# Aruba
#
device-vendor: Aruba
device-family: Aruba Wireless Controllers
arpnip: no
arpnip: yes
macsuck: yes
portmac: yes
duplex: no
class: Layer2::Aruba
class: Layer3::Aruba
device-family: Aruba Wireless Controllers
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
device: 5000
# Asante
device-vendor: Asante
device: 6000
device-family: Asante Hubs
#
# Asante
#
device-vendor: Asante
class: Layer1::Asante
ver: 1
arpnip: no
macsuck: no
duplex: no
device-family: Asante Hubs
device: 1012
#
# Bay
#
device-vendor: Bay
note: See Nortel
#
# CISCO
#
device-vendor: Cisco
cdp: yes
ver: 2
note: Error in CISCO-TC-MIB. See README for how to patch.
modules: yes
device-family: Aironet
note: IOS and Aironet OS versions
@@ -73,6 +137,12 @@ note: Aironet based device
device: AP350, AP340, CAP350, CAP340, 1200, AP4800
note: Aironet based device
device-family: Altiga
class: Layer3::Altiga
device: VPN3000
note: The Cisco 3000 device can return duplicate interface names, while Netdisco expects unique interface names. To ensure unique device names I append numbers only when an interface name would not be unique without one. Interfaces with unique names keep their ifDescr name.
device-family: 1000
duplex: no
ver: 1
@@ -93,17 +163,9 @@ arpnip: yes
ver: 1
class: Layer3::Cisco
device: 2501
device: 2501,2503,2511,2514
device: 2503
device: AS2509RJ
device: AS2511RJ
device: 2511
device: 2514
device: AS2509RJ,AS2511RJ
device-family: 2600
duplex: link
@@ -111,13 +173,15 @@ arpnip: yes
macsuck: yes
class: Layer3::Cisco
device:2610,2610XM,2611,2620,2620XM,2621
device:2610, 2610XM, 2611, 2620, 2620XM, 2621, 2621XM, 2651XM, 2691
device:2621XM
device-family: 2800
duplex: link
arpnip: yes
macsuck: yes
class: Layer3::Cisco
device:2651XM
device:2691
device: 2811,2821,2851
device-family: 3600
class: Layer3::Cisco
@@ -127,12 +191,17 @@ device: 3620
device: 3640
duplex: no
device-family:7200
class: Layer3::Cisco
device:all
#note: Unconfirmed problem : "When scanning my network with netdisco I would find that my 7200 series router running Cisco IOS Software Release 12.2(1) would reboot when scanning for CDP neighbours, to solve the issue I upgraded to Cisco IOS Software Release Version 12.2(37)"
device-family: 7500
class: Layer3::Cisco
device: 7507
duplex: no
note: !Duplex settings are falsely reported in older IOS versions
note: !Duplex settings are falsely reported in ancient IOS versions
device-family: AS5000
duplex: no
@@ -151,11 +220,7 @@ duplex: both
vlan: write
class: Layer2::C1900
device: wsc1900c
device-family: Catalyst 1900
device: wsc1900
device-family: Catalyst 1900
device: wsc1900c, wsc1900
device-family: Catalyst 2900
note: IOS
@@ -166,18 +231,14 @@ class: Layer2::C2900
portmac: yes
note: !Pre IOS 11.2 (8) SA3 - PortMAC shows up in CAM table.
device: 2912MfXL, 2924CXL, 2924CXLv
device: 2908xl
note: !Pre IOS 11.2 (8.6) some features (duplex...) aren't present.
device: 2912MfXL
device: 2924MXL
ver: 1
device: 2924CXL
device: 2924CXLv
device-family: Catalyst 2940
note: IOS
macsuck: vlan
@@ -216,11 +277,7 @@ note: L2 only IOS devices - Just like Catalyst 2900 series from SNMP
note: IOS Version 12.0(5)XP is buggy and doesn't do VLAN Community indexing correctly.
class: Layer2::C2900
device: 3508GXL
device: 3524XL
device: 3548XL
device: 3508GXL, 3524XL, 3548XL
device-family: Catalyst 3550
macsuck: vlan
@@ -236,11 +293,9 @@ device: 3550-12T
device: 3400 w/ MetroBase Image
device: 3550
device: 3550, 3560, 3550-24, 3550-48
note: L2/L3 Switch
arpnip: yes
device: 3550-24, 3550-48
macsuck: vlan
device-family: Catalyst 3750
@@ -248,19 +303,21 @@ class: Layer3::C6500
device: 3750
device-family: Catalyst Blade Switch 3xxx
macsuck: vlan
class: Layer3::C6500
note: Cisco Blade switches for Dell, FSC, HP and IBM blade system chassis. Limited testing done.
device-family: Catalyst 4000
duplex: write
macsuck: vlan
vlan: write
class: Layer2::Catalyst
note: Comes in IOS and CatOS versions like the 6k series.
note: CatOS versions like L2::Catalyst just fine.
note: !Reported problems with SNMP taking up all the CPU. Requests take significantly longer.
note: !Reported problems with SNMP taking up all the CPU on older SW. Requests take significantly longer.
note: !IOS Version 12.1.8a reported not to respond to BRIDGE-MIB calls.
device: wsc4003, wsc4006
device: wsc4503, wsc4506
device: wsc4003, wsc4006, wsc4503, wsc4506
device: wsc4912g
note: Dedicated 12 port gig-e switch
@@ -277,30 +334,19 @@ class: Layer3::C4000
note: !Has serious slowdown/timeout problems with SNMP
note: !IOS Software Release 12.2(20)EW or higher required for duplex support
device-family: Catalyst 5000
duplex: write
vlan: write
class: Layer2::Catalyst
note: Port info in CISCO-STACK-MIB
device: wsc2926
note: !Can give false information over SNMP at times.
device: wsc2948g
device: wsc2980g
note: !Macsuck not working?
device: wsc2948g, wsc2980g, wsc5500, wsc5505, wsc5509
device: wsc5000
note: !Has nasty tendency to not give you all SNMP data ,flaky for some older Catalyst versions.
device: wsc5505
device: wsc5509
device: wsc5500
device: wsx5302
arpnip: yes
class: Layer3
@@ -317,17 +363,9 @@ note: Native Mode (IOS) versions seem to have SNMP problems with L2 data.
note: !Problem with IOS 12.2.17d-SXB ... upgrade to -SXB1 or higher.
note: !Sup720-3B and NativeIOS 12.2 (17d)SXB10 may report 127.0.0.51 as CDP neighbor address.
device: 6503
macsuck:no
note: !Macsuck failing even under vlan mode
device: 6503, 6509, sp72033, s3223, s32p3, s222
note: Native mode (IOS) reports L2+L3
device: 6509
duplex: link
macsuck:no
note: Native mode (IOS) reports L2+L3
note: !Macsuck failing even under vlan mode
device: wsc6509
duplex: write
class: Layer2::Catalyst
@@ -351,23 +389,117 @@ duplex: no
device: VG200
# Extreme
device-vendor: Extreme Networks
device-family: Wireless Controllers
class: Layer2::Airespace
cdp:no
arpnip: no
macsuck: yes
portmac: yes
duplex: both
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
note: Device will only communicate with SNMP version configured in the controller.
device-family: Alpine and Summit
device: 2006, 4112, 4124, 4136, 4402, 4404
device-family: Firewall
class: Layer3::Cisco
device: PIX Security Appliance
device: Adaptive Security Applicance
device: Firewall Services Modules (FWSM)
note: !Arpnip only available for 4.x software releases.
class: Layer3::CiscoFWSM
arpnip: yes
#
# Cyclades
#
device-vendor: Cyclades
class: Layer1::Cyclades
device-family: All
device: All
#
# Dell
#
device-vendor: Dell
arpnip: no
macsuck: yes
duplex: both
vlan: yes
cdp: no
modules: yes
class: Layer3::Dell
device-family: Dell PowerConnect 6000 Series
arpnip: yes
device: 6024F, 6224, 6248
device-family: Dell PowerConnect 5000 Series
device: 5324
device-family: Dell PowerConnect 3000 Series
device: 3348, 3448P, 3424, 3424P
device-family: IBM BladeCenter Ethernet Switch
device: All
device-family: Linksys 2048
device: All
#
# Enterasys
#
device-vendor: Enterasys Networks
arpnip: yes
macsuck: yes
duplex: both
vlan: yes
cdp: yes
modules: yes
class: Layer3::Enterasys
device-family: SuperStack C-Series
device: C3G124-24, C3G124-48, C2G124-24, C2G124-48
device-family: Matrix
device: Matrix N-Series DFE
#
# Extreme
#
device-vendor: Extreme Networks
arpnip: yes
macsuck: yes
duplex: both
vlan: yes
cdp: no
modules: yes
class: Layer3::Extreme
device-family: Alpine and Summit
device: Alpine 3808
device: Summit 7i, 48si
#
# FreeBSD
#
device-vendor: FreeBSD
device-famly: Pf
class: Layer3::Pf
arpnip: yes
cdp: no
note: LLDP support might be available. See note in Layer3::Pf
#
# Foundry
#
device-vendor: Foundry Networks
note: CDP --> FDP.
vlan: yes
modules: no
device-family: FastIron
class: Layer3::Foundry
@@ -378,7 +510,7 @@ device: FastIron 4802
device-family: EdgeIron
ver: 2
class: Layer2::Foundry
class: Layer3::Foundry
cdp: yes
duplex: yes
macsuck: yes
@@ -393,63 +525,138 @@ note: FDP enabled.
duplex: yes
macsuck: yes
arpnip: yes
device:FWSX424
device:SI400 Router
device: FWSX424
device: ServerIronGT
device: FLS624, FLS648
#
# HP
#
device-vendor: HP
class: Layer2::HP
note: HP Devices are very widely supported.
ver: 2
modules: yes
device-family: HP ProCurve
device-family: HP ProCurve (old)
class: Layer2::HP4000
duplex: both
macsuck: yes
arpnip: no
cdp: yes
vlan: yes
note: CDP only available with newer ROM versions.
vlan: write
note: devices in this class only have CDP support
note: VLAN info in HP-VLAN MIB
device: 2512
ver: 1
device: 2524
ver: 1
device: 4000
device: 1600M,2400,2424M,4000,8000
duplex: link
note: duplex issues?
device: 4104GL
duplex: link
device: 4108GL,8000,2626,2650,8000
device-family: HP ProCurve (recent)
class: Layer2::HP
duplex: both
macsuck: yes
arpnip: no
cdp: yes
vlan: write
note: old firmware versions only have CDP support, more recent have LLDP
note: VLAN info in Q-BRIDGE-MIB
device: 2312,2324,2512,2524
ver: 1
device: 2510,2600,2610,2800,2810,2900,2910al
device: 3124,3324XL,3400cl,3500,3500yl
device: 4100GL,4200vl,5300XL,5400yy,5400zl
device: 6108,6200yl,6400cl,6410cl,6600,6600ml,8200zl
#
# Juniper
#
device-vendor: Juniper
arpnip: yes
device-family: M-series router
class: Layer3::Juniper
device: All
device-family: NetScreen
class: Layer3::Netscreen
device: All
#
# Linksys
#
device-vendor: Linksys
device-family: Generic L2 Device
class: Layer2
device: Some
device-family: Generic L3 Device
class: Layer3
device: Some
device-family: 2048
class: Layer3::Dell
device: All
#
# Microsoft
#
device-vendor: Microsoft
device-family: Windows
class: Layer3::Microsoft
device: Windows Router
#
# Netgear
#
device-vendor: NetGear
device-family: Switches
class: Layer2::Netgear
device: All
#
# NetScreen
#
device-vendor: NetScreen
note: See Juniper
#
# Net-SNMP
#
device-vendor: Net-SNMP
class: Layer3
ver: 2
device-family: Linux
note: net-snmp 4.x agent and 5.x agent.
device: Linux routers
device-family: BSD
device: BSD routers
# Juniper
device-vendor: Juniper
#
# Kentrox
#
device-vendor: Kentrox
note: MIB not yet shipped
device-family: M-series router
arpnip: yes
device: Kentrox DataSMART DSU/CSU
#
# NORTEL
#
device-vendor: Nortel
note: CDP --> SONMP.
macsuck: yes
cdp: proprietary
note: SONMP Discovery Protocol Supported
device-family: BayStack Hub
macsuck: yes
duplex: both
cdp: proprietary
ver: 1
modules: yes
class: Layer1::Bayhub
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
@@ -459,112 +666,87 @@ device: 102
device: System 5000
device-family: Ethernet Switch/Baystack Switch
arpnip: no
macsuck: yes
duplex: both
vlan: yes
cdp: proprietary
vlan: write
modules: yes
class: Layer2::Baystack
device: 303,304
device: 350
device: 380
device: 410
device: 420,425
device: 303, 304, 350, 380, 410, 420, 425, 460, 470
device: 450
note: !Some versions > 4.X in stacked configuration have SNMP timeout issues.
note: Labels full duplex as 20Mbit connection.
device: 460,470
device: BPS
device: Business Policy Switch (BPS)
device-family: Ethernet Routing Switch/Baystack Switch
arpnip: yes
macsuck: yes
duplex: both
vlan: yes
cdp: proprietary
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 3510
device: 2526,2550
device: 4524,4526,4548,4550
device: 5510,5520,5530
device-family: Business Ethernet Switch
arpnip: yes
duplex: write
vlan: write
modules: yes
class: Layer2::Baystack
device: 50,110,120,210,220,1010,1020
device-family: Centillion
macsuck: yes
duplex: both
cdp: proprietary
vlan: yes
class: Layer2::Centillion
note: !Must be on version 4.x or 5.x (VLAN based) software.
device: 5000BH
device: 5005BH
device: C100
device: C50
device: 5000BH, 5005BH
device: C50,C100
device-family: AP222x
macsuck: yes
duplex: both
cdp: proprietary
modules: no
class: Layer2::NAP222x
note: !Upgrade to version 1.3 or higher.
note: Sends out topology packets if enabled but does not build neighbor table.
device: AP-2220
device: AP-2221
device: AP-2220, AP-2221
device-family: Alteon AD
arpnip: yes
macsuck: yes
duplex: both
cdp: no
vlan: yes
modules: no
class: Layer3::AlteonAD
note: !Some versions have issues with continuous SNMP polling. Upgrade to 10.0.30.7 or higher.
device: AD2
device: AD2,AD3,AD4
device: AD3
device: AD4
device: 180
device: 183
device: 184
device: 180,183,184
device-family: Multiprotocol Router/BayRS
arpnip: yes
macsuck: yes
portmac: yes
duplex: both
cdp: no
vlan: yes
modules: yes
class: Layer3::BayRS
device: AN
device: AN,ARN,ASN,BLN,BCN
device: ARN
device: ASN
device: BLN
device: Passport 2430
device: Passport 5430
device: 2430,5430
device-family: VPN Router/Contivity
arpnip: yes
@@ -572,13 +754,14 @@ macsuck: no
portmac: yes
duplex: no
cdp: no
modules: yes
class: Layer3::Contivity
device: 100,400,600
device: 1000,1010,1050
device: 1500,1600,1700,1740
device: 1500,1600,1700,1740,1750
device: 2500,2600,2700
@@ -588,32 +771,40 @@ device-family: Ethernet Routing Switch/Passport/Accelar LAN
arpnip: yes
macsuck: yes
portmac: yes
duplex: both
duplex: write
cdp: proprietary
vlan: yes
vlan: write
modules: yes
class: Layer3::Passport
note: !8600 Code versions < 3.2 vlan based mac-suck and are unsupported. Upgrade code.
note: !8600 3.2 code versions < 3.2.2.2 have Bridge MIB loop. Upgrade code.
device: 8603,8606,8610
device: 8610co
device: 8106,8110
device: 8603,8606,8610, 8610co, 8106, 8110
device: 1050,1100,1150,1200
device-family: Ethernet Routing Switch/Passport 1600
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
arpnip: yes
macsuck: yes
portmac: yes
duplex: both
cdp: proprietary
vlan: yes
vlan: write
class: Layer3::N1600
device: 1612,1624,1648
device-family: Ethernet Routing Switch/Passport 1600 (Software >= 2.1)
arpnip: yes
macsuck: yes
portmac: yes
duplex: write
cdp: proprietary
vlan: write
class: Layer3::Passport
device: 1612,1624,1648
device-family: Synoptics
macsuck: yes
duplex: both
@@ -633,33 +824,52 @@ macsuck: yes
portmac: yes
duplex: both
cdp: proprietary
modules: yes
class: Layer2::N2270
note: Uses proprietary MIBs to provide MAC to port mapping. APs appear as switch ports.
device: 2270
#
# Proxim
#
device-vendor: Proxim
device-family: Orinoco
macsuck: yes
duplex: no
cdp: no
class: Layer2::Orinoco
device: AP-1000
device-family: Orinoco
device: AP-2000
device: AP-4000
device: AP-1000,AP-2000,AP-4000
device: WavePOINT-II
#
# SonicWALL
#
device-vendor: SonicWALL
class: Layer3::SonicWALL
#
# Sun
#
device-vendor: Sun
class: Layer3::Sun
device-family: Sun routers
device: Sun routers
#
# Synoptics
#
device-vendor: Synoptics
note: See Nortel
#
# Zyxel
#
device-vendor: Zyxel
class: Layer2::ZyXEL_DSLAM
note: Doesn't report sysServices (layers)

2657
Info.pm

File diff suppressed because it is too large Load Diff

172
Info/AdslLine.pm Normal file
View File

@@ -0,0 +1,172 @@
# SNMP::Info::AdslLine
#
# Copyright (c) 2009 Alexander Hartmaier
# 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::AdslLine;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::AdslLine::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::AdslLine::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
%GLOBALS = ();
%FUNCS = (
# ADSL-LINE-MIB::adslAtucChanTable
'adsl_atuc_interleave_delay' => 'adslAtucChanInterleaveDelay',
'adsl_atuc_curr_tx_rate' => 'adslAtucChanCurrTxRate',
'adsl_atuc_prev_tx_rate' => 'adslAtucChanPrevTxRate',
'adsl_atuc_crc_block_len' => 'adslAtucChanCrcBlockLength',
# ADSL-LINE-MIB::adslAturChanTable
'adsl_atur_interleave_delay' => 'adslAturChanInterleaveDelay',
'adsl_atur_curr_tx_rate' => 'adslAturChanCurrTxRate',
'adsl_atur_prev_tx_rate' => 'adslAturChanPrevTxRate',
'adsl_atur_crc_block_len' => 'adslAturChanCrcBlockLength',
);
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::AdslLine - SNMP Interface to the ADSL-LINE-MIB
=head1 AUTHOR
Alexander Hartmaier
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
information about the adsl interfaces of a device.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
none.
=head2 Required MIBs
=over
=item F<ADSL-LINE-MIB>
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over
=item none
=back
=head1 TABLE METHODS
=head2 ATUC channel table (C<adslAtucChanTable>)
This table provides one row for each ATUC channel.
ADSL channel interfaces are those ifEntries where ifType
is equal to adslInterleave(124) or adslFast(125).
=over
=item $info->adsl_atuc_interleave_delay()
(C<adslAtucChanInterleaveDelay>)
=item $info->adsl_atuc_curr_tx_rate()
(C<adslAtucChanCurrTxRate>)
=item $info->adsl_atuc_prev_tx_rate()
(C<adslAtucChanPrevTxRate>)
=item $info->adsl_atuc_crc_block_len()
(C<adslAtucChanCrcBlockLength>)
=back
=head2 ATUR channel table (C<adslAturChanTable>)
This table provides one row for each ATUR channel.
ADSL channel interfaces are those ifEntries where ifType
is equal to adslInterleave(124) or adslFast(125).
=over
=item $info->adsl_atur_interleave_delay()
(C<adslAturChanInterleaveDelay>)
=item $info->adsl_atur_curr_tx_rate()
(C<adslAturChanCurrTxRate>)
=item $info->adsl_atur_prev_tx_rate()
(C<adslAturChanPrevTxRate>)
=item $info->adsl_atur_crc_block_len()
(C<adslAturChanCrcBlockLength>)
=back
=cut

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,151 +1,171 @@
# SNMP::Info::CDP
# Max Baker
# $Id$
#
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
# All rights reserved.
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
# All rights reserved.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::CDP;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CDP::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
$VERSION = '2.08';
# Five data structures required by SNMP::Info
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
%MIBS = ( 'CISCO-CDP-MIB' => 'cdpGlobalRun' );
# Notice we dont inherit the default GLOBALS and FUNCS
# only the default MUNGE.
%GLOBALS = (
'cdp_run' => 'cdpGlobalRun',
'cdp_interval' => 'cdpGlobalMessageInterval',
'cdp_holdtime' => 'cdpGlobalHoldTime',
'cdp_id' => 'cdpGlobalDeviceId',
);
'cdp_run' => 'cdpGlobalRun',
'cdp_interval' => 'cdpGlobalMessageInterval',
'cdp_holdtime' => 'cdpGlobalHoldTime',
'cdp_id' => 'cdpGlobalDeviceId',
);
%FUNCS = (
'c_index' => 'cdpCacheIfIndex',
'c_proto' => 'cdpCacheAddressType',
'c_ip' => 'cdpCacheAddress',
'c_ver' => 'cdpCacheVersion',
'c_id' => 'cdpCacheDeviceId',
'c_port' => 'cdpCacheDevicePort',
'c_platform' => 'cdpCachePlatform',
'c_capabilities' => 'cdpCacheCapabilities',
'c_domain' => 'cdpCacheVTPMgmtDomain',
'c_vlan' => 'cdpCacheNativeVLAN',
'c_duplex' => 'cdpCacheDuplex'
);
%FUNCS = (
'c_index' => 'cdpCacheIfIndex',
'c_proto' => 'cdpCacheAddressType',
'c_addr' => 'cdpCacheAddress',
'c_ver' => 'cdpCacheVersion',
'c_id' => 'cdpCacheDeviceId',
'c_port' => 'cdpCacheDevicePort',
'c_platform' => 'cdpCachePlatform',
'c_capabilities' => 'cdpCacheCapabilities',
'c_domain' => 'cdpCacheVTPMgmtDomain',
'c_vlan' => 'cdpCacheNativeVLAN',
'c_duplex' => 'cdpCacheDuplex',
'c_power' => 'cdpCachePowerConsumption',
'c_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
'c_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
'c_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
'c_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
);
%MUNGE = (
'c_capabilities' => \&munge_caps,
'c_platform' => \&munge_null,
'c_domain' => \&munge_null,
'c_port' => \&munge_null,
'c_id' => \&munge_null,
'c_ver' => \&munge_null,
'c_ip' => \&SNMP::Info::munge_ip
);
'c_capabilities' => \&SNMP::Info::munge_caps,
'c_platform' => \&SNMP::Info::munge_null,
'c_domain' => \&SNMP::Info::munge_null,
'c_port' => \&SNMP::Info::munge_null,
'c_id' => \&SNMP::Info::munge_null,
'c_ver' => \&SNMP::Info::munge_null,
'c_ip' => \&SNMP::Info::munge_ip,
'c_power' => \&munge_power,
# munge_null() - removes nulls (\0)
sub munge_null {
my $text = shift || return;
$text =~ s/\0//g;
return $text;
);
sub munge_power {
my $power = shift;
my $decimal = substr( $power, -3 );
$power =~ s/$decimal$/\.$decimal/;
return $power;
}
sub munge_caps {
my $caps = shift;
return undef unless defined $caps;
my $bits = substr(unpack("B*",$caps),-7);
return $bits;
}
sub hasCDP {
my $cdp = shift;
my $ver = $cdp->{_version};
# SNMP v1 clients dont have the globals
if (defined $ver and $ver == 1){
if ( defined $ver and $ver == 1 ) {
my $c_ip = $cdp->c_ip();
# See if anything in cdp cache, if so we have cdp
return 1 if (defined $c_ip and scalar(keys %$c_ip)) ;
return undef;
return 1 if ( defined $c_ip and scalar( keys %$c_ip ) );
return;
}
return $cdp->cdp_run();
}
sub c_if {
my $cdp = shift;
my $cdp = shift;
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
my $c_index = $cdp->c_index();
my $c_index = $cdp->c_index();
return $c_index if defined $c_index;
# Nope, didn't think so. Now we fake it.
my $c_ip = $cdp->c_ip();
unless (defined $c_ip){
$cdp->error_throw("SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()");
return undef;
unless ( defined $c_ip ) {
$cdp->error_throw(
"SNMP::Info::CDP:c_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
);
return;
}
my %c_if;
foreach my $key (keys %$c_ip){
next unless defined $key;
my $iid = $key;
# Truncate .1 from cdp cache entry
$iid =~ s/\.\d+$//;
$c_if{$key} = $iid;
foreach my $key ( keys %$c_ip ) {
next unless defined $key;
my $iid = $key;
# Truncate .1 from cdp cache entry
$iid =~ s/\.\d+$//;
$c_if{$key} = $iid;
}
return \%c_if;
}
sub c_ip {
my $cdp = shift;
my $partial = shift;
my $c_addr = $cdp->c_addr($partial) || {};
my $c_proto = $cdp->c_proto($partial) || {};
my %c_ip;
foreach my $key ( keys %$c_addr ) {
my $addr = $c_addr->{$key};
my $proto = $c_proto->{$key};
next unless defined $addr;
next if ( defined $proto and $proto ne 'ip' );
my $ip = join( '.', unpack( 'C4', $addr ) );
$c_ip{$key} = $ip;
}
return \%c_ip;
}
1;
__END__
=head1 NAME
SNMP::Info::CDP - Perl5 Interface to Cisco Discovery Protocol (CDP) using SNMP
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
=head1 AUTHOR
@@ -185,10 +205,12 @@ Max Baker
SNMP::Info::CDP is a subclass of SNMP::Info that provides an object oriented
interface to CDP information through SNMP.
CDP is a Layer 2 protocol that supplies topology information of devices that also speak CDP,
mostly switches and routers. CDP is implemented in Cisco and some HP devices.
CDP is a Layer 2 protocol that supplies topology information of devices that
also speak CDP, mostly switches and routers. CDP is implemented in Cisco and
some HP devices.
Create or use a device subclass that inherits this class. Do not use directly.
Create or use a device subclass that inherits this class. Do not use
directly.
Each device implements a subset of the global and cache entries.
Check the return value to see if that data is held by the device.
@@ -201,7 +223,7 @@ None.
=over
=item CISCO-CDP-MIB
=item F<CISCO-CDP-MIB>
=back
@@ -221,30 +243,31 @@ Accounts for SNMP version 1 devices which may have CDP but not cdp_run()
=item $cdp->cdp_run()
Is CDP enabled on this device? Note that a lot of Cisco devices that implement
CDP don't implement this value. @#%$!
Is CDP enabled on this device? Note that a lot of Cisco devices that
implement CDP don't implement this value. @#%$!
(B<cdpGlobalRun>)
(C<cdpGlobalRun>)
=item $cdp->cdp_interval()
Interval in seconds at which CDP messages are generated.
(B<cdpGlobalMessageInterval>)
(C<cdpGlobalMessageInterval>)
=item $cdp->cdp_holdtime()
Time in seconds that CDP messages are kept.
(B<cdpGlobalHoldTime>)
(C<cdpGlobalHoldTime>)
=item $cdp->cdp_id()
Returns CDP device ID.
This is the device id broadcast via CDP to other devices, and is what is retrieved from remote devices with $cdp->id().
This is the device id broadcast via CDP to other devices, and is what is
retrieved from remote devices with $cdp->id().
(B<cdpGlobalDeviceId>)
(C<cdpGlobalDeviceId>)
=back
@@ -271,51 +294,59 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
=item (0x40) - Provides level 1 functionality.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
non router ports.
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
=item (0x10) - Sends and receives packets for at least one network layer
protocol. If the device is routing the protocol, this bit should not be set.
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
=item (0x08) - Performs level 2 switching. The difference between this bit
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
device is assumed to be deployed in a physical loop-free topology.
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
would set both this bit and bit 0x02.
=item (0x02) - Performs level 2 transparent bridging.
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
=item (0x01) - Performs level 3 routing for at least one network layer
protocol.
=back
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this
information.
(B<cdpCacheCapabilities>)
(C<cdpCacheCapabilities>)
=item $cdp->c_domain()
Returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
Returns remote VTP Management Domain as defined in
C<CISCO-VTP-MIB::managementDomainName>
(B<cdpCacheVTPMgmtDomain>)
(C<cdpCacheVTPMgmtDomain>)
=item $cdp->c_duplex()
Returns the port duplex status from remote devices.
(B<cdpCacheDuplex>)
(C<cdpCacheDuplex>)
=item $cdp->c_id()
Returns remote device id string
(B<cdpCacheDeviceId>)
(C<cdpCacheDeviceId>)
=item $cdp->c_if()
Returns the mapping to the SNMP Interface Table.
Note that a lot devices don't implement $cdp->c_index(), So if it isn't around,
we fake it.
Note that a lot devices don't implement $cdp->c_index(), So if it isn't
around, we fake it.
In order to map the cdp table entry back to the interfaces() entry, we truncate the last number
off of it :
In order to map the cdp table entry back to the interfaces() entry, we
truncate the last number off of it :
# it exists, yay.
my $c_index = $device->c_index();
@@ -339,47 +370,72 @@ off of it :
Returns the mapping to the SNMP2 Interface table for CDP Cache Entries.
Most devices don't implement this, so you probably want to use $cdp->c_if() instead.
Most devices don't implement this, so you probably want to use $cdp->c_if()
instead.
See c_if() entry.
(B<cdpCacheIfIndex>)
(C<cdpCacheIfIndex>)
=item $cdp->c_ip()
Returns remote IP address
If $cdp->c_proto() is supported, returns remote IPV4 address only. Otherwise
it will return all addresses.
(B<cdpCacheAddress>)
(C<cdpCacheAddress>)
=item $cdp->c_addr()
Returns remote address
(C<cdpCacheAddress>)
=item $cdp->c_platform()
Returns remote platform id
(B<cdpCachePlatform>)
(C<cdpCachePlatform>)
=item $cdp->c_port()
Returns remote port ID
(B<cdpDevicePort>)
(C<cdpDevicePort>)
=item $cdp->c_proto()
Returns remote address type received. Usually IP.
(B<cdpCacheAddressType>)
(C<cdpCacheAddressType>)
=item $cdp->c_ver()
Returns remote hardware version
(B<cdpCacheVersion>)
(C<cdpCacheVersion>)
=item $cdp->c_vlan()
Returns the remote interface native VLAN.
(B<cdpCacheNativeVLAN>)
(C<cdpCacheNativeVLAN>)
=item $cdp->c_power()
Returns the amount of power consumed by remote device in milliwatts munged
for decimal placement.
(C<cdpCachePowerConsumption>)
=back
=head1 Data Munging Callback Subroutines
=over
=item $cdp->munge_power()
Inserts a decimal at the proper location.
=back

473
Info/CiscoConfig.pm Normal file
View File

@@ -0,0 +1,473 @@
# SNMP::Info::CiscoConfig
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::CiscoConfig;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoConfig::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoConfig::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
'CISCO-FLASH-MIB' => 'ciscoFlashCopyTable',
'OLD-CISCO-SYS-MIB' => 'writeMem',
);
%GLOBALS = (
# OLD-CISCO-SYS-MIB
'old_write_mem' => 'writeMem',
'old_write_net' => 'writeNet',
);
%FUNCS = (
# CISCO-COPY-CONFIG-MIB::ccCopyTable
'config_protocol' => 'ccCopyProtocol',
'config_source_type' => 'ccCopySourceFileType',
'config_dest_type' => 'ccCopyDestFileType',
'config_server_addr' => 'ccCopyServerAddress',
'config_filename' => 'ccCopyFileName',
'config_username' => 'ccCopyUserName',
'config_password' => 'ccCopyUserPassword',
'config_notify_complete' => 'ccCopyNotificationOnCompletion',
'config_copy_state' => 'ccCopyState',
'config_copy_start_time' => 'ccCopyTimeStarted',
'config_copy_complete_time' => 'ccCopyTimeCompleted',
'config_fail_cause' => 'ccCopyFailCause',
'config_row_status' => 'ccCopyEntryRowStatus',
# CISCO-FLASH-MIB::ciscoFlashCopyTable
'flash_copy_cmd' => 'ciscoFlashCopyCommand',
'flash_copy_protocol' => 'ciscoFlashCopyProtocol',
'flash_copy_address' => 'ciscoFlashCopyServerAddress',
'flash_copy_source' => 'ciscoFlashCopySourceName',
'flash_copy_dest' => 'ciscoFlashCopyDestinationName',
'flash_copy_row_status' => 'ciscoFlashCopyEntryStatus',
);
%MUNGE = ();
sub copy_run_tftp {
my $ciscoconfig = shift;
my ( $tftphost, $tftpfile ) = @_;
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
print "Saving running config to $tftphost as $tftpfile\n"
if $ciscoconfig->debug();
#Try new method first fall back to old method
if ( $ciscoconfig->set_config_protocol( 1, $rand ) ) {
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
#Check each set, delete created row if any fail
unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
$ciscoconfig->error_throw("Setting source type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Setting source type failed and failed to delete row $rand"
);
}
return;
}
unless ( $ciscoconfig->set_config_dest_type( 1, $rand ) ) {
$ciscoconfig->error_throw("Setting destination type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Setting dest type failed and failed to delete row $rand"
);
}
return;
}
unless ( $ciscoconfig->set_config_server_addr( $tftphost, $rand ) ) {
$ciscoconfig->error_throw("Setting tftp server failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Setting tftp server failed and failed to delete row $rand"
);
}
return;
}
unless ( $ciscoconfig->set_config_filename( $tftpfile, $rand ) ) {
$ciscoconfig->error_throw("Setting file name failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Setting file name failed and failed to delete row $rand"
);
}
return;
}
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
$ciscoconfig->error_throw("Initiating transfer failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Initiating transfer failed and failed to delete row $rand"
);
}
return;
}
my $status = 0;
my $timer = 0;
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
# option later if needed
my $timeout = 300;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
$timer += 1;
if ( $timer >= $timeout ) {
$status = 'failed';
last;
}
sleep 1;
}
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
}
if ( $status eq 'successful' ) {
print "Save operation successful\n" if $ciscoconfig->debug();
return 1;
}
if ( $status eq 'failed' ) {
$ciscoconfig->error_throw("Save operation failed");
return;
}
}
print "Using old method\n" if $ciscoconfig->debug();
unless ( $ciscoconfig->set_old_write_net( $tftpfile, $tftphost ) ) {
$ciscoconfig->error_throw("Save operation failed");
return;
}
return 1;
}
sub copy_run_start {
my $ciscoconfig = shift;
srand( time() ^ ( $$ + ( $$ << 15 ) ) );
my $rand = int( rand( 1 << 24 ) );
print "Saving running config to memory\n" if $ciscoconfig->debug();
if ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
#Check each set, delete created row if any fail
unless ( $ciscoconfig->set_config_dest_type( 3, $rand ) ) {
$ciscoconfig->error_throw("Setting dest type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Setting dest type failed and failed to delete row $rand"
);
}
return;
}
unless ( $ciscoconfig->set_config_row_status( 1, $rand ) ) {
$ciscoconfig->error_throw("Initiating save failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
$ciscoconfig->error_throw(
"Initiating save failed and failed to delete row $rand");
}
return;
}
my $status = 0;
my $timer = 0;
# Hard-coded timeout of approximately 5 minutes, we can wrap this in an
# option later if needed
my $timeout = 300;
while ( $status !~ /successful|failed/ ) {
my $t = $ciscoconfig->config_copy_state($rand);
$status = $t->{$rand};
last if $status =~ /successful|failed/;
$timer += 1;
if ( $timer >= $timeout ) {
$status = 'failed';
last;
}
sleep 1;
}
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
print "Failed deleting row, iid $rand\n" if $ciscoconfig->debug();
}
if ( $status eq 'successful' ) {
print "Save operation successful\n" if $ciscoconfig->debug();
return 1;
}
if ( $status eq 'failed' ) {
$ciscoconfig->error_throw("Save operation failed");
return;
}
}
print "Using old method\n" if $ciscoconfig->debug();
unless ( $ciscoconfig->set_old_write_mem(1) ) {
$ciscoconfig->error_throw("Save operation failed");
return;
}
return 1;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoConfig - SNMP Interface to Cisco Configuration Files
=head1 AUTHOR
Justin Hunter, Eric Miller
=head1 SYNOPSIS
my $ciscoconfig = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ciscoconfig->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::CiscoConfig is a subclass of SNMP::Info that provides an interface
to F<CISCO-CONFIG-COPY-MIB>, F<CISCO-FLASH-MIB>, and F<OLD-CISCO-SYS-MIB>.
These MIBs facilitate the writing of configuration files.
Use or create a subclass of SNMP::Info that inherits this one.
Do not use directly.
=head2 Inherited Classes
=over
None.
=back
=head2 Required MIBs
=over
=item F<CISCO-CONFIG-COPY-MIB>
=item F<CISCO-FLASH-MIB>
=item F<OLD-CISCO-SYS-MIB>
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $ciscoconfig->old_write_mem()
(C<writeMem>)
=item $ciscoconfig->old_write_net()
(C<writeNet>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=back
=head2 Config Copy Request Table (C<ccCopyTable>)
=over
=item $ciscoconfig->config_protocol()
(C<ccCopyProtocol>)
=item $ciscoconfig->config_source_type()
(C<ccCopySourceFileType>)
=item $ciscoconfig->config_dest_type()
(C<ccCopyDestFileType>)
=item $ciscoconfig->config_server_addr()
(C<ccCopyServerAddress>)
=item $ciscoconfig->config_filename()
(C<ccCopyFileName>)
=item $ciscoconfig->config_username()
(C<ccCopyUserName>)
=item $ciscoconfig->config_password()
(C<ccCopyUserPassword>)
=item $ciscoconfig->config_notify_complete()
(C<ccCopyNotificationOnCompletion>)
=item $ciscoconfig->config_copy_state()
(C<ccCopyState>)
=item $ciscoconfig->config_copy_start_time()
(C<ccCopyTimeStarted>)
=item $ciscoconfig->config_copy_complete_time()
(C<ccCopyTimeCompleted>)
=item $ciscoconfig->config_fail_cause()
(C<ccCopyFailCause>)
=item $ciscoconfig->config_row_status()
(C<ccCopyEntryRowStatus>)
=back
=head2 Flash Copy Table (C<ciscoFlashCopyTable>)
Table of Flash copy operation entries.
=over
=item $ciscoconfig->flash_copy_cmd()
(C<ciscoFlashCopyCommand>)
=item $ciscoconfig->flash_copy_protocol()
(C<ciscoFlashCopyProtocol>)
=item $ciscoconfig->flash_copy_address()
(C<ciscoFlashCopyServerAddress>)
=item $ciscoconfig->flash_copy_source()
(C<ciscoFlashCopySourceName>)
=item $ciscoconfig->flash_copy_dest()
(C<ciscoFlashCopyDestinationName>)
=item $ciscoconfig->flash_copy_row_status()
(C<ciscoFlashCopyEntryStatus>)
=back
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=over
=item $ciscoconfig->copy_run_tftp (tftpserver, tftpfilename )
Store the running configuration on a TFTP server. Equivalent to the CLI
commands "copy running-config tftp" or "write net".
This method attempts to use newer "copy running-config tftp" procedure first
and then the older "write net" procedure if that fails. The newer procedure
is supported Cisco devices with the F<CISCO-CONFIG-COPY-MIB> available, Cisco
IOS software release 12.0 or on some devices as early as release 11.2P. The
older procedure has been depreciated by Cisco and is utilized only to support
devices running older code revisions.
Example:
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
or die Couldn't save config. ",$ciscoconfig->error(1);
=item $ciscoconfig->copy_run_start()
Copy the running configuration to the start up configuration. Equivalent to
the CLI command C<"copy running-config startup-config"> or C<"write mem">.
This method attempts to use newer C<"copy running-config startup-config">
procedure first and then the older C<"write mem"> procedure if that fails.
The newer procedure is supported Cisco devices with the
F<CISCO-CONFIG-COPY-MIB> available, Cisco IOS software release 12.0 or on
some devices as early as release 11.2P. The older procedure has been
depreciated by Cisco and is utilized only to support devices running older
code revisions.
Example:
$ciscoconfig->copy_run_start()
or die "Couldn't save config. ",$ciscoconfig->error(1);
=back
=cut

View File

@@ -1,62 +1,59 @@
package SNMP::Info::CiscoImage;
#$Id$
# Copyright (c) 2005 Matt Tuttle
# $Id$
#
# Redistribution and use in source and binary forms, with or without
# Copyright (c) 2005 Matt Tuttle
# 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
# * 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.
#
# 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::CiscoImage;
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
$VERSION = '1.04';
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
%MIBS = (
'CISCO-IMAGE-MIB' => 'ciscoImageString',
);
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%GLOBALS = (
);
$VERSION = '2.08';
%FUNCS = (
'ci_images' => 'ciscoImageString',
);
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
%MUNGE = (
);
%GLOBALS = ();
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::CiscoImage - Perl5 Interface to image strings for Cisco Devices
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
=head1 AUTHOR
@@ -64,36 +61,36 @@ Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $ci = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ci->class();
my $class = $ci->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
SNMP::Info::CiscoImage is a subclass of SNMP::Info that provides access to
image strings embedded in an image running on Cisco Devices.
image strings embedded in an image running on Cisco Devices.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
none.
None.
=head2 Required MIBs
=over
=item CISCO-IMAGE-MIB
=item F<CISCO-IMAGE-MIB>
=back
@@ -111,7 +108,7 @@ None.
Returns the table of image strings.
B<ciscoImageString>
C<ciscoImageString>
=back

388
Info/CiscoPortSecurity.pm Normal file
View File

@@ -0,0 +1,388 @@
# SNMP::Info::CiscoPortSecurity
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::CiscoPortSecurity;
use strict;
use Exporter;
@SNMP::Info::CiscoPortSecurity::ISA = qw/Exporter/;
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
$VERSION = '2.08';
%MIBS = (
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
'CISCO-PAE-MIB' => 'ciscoPaeMIB',
'IEEE8021-PAE-MIB' => 'dot1xAuthLastEapolFrameSource',
);
%GLOBALS = (
# CISCO-PORT-SECURITY-MIB
'cps_clear' => 'cpsGlobalClearSecureMacAddresses',
'cps_notify' => 'cpsGlobalSNMPNotifControl',
'cps_rate' => 'cpsGlobalSNMPNotifRate',
'cps_enable' => 'cpsGlobalPortSecurityEnable',
'cps_mac_count' => 'cpsGlobalTotalSecureAddress',
'cps_mac_max' => 'cpsGlobalMaxSecureAddress',
);
%FUNCS = (
# CISCO-PORT-SECURITY-MIB::cpsIfConfigTable
'cps_i_limit_val' => 'cpsIfInvalidSrcRateLimitValue',
'cps_i_limit' => 'cpsIfInvalidSrcRateLimitEnable',
'cps_i_sticky' => 'cpsIfStickyEnable',
'cps_i_clear_type' => 'cpsIfClearSecureMacAddresses',
'cps_i_shutdown' => 'cpsIfShutdownTimeout',
'cps_i_flood' => 'cpsIfUnicastFloodingEnable',
'cps_i_clear' => 'cpsIfClearSecureAddresses',
'cps_i_mac' => 'cpsIfSecureLastMacAddress',
'cps_i_count' => 'cpsIfViolationCount',
'cps_i_action' => 'cpsIfViolationAction',
'cps_i_mac_static' => 'cpsIfStaticMacAddrAgingEnable',
'cps_i_mac_type' => 'cpsIfSecureMacAddrAgingType',
'cps_i_mac_age' => 'cpsIfSecureMacAddrAgingTime',
'cps_i_mac_count' => 'cpsIfCurrentSecureMacAddrCount',
'cps_i_mac_max' => 'cpsIfMaxSecureMacAddr',
'cps_i_status' => 'cpsIfPortSecurityStatus',
'cps_i_enable' => 'cpsIfPortSecurityEnable',
# CISCO-PORT-SECURITY-MIB::cpsIfVlanTable
'cps_i_v_mac_count' => 'cpsIfVlanCurSecureMacAddrCount',
'cps_i_v_mac_max' => 'cpsIfVlanMaxSecureMacAddr',
'cps_i_v' => 'cpsIfVlanIndex',
# CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable
'cps_i_v_mac_status' => 'cpsIfVlanSecureMacAddrRowStatus',
'cps_i_v_mac_age' => 'cpsIfVlanSecureMacAddrRemainAge',
'cps_i_v_mac_type' => 'cpsIfVlanSecureMacAddrType',
'cps_i_v_vlan' => 'cpsIfVlanSecureVlanIndex',
'cps_i_v_mac' => 'cpsIfVlanSecureMacAddress',
# CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable
'cps_m_status' => 'cpsSecureMacAddrRowStatus',
'cps_m_age' => 'cpsSecureMacAddrRemainingAge',
'cps_m_type' => 'cpsSecureMacAddrType',
'cps_m_mac' => 'cpsSecureMacAddress',
# IEEE8021-PAE-MIB::dot1xPaePortEntry
'pae_i_capabilities' => 'dot1xPaePortCapabilities',
'pae_i_last_eapol_frame_source' => 'dot1xAuthLastEapolFrameSource',
);
%MUNGE = (
'cps_i_mac' => \&SNMP::Info::munge_mac,
'cps_m_mac' => \&SNMP::Info::munge_mac,
'cps_i_v_mac' => \&SNMP::Info::munge_mac,
'pae_i_last_eapol_frame_source' => \&SNMP::Info::munge_mac,
'pae_i_capabilities' => \&munge_pae_capabilities,
);
%PAECAPABILITIES = (
0 => 'dot1xPaePortAuthCapable',
1 => 'dot1xPaePortSuppCapable'
);
sub munge_pae_capabilities {
my $bits = shift;
return unless defined $bits;
my @vals
= map( $PAECAPABILITIES{$_}, sprintf( "%x", unpack( 'b*', $bits ) ) );
return join( ' ', @vals );
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $cps = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $cps->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
SNMP::Info::CiscoPortSecurity is a subclass of SNMP::Info that provides
an interface to the F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>. These
MIBs are used across the Catalyst family under CatOS and IOS.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<CISCO-PORT-SECURITY-MIB>
=item F<CISCO-PAE-MIB>
=item F<IEEE8021-PAE-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=back
=head2 F<CISCO-PORT-SECURITY-MIB> globals
=over
=item $cps->cps_clear()
(C<cpsGlobalClearSecureMacAddresses>)
=item $cps->cps_notify()
(C<cpsGlobalSNMPNotifControl>)
=item $cps->cps_rate()
(C<cpsGlobalSNMPNotifRate>)
=item $cps->cps_enable()
(C<cpsGlobalPortSecurityEnable>)
=item $cps->cps_mac_count()
(C<cpsGlobalTotalSecureAddress>)
=item $cps->cps_mac_max()
(C<cpsGlobalMaxSecureAddress>)
=back
=head1 TABLE METHODS
=head2 C<CISCO-PORT-SECURITY-MIB> - Interface Config Table
=over
=item $cps->cps_i_limit_val()
(C<cpsIfInvalidSrcRateLimitValue>)
=item $cps->cps_i_limit()
(C<cpsIfInvalidSrcRateLimitEnable>)
=item $cps->cps_i_sticky()
(C<cpsIfStickyEnable>)
=item $cps->cps_i_clear_type()
(C<cpsIfClearSecureMacAddresses>)
=item $cps->cps_i_shutdown()
(C<cpsIfShutdownTimeout>)
=item $cps->cps_i_flood()
(C<cpsIfUnicastFloodingEnable>)
=item $cps->cps_i_clear()
(C<cpsIfClearSecureAddresses>)
=item $cps->cps_i_mac()
(C<cpsIfSecureLastMacAddress>)
=item $cps->cps_i_count()
(C<cpsIfViolationCount>)
=item $cps->cps_i_action()
(C<cpsIfViolationAction>)
=item $cps->cps_i_mac_static()
(C<cpsIfStaticMacAddrAgingEnable>)
=item $cps->cps_i_mac_type()
(C<cpsIfSecureMacAddrAgingType>)
=item $cps->cps_i_mac_age()
(C<cpsIfSecureMacAddrAgingTime>)
=item $cps->cps_i_mac_count()
(C<cpsIfCurrentSecureMacAddrCount>)
=item $cps->cps_i_mac_max()
(C<cpsIfMaxSecureMacAddr>)
=item $cps->cps_i_status()
(C<cpsIfPortSecurityStatus>)
=item $cps->cps_i_enable()
(C<cpsIfPortSecurityEnable>)
=back
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanTable>
=over
=item $cps->cps_i_v_mac_count()
(C<cpsIfVlanCurSecureMacAddrCount>)
=item $cps->cps_i_v_mac_max()
(C<cpsIfVlanMaxSecureMacAddr>)
=item $cps->cps_i_v()
(C<cpsIfVlanIndex>)
=back
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable>
=over
=item $cps->cps_i_v_mac_status()
(C<cpsIfVlanSecureMacAddrRowStatus>)
=item $cps->cps_i_v_mac_age()
(C<cpsIfVlanSecureMacAddrRemainAge>)
=item $cps->cps_i_v_mac_type()
(C<cpsIfVlanSecureMacAddrType>)
=item $cps->cps_i_v_vlan()
(C<cpsIfVlanSecureVlanIndex>)
=item $cps->cps_i_v_mac()
(C<cpsIfVlanSecureMacAddress>)
=back
=head2 C<CISCO-PORT-SECURITY-MIB::cpsSecureMacAddressTable>
=over
=item $cps->cps_m_status()
(C<cpsSecureMacAddrRowStatus>)
=item $cps->cps_m_age()
(C<cpsSecureMacAddrRemainingAge>)
=item $cps->cps_m_type()
(C<cpsSecureMacAddrType>)
=item $cps->cps_m_mac()
(C<cpsSecureMacAddress>)
=back
=head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry>
=over
=item $cps->pae_i_capabilities()
C<dot1xPaePortCapabilities>
Indicates the PAE functionality that this Port supports
and that may be managed through this MIB munged to return either
C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>.
=item $cps->pae_i_last_eapol_frame_source()
C<dot1xAuthLastEapolFrameSource>
The source MAC address carried in the most recently received EAPOL frame.
=back
=head1 Data Munging Callback Subroutines
=over
=item $cps->munge_pae_capabilities()
Return either C<'dot1xPaePortAuthCapable'> or C<'dot1xPaePortSuppCapable'>
based upon bit value.
=back
=cut

193
Info/CiscoPower.pm Normal file
View File

@@ -0,0 +1,193 @@
# SNMP::Info::CiscoPower
# $Id$
#
# Copyright (c) 2008 Bill Fenner
# 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::CiscoPower;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoPower::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoPower::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
%GLOBALS = ();
%FUNCS = (
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
);
%MUNGE = ();
# Cisco overcame the limitation of the module.port index of the
# pethPsePortTable by adding another mapping table, which maps
# a pethPsePortTable row to an entPhysicalTable index, which can
# then be mapped to ifIndex.
sub peth_port_ifindex {
my $cpeth = shift;
my $partial = shift;
my $ent_phy = $cpeth->cpeth_ent_phy($partial);
my $e_port = $cpeth->e_port();
my $peth_port_ifindex = {};
foreach my $i ( keys %$ent_phy ) {
if ( $e_port->{ $ent_phy->{$i} } ) {
$peth_port_ifindex->{$i} = $e_port->{ $ent_phy->{$i} };
}
}
return $peth_port_ifindex;
}
# peth_port_neg_power uses the same index as the other peth_port_* tables.
# However, cdpCachePowerConsumption uses <ifIndex>.<neighbor>.
# Therefore, we have to invert peth_port_ifindex, to get to
# the index that is expected and the rest of the code can re-invert it.
sub peth_port_neg_power {
my $cpeth = shift;
my $partial = shift;
# Ignoring partial, since it's not easy to implement properly.
my $index = $cpeth->peth_port_ifindex();
my %inverse_index;
foreach my $i ( keys %$index ) {
$inverse_index{ $index->{$i} } = $i;
}
my $neg_power = $cpeth->cdpCachePowerConsumption();
my $peth_port_neg_power = {};
foreach my $i ( keys %$neg_power ) {
my( $ifIndex, $nbrIndex ) = split( /\./, $i );
if ( defined( $inverse_index{ $ifIndex } ) ) {
$peth_port_neg_power->{ $inverse_index{ $ifIndex } } = $neg_power->{ $i };
}
}
return $peth_port_neg_power;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoPower - SNMP Interface to data stored in
F<CISCO-POWER-ETHERNET-EXT-MIB>.
=head1 AUTHOR
Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $poe = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $poe->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
The Info::PowerEthernet class needs a per-device helper function to
properly map the C<pethPsePortTable> to C<ifIndex> values. This class
provides that helper, using F<CISCO-POWER-ETHERNET-EXT-MIB>.
It does not define any helpers for the extra values that this MIB
contains.
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 $poe = new SNMP::Info::CiscoPower (...);
=head2 Inherited Classes
none.
Note that it requires that the device inherits from Info::Entity.
=head2 Required MIBs
=over
=item F<CISCO-POWER-ETHERNET-EXT-MIB>
=back
=head1 GLOBALS
none.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Power Port Table
=over
=item $poe->peth_port_ifindex()
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
=item $poe->peth_port_power()
Power supplied by PoE ports, in milliwatts
("cpeExtPsePortPwrConsumption")
=back
=head2 CDP Port table
=over
=item $poe->peth_port_neg_power()
Power negotiated using CDP, in milliwats
("cdpCachePowerConsumption")
=back
=cut

View File

@@ -1,81 +1,88 @@
# SNMP::Info::CiscoQOS
# Alexander Hartmaier <alexander.hartmaier@t-systems.at>
# $Id$
#
# Copyright (c) 2005 Alexander Hartmaier
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::CiscoQOS;
$VERSION = '1.04';
use strict;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoQOS::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoQOS::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%MIBS = (
'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex',
);
$VERSION = '2.08';
%GLOBALS = (
);
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
%FUNCS = (
# CISCO-CLASS-BASED-QOS-MIB
'qos_i_index' => 'cbQosIfIndex',
'qos_i_type' => 'cbQosIfType',
'qos_pol_direction' => 'cbQosPolicyDirection',
'qos_obj_index' => 'cbQosConfigIndex',
'qos_obj_type' => 'cbQosObjectsType',
'qos_obj_parent' => 'cbQosParentObjectsIndex',
'qos_cm_name' => 'cbQosCMName',
'qos_cm_desc' => 'cbQosCMDesc',
'qos_cm_info' => 'cbQosCMInfo',
'qos_octet_pre' => 'cbQosCMPrePolicyByte',
'qos_octet_post' => 'cbQosCMPostPolicyByte',
);
%GLOBALS = ();
%MUNGE = (
);
%FUNCS = (
# CISCO-CLASS-BASED-QOS-MIB::cbQosServicePolicyTable
'qos_i_index' => 'cbQosIfIndex',
'qos_i_type' => 'cbQosIfType',
'qos_pol_direction' => 'cbQosPolicyDirection',
# CISCO-CLASS-BASED-QOS-MIB::cbQosObjectsTable
'qos_obj_conf_index' => 'cbQosConfigIndex',
'qos_obj_type' => 'cbQosObjectsType',
'qos_obj_parent' => 'cbQosParentObjectsIndex',
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMCfgTable
'qos_cm_name' => 'cbQosCMName',
'qos_cm_desc' => 'cbQosCMDesc',
'qos_cm_info' => 'cbQosCMInfo',
# CISCO-CLASS-BASED-QOS-MIB::cbQosCMStatsTable
'qos_octet_pre' => 'cbQosCMPrePolicyByte',
'qos_octet_post' => 'cbQosCMPostPolicyByte',
# CISCO-CLASS-BASED-QOS-MIB::cbQosQueueingCfgTable
'qos_queueingcfg_bw' => 'cbQosQueueingCfgBandwidth',
'qos_queueingcfg_bw_units' => 'cbQosQueueingCfgBandwidthUnits',
);
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::CiscoQOS - Perl5 Interface to Cisco's Quality of Service MIBs
SNMP::Info::CiscoQOS - SNMP Interface to Cisco's Quality of Service MIBs
=head1 AUTHOR
Alexander Hartmaier (C<alexander.hartmaier@t-systems.at>)
Alexander Hartmaier
=head1 SYNOPSIS
@@ -83,14 +90,13 @@ Alexander Hartmaier (C<alexander.hartmaier@t-systems.at>)
my $qos = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $qos->class();
my $class = $qos->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -108,7 +114,7 @@ none.
=over
=item CISCO-CLASS-BASED-QOS-MIB
=item F<CISCO-CLASS-BASED-QOS-MIB>
=back
@@ -118,34 +124,95 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=over
none
=item none
=back
=head1 TABLE METHODS
=head2 ServicePolicy Table
=head2 Service Policy Table (C<cbQosServicePolicyTable>)
This table is from CISCO-CLASS-BASED-QOS-MIB::cbQosServicePolicyTable
This table describes the interfaces/media types and the policymap that are attached to it.
This table describes the interfaces/media types and the policy map that are
attached to it.
=over
=item $qos->qos_i_index()
(B<cbQosIfIndex>)
(C<cbQosIfIndex>)
=item $qos->qos_i_type()
(B<cbQosIfType>)
(C<cbQosIfType>)
=head2 ClassMap configuration Table
=item $qos->qos_pol_direction()
This table is from CISCO-CLASS-BASED-QOS-MIB::cbQosCMCfgTable
(C<cbQosPolicyDirection>)
=back
=head2 Class Map Objects Table (C<cbQosObjectsTable>)
=over
=item $qos->qos_obj_index()
(C<cbQosConfigIndex>)
=item $qos->qos_obj_type()
(C<cbQosObjectsType>)
=item $qos->qos_obj_parent()
(C<cbQosParentObjectsIndex>)
=back
=head2 Class Map Configuration Table (C<cbQosCMCfgTable>)
=over
=item $qos->qos_cm_name()
(C<cbQosCMName>)
=item $qos->qos_cm_desc()
(C<cbQosCMDesc>)
=item $qos->qos_cm_info()
(C<cbQosCMInfo>)
=back
=head2 Class Map Stats Table (C<cbQosCMStatsTable>)
=over
=item $qos->qos_octet_pre()
(C<cbQosCMPrePolicyByte>)
=item $qos->qos_octet_post()
(C<cbQosCMPostPolicyByte>)
=back
=head2 Queueing Configuration Table (C<cbQosQueueingCfgTable>)
=over
=item $qos->qos_queueingcfg_bw()
(C<cbQosQueueingCfgBandwidth>)
=item $qos->qos_queueingcfg_bw_units()
(C<cbQosQueueingCfgBandwidthUnits>)
=back
=cut

View File

@@ -1,73 +1,69 @@
# SNMP::Info::CiscoRTT
# Alexander Hartmaier <alexander.hartmaier@t-systems.at>
# $Id$
#
# Copyright (c) 2005 Alexander Hartmaier
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::CiscoRTT;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoRTT::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoRTT::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%MIBS = (
'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner',
);
$VERSION = '2.08';
%GLOBALS = (
);
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
%FUNCS = (
# CISCO-RTTMON-MIB
'rtt_desc' => 'rttMonCtrlAdminOwner',
'rtt_last' => 'rttMonLatestRttOperCompletionTime',
);
%GLOBALS = ();
%MUNGE = (
);
%FUNCS = (
# CISCO-RTTMON-MIB
'rtt_desc' => 'rttMonCtrlAdminOwner',
'rtt_last' => 'rttMonLatestRttOperCompletionTime',
);
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::CiscoRTT - Perl5 Interface to Cisco's Round Trip Time MIBs
SNMP::Info::CiscoRTT - SNMP Interface to Cisco's Round Trip Time MIBs
=head1 AUTHOR
Alexander Hartmaier (C<alexander.hartmaier@t-systems.at>)
Alexander Hartmaier
=head1 SYNOPSIS
@@ -75,14 +71,13 @@ Alexander Hartmaier (C<alexander.hartmaier@t-systems.at>)
my $rtt = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $rtt->class();
my $class = $rtt->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -100,7 +95,7 @@ none.
=over
=item CISCO-RTTMON-MIB
=item F<CISCO-RTTMON-MIB>
=back
@@ -110,7 +105,7 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=over
none
None
=back
@@ -118,25 +113,25 @@ none
=head2 Overall Control Group Table
This table is from CISCO-RTTMAN-MIB::rttMonCtrlAdminTable
This table is from C<CISCO-RTTMAN-MIB::rttMonCtrlAdminTable>
=over
=item $rtt->rtt_desc()
(B<rttMonCtrlAdminOwner>)
(C<rttMonCtrlAdminOwner>)
=back
=head2 Overall Control Group Table
This table is from CISCO-RTTMON-MIB::rttMonCtrl
This table is from C<CISCO-RTTMON-MIB::rttMonCtrl>
=over
=item $rtt->rtt_last()
(B<rttMonLatestRttOperCompletionTime>)
(C<rttMonLatestRttOperCompletionTime>)
=back

File diff suppressed because it is too large Load Diff

View File

@@ -1,112 +1,222 @@
# SNMP::Info::CiscoStats
# Max Baker
# $Id$
#
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
# All rights reserved.
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
# All rights reserved.
#
# Copyright (c) 2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::CiscoStats;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
'CISCO-PRODUCTS-MIB' => 'sysName',
'CISCO-STACK-MIB' => 'wsc1900sysID', # some older catalysts live here
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
);
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
'CISCO-PRODUCTS-MIB' => 'sysName',
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
# some older catalysts live here
'CISCO-STACK-MIB' => 'wsc1900sysID',
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevChassis',
'CISCO-FLASH-MIB' => 'ciscoFlashDeviceSize',
);
%GLOBALS = (
'description' => 'sysDescr',
# We will use the numeric OID's so that we don't require people
# to install v1 MIBs, which can conflict.
# OLD-CISCO-CPU-MIB:avgBusyPer
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
# CISCO-PROCESS-MIB
'cat_cpu' => 'cpmCPUTotal5sec.9',
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
# CISCO-MEMORY-POOL-MIB
'mem_free' => 'ciscoMemoryPoolFree.1',
'mem_used' => 'ciscoMemoryPoolUsed.1',
# OLD-CISCO-SYSTEM-MIB
'write_mem' => 'writeMem',
);
'description' => 'sysDescr',
'ent_physical_software_rev' => 'entPhysicalSoftwareRev.1',
%FUNCS = (
);
# We will use the numeric OID's so that we don't require people
# to install v1 MIBs, which can conflict.
# OLD-CISCO-CPU-MIB:avgBusyPer
'ios_cpu' => '1.3.6.1.4.1.9.2.1.56.0',
'ios_cpu_1min' => '1.3.6.1.4.1.9.2.1.57.0',
'ios_cpu_5min' => '1.3.6.1.4.1.9.2.1.58.0',
%MUNGE = (
);
# CISCO-PROCESS-MIB
'cat_cpu' => 'cpmCPUTotal5sec.9',
'cat_cpu_1min' => 'cpmCPUTotal1min.9',
'cat_cpu_5min' => 'cpmCPUTotal5min.9',
# OLD-CISCO-SYSTEM-MIB
'write_mem' => 'writeMem',
'rom_id' => 'romId',
);
%FUNCS = (
# CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolTable
'cisco_mem_free' => 'ciscoMemoryPoolFree',
'cisco_mem_used' => 'ciscoMemoryPoolUsed',
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
'cisco_flash_size' => 'ciscoFlashDeviceSize',
);
%MUNGE = ();
sub vendor {
return 'cisco';
}
sub os {
my $l2 = shift;
my $descr = $l2->description() || '';
# order here matters - there are Catalysts that run IOS and have catalyst in their description field.
return 'ios' if ($descr =~ /IOS/);
return 'catalyst' if ($descr =~ /catalyst/i);
return undef;
# order here matters - there are Catalysts that run IOS and have catalyst
# in their description field.
return 'ios' if ( $descr =~ /IOS/ );
return 'catalyst' if ( $descr =~ /catalyst/i );
return 'css' if ( $descr =~ /Content Switch SW/ );
return 'css-sca' if ( $descr =~ /Cisco Systems Inc CSS-SCA-/ );
return 'pix' if ( $descr =~ /Cisco PIX Security Appliance/ );
return 'asa' if ( $descr =~ /Cisco Adaptive Security Appliance/ );
if ( $descr =~ /Application Control Engine Service Module/ ) {
# Only the admin context implements the entity MIB
return 'ace-admin' if defined $l2->ent_physical_software_rev();
return 'ace-context';
}
# Pre-version 3 FWSMs
return 'fwsm' if ( $descr =~ /Cisco Secure FWSM Firewall/ );
# Version 3+ FWSMs (currently untested against version 4)
if ( $descr =~ /Firewall Services Module/ ) {
my $model = $l2->model();
if ( defined $model && $model eq "WsSvcFwm1sc" ) {
# Only the admin context implements the entity MIB
return 'fwsm-admin' if defined $l2->ent_physical_software_rev();
return 'fwsm-context';
}
# Non context mode FWSM
return 'fwsm';
}
return;
}
sub os_ver {
my $l2 = shift;
my $os = $l2->os();
my $descr = $l2->description();
# Older Catalysts
if (defined $os and $os eq 'catalyst' and defined $descr and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/){
if ( defined $os
and $os eq 'catalyst'
and defined $descr
and $descr =~ m/V(\d{1}\.\d{2}\.\d{2})/ )
{
return $1;
}
# Newer Catalysts and IOS devices
if (defined $descr and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ ){
if ( defined $os
and $os eq 'css'
and defined $descr
and $descr =~ m/Content Switch SW Version ([0-9\.\(\)]+) with SNMPv1\/v2c Agent/ )
{
return $1;
}
return undef;
}
if ( defined $os
and $os eq 'css-sca'
and defined $descr
and $descr =~ m/Cisco Systems Inc CSS-SCA-2FE-K9, ([0-9\.\(\)]+) Release / )
{
return $1;
}
if ( defined $os
and $os eq 'pix'
and defined $descr
and $descr =~ m/Cisco PIX Security Appliance Version ([0-9\.\(\)]+)/ )
{
return $1;
}
if ( defined $os
and $os eq 'asa'
and defined $descr
and $descr =~ m/Cisco Adaptive Security Appliance Version ([0-9\.\(\)]+)/ )
{
return $1;
}
if ( defined $os
and $os =~ /^ace/ )
{
return $l2->ent_physical_software_rev();
}
if ( defined $os
and $os =~ /^fwsm/
and defined $descr
and $descr =~ m/Version (\d+\.\d+(\(\d+\)){0,1})/ )
{
return $1;
}
# Newer Catalysts and IOS devices
if ( defined $descr
and $descr =~ m/Version (\d+\.\d+\([^)]+\)[^,\s]*)(,|\s)+/ )
{
return $1;
}
return;
}
sub os_bin {
my $self = shift;
my $rom_id = $self->rom_id();
if ($rom_id =~ m/Version ([^,]+),/) {
return $1;
}
return;
}
sub cpu {
my $self = shift;
my $self = shift;
my $ios_cpu = $self->ios_cpu();
return $ios_cpu if defined $ios_cpu;
my $cat_cpu = $self->cat_cpu();
@@ -114,7 +224,7 @@ sub cpu {
}
sub cpu_1min {
my $self = shift;
my $self = shift;
my $ios_cpu_1min = $self->ios_cpu_1min();
return $ios_cpu_1min if defined $ios_cpu_1min;
my $cat_cpu_1min = $self->cat_cpu_1min();
@@ -122,19 +232,69 @@ sub cpu_1min {
}
sub cpu_5min {
my $self = shift;
my $self = shift;
my $ios_cpu_5min = $self->ios_cpu_5min();
return $ios_cpu_5min if defined $ios_cpu_5min;
my $cat_cpu_5min = $self->cat_cpu_5min();
return $cat_cpu_5min;
}
sub mem_free {
my $self = shift;
my $mem_free;
my $cisco_mem_free = $self->cisco_mem_free() || {};
foreach my $mem_free_val ( values %$cisco_mem_free ) {
$mem_free += $mem_free_val;
}
return $mem_free;
}
sub mem_used {
my $self = shift;
my $mem_used;
my $cisco_mem_used = $self->cisco_mem_used() || {};
foreach my $mem_used_val ( values %$cisco_mem_used ) {
$mem_used += $mem_used_val;
}
return $mem_used;
}
sub mem_total {
my $self = shift;
my $mem_free = $self->mem_free();
my $mem_used = $self->mem_used();
return undef unless defined $mem_free and defined $mem_used;
return $mem_free + $mem_used;
my $mem_total;
my $cisco_mem_free = $self->cisco_mem_free() || {};
my $cisco_mem_used = $self->cisco_mem_used() || {};
foreach my $mem_entry ( keys %$cisco_mem_free ) {
my $mem_free = $cisco_mem_free->{$mem_entry} || 0;
my $mem_used = $cisco_mem_used->{$mem_entry} || 0;
$mem_total += ( $mem_free + $mem_used );
}
return $mem_total;
}
sub flashmem_total {
my $self = shift;
my $flashmem_total;
my $flash_sizes = $self->cisco_flash_size;
foreach my $flash_index ( keys %$flash_sizes ) {
$flashmem_total += $flash_sizes->{$flash_index};
}
return $flashmem_total;
}
1;
@@ -142,23 +302,24 @@ __END__
=head1 NAME
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco Devices
SNMP::Info::CiscoStats - Perl5 Interface to CPU and Memory stats for Cisco
Devices
=head1 AUTHOR
Max Baker
Eric Miller, Max Baker, Sam Stickland
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ciscostats = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ciscostats->class();
@@ -166,32 +327,36 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory, os and
version information about Cisco Devices.
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
os and version information about Cisco Devices.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
none.
None.
=head2 Required MIBs
=over
=item CISCO-PRODUCTS-MIB
=item F<CISCO-PRODUCTS-MIB>
=item CISCO-PROCESS-MIB
=item F<CISCO-PROCESS-MIB>
=item CISCO-MEMORY-POOL-MIB
=item F<CISCO-MEMORY-POOL-MIB>
=item SNMPv2-MIB
=item F<SNMPv2-MIB>
=item OLD-CISCO-SYSTEM-MIB
=item F<OLD-CISCO-SYSTEM-MIB>
=item CISCO-STACK-MIB
=item F<CISCO-STACK-MIB>
=item CISCO-ENTITY-VENDORTYPE-OID-MIB
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
=item F<CISCO-FLASH-MIB>
=item F<ENTITY-MIB>
=back
@@ -217,67 +382,162 @@ Returns ios_cpu_5min() or cat_cpu5min(), whichever is available.
Returns mem_free() + mem_used()
=item $ciscostats->vendor()
'cisco'
=item $ciscostats->os()
Trys to parse if device is running IOS or CatOS from description()
Tries to parse if device is running IOS or CatOS from description()
Available values :
=over
=item pix
Cisco PIX
=item asa
Cisco ASA
=item fwsm
Single-mode FWSM
=item fwsm-admin
Admin context of multi-context FWSM
=item fwsm-context
Standard context of multi-context FWSM
=item ace-admin
Admin context of ACE module
=item ace-context
Standard context of ACE module (NB: No OS version detection
is available, but will be the same as it's 'ace admin')
=item css
Cisco Content Switch
=item css-sca
Cisco Content Switch Secure Content Acceleration
=back
=item $ciscostats->os_ver()
Trys to parse device operating system version from description()
Tries to parse device operating system version from description()
=item $ciscostats->os_bin()
Tries to parse ROMMON version from rom_id() string
=item $ciscostats->ios_cpu()
Current CPU usage in percents of device.
Current CPU usage in percent.
B<1.3.6.1.4.1.9.2.1.56.0> =
B<OLD-CISCO-CPU-MIB:avgBusyPer>
C<1.3.6.1.4.1.9.2.1.56.0> =
C<OLD-CISCO-CPU-MIB:avgBusyPer>
=item $ciscostats->ios_cpu_1min()
Average CPU Usage in percents of device over last minute.
Average CPU Usage in percent over the last minute.
B<1.3.6.1.4.1.9.2.1.57.0>
C<1.3.6.1.4.1.9.2.1.57.0>
=item $ciscostats->ios_cpu_5min()
Average CPU Usage in percents of device over last 5 minutes.
Average CPU Usage in percent over the last 5 minutes.
B<1.3.6.1.4.1.9.2.1.58.0>
C<1.3.6.1.4.1.9.2.1.58.0>
=item $ciscostats->cat_cpu()
Current CPU usage in percents of device.
Current CPU usage in percent.
B<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
C<CISCO-PROCESS-MIB::cpmCPUTotal5sec.9>
=item $ciscostats->cat_cpu_1min()
Average CPU Usage in percents of device over last minute.
Average CPU Usage in percent over the last minute.
B<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
C<CISCO-PROCESS-MIB::cpmCPUTotal1min.9>
=item $ciscostats->cat_cpu_5min()
Average CPU Usage in percents of device over last 5 minutes.
Average CPU Usage in percent over the last 5 minutes.
B<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
C<CISCO-PROCESS-MIB::cpmCPUTotal5min.9>
=item $ciscostats->mem_free()
Main DRAM free in device. In bytes.
Main DRAM free of the device in bytes.
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree.1>
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree>
=item $ciscostats->mem_used()
Main DRAM used in device. In bytes.
Main DRAM used of the device in bytes.
B<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed.1>
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
=item $ciscostats->mem_total()
Main DRAM of the device in bytes.
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolFree> +
C<CISCO-MEMORY-POOL-MIB::ciscoMemoryPoolUsed>
=item $ciscostats->flashmem_total()
Flash memory of the device in bytes.
C<CISCO-FLASH-MIB::ciscoFlashDeviceSize>
=back
=head1 TABLE METHODS
None.
=head2 Cisco Memory Pool Table (C<ciscoMemoryPoolTable>)
=over
=item $ciscostats->cisco_mem_free()
The number of bytes from the memory pool that are currently unused on the
managed device.
(C<ciscoMemoryPoolFree>)
=item $ciscostats->cisco_mem_used()
The number of bytes from the memory pool that are currently in use by
applications on the managed device.
(C<ciscoMemoryPoolUsed>)
=back
=head2 Cisco Flash Device Table (C<ciscoFlashDeviceTable>)
=over
=item $ciscostats->cisco_flash_size()
Total size of the Flash device. For a removable device, the size will be
zero if the device has been removed.
(C<ciscoFlashDeviceSize>)
=back
=cut

353
Info/CiscoStpExtensions.pm Normal file
View File

@@ -0,0 +1,353 @@
# SNMP::Info::CiscoStpExtensions
#
# Copyright (c)2009 Carlos Vicente
# 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 author 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::CiscoStpExtensions;
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
$VERSION = '2.08';
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
%MIBS = (
%SNMP::Info::Bridge::MIBS,
'CISCO-STP-EXTENSIONS-MIB' => 'stpxSpanningTreeType',
);
%GLOBALS = (
%SNMP::Info::Bridge::GLOBALS,
'stpx_mst_config_digest' => 'stpxSMSTConfigDigest',
'stpx_mst_region_name' => 'stpxMSTRegionName',
'stpx_mst_region_rev' => 'stpxSMSTRegionRevision',
'stpx_stp_type' => 'stpxSpanningTreeType',
'stpx_bpduguard_enable' => 'stpxFastStartBpduGuardEnable',
'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable',
);
%FUNCS = (
%SNMP::Info::Bridge::FUNCS,
'stpx_rootguard_enabled' => 'stpxRootGuardConfigEnabled',
'stpx_loopguard_enabled' => 'stpxLoopGuardConfigEnabled',
'stpx_port_bpduguard_mode' => 'stpxFastStartPortBpduGuardMode',
'stpx_port_bpdufilter_mode' => 'stpxFastStartPortBpduFilterMode',
'stpx_smst_root' => 'stpxSMSTInstanceCISTRegionalRoot',
'stpx_smst_vlans_mapped_1k2k' => 'stpxSMSTInstanceVlansMapped1k2k',
'stpx_smst_vlans_mapped_3k4k' => 'stpxSMSTInstanceVlansMapped3k4k',
);
%MUNGE = (
%SNMP::Info::Bridge::MUNGE,
'stpx_mst_config_digest' => \&SNMP::Info::CiscoStpExtensions::oct2str,
);
# Report version of STP via standard method
sub stp_ver {
my $self = shift;
my $stp_ver = $self->SUPER::stp_ver();
if ( $stp_ver eq 'unknown' ){
if ( defined $self->stpx_stp_type() ){
$stp_ver = $self->stpx_stp_type();
}
}
return $stp_ver;
}
sub mst_config_digest {
my $self = shift;
return $self->stpx_mst_config_digest;
}
sub mst_region_name {
my $self = shift;
return $self->stpx_mst_region_name;
}
sub mst_region_rev {
my $self = shift;
return $self->stpx_mst_region_rev;
}
sub mst_vlan2instance {
my $self = shift;
# Get MST vlan-to-instance mapping
my $m1k2k = $self->stpx_smst_vlans_mapped_1k2k;
my $m3k4k = $self->stpx_smst_vlans_mapped_3k4k;
# Get list of VLANs
my $vlan_membership = $self->i_vlan_membership;
my @vlans;
foreach my $iid ( keys %$vlan_membership ){
if ( my $vm = $vlan_membership->{$iid} ){
foreach my $vid ( @$vm ){
push @vlans, $vid;
}
}
}
my %res;
foreach my $vlan ( @vlans ){
if ( $vlan < 2048 ){
foreach my $inst ( keys %$m1k2k ){
my $list = $m1k2k->{$inst};
my $vlanlist = [split(//, unpack("B*", $list))];
if ( @$vlanlist[$vlan] ){
$res{$vlan} = $inst;
last;
}
}
}else{
foreach my $inst ( keys %$m3k4k ){
my $list = $m3k4k->{$inst};
my $vlanlist = [split(//, unpack("B*", $list))];
if ( @$vlanlist[$vlan-2048] ){
$res{$vlan} = $inst;
last;
}
}
}
}
return \%res;
}
sub i_rootguard_enabled {
my $self = shift;
my $partial = shift;
my $rg_enabled = $self->stpx_rootguard_enabled();
my $bp_index = $self->bp_index($partial);
my %res;
foreach my $index ( keys %$rg_enabled ){
my $enabled = $rg_enabled->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $enabled;
$res{$iid} = $enabled;
}
return \%res;
}
sub i_loopguard_enabled {
my $self = shift;
my $partial = shift;
my $lg_enabled = $self->stpx_loopguard_enabled();
my $bp_index = $self->bp_index($partial);
my %res;
foreach my $index ( keys %$lg_enabled ){
my $enabled = $lg_enabled->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $enabled;
$res{$iid} = $enabled;
}
return \%res;
}
sub i_bpduguard_enabled {
my $self = shift;
my $partial = shift;
my $bpdugm_default = $self->stpx_bpduguard_enable();
my $bp_index = $self->bp_index($partial);
my $bpdugm = $self->stpx_port_bpduguard_mode();
my %res;
foreach my $index ( keys %$bpdugm ){
my $mode = $bpdugm->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $mode;
if ( $mode eq 'default' ){
$res{$iid} = $bpdugm_default;
}else{
$res{$iid} = $mode;
}
}
return \%res;
}
sub i_bpdufilter_enabled {
my $self = shift;
my $partial = shift;
my $bpdufm_default = $self->stpx_bpdufilter_enable();
my $bp_index = $self->bp_index($partial);
my $bpdufm = $self->stpx_port_bpdufilter_mode();
my %res;
foreach my $index ( keys %$bpdufm ){
my $mode = $bpdufm->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $mode;
if ( $mode eq 'default' ){
$res{$iid} = $bpdufm_default;
}else{
$res{$iid} = $mode;
}
}
return \%res;
}
sub oct2str {
my ($v) = @_;
return sprintf('%s', unpack('H*', $v));
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoStpExtensions - SNMP Interface to C<CISCO-STP-EXTENSIONS-MIB>
=head1 AUTHOR
Carlos Vicente
=head1 SYNOPSIS
=head1 DESCRIPTION
Create or use a subclass of SNMP::Info that inherits this class. Do not use
directly.
For debugging you can call new() directly as you would in SNMP::Info
my $stpx = new SNMP::Info::CiscoStpExtensions(...);
=head2 Inherited Classes
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
=over
=item $stpx->stp_ver()
Returns the particular STP version running on this device.
Meant to override SNMP::Info::Brigde::stp_ver()
Values: C<pvstPlus>, C<mistp>, C<mistpPvstPlus>, C<mst>, C<rapidPvstPlus>
(C<stpxSpanningTreeType>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $stpx->mst_config_digest()
Returns the Multiple Spanning Tree (MST) configuration digest
(C<stpxSMSTConfigDigest>)
=item $stpx->mst_region_name()
Returns the Multiple Spanning Tree (MST) region name
(C<stpxMSTRegionName>)
=item $stpx->mst_region_rev()
Returns the Multiple Spanning Tree (MST) region name
(C<stpxSMSTRegionRevision>)
=item $stpx->mst_vlan2instance()
Returns the mapping of vlan to MST instance in the form of a hash reference
with key = VLAN id, value = STP instance
=item $stpx->i_rootguard_enabled()
Returns 1 or 0 depending on whether C<RootGuard> is enabled on a given port.
Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxRootGuardConfigEnabled>)
=item $stpx->i_loopguard_enabled()
Returns 1 or 0 depending on whether C<LoopGuard> is enabled on a given port.
Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxLoopGuardConfigEnabled>)
=item $stpx->i_bpduguard_enabled()
Returns 1 or 0 depending on whether C<BpduGuard> is enabled on a given port.
Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxFastStartPortBpduGuardMode>)
=item $stpx->i_bpdufilter_enabled()
Returns 1 or 0 depending on whether C<BpduFilter> is enabled on a given port.
Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxFastStartBpduFilterEnable>)
=back
=head1 MUNGES
=over
=item oct2str()
Unpacks H* into a string
=back
=cut

File diff suppressed because it is too large Load Diff

View File

@@ -1,82 +1,102 @@
# SNMP::Info::Entity
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# 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
#
# 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
# * 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.
#
# 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;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Entity::EXPORT_OK = qw//;
%MIBS = ('ENTITY-MIB' => 'entPhysicalSerialNum');
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%GLOBALS = (
);
$VERSION = '2.08';
%FUNCS = (
'e_index' => 'entPhysicalIndex',
'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' => 'entParentRelPos',
'e_serial' => 'entPhysicalSerialNum',
'e_swver' => 'entPhysicalSoftwareRev',
'e_type' => 'entPhysicalVendorType',
'e_vendor' => 'entPhysicalMfgName',
);
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
%MUNGE = (
);
%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 $e_map = $entity->e_map();
my $entity = shift;
my $partial = shift;
my $e_map = $entity->e_map($partial);
my %e_port;
foreach my $e_id (keys %$e_map) {
foreach my $e_id ( keys %$e_map ) {
my $id = $e_id;
$id =~ s/\.0$//;
@@ -88,11 +108,14 @@ sub e_port {
return \%e_port;
}
1;
__END__
=head1 NAME
SNMP::Info::Entity - Perl5 Interface to SNMP data stored in ENTITY-MIB. RFC 2737
SNMP::Info::Entity - SNMP Interface to data stored in F<ENTITY-MIB>. RFC 2737
=head1 AUTHOR
@@ -104,7 +127,6 @@ Max Baker
my $entity = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -116,13 +138,15 @@ Max Baker
=head1 DESCRIPTION
ENTITY-MIB is used by Layer 2 devices from HP,Aironet,Foundry,Cisco and more.
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
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
For debugging purposes you can call this class directly as you would
SNMP::Info
my $entity = new SNMP::Info::Entity (...);
@@ -134,7 +158,7 @@ none.
=over
=item ENTITY-MIB
=item F<ENTITY-MIB>
=back
@@ -155,7 +179,7 @@ to a hash.
=item $entity->e_index()
Not normally implemented
Index
(C<entPhysicalIndex>)
@@ -183,7 +207,7 @@ Human Friendly
=item $entity->e_fru()
BOOLEAN. Field Replaceable unit?
BOOLEAN. Is a Field Replaceable unit?
(C<entPhysicalFRU>)
@@ -223,9 +247,15 @@ More computer friendly name of entity. Parse me.
=item $entity->e_port()
Maps EntityTable entries to the Interface Table (IfTable) using
Maps Entity Table entries to the Interface Table (C<IfTable>) using
$entity->e_map()
=item $entity->e_pos()
The relative position among all entities sharing the same parent.
(C<entPhysicalParentRelPos>)
=item $entity->e_serial()
(C<entPhysicalSerialNum>)
@@ -236,7 +266,8 @@ $entity->e_map()
=item $entity->e_type()
This is an OID.
This is an OID, which gets munged into the object name if the right
MIB is loaded.
(C<entPhysicalVendorType>)

View File

@@ -1,77 +1,78 @@
# SNMP::Info::EtherLike
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::EtherLike;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
%MIBS = ('ETHERLIKE-MIB' => 'etherMIB' );
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
%GLOBALS = ();
%FUNCS = (
# EtherLike StatsTable
'el_chipset' => 'dot3StatsEtherChipSet',
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
'el_coll_late' => 'dot3StatsLateCollisions',
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
'el_duplex' => 'dot3StatsDuplexStatus',
'el_error_alignment' => 'dot3StatsAlignmentErrors',
'el_error_fcs' => 'dot3StatsFCSErrors',
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
'el_error_frame' => 'dot3StatsFrameTooLongs',
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
'el_error_sqe' => 'dot3StatsSQETestErrors',
'el_error_symbol' => 'dot3StatsSymbolErrors',
'el_index' => 'dot3StatsIndex',
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
# Ethernet-like Collision Statistics Group
'el_coll_count' => 'dot3CollCount',
'el_coll_freq' => 'dot3CollFrequencies'
);
%MUNGE = ( %SNMP::Info::MUNGE,
'el_duplex' => \&munge_el_duplex,
);
# EtherLike StatsTable
'el_chipset' => 'dot3StatsEtherChipSet',
'el_coll_excess' => 'dot3StatsExcessiveCollisions',
'el_coll_late' => 'dot3StatsLateCollisions',
'el_coll_mult' => 'dot3StatsMultipleCollisionFrames',
'el_coll_single' => 'dot3StatsSingleCollisionFrames',
'el_duplex' => 'dot3StatsDuplexStatus',
'el_error_alignment' => 'dot3StatsAlignmentErrors',
'el_error_fcs' => 'dot3StatsFCSErrors',
'el_error_cs' => 'dot3StatsCarrierSenseErrors',
'el_error_frame' => 'dot3StatsFrameTooLongs',
'el_error_mac_rec' => 'dot3StatsInternalMacReceiveErrors',
'el_error_mac_xmit' => 'dot3StatsInternalMacTransmitErrors',
'el_error_sqe' => 'dot3StatsSQETestErrors',
'el_error_symbol' => 'dot3StatsSymbolErrors',
'el_index' => 'dot3StatsIndex',
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
# Ethernet-like Collision Statistics Group
'el_coll_count' => 'dot3CollCount',
'el_coll_freq' => 'dot3CollFrequencies'
);
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
sub munge_el_duplex {
my $duplex = shift;
@@ -81,14 +82,13 @@ sub munge_el_duplex {
return $duplex;
}
1;
__END__
=head1 NAME
SNMP::Info::EtherLike - Perl5 Interface to SNMP ETHERLIKE-MIB RFC 1398
SNMP::Info::EtherLike - SNMP Interface to SNMP F<ETHERLIKE-MIB> RFC 1398
=head1 AUTHOR
@@ -107,7 +107,8 @@ Max Baker
my $class = $cdp->class();
print " Using device sub class : $class\n";
# Find the duplex setting for a port on a device that implements ETHERLIKE-MIB
# Find the duplex setting for a port on a device that implements
# ETHERLIKE-MIB
my $interfaces = $el->interfaces();
my $el_index = $el->el_index();
my $el_duplex = $el->el_duplex();
@@ -123,11 +124,13 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
access to the ETHERLIKE-MIB used by some Layer 3 Devices such as Cisco routers.
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
Cisco routers.
See RFC 1398 for more details.
Use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
Use or create a subclass of SNMP::Info that inherits this one. Do not use
directly.
=head2 Inherited Classes
@@ -137,7 +140,7 @@ None.
=over
=item ETHERLIKE-MIB
=item F<ETHERLIKE-MIB>
=back
@@ -158,7 +161,7 @@ These are methods that return scalar values from SNMP
These are methods that return tables of information in the form of a reference
to a hash.
=head2 ETHERLIKE STATS TABLE (dot3StatsTable)
=head2 ETHERLIKE STATS TABLE (C<dot3StatsTable>)
=over
@@ -166,77 +169,87 @@ to a hash.
Returns reference to hash. Indexes Stats Table to the interface index (iid).
(B<dot3StatsIndex>)
(C<dot3StatsIndex>)
=item $el->el_duplex()
Returns reference to hash. Indexes Stats Table to Duplex Status of port.
(B<dot3StatsDuplexStatus>)
(C<dot3StatsDuplexStatus>)
=item $el->el_chipset()
(B<dot3StatsEtherChipSet>)
(C<dot3StatsEtherChipSet>)
=item $el->el_coll_excess()
(B<dot3StatsExcessiveCollisions>)
(C<dot3StatsExcessiveCollisions>)
=item $el->el_coll_late()
(B<dot3StatsLateCollisions>)
(C<dot3StatsLateCollisions>)
=item $el->el_coll_mult()
(B<dot3StatsMultipleCollisionFrames>)
(C<dot3StatsMultipleCollisionFrames>)
=item $el->el_coll_single()
(B<dot3StatsSingleCollisionFrames>)
(C<dot3StatsSingleCollisionFrames>)
=item $el->el_error_alignment()
(B<dot3StatsAlignmentErrors>)
(C<dot3StatsAlignmentErrors>)
=item $el->el_error_fcs()
(B<dot3StatsFCSErrors>)
(C<dot3StatsFCSErrors>)
=item $el->el_error_cs()
(B<dot3StatsCarrierSenseErrors>)
(C<dot3StatsCarrierSenseErrors>)
=item $el->el_error_frame()
(B<dot3StatsFrameTooLongs>)
(C<dot3StatsFrameTooLongs>)
=item $el->el_error_mac_rec()
(B<dot3StatsInternalMacReceiveErrors>)
(C<dot3StatsInternalMacReceiveErrors>)
=item $el->el_error_mac_xmit()
(B<dot3StatsInternalMacTransmitErrors>)
(C<dot3StatsInternalMacTransmitErrors>)
=item $el->el_error_sqe()
(B<dot3StatsSQETestErrors>)
(C<dot3StatsSQETestErrors>)
=item $el->el_error_symbol()
(B<dot3StatsSymbolErrors>)
(C<dot3StatsSymbolErrors>)
=item $el->el_xmit_defer()
(B<dot3StatsDeferredTransmissions>)
(C<dot3StatsDeferredTransmissions>)
=item $el->el_coll_count()
(B<dot3CollCount>)
(C<dot3CollCount>)
=item $el->el_coll_freq()
(B<dot3CollFrequencies>)
(C<dot3CollFrequencies>)
=back
=head1 Data Munging Callback Subroutines
=over
=item $el->munge_el_duplex()
Removes 'Duplex' from the end of a string.
=back

View File

@@ -1,95 +1,86 @@
# SNMP::Info::FDP
# Bruce Rodger
# $Id$
#
# (c) 2004 Bruce Rodger, Max Baker
# All rights reserved.
# Copyright (c) 2008 Bruce Rodger, Max Baker
# All rights reserved.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::FDP;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::FDP::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
$VERSION = '1.04';
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
$VERSION = '2.08';
%MIBS = ( 'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snFdpGlobalRun' );
%GLOBALS = (
# CDP-Compatibility
'cdp_interval' => 'snFdpGlobalMessageInterval',
'cdp_holdtime' => 'snFdpGlobalHoldTime',
'cdp_id' => 'snFdpGlobalDeviceId',
#
'fdp_run' => 'snFdpGlobalRun',
'fdp_interval' => 'snFdpGlobalMessageInterval',
'fdp_holdtime' => 'snFdpGlobalHoldTime',
'fdp_id' => 'snFdpGlobalDeviceId',
);
%FUNCS = (
'c_index' => 'snFdpCacheIfIndex',
'c_proto' => 'snFdpCacheAddressType',
'c_ip' => 'snFdpCacheAddress',
'c_ver' => 'snFdpCacheVersion',
'c_id' => 'snFdpCacheDeviceId',
'c_port' => 'snFdpCacheDevicePort',
'c_platform' => 'snFdpCachePlatform',
'c_capabilities' => 'snFdpCacheCapabilities',
'c_domain' => 'snFdpCacheVTPMgmtDomain',
'c_vlan' => 'snFdpCacheNativeVLAN',
'c_duplex' => 'snFdpCacheDuplex',
);
# CDP-Compatibility
'cdp_interval' => 'snFdpGlobalMessageInterval',
'cdp_holdtime' => 'snFdpGlobalHoldTime',
'cdp_id' => 'snFdpGlobalDeviceId',
#
'fdp_run' => 'snFdpGlobalRun',
'fdp_interval' => 'snFdpGlobalMessageInterval',
'fdp_holdtime' => 'snFdpGlobalHoldTime',
'fdp_id' => 'snFdpGlobalDeviceId',
);
%FUNCS = (
'c_index' => 'snFdpCacheIfIndex',
'c_proto' => 'snFdpCacheAddressType',
'c_ip' => 'snFdpCacheAddress',
'c_ver' => 'snFdpCacheVersion',
'c_id' => 'snFdpCacheDeviceId',
'c_port' => 'snFdpCacheDevicePort',
'c_platform' => 'snFdpCachePlatform',
'c_capabilities' => 'snFdpCacheCapabilities',
'c_domain' => 'snFdpCacheVTPMgmtDomain',
'c_vlan' => 'snFdpCacheNativeVLAN',
'c_duplex' => 'snFdpCacheDuplex',
);
%MUNGE = (
'c_capabilities' => \&munge_caps,
'c_ip' => \&SNMP::Info::munge_ip
);
sub munge_caps {
my $caps = shift;
return undef unless defined $caps;
my $bits = substr(unpack("B*",$caps),-7);
return $bits;
}
'c_capabilities' => \&SNMP::Info::munge_caps,
'c_ip' => \&SNMP::Info::munge_ip
);
sub cdp_run {
my $fdp = shift;
my $fdp = shift;
my $fdp_run = $fdp->fdp_run();
# if fdp_run isn't implemented on device, assume FDP is on
@@ -101,42 +92,45 @@ sub hasFDP {
my $fdp = shift;
my $ver = $fdp->{_version};
#my $ver = $fdp->fdp_ver;
# SNMP v1 clients dont have the globals
if (defined $ver and $ver == 1){
if ( defined $ver and $ver == 1 ) {
my $fdp_ip = $fdp->fdp_ip();
# See if anything in fdp cache, if so we have fdp
return 1 if (defined $fdp_ip and scalar(keys %$fdp_ip)) ;
return undef;
return 1 if ( defined $fdp_ip and scalar( keys %$fdp_ip ) );
return;
}
return $fdp->fdp_run();
}
sub c_if {
my $fdp = shift;
my $fdp = shift;
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
my $fdp_index = $fdp->fdp_index();
my $fdp_index = $fdp->fdp_index();
return $fdp_index if defined $fdp_index;
# Nope, didn't think so. Now we fake it.
my $fdp_ip = $fdp->c_ip();
unless (defined $fdp_ip){
$fdp->error_throw("SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()");
return undef;
unless ( defined $fdp_ip ) {
$fdp->error_throw(
"SNMP::Info::FDP:fdp_if() - Device doesn't have fdp_ip() data. Can't fake fdp_index()"
);
return;
}
my %fdp_if;
foreach my $key (keys %$fdp_ip){
next unless defined $key;
my $iid = $key;
# Truncate .1 from fdp cache entry
$iid =~ s/\.\d+$//;
$fdp_if{$key} = $iid;
foreach my $key ( keys %$fdp_ip ) {
next unless defined $key;
my $iid = $key;
# Truncate .1 from fdp cache entry
$iid =~ s/\.\d+$//;
$fdp_if{$key} = $iid;
}
return \%fdp_if;
@@ -147,7 +141,8 @@ __END__
=head1 NAME
SNMP::Info::FDP - Perl5 Interface to Foundry Discovery Protocol (FDP) using SNMP
SNMP::Info::FDP - SNMP Interface to Foundry Discovery Protocol (FDP) using
SNMP
=head1 AUTHOR
@@ -193,7 +188,8 @@ similar functionality to Cisco's CDP, and the SNMP interface is
virtually identical. FDP is implemented in Foundry devices, including
the Bigiron and Fastiron range.
Create or use a device subclass that inherits this class. Do not use directly.
Create or use a device subclass that inherits this class. Do not use
directly.
Each device implements a subset of the global and cache entries.
Check the return value to see if that data is held by the device.
@@ -206,17 +202,13 @@ None.
=over
=item FOUNDRY-SN-SWITCH-GROUP-MIB
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
work with B2R07600C.
=back
MIBs are normally distributed with each code update. Contact your vendor,
or trawl through google...
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
@@ -233,27 +225,61 @@ Accounts for SNMP version 1 devices which may have FDP but not fdp_run()
Is FDP enabled on this device?
(B<fdpGlobalRun>)
(C<fdpGlobalRun>)
=item $fdp->fdp_interval()
Interval in seconds at which FDP messages are generated.
(B<fdpGlobalMessageInterval>)
(C<fdpGlobalMessageInterval>)
=item $fdp->fdp_holdtime()
Time in seconds that FDP messages are kept.
(B<fdpGlobalHoldTime>)
(C<fdpGlobalHoldTime>)
=item $fdp->fdp_id()
Returns FDP device ID.
This is the device id broadcast via FDP to other devices, and is what is retrieved from remote devices with $fdp->id().
This is the device id broadcast via FDP to other devices, and is what is
retrieved from remote devices with $fdp->id().
(B<fdpGlobalDeviceId>)
(C<fdpGlobalDeviceId>)
=back
=head2 Overrides
CDP compatibility
=over
=item $fdp->c_interval()
Interval in seconds at which FDP messages are generated.
(C<fdpGlobalMessageInterval>)
=item $fdp->c_holdtime()
Time in seconds that FDP messages are kept.
(C<fdpGlobalHoldTime>)
=item $fdp->c_id()
Returns FDP device ID.
This is the device id broadcast via FDP to other devices, and is what is
retrieved from remote devices with $fdp->id().
(C<fdpGlobalDeviceId>)
=item $cdp->cdp_run()
Is FDP enabled on this device?
=back
@@ -262,11 +288,13 @@ This is the device id broadcast via FDP to other devices, and is what is retriev
These are methods that return tables of information in the form of a reference
to a hash.
=head2 FDP CACHE ENTRIES
=head2 Overrides
CDP compatibility
=over
=item $fdp->fdp_capabilities()
=item $fdp->c_capabilities()
Returns Device Functional Capabilities. Results are munged into an ascii
binary string, 7 digits long, MSB. Each digit represents a bit from the
@@ -280,51 +308,59 @@ From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#1884
=item (0x40) - Provides level 1 functionality.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on nonrouter ports.
=item (0x20) - The bridge or switch does not forward IGMP Report packets on
non router ports.
=item (0x10) - Sends and receives packets for at least one network layer protocol. If the device is routing the protocol, this bit should not be set.
=item (0x10) - Sends and receives packets for at least one network layer
protocol. If the device is routing the protocol, this bit should not be set.
=item (0x08) - Performs level 2 switching. The difference between this bit and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This device is assumed to be deployed in a physical loop-free topology.
=item (0x08) - Performs level 2 switching. The difference between this bit
and bit 0x02 is that a switch does not run the Spanning-Tree Protocol. This
device is assumed to be deployed in a physical loop-free topology.
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge would set both this bit and bit 0x02.
=item (0x04) - Performs level 2 source-route bridging. A source-route bridge
would set both this bit and bit 0x02.
=item (0x02) - Performs level 2 transparent bridging.
=item (0x01) - Performs level 3 routing for at least one network layer protocol.
=item (0x01) - Performs level 3 routing for at least one network layer
protocol.
=back
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to this information.
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
this information.
(B<fdpCacheCapabilities>)
(C<fdpCacheCapabilities>)
=item $fdp->fdp_domain()
=item $fdp->c_domain()
The CDP version of this returns remote VTP Management Domain as defined in CISCO-VTP-MIB::managementDomainName
The CDP version of this returns remote VTP Management Domain as defined
in C<CISCO-VTP-MIB::managementDomainName>
(B<fdpCacheVTPMgmtDomain>)
(C<fdpCacheVTPMgmtDomain>)
=item $fdp->fdp_duplex()
=item $fdp->c_duplex()
Returns the port duplex status from remote devices.
(B<fdpCacheDuplex>)
(C<fdpCacheDuplex>)
=item $fdp->fdp_id()
=item $fdp->c_id()
Returns remote device id string
(B<fdpCacheDeviceId>)
(C<fdpCacheDeviceId>)
=item $fdp->fdp_if()
=item $fdp->c_if()
Returns the mapping to the SNMP Interface Table.
Note that a lot devices don't implement $fdp->fdp_index(), So if it isn't around,
we fake it.
Note that a lot devices don't implement $fdp->fdp_index(), So if it isn't
around, we fake it.
In order to map the fdp table entry back to the interfaces() entry, we truncate the last number
off of it :
In order to map the fdp table entry back to the interfaces() entry, we
truncate the last number off of it :
# it exists, yay.
my $fdp_index = $device->fdp_index();
@@ -344,51 +380,52 @@ off of it :
return \%fdp_if;
=item $fdp->fdp_index()
=item $fdp->c_index()
Returns the mapping to the SNMP2 Interface table for FDP Cache Entries.
Most devices don't implement this, so you probably want to use $fdp->fdp_if() instead.
Most devices don't implement this, so you probably want to use $fdp->fdp_if()
instead.
See fdp_if() entry.
(B<fdpCacheIfIndex>)
(C<fdpCacheIfIndex>)
=item $fdp->fdp_ip()
=item $fdp->c_ip()
Returns remote IP address
(B<fdpCacheAddress>)
(C<fdpCacheAddress>)
=item $fdp->fdp_platform()
=item $fdp->c_platform()
Returns remote platform id
(B<fdpCachePlatform>)
(C<fdpCachePlatform>)
=item $fdp->fdp_port()
=item $fdp->c_port()
Returns remote port ID
(B<fdpDevicePort>)
(C<fdpDevicePort>)
=item $fdp->fdp_proto()
=item $fdp->c_proto()
Returns remote address type received. Usually IP.
(B<fdpCacheAddressType>)
(C<fdpCacheAddressType>)
=item $fdp->fdp_ver()
=item $fdp->c_ver()
Returns remote hardware version
(B<fdpCacheVersion>)
(C<fdpCacheVersion>)
=item $fdp->fdp_vlan()
=item $fdp->c_vlan()
Returns the remote interface native VLAN.
(B<fdpCacheNativeVLAN>)
(C<fdpCacheNativeVLAN>)
=back

407
Info/IEEE802dot11.pm Normal file
View File

@@ -0,0 +1,407 @@
# SNMP::Info::IEEE802dot11
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::IEEE802dot11;
use strict;
use Exporter;
@SNMP::Info::IEEE802dot11::ISA = qw/Exporter/;
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
%GLOBALS = ();
%FUNCS = (
# dot11PhyOFDMTable
'dot11_cur_freq' => 'dot11CurrentFrequency',
# dot11PhyDSSSTable
'dot11_cur_ch' => 'dot11CurrentChannel',
# dot11PhyOperationTable
'dot11_phy_type' => 'dot11PHYType',
'dot11_reg_dom' => 'dot11CurrentRegDomain',
# dot11ResourceInfoTable
'dot11_prod_ver' => 'dot11manufacturerProductVersion',
'dot11_prod_name' => 'dot11manufacturerProductName',
'dot11_man_name' => 'dot11manufacturerName',
# dot11OperationTable
'dot11_mac' => 'dot11MACAddress',
# dot11StationConfigTable
'dot11_bss_type' => 'dot11DesiredBSSType',
'i_ssidlist' => 'dot11DesiredSSID',
'dot11_pwr_mode' => 'dot11PowerManagementMode',
'dot11_sta_id' => 'dot11StationID',
# dot11PhyTxPowerTable
'dot11_cur_tx_pwr' => 'dot11CurrentTxPowerLevel',
'dot11_tx_pwr_level_1' => 'dot11TxPowerLevel1',
'dot11_tx_pwr_level_2' => 'dot11TxPowerLevel2',
'dot11_tx_pwr_level_3' => 'dot11TxPowerLevel3',
'dot11_tx_pwr_level_4' => 'dot11TxPowerLevel4',
'dot11_tx_pwr_level_5' => 'dot11TxPowerLevel5',
'dot11_tx_pwr_level_6' => 'dot11TxPowerLevel6',
'dot11_tx_pwr_level_7' => 'dot11TxPowerLevel7',
'dot11_tx_pwr_level_8' => 'dot11TxPowerLevel8',
);
%MUNGE = (
'dot11_mac' => \&SNMP::Info::munge_mac,
'dot11_sta_id' => \&SNMP::Info::munge_mac,
);
sub vendor {
my $dot11 = shift;
my $names = $dot11->dot11_man_name();
foreach my $iid ( keys %$names ) {
my $vendor = $names->{$iid};
next unless defined $vendor;
if ( $vendor =~ /^(\S+)/ ) {
return lc($1);
}
}
return;
}
sub model {
my $dot11 = shift;
my $names = $dot11->dot11_prod_name();
foreach my $iid ( keys %$names ) {
my $prod = $names->{$iid};
next unless defined $prod;
return lc($prod);
}
return;
}
sub os_ver {
my $dot11 = shift;
my $versions = $dot11->dot11_prod_ver();
foreach my $iid ( keys %$versions ) {
my $ver = $versions->{$iid};
next unless defined $ver;
if ( $ver =~ /([\d\.]+)/ ) {
return $1;
}
}
return;
}
sub i_80211channel {
my $dot11 = shift;
my $phy_type = $dot11->dot11_phy_type() || {};
my $cur_freq = $dot11->dot11_cur_freq() || {};
my $cur_ch = $dot11->dot11_cur_ch() || {};
my %i_80211channel;
foreach my $iid ( keys %$phy_type ) {
my $type = $phy_type->{$iid};
next unless defined $type;
if ( $type =~ /dsss/ ) {
my $ch = $cur_ch->{$iid};
next unless defined $ch;
$i_80211channel{$iid} = $ch;
}
elsif ( $type =~ /ofdm/ ) {
my $ch = $cur_freq->{$iid};
next unless defined $ch;
$i_80211channel{$iid} = $ch;
}
else {
next;
}
}
return \%i_80211channel;
}
sub dot11_cur_tx_pwr_mw {
my $dot11 = shift;
my $partial = shift;
my $cur = $dot11->dot11_cur_tx_pwr($partial);
my $dot11_cur_tx_pwr_mw = {};
foreach my $idx ( keys %$cur ) {
my $pwr = $cur->{$idx};
if ( $pwr >= 1 && $pwr <= 8 ) {
# ToDo - Look at string eval
my $mw
= eval "\$dot11->dot11_tx_pwr_level_$pwr(\$idx)"; ## no critic
$dot11_cur_tx_pwr_mw->{$idx} = $mw->{$idx};
}
else {
next;
}
}
return $dot11_cur_tx_pwr_mw;
}
1;
__END__
=head1 NAME
SNMP::Info::IEEE802dot11 - SNMP Interface to data from F<IEEE802dot11-MIB>
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $dot11 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $dot11->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::IEEE802dot11 is a subclass of SNMP::Info that provides an
interface to F<IEEE802dot11-MIB>. This MIB is used in standards based
802.11 wireless devices.
Use or create a subclass of SNMP::Info that inherits this one.
Do not use directly.
=head2 Inherited Classes
=over
None.
=back
=head2 Required MIBs
=over
=item F<IEEE802dot11-MIB>
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $dot11->vendor()
Tries to discover the vendor from dot11_man_name() - returns lower case
of the first word in the first instance found.
=item $dot11->model()
Tries to discover the model from dot11_prod_name() - returns lower case
of the first instance found.
=item $dot11->os_ver()
Tries to discover the operating system version from dot11_prod_ver() - returns
string of numeric and decimals in the first instance found.
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $dot11->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
(C<dot11DesiredSSID>)
=item $dot11->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
=item $dot11->dot11_cur_tx_pwr_mw()
Returns reference to hash. Current transmit power, in milliwatts, of the
radio interface.
=back
=head2 Dot11 Phy OFDM Table (C<dot11PhyOFDMTable>)
=over
=item $dot11->dot11_cur_freq()
(C<dot11CurrentFrequency>)
=back
=head2 Dot11 Phy DSSS Table (C<dot11PhyDSSSTable>)
=over
=item $dot11->dot11_cur_ch()
(C<dot11CurrentChannel>)
=back
=head2 Dot11 Phy Operation Table (C<dot11PhyOperationTable>)
=over
=item $dot11->dot11_phy_type()
(C<dot11PHYType>)
=item $dot11->dot11_reg_dom()
(C<dot11CurrentRegDomain>)
=back
=head2 Dot11 Resource Information Table (C<dot11ResourceInfoTable>)
=over
=item $dot11->dot11_prod_ver()
(C<dot11manufacturerProductVersion>)
=item $dot11->dot11_prod_name()
(C<dot11manufacturerProductName>)
=item $dot11->dot11_man_name()
(C<dot11manufacturerName>)
=back
=head2 Dot11 Operation Table (C<dot11OperationTable>)
=over
=item $dot11->dot11_mac()
(C<dot11MACAddress>)
=back
=head2 Dot11 Station Configuration Table (C<dot11StationConfigTable>)
=over
=item $dot11->dot11_bss_type()
(C<dot11DesiredBSSType>)
=item $dot11->dot11_pwr_mode()
(C<dot11PowerManagementMode>)
=item $dot11->dot11_sta_id()
(C<dot11StationID>)
=back
=head2 Dot11 Transmission Power Table (C<dot11PhyTxPowerTable>)
=over
=item $dot11->dot11_cur_tx_pwr()
(C<dot11CurrentTxPowerLevel>)
=item $dot11->dot11_tx_pwr_level_1()
(C<dot11TxPowerLevel1>)
=item $dot11->dot11_tx_pwr_level_2()
(C<dot11TxPowerLevel2>)
=item $dot11->dot11_tx_pwr_level_3()
(C<dot11TxPowerLevel3>)
=item $dot11->dot11_tx_pwr_level_4()
(C<dot11TxPowerLevel4>)
=item $dot11->dot11_tx_pwr_level_5()
(C<dot11TxPowerLevel5>)
=item $dot11->dot11_tx_pwr_level_6()
(C<dot11TxPowerLevel6>)
=item $dot11->dot11_tx_pwr_level_7()
(C<dot11TxPowerLevel7>)
=item $dot11->dot11_tx_pwr_level_8()
(C<dot11TxPowerLevel8>)
=back
=cut

475
Info/IPv6.pm Normal file
View File

@@ -0,0 +1,475 @@
# SNMP::Info::IPv6
#
# Copyright (c) 2010 Jeroen van Ingen and Carlos Vicente
# 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::IPv6;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::IPv6::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::IPv6::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE $METHOD/;
use constant {
IPMIB => 1,
CISCO => 2,
IPV6MIB => 3,
};
$VERSION = '2.08';
%MIBS = (
'IP-MIB' => 'ipv6InterfaceTableLastChange',
'IPV6-MIB' => 'ipv6IfTableLastChange',
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
);
%GLOBALS = ();
%FUNCS = (
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
'i6_n2p_phys_addr' => 'ipv6NetToMediaNetAddress', # IPV6-MIB
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
'i6_n2p_phys_type' => 'ipv6NetToMediaType', # IPV6-MIB
'ip_n2p_phys_state' => 'ipNetToPhysicalState', # IP-MIB
'c_inet_phys_state' => 'cInetNetToMediaState', # CISCO-IETF-IP-MIB
'i6_n2p_phys_state' => 'ipv6NetToMediaState', # IPV6-MIB
'ip_pfx_origin' => 'ipAddressPrefixOrigin', # IP-MIB
'c_pfx_origin' => 'cIpAddressPfxOrigin', # CISCO-IETF-IP-MIB
'ip_addr6_pfx' => 'ipAddressPrefix', # IP-MIB
'c_addr6_pfx' => 'cIpAddressPrefix', # CISCO-IETF-IP-MIB
'ip_addr6_index' => 'ipAddressIfIndex', # IP-MIBw
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
'ip_addr6_type' => 'ipAddressType', # IP-MIB
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
);
%MUNGE = (
'ip_n2p_phys_addr' => \&SNMP::Info::munge_mac,
'c_inet_phys_addr' => \&munge_physaddr,
'i6_n2p_phys_addr' => \&SNMP::Info::munge_mac,
);
sub ipv6_n2p_mac {
my $info = shift;
my $return;
my $phys_addr = &_test_methods( $info, {
ip_n2p_phys_addr => IPMIB,
c_inet_phys_addr => CISCO,
i6_n2p_phys_addr => IPV6MIB,
});
return unless defined $phys_addr;
foreach my $row (keys %$phys_addr) {
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
if ($info::METHOD == IPV6MIB) {
# IPV6-MIB doesn't include the addrtype in the index;
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if (($addrtype == 2) && (defined $phys_addr->{$row})) { # IPv6
$return->{$row} = substr($phys_addr->{$row}, 0, 17);
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_n2p_addr {
my $info = shift;
my $return;
my $net_addr = &_test_methods( $info, {
ip_n2p_phys_addr => IPMIB,
c_inet_phys_addr => CISCO,
i6_n2p_phys_addr => IPV6MIB,
});
return unless defined $net_addr;
foreach my $row (keys %$net_addr) {
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
if ($info::METHOD == IPV6MIB) {
# IPV6-MIB doesn't include the addrtype in the index;
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if ($addrtype == 2) { # IPv6
my $v6_packed = pack("C*", split(/\./, $v6addr));
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
$return->{$row} = $v6addr;
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_n2p_if {
my $info = shift;
my $return;
my $phys_addr = &_test_methods( $info, {
ip_n2p_phys_addr => IPMIB,
c_inet_phys_addr => CISCO,
i6_n2p_phys_addr => IPV6MIB,
});
return unless defined $phys_addr;
foreach my $row (keys %$phys_addr) {
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
if ($info::METHOD == IPV6MIB) {
# IPV6-MIB doesn't include the addrtype in the index;
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if ($addrtype == 2) { # IPv6
$return->{$row} = $ifindex;
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_n2p_type {
my $info = shift;
my $return;
my $phys_type = &_test_methods( $info, {
ip_n2p_phys_type => IPMIB,
c_inet_phys_type => CISCO,
i6_n2p_phys_type => IPV6MIB,
});
return unless defined $phys_type;
foreach my $row (keys %$phys_type) {
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
if ($info::METHOD == IPV6MIB) {
# IPV6-MIB doesn't include the addrtype in the index;
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if ($addrtype == 2) { # IPv6
$return->{$row} = $phys_type->{$row};
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_n2p_state {
my $info = shift;
my $return;
my $phys_state = &_test_methods( $info, {
ip_n2p_phys_state => IPMIB,
c_inet_phys_state => CISCO,
i6_n2p_phys_state => IPV6MIB,
});
return unless defined $phys_state;
foreach my $row (keys %$phys_state) {
if ($row =~ /^(\d+)\.(\d+)\.(\d+)\.([\d\.]+)$/) {
my $ifindex = $1; my $addrtype = $2; my $addrsize = $3; my $v6addr = $4;
if ($info::METHOD == IPV6MIB) {
# IPV6-MIB doesn't include the addrtype in the index;
# also, address syntax is IPv6Address (fixed 16 bytes) and not InetAddress (length field followed by address bytes)
$v6addr = join('.', $addrtype, $addrsize, $v6addr);
$addrtype = 2;
}
if ($addrtype == 2) { # IPv6
$return->{$row} = $phys_state->{$row};
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_index {
my $info = shift;
my $return;
my $ipv6_index = &_test_methods( $info, {
ip_addr6_index => IPMIB,
c_addr6_index => CISCO,
});
return unless defined $ipv6_index;
foreach my $row (keys %$ipv6_index){
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
my $addrtype = $1; my $v6addr = $2;
if ($addrtype == 2) { # IPv6
$return->{$row} = $ipv6_index->{$row};
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_type {
my $info = shift;
my $return;
my $ipv6_type = &_test_methods( $info, {
ip_addr6_type => IPMIB,
c_addr6_type => CISCO,
});
return unless defined $ipv6_type;
foreach my $row (keys %$ipv6_type){
if ($row =~ /^(\d+)\.([\d\.]+)$/) {
my $addrtype = $1; my $v6addr = $2;
if ($addrtype == 2) { # IPv6
$return->{$row} = $ipv6_type->{$row};
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_pfx_origin {
my $info = shift;
my $return;
my $ipv6_pfx_origin = &_test_methods( $info, {
ip_pfx_origin => IPMIB,
c_pfx_origin => CISCO,
});
return unless defined $ipv6_pfx_origin;
foreach my $row (keys %$ipv6_pfx_origin){
if ($row =~ /^(\d+)\.(\d+)\.([\d\.]+)\.(\d+)$/) {
my $ifindex = $1; my $type = $2; my $pfx = $3; my $len = $4;
if ($type == 2) { # IPv6
$return->{$row} = $ipv6_pfx_origin->{$row};
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_addr_prefix {
my $info = shift;
my $return;
my $ipv6_addr_prefix = &_test_methods( $info, {
ip_addr6_pfx => IPMIB,
c_addr6_pfx => CISCO,
});
return unless defined $ipv6_addr_prefix;
foreach my $row (keys %$ipv6_addr_prefix){
if ($row =~ /^(\d+)\.[\d\.]+$/) {
my $type = $1;
if ($type == 2) { # IPv6
# Remove the OID part from the value
my $val = $ipv6_addr_prefix->{$row};
if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
$val = $1;
$return->{$row} = $val;
}
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub _method_used {
my $info = shift;
my $return = 'none of the MIBs';
if (defined $info::METHOD) {
if ($info::METHOD eq IPMIB) {
$return = 'IP-MIB';
} elsif ($info::METHOD eq IPV6MIB) {
$return = 'IPV6-MIB';
} elsif ($info::METHOD eq CISCO) {
$return = 'CISCO-IETF-IP-MIB';
}
}
return $return;
}
sub _test_methods {
my $info = shift;
my $test = shift;
my $return = {};
foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
$return = $info->$method || {};
if (scalar keys %$return) {
$info::METHOD = $test->{$method};
last;
}
}
return $return;
}
sub _my_sub_name {
my @callinfo = caller(1);
return $callinfo[3];
}
sub munge_physaddr {
my $addr = shift;
return unless defined $addr;
return unless length $addr;
$addr = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $addr ) );
return $addr;
}
1;
__END__
=head1 NAME
SNMP::Info::IPv6 - SNMP Interface for obtaining IPv6 addresses and IPv6
address mappings
=head1 AUTHOR
Jeroen van Ingen and Carlos Vicente
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $info = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $info->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
to MAC addresses, interfaces and more. It will use data from the IP-MIB, IPV6-MIB
or the CISCO-IETF-IP-MIB, whichever is supported by the device.
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
device classes.
For debugging purposes you can call this class directly as you would
SNMP::Info
my $info = new SNMP::Info::IPv6 (...);
=head2 Inherited Classes
none.
=head2 Required MIBs
=over
=item F<IP-MIB>
=item F<IPV6-MIB>
=item F<CISCO-IETF-IP-MIB>
=back
=head1 GLOBALS
none.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Internet Address Table
=over
=item $info->ipv6_n2p_addr()
=item $info->ipv6_n2p_if()
=item $info->ipv6_n2p_mac()
=item $info->ipv6_n2p_state()
=item $info->ipv6_n2p_type()
=item $info->ipv6_index()
Maps an IPv6 address to an interface C<ifIndex>
=item $info->ipv6_type()
Maps an IPv6 address to its type (unicast, anycast, etc.)
=item $info->ipv6_pfx_origin()
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
=item $info->ipv6_addr_prefix()
Maps IPv6 addresses with their prefixes
=back
=head2 Internet Address Translation Table
=over
=item $info->c_inet_phys_address()
Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex> to a physical address.
=back
=head1 MUNGES
=over
=item munge_physaddr()
Takes an octet stream (HEX-STRING) and returns a colon separated ASCII hex
string.
=back
=cut

531
Info/LLDP.pm Normal file
View File

@@ -0,0 +1,531 @@
# SNMP::Info::LLDP
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::LLDP;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::LLDP::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
'LLDP-MIB' => 'lldpLocSysCapEnabled',
'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
);
%GLOBALS = (
'lldp_sysname' => 'lldpLocSysName',
'lldp_sysdesc' => 'lldpLocSysDesc',
'lldp_sys_cap' => 'lldpLocSysCapEnabled',
);
%FUNCS = (
# LLDP-MIB::lldpLocManAddrTable
'lldp_lman_addr' => 'lldpLocManAddrIfId',
# LLDP-MIB::lldpRemTable
'lldp_rem_id_type' => 'lldpRemChassisIdSubtype',
'lldp_rem_id' => 'lldpRemChassisId',
'lldp_rem_pid_type' => 'lldpRemPortIdSubtype',
'lldp_rem_pid' => 'lldpRemPortId',
'lldp_rem_desc' => 'lldpRemPortDesc',
'lldp_rem_sysname' => 'lldpRemSysName',
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
# LLDP-MIB::lldpRemManAddrTable
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
);
%MUNGE = (
'lldp_sysdesc' => \&SNMP::Info::munge_null,
'lldp_sysname' => \&SNMP::Info::munge_null,
'lldp_rem_sysname' => \&SNMP::Info::munge_null,
'lldp_rem_sysdesc' => \&SNMP::Info::munge_null,
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
);
sub hasLLDP {
my $lldp = shift;
# We may be have LLDP, but nothing in lldpRemoteSystemsData Tables
# so we could be running LLDP but not return any useful information
my $lldp_cap = $lldp->lldp_sys_cap();
return 1 if defined $lldp_cap;
return;
}
sub lldp_if {
my $lldp = shift;
my $partial = shift || 0;
my $addr = $lldp->lldp_rem_pid($partial) || {};
my $i_descr = $lldp->i_description() || {};
my %r_i_descr = reverse %$i_descr;
my %lldp_if;
foreach my $key ( keys %$addr ) {
my @aOID = split( '\.', $key );
my $port = $aOID[1];
next unless $port;
# Local LLDP port may not equate to ifIndex
# Cross reference lldpLocPortDesc with ifDescr to get ifIndex
my $lldp_desc = $lldp->lldpLocPortDesc($port);
my $desc = $lldp_desc->{$port};
# If cross reference is successful use it, otherwise stick with lldpRemLocalPortNum
if ( exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
}
$lldp_if{$key} = $port;
}
return \%lldp_if;
}
sub lldp_ip {
my $lldp = shift;
my $partial = shift || 0;
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
my %lldp_ip;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
next unless defined $index;
next unless $proto == 1;
$lldp_ip{$index} = $addr;
}
return \%lldp_ip;
}
sub lldp_addr {
my $lldp = shift;
my $partial = shift || 0;
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
my %lldp_ip;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
next unless defined $index;
$lldp_ip{$index} = $addr;
}
return \%lldp_ip;
}
sub lldp_port {
my $lldp = shift;
my $partial = shift || 0;
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
my $pid = $lldp->lldp_rem_pid($partial) || {};
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
my %lldp_port;
foreach my $key ( sort keys %$pid ) {
my $port = $pdesc->{$key};
unless ($port) {
$port = $pid->{$key};
next unless $port;
my $type = $ptype->{$key};
next unless $type;
# May need to format other types in the future, i.e. Network address
if ( $type =~ /mac/ ) {
$port = join( ':',
map { sprintf "%02x", $_ } unpack( 'C*', $port ) );
}
}
# Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
# figure out slot.port based upon lldpRemPortDesc
if ( $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ ) {
$port = defined $1 ? "$2.$3" : "$3";
}
$lldp_port{$key} = $port;
}
return \%lldp_port;
}
sub lldp_id {
my $lldp = shift;
my $partial = shift || 0;
my $ch_type = $lldp->lldp_rem_id_type($partial) || {};
my $ch = $lldp->lldp_rem_id($partial) || {};
my %lldp_id;
foreach my $key ( keys %$ch ) {
my $id = $ch->{$key};
next unless $id;
my $type = $ch_type->{$key};
next unless $type;
# May need to format other types in the future
if ( $type =~ /mac/ ) {
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
}
elsif ($type eq 'networkAddress') {
if ( length(unpack('H*', $id)) == 10 ) {
# IP address (first octet is sign, I guess)
my @octets = (map { sprintf "%02x",$_ } unpack('C*', $id))[1..4];
$id = join '.', map { hex($_) } @octets;
}
}
$lldp_id{$key} = $id;
}
return \%lldp_id;
}
#sub root_ip {
# my $lldp = shift;
#
# my $man_addr = $lldp->lldp_lman_addr() || {};
#
# foreach my $key (keys %$man_addr) {
# my @oids = split(/\./, $key);
# my $proto = shift(@oids);
# my $length = shift(@oids);
# # IPv4
# if ($proto == 1) {
# my $addr = join('.',@oids);
# return $addr if (defined $addr and $lldp->snmp_connect_ip($addr));
# }
# }
# return;
#}
# Break up the lldpRemManAddrTable INDEX into common index, protocol,
# and address.
sub _lldp_addr_index {
my $idx = shift;
my @oids = split( /\./, $idx );
my $index = join( '.', splice( @oids, 0, 3 ) );
my $proto = shift(@oids);
my $length = shift(@oids);
# IPv4
if ( $proto == 1 ) {
return ( $index, $proto, join( '.', @oids ) );
}
# MAC
elsif ( $proto == 6 ) {
return ( $index, $proto,
join( ':', map { sprintf "%02x", $_ } @oids ) );
}
# TODO - Need to handle other protocols, i.e. IPv6
else {
return;
}
}
1;
__END__
=head1 NAME
SNMP::Info::LLDP - SNMP Interface to the Link Layer Discovery Protocol (LLDP)
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $lldp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $lldp->class();
print " Using device sub class : $class\n";
$haslldp = $lldp->hasLLDP() ? 'yes' : 'no';
# Print out a map of device ports with LLDP neighbors:
my $interfaces = $lldp->interfaces();
my $lldp_if = $lldp->lldp_if();
my $lldp_ip = $lldp->lldp_ip();
my $lldp_port = $lldp->lldp_port();
foreach my $lldp_key (keys %$lldp_ip){
my $iid = $lldp_if->{$lldp_key};
my $port = $interfaces->{$iid};
my $neighbor = $lldp_ip->{$lldp_key};
my $neighbor_port = $lldp_port->{$lldp_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented
interface to LLDP information through SNMP.
LLDP is a Layer 2 protocol that allows a network device to advertise its
identity and capabilities on the local network providing topology information.
The protocol is defined in the IEEE standard 802.1AB.
Create or use a device subclass that inherits this class. Do not use
directly.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<LLDP-MIB>
=item F<LLDP-EXT-DOT1-MIB>
=item F<LLDP-EXT-DOT3-MIB>
=back
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
=over
=item $lldp->hasLLDP()
Is LLDP is active in this device?
Note: LLDP may be active, but nothing in C<lldpRemoteSystemsData> Tables so
the device would not return any useful topology information.
=item $lldp->lldp_sysname()
The string value used to identify the system name of the local system. If the
local agent supports IETF RFC 3418, C<lldpLocSysName> object should have the
same value of C<sysName> object.
Nulls are removed before the value is returned.
(C<lldpLocSysName>)
=item $lldp->lldp_sysdesc()
The string value used to identify the system description of the local system.
If the local agent supports IETF RFC 3418, C<lldpLocSysDesc> object should
have the same value of C<sysDesc> object.
Nulls are removed before the value is returned.
(C<lldpLocSysDesc>)
=item $lldp->lldp_sys_cap()
Returns which system capabilities are enabled on the local system. Results
are munged into an ascii binary string, LSB. Each digit represents a bit
from the table below:
=over
=item Bit 'other(0)' indicates that the system has capabilities other than
those listed below.
=item Bit 'repeater(1)' indicates that the system has repeater capability.
=item Bit 'bridge(2)' indicates that the system has bridge capability.
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
point capability.
=item Bit 'router(4)' indicates that the system has router capability.
=item Bit 'telephone(5)' indicates that the system has telephone capability.
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
Device capability (IETF RFC 2669 & 2670).
=item Bit 'stationOnly(7)' indicates that the system has only station
capability and nothing else."
=back
(C<lldpLocSysCapEnabled>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
Methods accessing the (C<lldpRemTable>) table use a partial value of zero if
not provided to set the (C<lldpRemTimeMark>) TimeMark instance to a known value
as per RFC 2021.
=over
=item $lldp->lldp_id()
Returns the string value used to identify the chassis component associated
with the remote system.
(C<lldpRemChassisId>)
=item $lldp->lldp_if()
Returns the mapping to the SNMP Interface Table. Trys to cross reference
(C<lldpLocPortDesc>) with (C<ifDescr>) to get (C<ifIndex>), if unable
defaults to (C<lldpRemLocalPortNum>).
=item $lldp->lldp_ip()
Returns remote IPv4 address. Returns for all other address types, use
lldp_addr if you want any return address type.
=item $lldp->lldp_addr()
Returns remote address. Type may be any IANA Address Family Number.
Currently only returns IPv4 or MAC addresses.
=item $lldp->lldp_port()
Returns remote port ID
=back
=head2 LLDP Remote Table (C<lldpRemTable>)
=over
=item $lldp->lldp_rem_id_type()
Returns the type of encoding used to identify the chassis associated with
the remote system.
(C<lldpRemChassisIdSubtype>)
=item $lldp->lldp_rem_id()
Returns the string value used to identify the chassis component associated
with the remote system.
(C<lldpRemChassisId>)
=item $lldp->lldp_rem_pid_type()
Returns the type of port identifier encoding used in the associated
C<lldpRemPortId> object.
(C<lldpRemPortIdSubtype>)
=item $lldp->lldp_rem_pid()
Returns the string value used to identify the port component associated with
the remote system.
(C<lldpRemPortId>)
=item $lldp->lldp_rem_desc()
Returns the string value used to identify the description of the given port
associated with the remote system.
Nulls are removed before the value is returned.
(C<lldpRemPortDesc>)
=item $lldp->lldp_rem_sysname()
Returns the string value used to identify the system name of the remote
system.
Nulls are removed before the value is returned.
(C<lldpRemSysName>)
=item $lldp->lldp_rem_sysdesc()
Returns the string value used to identify the system description of the
remote system.
Nulls are removed before the value is returned.
(C<lldpRemSysDesc>)
=item $lldp->lldp_rem_sys_cap()
Returns which system capabilities are enabled on the local system. Results
are munged into an ascii binary string, LSB. Each digit
represents a bit from the table below:
=over
=item Bit 'other(0)' indicates that the system has capabilities other than
those listed below.
=item Bit 'repeater(1)' indicates that the system has repeater capability.
=item Bit 'bridge(2)' indicates that the system has bridge capability.
=item Bit 'wlanAccessPoint(3)' indicates that the system has WLAN access
point capability.
=item Bit 'router(4)' indicates that the system has router capability.
=item Bit 'telephone(5)' indicates that the system has telephone capability.
=item Bit 'docsisCableDevice(6)' indicates that the system has DOCSIS Cable
Device capability (IETF RFC 2669 & 2670).
=item Bit 'stationOnly(7)' indicates that the system has only station
capability and nothing else."
=back
(C<lldpRemSysCapEnabled>)
=back
=cut

View File

@@ -1,74 +1,73 @@
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
# Max Baker
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer1;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Layer1::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::MIBS,
'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex'
);
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '2.08';
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
%GLOBALS = (
%SNMP::Info::GLOBALS,
'ports_managed' => 'ifNumber',
'rptr_slots' => 'rptrGroupCapacity',
'slots' => 'rptrGroupCapacity'
);
%SNMP::Info::GLOBALS,
'ports_managed' => 'ifNumber',
'rptr_slots' => 'rptrGroupCapacity',
'slots' => 'rptrGroupCapacity'
);
%FUNCS = (
%SNMP::Info::FUNCS,
'i_up2' => 'ifOperStatus',
'i_up_admin2' => 'ifAdminStatus',
'rptr_ports' => 'rptrGroupPortCapacity',
'rptr_port' => 'rptrPortIndex',
'rptr_slot' => 'rptrPortGroupIndex',
'rptr_up_admin' => 'rptrPortAdminStatus',
'rptr_up' => 'rptrPortOperStatus',
);
%FUNCS = (
%SNMP::Info::FUNCS,
'rptr_ports' => 'rptrGroupPortCapacity',
'rptr_port' => 'rptrPortIndex',
'rptr_slot' => 'rptrPortGroupIndex',
'rptr_up_admin' => 'rptrPortAdminStatus',
'rptr_up' => 'rptrPortOperStatus',
'rptr_last_src' => 'rptrAddrTrackNewLastSrcAddress',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
);
# Inherit all the built in munging
%SNMP::Info::MUNGE,
'rptr_last_src' => \&SNMP::Info::munge_mac,
);
# Method OverRides
@@ -76,23 +75,23 @@ use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
sub ports {
my $l1 = shift;
my $ports = $l1->ports_managed();
my $rptr_ports = $l1->rptr_ports();
my $ports = $l1->ports_managed();
my $rptr_ports = $l1->rptr_ports();
foreach my $group (keys %$rptr_ports){
$ports += $rptr_ports->{$group};
foreach my $group ( keys %$rptr_ports ) {
$ports += $rptr_ports->{$group};
}
return $ports;
}
# $l1->model() - Looks at sysObjectID which gives the oid of the system
# name, contained in a propriatry MIB.
# name, contained in a propriatry MIB.
sub model {
my $l1 = shift;
my $id = $l1->id();
my $l1 = shift;
my $id = $l1->id();
my $model = &SNMP::translateObj($id);
# HP
$model =~ s/^hpswitch//i;
@@ -103,62 +102,69 @@ sub model {
}
sub vendor {
my $l1 = shift;
my $l1 = shift;
my $descr = $l1->description();
return 'hp' if ($descr =~ /hp/i);
return 'cisco' if ($descr =~ /(catalyst|cisco|ios)/i);
return 'allied' if ($descr =~ /allied/i);
return 'asante' if ($descr =~ /asante/i);
return 'hp' if ( $descr =~ /hp/i );
return 'cisco' if ( $descr =~ /(catalyst|cisco|ios)/i );
return 'allied' if ( $descr =~ /allied/i );
return 'asante' if ( $descr =~ /asante/i );
return 'unknown';
}
# By Default we'll use the description field
sub interfaces {
my $l1 = shift;
my $interfaces = $l1->i_index();
my $rptr_port = $l1->rptr_port();
my $l1 = shift;
my $partial = shift;
foreach my $port (keys %$rptr_port){
my $interfaces = $l1->i_index($partial) || {};
my $rptr_port = $l1->rptr_port($partial) || {};
foreach my $port ( keys %$rptr_port ) {
$interfaces->{$port} = $port;
}
return $interfaces;
}
sub i_up_admin {
my $l1 = shift;
my $l1 = shift;
my $partial = shift;
my $i_up_admin = $l1->i_up_admin2();
my $rptr_up_admin = $l1->rptr_up_admin();
my $i_up_admin = $l1->SUPER::i_up_admin($partial) || {};
my $rptr_up_admin = $l1->rptr_up_admin($partial) || {};
foreach my $key (keys %$rptr_up_admin){
foreach my $key ( keys %$rptr_up_admin ) {
my $up = $rptr_up_admin->{$key};
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
$i_up_admin->{$key} = 'up' if $up =~ /enabled/;
$i_up_admin->{$key} = 'down' if $up =~ /disabled/;
}
return $i_up_admin;
}
sub i_up {
my $l1 = shift;
my $i_up = $l1->i_up2();
my $rptr_up = $l1->rptr_up();
my $l1 = shift;
my $partial = shift;
foreach my $key (keys %$rptr_up){
my $i_up = $l1->SUPER::i_up($partial) || {};
my $rptr_up = $l1->rptr_up($partial) || {};
foreach my $key ( keys %$rptr_up ) {
my $up = $rptr_up->{$key};
$i_up->{$key} = 'up' if $up =~ /operational/;
$i_up->{$key} = 'up' if $up =~ /operational/;
}
return $i_up;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer1 - Perl5 Interface to network devices serving Layer1 only.
SNMP::Info::Layer1 - SNMP Interface to network devices serving Layer1 only.
=head1 AUTHOR
@@ -170,14 +176,13 @@ Max Baker
my $l1 = 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 = $l1->class();
my $class = $l1->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
# Let's get some basic Port information
@@ -194,14 +199,15 @@ Max Baker
=head1 DESCRIPTION
This class is usually used as a superclass for more specific device classes listed under
SNMP::Info::Layer1::* Please read all docs under SNMP::Info first.
This class is usually used as a superclass for more specific device classes
listed under SNMP::Info::Layer1::* Please read all docs under SNMP::Info
first.
Provides abstraction to the configuration information obtainable from a
Layer1 device through SNMP. Information is stored in a number of MIBs.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $l1 = new SNMP::Info::Layer1(...);
@@ -217,15 +223,16 @@ a more specific class using the method above.
=over
=item SNMP-REPEATER-MIB
=item Inherited Classes
MIBs required for SNMP::Info
=item F<SNMP-REPEATER-MIB>
=back
SNMP-REPEATER-MIB needs to be extracted from ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
MIBs required for L<SNMP::Info/"Required MIBs">
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
F<SNMP-REPEATER-MIB> needs to be extracted from
ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
=head1 GLOBALS
@@ -237,7 +244,7 @@ These are methods that return scalar value from SNMP
Gets the number of ports under the interface mib
(B<ifNumber>)
(C<ifNumber>)
=back
@@ -245,9 +252,17 @@ Gets the number of ports under the interface mib
=over
=item $l1->model()
Cross references $l1->id() with product IDs.
For HP devices, removes C<'hpswitch'> from the name
For Cisco devices, removes C<'sysid'> from the name
=item $l1->vendor()
Trys to discover the vendor from $l1->model() and $l1->vendor()
Tries to discover the vendor from $l1->model() and $l1->vendor()
=item $l1->ports()
@@ -257,15 +272,15 @@ Adds the values from rptr_ports() and ports_managed()
Number of 'groups' in the Repeater MIB
(B<rptrGroupCapacity>)
(C<rptrGroupCapacity>)
=back
=head2 Globals imported from SNMP::Info
=head2 Global Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -276,10 +291,16 @@ to a hash.
=item $l1->interfaces()
Returns reference to the map between IID and physical Port.
=item $l1->i_up()
Returns reference to map of IIDs to link status.
=item $l1->i_up_admin()
Returns reference to map of IIDs to administrative link status.
=back
=head2 Repeater MIB
@@ -290,32 +311,36 @@ to a hash.
Number of ports in each group.
(B<rptrGroupPortCapacity>)
(C<rptrGroupPortCapacity>)
=item $l1->rptr_port()
Port number in Group
(B<rptrPortIndex>)
(C<rptrPortIndex>)
=item $l1->rptr_slot()
Group (slot) Number for given port.
(B<rptrPortGroupIndex>)
(C<rptrPortGroupIndex>)
=item $l1->rptr_up_admin()
(B<rptrPortAdminStatus>)
(C<rptrPortAdminStatus>)
=item $l1->rptr_up()
(B<rptrPortOperStatus>)
(C<rptrPortOperStatus>)
=item $l1->rptr_last_src()
(C<rptrAddrTrackNewLastSrcAddress>)
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=cut

View File

@@ -1,66 +1,60 @@
# SNMP::Info::Layer1::Allied
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer1::Allied;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer1;
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Allied::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Allied::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer1::GLOBALS,
'root_ip' => 'actualIPAddr',
);
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
'i_name2' => 'ifName',
'ati_p_name' => 'portName',
'ati_up' => 'linkTestLED',
);
%FUNCS = (
%SNMP::Info::Layer1::FUNCS,
'ati_p_name' => 'portName',
'ati_up' => 'linkTestLED',
);
%MIBS = (
%SNMP::Info::Layer1::MIBS,
'ATI-MIB' => 'atiPortGroupIndex'
);
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ATI-MIB' => 'atiPortGroupIndex' );
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
);
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
sub vendor {
return 'allied';
@@ -72,9 +66,9 @@ sub os {
sub os_ver {
my $allied = shift;
my $descr = $allied->description();
if ($descr =~ m/version (\d+\.\d+)/){
my $descr = $allied->description();
if ( $descr =~ m/version (\d+\.\d+)/ ) {
return $1;
}
}
@@ -84,39 +78,40 @@ sub model {
my $desc = $allied->description();
if ($desc =~ /(AT-\d{4}\S{1}?)/){
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
return $1;
}
return undef;
return;
}
sub i_name{
my $allied = shift;
sub i_name {
my $allied = shift;
my $partial = shift;
my $i_name = $allied->i_name2();
my $i_name = $allied->orig_i_name($partial) || {};
my $ati_p_name = $allied->ati_p_name($partial) || {};
my $ati_p_name = $allied->ati_p_name();
foreach my $port (keys %$ati_p_name){
foreach my $port ( keys %$ati_p_name ) {
my $name = $ati_p_name->{$port};
$i_name->{$port} = $name if (defined $name and $name !~ /^\s*$/);
$i_name->{$port} = $name if ( defined $name and $name !~ /^\s*$/ );
}
return $i_name;
}
sub i_up {
my $allied = shift;
my $allied = shift;
my $partial = shift;
my $i_up = SNMP::Info::Layer1::i_up($allied);
my $ati_up = $allied->ati_up();
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
my $ati_up = $allied->ati_up($partial) || {};
foreach my $port (keys %$ati_up){
foreach my $port ( keys %$ati_up ) {
my $up = $ati_up->{$port};
$i_up->{$port} = 'down' if $up eq 'linktesterror';
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
}
return $i_up;
}
1;
@@ -136,14 +131,13 @@ Max Baker
my $allied = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myhub',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $l1->class();
my $class = $allied->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -164,16 +158,14 @@ inherited methods.
=over
=item ATI-MIB
Download for your device from http://www.allied-telesyn.com/allied/support/
=item Inherited Classes
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
=item F<ATI-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -198,19 +190,19 @@ Culls Version from description()
Returns IP Address of Managed Hub.
(B<actualIpAddr>)
(C<actualIpAddr>)
=item $allied->model()
Trys to cull out AT-nnnnX out of the description field.
Tries to cull out C<AT-nnnnX> out of the description field.
=back
=head2 Global Methods imported from SNMP::Info::Layer1
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
=head2 Overrides
@@ -233,16 +225,16 @@ the values of ati_up() to 'up' and 'down'.
=item $allied->ati_p_name()
(B<portName>)
(C<portName>)
=item $allied->ati_up()
(B<linkTestLED>)
(C<linkTestLED>)
=back
=head2 Table Methods imported from SNMP::Info::Layer1
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
=cut

View File

@@ -1,81 +1,72 @@
# SNMP::Info::Layer1::Asante
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer1::Asante;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer1;
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Asante::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Asante::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer1::GLOBALS,
);
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
%FUNCS = (%SNMP::Info::Layer1::FUNCS,
'i_speed2' => 'ifSpeed',
'i_mac2' => 'ifPhysAddress',
'i_descr2' => 'ifDescr',
'i_name2' => 'ifName',
'asante_port' => 'ePortIndex',
'asante_group' => 'ePortGrpIndex',
'i_type' => 'ePortStateType',
'asante_up' => 'ePortStateLinkStatus',
);
%FUNCS = (
%SNMP::Info::Layer1::FUNCS,
'asante_port' => 'ePortIndex',
'asante_group' => 'ePortGrpIndex',
'i_type' => 'ePortStateType',
'asante_up' => 'ePortStateLinkStatus',
);
%MIBS = (
%SNMP::Info::Layer1::MIBS,
'ASANTE-HUB1012-MIB' => 'asante'
);
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
%MUNGE = (%SNMP::Info::Layer1::MUNGE,
'i_mac2' => \&SNMP::Info::munge_mac,
'i_speed2' => \&SNMP::Info::munge_speed,
);
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
sub interfaces {
my $asante = shift;
my $asante = shift;
my $partial = shift;
my $rptr_port = $asante->rptr_port();
my $rptr_port = $asante->rptr_port($partial) || {};
my %interfaces;
foreach my $port (keys %$rptr_port){
foreach my $port ( keys %$rptr_port ) {
$interfaces{$port} = $port;
}
@@ -88,13 +79,13 @@ sub os {
sub os_ver {
my $asante = shift;
my $descr = $asante->description();
if ($descr =~ /software v(\d+\.\d+)/){
my $descr = $asante->description();
if ( $descr =~ /software v(\d+\.\d+)/ ) {
return $1;
}
}
sub vendor {
return 'asante';
}
@@ -102,31 +93,33 @@ sub vendor {
sub model {
my $asante = shift;
my $id = $asante->id();
my $id = $asante->id();
my $model = &SNMP::translateObj($id);
return $model;
}
sub i_up {
my $asante = shift;
my $asante = shift;
my $partial = shift;
my $asante_up = $asante->asante_up();
my $asante_up = $asante->asante_up($partial) || {};
my $i_up = {};
foreach my $port (keys %$asante_up){
foreach my $port ( keys %$asante_up ) {
my $up = $asante_up->{$port};
$i_up->{$port} = 'down' if $up =~ /on/;
$i_up->{$port} = 'up' if $up =~ /off/;
$i_up->{$port} = 'up' if $up =~ /off/;
}
return $i_up;
}
sub i_speed {
my $asante = shift;
my $asante = shift;
my $partial = shift;
my $i_speed = $asante->i_speed2();
my $i_speed = $asante->orig_i_speed($partial) || {};
my %i_speed;
@@ -136,9 +129,10 @@ sub i_speed {
}
sub i_mac {
my $asante = shift;
my $asante = shift;
my $partial = shift;
my $i_mac = $asante->i_mac2();
my $i_mac = $asante->orig_i_mac($partial) || {};
my %i_mac;
@@ -148,13 +142,14 @@ sub i_mac {
}
sub i_description {
return undef;
return;
}
sub i_name {
my $asante = shift;
my $asante = shift;
my $partial = shift;
my $i_name = $asante->i_descr2();
my $i_name = $asante->orig_i_descr($partial) || {};
my %i_name;
@@ -162,7 +157,9 @@ sub i_name {
return \%i_name;
}
1;
__END__
=head1 NAME
@@ -179,14 +176,13 @@ Max Baker
my $asante = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $asante->class();
my $class = $asante->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -206,14 +202,14 @@ Asante device through SNMP.
=over
=item ASANTE-HUB1012-MIB
Download from http://www.mibdepot.com
=item MIBs listed in SNMP::Info::Layer1
=item F<ASANTE-HUB1012-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
=head2 Overrides
@@ -234,20 +230,34 @@ Returns 'asante' :)
=item $asante->model()
Trys to cull out AT-nnnnX out of the description field.
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
the results.
=back
=head2 Globals inherited from SNMP::Info::Layer1
=head2 Global Methods imported from SNMP::Info::Layer1
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
=head2 Overrides
=over
=item $asante->interfaces()
Returns reference to the map between IID and physical Port.
=item $asante->i_description()
Description of the interface.
=item $asante->i_mac()
MAC address of the interface. Note this is just the MAC of the port, not
anything connected to it.
=item $asante->i_name()
Returns reference to map of IIDs to human-set port name.
@@ -255,7 +265,11 @@ Returns reference to map of IIDs to human-set port name.
=item $asante->i_up()
Returns reference to map of IIDs to link status. Changes
the values of ati_up() to 'up' and 'down'.
the values of asante_up() to 'up' and 'down'.
=item $asante->i_speed()
Speed of the link, human format.
=back
@@ -265,16 +279,16 @@ the values of ati_up() to 'up' and 'down'.
=item $asante->ati_p_name()
(B<portName>)
(C<portName>)
=item $asante->ati_up()
(B<linkTestLED>)
(C<linkTestLED>)
=back
=head2 Table Methods imported from SNMP::Info::Layer1
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
=cut

View File

@@ -1,85 +1,88 @@
# SNMP::Info::Layer1::Bayhub
# Eric Miller
# $Id$
#
# Copyright (c) 2004-6 Eric Miller, Max Baker
# Copyright (c) 2008 Eric Miller, Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer1::Bayhub;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::NortelStack;
use SNMP::Info::SONMP;
use SNMP::Info::NortelStack;
use SNMP::Info::Layer2;
@SNMP::Info::Layer1::Bayhub::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer1::Bayhub::ISA
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer1::Bayhub::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
'S5-COMMON-STATS-MIB' => 's5CmStat',
);
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'S5-ETHERNET-COMMON-MIB' => 's5EnPortTable',
'S5-COMMON-STATS-MIB' => 's5CmStat',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
);
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
# S5-ETHERNET-COMMON-MIB::s5EnPortTable
'bayhub_pb_index' => 's5EnPortBrdIndx',
'bayhub_pp_index' => 's5EnPortIndx',
'bayhub_up_admin' => 's5EnPortPartStatus',
'bayhub_up' => 's5EnPortLinkStatus',
# S5-COMMON-STATS-MIB::s5CmSNodeTable
'bayhub_nb_index' => 's5CmSNodeBrdIndx',
'bayhub_np_index' => 's5CmSNodePortIndx',
'fw_mac' => 's5CmSNodeMacAddr',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::NortelStack::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
# S5-ETHERNET-COMMON-MIB::s5EnPortTable
'bayhub_pb_index' => 's5EnPortBrdIndx',
'bayhub_pp_index' => 's5EnPortIndx',
'bayhub_up_admin' => 's5EnPortPartStatus',
'bayhub_up' => 's5EnPortLinkStatus',
# S5-ETHERNET-COMMON-MIB::s5EnPortExtTable
'bayhub_p_speed' => 's5EnPortExtActiveSpeed',
'bayhub_p_cap' => 's5EnPortExtHwCapability',
'bayhub_p_adv' => 's5EnPortExtAutoNegAdv',
# S5-COMMON-STATS-MIB::s5CmSNodeTable
'bayhub_nb_index' => 's5CmSNodeBrdIndx',
'bayhub_np_index' => 's5CmSNodePortIndx',
'fw_mac' => 's5CmSNodeMacAddr',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::NortelStack::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
sub layers {
return '00000011';
@@ -95,67 +98,78 @@ sub vendor {
sub model {
my $bayhub = shift;
my $id = $bayhub->id();
return undef unless defined $id;
my $id = $bayhub->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^sreg-//i;
return 'Baystack Hub' if ($model =~ /BayStackEth/);
return '5000' if ($model =~ /5000/);
return '5005' if ($model =~ /5005/);
return 'Baystack Hub' if ( $model =~ /BayStack/ );
return '5000' if ( $model =~ /5000/ );
return '5005' if ( $model =~ /5005/ );
return $model;
}
# Hubs do not support ifMIB requirements for get MAC
# and port status
# and port status
sub i_index {
my $bayhub = shift;
my $b_index = $bayhub->bayhub_pb_index();
my $p_index = $bayhub->bayhub_pp_index();
my $model = $bayhub->model();
my $bayhub = shift;
my $partial = shift;
my $b_index = $bayhub->bayhub_pb_index($partial) || {};
my $p_index = $bayhub->bayhub_pp_index($partial) || {};
my $model = $bayhub->model() || 'Baystack Hub';
my %i_index;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
my $port = $p_index->{$iid} || 0;
if ($model eq 'Baystack Hub') {
if ( $model eq 'Baystack Hub' ) {
my $comidx = $board;
if (! ($comidx % 5)) {
$board = ($board / 5);
} elsif ($comidx =~ /[16]$/) {
$board = int($board/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$board = int($board/5);
$port = 26;
}
}
if ( !( $comidx % 5 ) ) {
$board = ( $board / 5 );
}
elsif ( $comidx =~ /[16]$/ ) {
$board = int( $board / 5 );
$port = 25;
}
elsif ( $comidx =~ /[27]$/ ) {
$board = int( $board / 5 );
$port = 26;
}
}
my $index = ($board*256)+$port;
my $index = ( $board * 256 ) + $port;
$i_index{$iid} = $index;
}
return \%i_index;
}
# Partials don't really help in this class, but implemented
# for consistency
sub interfaces {
my $bayhub = shift;
my $i_index = $bayhub->i_index();
my $bayhub = shift;
my $partial = shift;
my $i_index = $bayhub->i_index() || {};
my %if;
foreach my $iid (keys %$i_index){
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
# Index numbers are deterministic slot * 256 + port
my $port = $index % 256;
my $slot = int($index / 256);
my $slot = int( $index / 256 );
my $slotport = "$slot.$port";
$if{$index} = $slotport;
}
@@ -163,95 +177,114 @@ sub interfaces {
}
sub i_duplex {
my $bayhub = shift;
my $port_index = $bayhub->i_index();
my $bayhub = shift;
my $partial = shift;
my $port_index = $bayhub->i_index() || {};
my %i_duplex;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $duplex = 'half';
$i_duplex{$index}=$duplex;
$i_duplex{$index} = $duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $bayhub = shift;
my $port_index = $bayhub->i_index();
my $bayhub = shift;
my $partial = shift;
my $port_index = $bayhub->i_index() || {};
my %i_duplex_admin;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $duplex = 'half';
$i_duplex_admin{$index}=$duplex;
$i_duplex_admin{$index} = $duplex;
}
return \%i_duplex_admin;
}
sub i_speed {
my $bayhub = shift;
my $port_index = $bayhub->i_index();
my $bayhub = shift;
my $partial = shift;
my $port_index = $bayhub->i_index() || {};
my $port_speed = $bayhub->bayhub_p_speed() || {};
my %i_speed;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
my $speed = '10 Mbps';
$i_speed{$index}=$speed;
next if ( defined $partial and $index !~ /^$partial$/ );
my $speed = $port_speed->{$iid} || '10 Mbps';
$speed = '10 Mbps' if $speed =~ /bps10M/i;
$speed = '100 Mbps' if $speed =~ /bps100M/i;
$i_speed{$index} = $speed;
}
return \%i_speed;
}
sub i_up {
my $bayhub = shift;
my $port_index = $bayhub->i_index();
my $link_stat = $bayhub->bayhub_up();
my $bayhub = shift;
my $partial = shift;
my $port_index = $bayhub->i_index() || {};
my $link_stat = $bayhub->bayhub_up() || {};
my %i_up;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $link_stat = $link_stat->{$iid};
next unless defined $link_stat;
$link_stat = 'up' if $link_stat =~ /on/i;
$link_stat = 'up' if $link_stat =~ /on/i;
$link_stat = 'down' if $link_stat =~ /off/i;
$i_up{$index}=$link_stat;
$i_up{$index} = $link_stat;
}
return \%i_up;
}
sub i_up_admin {
my $bayhub = shift;
my $i_index = $bayhub->i_index();
my $link_stat = $bayhub->bayhub_up_admin();
my $bayhub = shift;
my $partial = shift;
my $i_index = $bayhub->i_index() || {};
my $link_stat = $bayhub->bayhub_up_admin() || {};
my %i_up_admin;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $link_stat = $link_stat->{$iid};
next unless defined $link_stat;
$i_up_admin{$index}=$link_stat;
$i_up_admin{$index} = $link_stat;
}
return \%i_up_admin;
}
sub set_i_up_admin {
# map setting to those the hub will understand
my %setting = qw/up 2 down 3/;
my $bayhub = shift;
my ($setting, $iid) = @_;
my ( $setting, $iid ) = @_;
my $i_index = $bayhub->i_index();
my $i_index = $bayhub->i_index() || {};
my %reverse_i_index = reverse %$i_index;
$setting = lc($setting);
@@ -260,36 +293,41 @@ sub set_i_up_admin {
$iid = $reverse_i_index{$iid};
return $bayhub->set_bayhub_up_admin($setting{$setting}, $iid);
return $bayhub->set_bayhub_up_admin( $setting{$setting}, $iid );
}
# Hubs do not support the standard Bridge MIB
sub bp_index {
my $bayhub = shift;
my $b_index = $bayhub->bayhub_nb_index();
my $p_index = $bayhub->bayhub_np_index();
my $model = $bayhub->model();
my $bayhub = shift;
my $partial = shift;
my $b_index = $bayhub->bayhub_nb_index() || {};
my $p_index = $bayhub->bayhub_np_index() || {};
my $model = $bayhub->model() || 'Baystack Hub';
my %bp_index;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
if ($model eq 'Baystack Hub') {
my $comidx = $board;
if (! ($comidx % 5)) {
$board = ($board / 5);
} elsif ($comidx =~ /[16]$/) {
$board = int($board/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$board = int($board/5);
$port = 26;
}
}
my $port = $p_index->{$iid} || 0;
my $index = ($board*256)+$port;
if ( $model eq 'Baystack Hub' ) {
my $comidx = $board;
if ( !( $comidx % 5 ) ) {
$board = ( $board / 5 );
}
elsif ( $comidx =~ /[16]$/ ) {
$board = int( $board / 5 );
$port = 25;
}
elsif ( $comidx =~ /[27]$/ ) {
$board = int( $board / 5 );
$port = 26;
}
}
my $index = ( $board * 256 ) + $port;
next if ( defined $partial and $index !~ /^$partial$/ );
$bp_index{$index} = $index;
}
@@ -297,33 +335,37 @@ sub bp_index {
}
sub fw_port {
my $bayhub = shift;
my $b_index = $bayhub->bayhub_nb_index();
my $p_index = $bayhub->bayhub_np_index();
my $model = $bayhub->model();
my $bayhub = shift;
my $partial = shift;
my $b_index = $bayhub->bayhub_nb_index($partial) || {};
my $p_index = $bayhub->bayhub_np_index($partial) || {};
my $model = $bayhub->model() || 'Baystack Hub';
my %fw_port;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
my $port = $p_index->{$iid} || 0;
if ($model eq 'Baystack Hub') {
my $comidx = $board;
if (! ($comidx % 5)) {
$board = ($board / 5);
} elsif ($comidx =~ /[16]$/) {
$board = int($board/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$board = int($board/5);
$port = 26;
}
}
my $index = ($board*256)+$port;
if ( $model eq 'Baystack Hub' ) {
my $comidx = $board;
if ( !( $comidx % 5 ) ) {
$board = ( $board / 5 );
}
elsif ( $comidx =~ /[16]$/ ) {
$board = int( $board / 5 );
$port = 25;
}
elsif ( $comidx =~ /[27]$/ ) {
$board = int( $board / 5 );
$port = 26;
}
}
$fw_port{$iid} = $index;
my $index = ( $board * 256 ) + $port;
$fw_port{$iid} = $index;
}
return \%fw_port;
}
@@ -336,6 +378,92 @@ sub slot_offset {
return 0;
}
# Devices do not support ENTITY-MIB use proprietary methods.
sub e_index {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_index($partial);
}
sub e_class {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_class($partial);
}
sub e_descr {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_descr($partial);
}
sub e_name {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_name($partial);
}
sub e_fwver {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_fwver($partial);
}
sub e_hwver {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_hwver($partial);
}
sub e_parent {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_parent($partial);
}
sub e_pos {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_pos($partial);
}
sub e_serial {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_serial($partial);
}
sub e_swver {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_swver($partial);
}
sub e_type {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_type($partial);
}
sub e_vendor {
my $stack = shift;
my $partial = shift;
return $stack->ns_e_vendor($partial);
}
1;
__END__
@@ -354,7 +482,6 @@ Eric Miller
my $bayhub = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -368,10 +495,11 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Bayhub device through SNMP. Also provides device MAC to port mapping through the propietary MIB.
Bay hub device through SNMP. Also provides device MAC to port mapping through
the proprietary MIB.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
@@ -379,9 +507,7 @@ my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::Layer2
=item SNMP::Info::NortelStack
@@ -393,22 +519,20 @@ my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
=over
=item S5-ETHERNET-COMMON-MIB
=item F<S5-ETHERNET-COMMON-MIB>
=item S5-COMMON-STATS-MIB
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See SNMP::Info::NortelStack for its own MIB requirements.
See SNMP::Info::SONMP for its own MIB requirements.
=item F<S5-COMMON-STATS-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -425,10 +549,10 @@ Returns 'bay_hub'
=item $bayhub->model()
Cross references $bayhub->id() to the SYNOPTICS-MIB and returns
Cross references $bayhub->id() to the F<SYNOPTICS-MIB> and returns
the results.
Removes sreg- from the model name
Removes either Baystack Hub, 5000, or 5005 depending on the model.
=back
@@ -438,7 +562,8 @@ Removes sreg- from the model name
=item $bayhub->layers()
Returns 00000011. Class emulates Layer 2 functionality through proprietary MIBs.
Returns 00000011. Class emulates Layer 2 functionality through proprietary
MIBs.
=item $bayhub->index_factor()
@@ -452,23 +577,19 @@ start at 0. Returns 0.
=back
=head2 Globals imported from SNMP::Info
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::NortelStack
See documentation in SNMP::Info::NortelStack for details.
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -481,7 +602,7 @@ to a hash.
Returns reference to map of IIDs to Interface index.
Since hubs do not support ifIndex, the interface index is created using the
Since hubs do not support C<ifIndex>, the interface index is created using the
formula (board * 256 + port).
=item $bayhub->interfaces()
@@ -498,21 +619,21 @@ Returns half, hubs do not support full duplex.
=item $bayhub->i_speed()
Currently returns 10 Mbps. The class does not currently support 100 Mbps hubs.
Returns interface speed.
=item $bayhub->i_up()
Returns (B<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
Returns (C<s5EnPortLinkStatus>) for each port. Translates on/off to up/down.
=item $bayhub->i_up_admin()
Returns (B<s5EnPortPartStatus>) for each port.
Returns (C<s5EnPortPartStatus>) for each port.
=item $bayhub->set_i_up_admin(state, ifIndex)
Sets port state, must be supplied with state and port ifIndex
Sets port state, must be supplied with state and port C<ifIndex>
State choices are 'up'or 'down'
State choices are 'up' or 'down'
Example:
my %if_map = reverse %{$bayhub->interfaces()};
@@ -526,29 +647,83 @@ both the keys and values.
=item $bayhub->fw_port()
Returns reference to map of IIDs of the S5-COMMON-STATS-MIB::s5CmSNodeTable
Returns reference to map of IIDs of the C<S5-COMMON-STATS-MIB::s5CmSNodeTable>
to the Interface index.
=item $bayhub->fw_mac()
(B<s5CmSNodeMacAddr>)
(C<s5CmSNodeMacAddr>)
=back
=head2 Table Methods imported from SNMP::Info
=head2 Pseudo F<ENTITY-MIB> Information
See documentation in SNMP::Info for details.
These devices do not support F<ENTITY-MIB>. These methods emulate Physical
Table methods using F<S5-CHASSIS-MIB>. See
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
=over
See documentation in SNMP::Info::Bridge for details.
=item $bayhub->e_index()
Returns ns_e_index().
=item $bayhub->e_class()
Returns ns_e_class().
=item $bayhub->e_descr()
Returns ns_e_descr().
=item $bayhub->e_name()
Returns ns_e_name().
=item $bayhub->e_fwver()
Returns ns_e_fwver().
=item $bayhub->e_hwver()
Returns ns_e_hwver().
=item $bayhub->e_parent()
Returns ns_e_parent().
=item $bayhub->e_pos()
Returns ns_e_pos().
=item $bayhub->e_serial()
Returns ns_e_serial().
=item $bayhub->e_swver()
Returns ns_e_swver().
=item $bayhub->e_type()
Returns ns_e_type().
=item $bayhub->e_vendor()
Returns ns_e_vendor().
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::NortelStack
See documentation in SNMP::Info::NortelStack for details.
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=cut

444
Info/Layer1/Cyclades.pm Normal file
View File

@@ -0,0 +1,444 @@
# SNMP::Info::Layer1::Cyclades
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer1::Cyclades;
use strict;
use Exporter;
use SNMP::Info::Layer1;
@SNMP::Info::Layer1::Cyclades::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer1::MIBS,
'CYCLADES-ACS-SYS-MIB' => 'cyACSversion',
'CYCLADES-ACS-CONF-MIB' => 'cyEthIPaddr',
'CYCLADES-ACS-INFO-MIB' => 'cyISPortTty',
);
%GLOBALS = (
# CYCLADES-ACS-SYS-MIB
%SNMP::Info::Layer1::GLOBALS,
'os_ver' => 'cyACSversion',
'cy_model' => 'cyACSpname',
'serial' => 'cyACSDevId',
'root_ip' => 'cyEthIPaddr',
'ps1_status' => 'cyACSPw1',
'ps2_status' => 'cyACSPw2',
);
%FUNCS = (
%SNMP::Info::Layer1::FUNCS,
# CYCLADES-ACS-INFO-MIB::cyInfoSerialTable
'cy_port_tty' => 'cyISPortTty',
'cy_port_name' => 'cyISPortName',
'cy_port_speed' => 'cyISPortSpeed',
'cy_port_cd' => 'cyISPortSigCD',
# CYCLADES-ACS-CONF-MIB::cySerialPortTable
'cy_port_socket' => 'cySPortSocketPort',
);
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
# These devices don't have a FDB and we probably don't want to poll for ARP
# cache so turn off reported L2/L3.
sub layers {
return '01000001';
}
sub os {
return 'cyclades';
}
sub vendor {
return 'cyclades';
}
sub model {
my $cyclades = shift;
my $model = $cyclades->cy_model();
return unless defined $model;
return lc($model);
}
# Extend interface methods to include serial ports
#
# Partials don't really help in this class, but implemented
# for consistency
sub i_index {
my $cyclades = shift;
my $partial = shift;
my $orig_index = $cyclades->orig_i_index($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my %i_index;
foreach my $iid ( keys %$orig_index ) {
my $index = $orig_index->{$iid};
next unless defined $index;
$i_index{$iid} = $index;
}
# Use alternative labeling system for the serial port, listening socket
# to avoid conflicts with ifIndex.
foreach my $iid ( keys %$cy_index ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
$i_index{$index} = $index;
}
return \%i_index;
}
sub interfaces {
my $cyclades = shift;
my $partial = shift;
my $i_descr = $cyclades->orig_i_description($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my $cy_p_tty = $cyclades->cy_port_tty() || {};
my %if;
foreach my $iid ( keys %$i_descr ) {
my $descr = $i_descr->{$iid};
next unless defined $descr;
$if{$iid} = $descr;
}
foreach my $iid ( keys %$cy_p_tty ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $name = $cy_p_tty->{$iid};
next unless defined $name;
$if{$index} = $name;
}
return \%if;
}
sub i_speed {
my $cyclades = shift;
my $partial = shift;
my $i_speed = $cyclades->orig_i_speed($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my $cy_p_speed = $cyclades->cy_port_speed() || {};
my %i_speed;
foreach my $iid ( keys %$i_speed ) {
my $speed = $i_speed->{$iid};
next unless defined $speed;
$i_speed{$iid} = $speed;
}
foreach my $iid ( keys %$cy_p_speed ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $speed = $cy_p_speed->{$iid};
next unless defined $speed;
$i_speed{$index} = $speed;
}
return \%i_speed;
}
sub i_up {
my $cyclades = shift;
my $partial = shift;
my $i_up = $cyclades->orig_i_up($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my $cy_p_up = $cyclades->cy_port_cd() || {};
my %i_up;
foreach my $iid ( keys %$i_up ) {
my $up = $i_up->{$iid};
next unless defined $up;
$i_up{$iid} = $up;
}
foreach my $iid ( keys %$cy_p_up ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $up = $cy_p_up->{$iid};
next unless defined $up;
$i_up{$index} = $up;
}
return \%i_up;
}
sub i_description {
my $cyclades = shift;
my $partial = shift;
my $i_desc = $cyclades->orig_i_description($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my $cy_p_desc = $cyclades->cy_port_name() || {};
my %descr;
foreach my $iid ( keys %$i_desc ) {
my $desc = $i_desc->{$iid};
next unless defined $desc;
$descr{$iid} = $desc;
}
foreach my $iid ( keys %$cy_p_desc ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $desc = $cy_p_desc->{$iid};
next unless defined $desc;
$descr{$index} = $desc;
}
return \%descr;
}
sub i_name {
my $cyclades = shift;
my $partial = shift;
my $i_name = $cyclades->orig_i_name($partial) || {};
my $cy_index = $cyclades->cy_port_socket() || {};
my $cy_p_desc = $cyclades->cy_port_name() || {};
my %i_name;
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_name{$iid} = $name;
}
foreach my $iid ( keys %$cy_p_desc ) {
my $index = $cy_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $name = $cy_p_desc->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
return \%i_name;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer1::Cyclades - SNMP Interface to Cyclades terminal servers
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
#Let SNMP::Info determine the correct subclass for you.
my $cyclades = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $cyclades->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Cyclades 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 $cyclades = new SNMP::Info::Layer1::Cyclades(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer1
=back
=head2 Required MIBs
=over
=item F<CYCLADES-ACS-SYS-MIB>
=item F<CYCLADES-ACS-CONF-MIB>
=item F<CYCLADES-ACS-INFO-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer1/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $cyclades->os_ver()
(C<cyACSversion>)
=item $cyclades->serial()
(C<cyACSDevId>)
=item $cyclades->root_ip()
(C<cyEthIPaddr>)
=item $cyclades->ps1_status()
(C<cyACSPw1>)
=item $cyclades->ps2_status()
(C<cyACSPw2>)
=back
=head2 Overrides
=over
=item $cyclades->layers()
Returns 01000001. These devices don't have a FDB and we probably don't want
to poll for an ARP cache so turn off reported Layer 2 and Layer 3.
=item $cyclades->vendor()
Returns 'cyclades'
=item $cyclades->os()
Returns 'cyclades'
=item $cyclades->model()
Returns lower case (C<cyACSpname>)
=back
=head2 Globals imported from SNMP::Info::Layer1
See L<SNMP::Info::Layer1/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $cyclades->i_index()
Returns reference to map of IIDs to Interface index.
Extended to include serial ports. Serial ports are indexed with the
alternative labeling system for the serial port, the listening socket port
C<cySPortSocketPort> to avoid conflicts with C<ifIndex>.
=item $cyclades->interfaces()
Returns reference to map of IIDs to physical ports. Extended to include
serial ports, C<cyISPortTty>.
=item $cyclades->i_speed()
Returns interface speed. Extended to include serial ports, C<cyISPortSpeed>.
=item $cyclades->i_up()
Returns link status for each port. Extended to include serial ports,
C<cyISPortSigCD>.
=item $cyclades->i_description()
Returns description of each port. Extended to include serial ports,
C<cyISPortName>.
=item $cyclades->i_name()
Returns name of each port. Extended to include serial ports, C<cyISPortName>.
=back
=head2 Table Methods imported from SNMP::Info::Layer1
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
=cut

View File

@@ -1,84 +1,84 @@
# SNMP::Info::Layer1::S3000
# Eric Miller
# $Id$
#
# Copyright (c) 2006 Eric Miller
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer1::S3000;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info::Layer1;
use SNMP::Info::Bridge;
use SNMP::Info::Layer2;
@SNMP::Info::Layer1::S3000::ISA = qw/SNMP::Info::Layer1 SNMP::Info::Bridge/;
@SNMP::Info::Layer1::S3000::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer1::S3000::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::Layer1::MIBS,
%SNMP::Info::Bridge::MIBS,
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
);
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'SYNOPTICS-ETHERNET-MIB' => 's3EnetPortTable',
'SYNOPTICS-COMMON-MIB' => 's3AgentType',
);
%GLOBALS = (
%SNMP::Info::Layer1::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
# From SYNOPTICS-COMMON-MIB
'os_bin' => 's3AgentFwVer',
's3000_major_ver' => 's3AgentSwMajorVer',
's3000_minor_ver' => 's3AgentSwMinorVer',
's3000_maint_ver' => 's3AgentSwMaintVer',
);
%SNMP::Info::Layer2::GLOBALS,
%FUNCS = (
%SNMP::Info::Layer1::FUNCS,
%SNMP::Info::Bridge::FUNCS,
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
's3000_pb_index' => 's3EnetPortBoardIndex',
's3000_pp_index' => 's3EnetPortIndex',
's3000_up_admin' => 's3EnetPortPartStatus',
's3000_up' => 's3EnetPortLinkStatus',
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
's3000_np_index' => 's3EnetShowNodesPortIndex',
'fw_mac' => 's3EnetShowNodesMacAddress',
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
's3000_topo_port' => 's3EnetTopNmmPort',
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
);
# From SYNOPTICS-COMMON-MIB
'os_bin' => 's3AgentFwVer',
's3000_major_ver' => 's3AgentSwMajorVer',
's3000_minor_ver' => 's3AgentSwMinorVer',
's3000_maint_ver' => 's3AgentSwMaintVer',
);
%MUNGE = (
%SNMP::Info::Layer1::MUNGE,
%SNMP::Info::Bridge::MUNGE,
's3000_topo_mac' => \&SNMP::Info::munge_mac
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
# SYNOPTICS-ETHERNET-MIB::s3EnetPortTable
's3000_pb_index' => 's3EnetPortBoardIndex',
's3000_pp_index' => 's3EnetPortIndex',
's3000_up_admin' => 's3EnetPortPartStatus',
's3000_up' => 's3EnetPortLinkStatus',
# SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
's3000_nb_index' => 's3EnetShowNodesSlotIndex',
's3000_np_index' => 's3EnetShowNodesPortIndex',
'fw_mac' => 's3EnetShowNodesMacAddress',
# SYNOPTICS-ETHERNET-MIB::s3EnetTopNmmTable
's3000_topo_port' => 's3EnetTopNmmPort',
's3000_topo_mac' => 's3EnetTopNmmMacAddr',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, 's3000_topo_mac' => \&SNMP::Info::munge_mac
);
sub layers {
return '00000011';
@@ -94,77 +94,87 @@ sub vendor {
sub model {
my $s3000 = shift;
my $id = $s3000->id();
return undef unless defined $id;
my $id = $s3000->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^s3reg-//i;
return $1 if ($model =~ /((\d+){3}[\dX])/);
return $1 if ( $model =~ /((\d+){3}[\dX])/ );
return $model;
}
sub os_ver {
my $s3000 = shift;
my $s3000 = shift;
my $major_ver = $s3000->s3000_major_ver() || 0;
my $minor_ver = $s3000->s3000_minor_ver() || 0;
my $maint_ver = $s3000->s3000_maint_ver() || 0;
my $ver = "$major_ver.$minor_ver.$maint_ver";
return $ver;
my $ver = "$major_ver.$minor_ver.$maint_ver";
return $ver;
}
sub mac {
my $s3000 = shift;
my $s3000 = shift;
my $topo_port = $s3000->s3000_topo_port();
my $topo_mac = $s3000->s3000_topo_mac();
foreach my $entry (keys %$topo_port){
my $topo_mac = $s3000->s3000_topo_mac();
foreach my $entry ( keys %$topo_port ) {
my $port = $topo_port->{$entry};
next unless $port == 0;
my $mac = $topo_mac->{$entry};
return $mac;
}
# Topology turned off, not supported.
return undef;
return;
}
# Hubs do not support ifMIB requirements for get MAC
# and port status
# and port status
sub i_index {
my $s3000 = shift;
my $b_index = $s3000->s3000_pb_index();
my $p_index = $s3000->s3000_pp_index();
my $s3000 = shift;
my $partial = shift;
my $b_index = $s3000->s3000_pb_index($partial) || {};
my $p_index = $s3000->s3000_pp_index($partial) || {};
my %i_index;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
my $port = $p_index->{$iid} || 0;
# We need to make up an index for multiple board instances.
my $index = ($board*256)+$port;
my $index = ( $board * 256 ) + $port;
$i_index{$iid} = $index;
}
return \%i_index;
}
# Partials don't really help in this class, but implemented
# for consistency
sub interfaces {
my $s3000 = shift;
my $i_index = $s3000->i_index();
my $s3000 = shift;
my $partial = shift;
my $i_index = $s3000->i_index() || {};
my %if;
foreach my $iid (keys %$i_index){
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
# Index numbers are deterministic slot * 256 + port - see i_index()
my $port = $index % 256;
my $slot = int($index / 256);
my $slot = int( $index / 256 );
my $slotport = "$slot.$port";
$if{$index} = $slotport;
}
@@ -172,98 +182,114 @@ sub interfaces {
}
sub i_duplex {
my $s3000 = shift;
my $port_index = $s3000->i_index();
my $s3000 = shift;
my $partial = shift;
my $port_index = $s3000->i_index() || {};
my %i_duplex;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
# Hubs only function half duplex
my $duplex = 'half';
$i_duplex{$index}=$duplex;
$i_duplex{$index} = $duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $s3000 = shift;
my $port_index = $s3000->i_index();
my $s3000 = shift;
my $partial = shift;
my $port_index = $s3000->i_index() || {};
my %i_duplex_admin;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
# Hubs only function half duplex
# Hubs only function half duplex
my $duplex = 'half';
$i_duplex_admin{$index}=$duplex;
$i_duplex_admin{$index} = $duplex;
}
return \%i_duplex_admin;
}
sub i_speed {
my $s3000 = shift;
my $port_index = $s3000->i_index();
my $s3000 = shift;
my $partial = shift;
my $port_index = $s3000->i_index() || {};
my %i_speed;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
# These hubs only support 10Mbs
# These hubs only support 10 Mbs
my $speed = '10000000';
$i_speed{$index}=$speed;
$i_speed{$index} = $speed;
}
return \%i_speed;
}
sub i_up {
my $s3000 = shift;
my $port_index = $s3000->i_index();
my $link_stat = $s3000->s3000_up();
my $s3000 = shift;
my $partial = shift;
my $port_index = $s3000->i_index() || {};
my $link_stat = $s3000->s3000_up() || {};
my %i_up;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $link_stat = $link_stat->{$iid};
next unless defined $link_stat;
$link_stat = 'up' if $link_stat =~ /on/i;
$link_stat = 'up' if $link_stat =~ /on/i;
$link_stat = 'down' if $link_stat =~ /off/i;
$i_up{$index}=$link_stat;
$i_up{$index} = $link_stat;
}
return \%i_up;
}
sub i_up_admin {
my $s3000 = shift;
my $i_index = $s3000->i_index();
my $link_stat = $s3000->s3000_up_admin();
my $s3000 = shift;
my $partial = shift;
my $i_index = $s3000->i_index() || {};
my $link_stat = $s3000->s3000_up_admin() || {};
my %i_up_admin;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
next if ( defined $partial and $index !~ /^$partial$/ );
my $link_stat = $link_stat->{$iid};
next unless defined $link_stat;
$i_up_admin{$index}=$link_stat;
$i_up_admin{$index} = $link_stat;
}
return \%i_up_admin;
}
sub set_i_up_admin {
# map setting to those the hub will understand
my %setting = qw/up 2 down 3/;
my $s3000 = shift;
my ($setting, $iid) = @_;
my ( $setting, $iid ) = @_;
my $i_index = $s3000->i_index();
my $i_index = $s3000->i_index() || {};
my %reverse_i_index = reverse %$i_index;
$setting = lc($setting);
@@ -272,23 +298,26 @@ sub set_i_up_admin {
$iid = $reverse_i_index{$iid};
return $s3000->set_s3000_up_admin($setting{$setting}, $iid);
return $s3000->set_s3000_up_admin( $setting{$setting}, $iid );
}
# Hubs do not support the standard Bridge MIB
sub bp_index {
my $s3000 = shift;
my $b_index = $s3000->s3000_nb_index();
my $p_index = $s3000->s3000_np_index();
my $model = $s3000->model();
my $s3000 = shift;
my $partial = shift;
my $b_index = $s3000->s3000_nb_index() || {};
my $p_index = $s3000->s3000_np_index() || {};
my $model = $s3000->model();
my %bp_index;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
my $index = ($board*256)+$port;
my $port = $p_index->{$iid} || 0;
my $index = ( $board * 256 ) + $port;
next if ( defined $partial and $index !~ /^$partial$/ );
$bp_index{$index} = $index;
}
@@ -296,20 +325,22 @@ sub bp_index {
}
sub fw_port {
my $s3000 = shift;
my $b_index = $s3000->s3000_nb_index();
my $p_index = $s3000->s3000_np_index();
my $model = $s3000->model();
my $s3000 = shift;
my $partial = shift;
my $b_index = $s3000->s3000_nb_index($partial) || {};
my $p_index = $s3000->s3000_np_index($partial) || {};
my $model = $s3000->model();
my %fw_port;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $board = $b_index->{$iid};
next unless defined $board;
my $port = $p_index->{$iid}||0;
my $port = $p_index->{$iid} || 0;
my $index = ($board*256)+$port;
my $index = ( $board * 256 ) + $port;
$fw_port{$iid} = $index;
$fw_port{$iid} = $index;
}
return \%fw_port;
}
@@ -332,7 +363,6 @@ Eric Miller
my $s3000 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -346,10 +376,11 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Bayhub device through SNMP. Also provides device MAC to port mapping through the propietary MIB.
Bay hub device through SNMP. Also provides device MAC to port mapping through
the proprietary MIB.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $s3000 = new SNMP::Info::Layer1::S3000(...);
@@ -357,9 +388,7 @@ my $s3000 = new SNMP::Info::Layer1::S3000(...);
=over
=item SNMP::Info::Layer1
=item SNMP::Info::Bridge
=item SNMP::Info::Layer2
=back
@@ -367,18 +396,16 @@ my $s3000 = new SNMP::Info::Layer1::S3000(...);
=over
=item SYNOPTICS-COMMON-MIB
=item F<SYNOPTICS-COMMON-MIB>
=item SYNOPTICS-ETHERNET-MIB
=item Inherited Classes' MIBs
See SNMP::Info::Layer1 for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
=item F<SYNOPTICS-ETHERNET-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -395,20 +422,21 @@ Returns 'synoptics'
=item $s3000->model()
Cross references $s3000->id() to the SYNOPTICS-MIB and returns
Cross references $s3000->id() to the F<SYNOPTICS-MIB> and returns
the results.
Removes sreg- from the model name and returns only the numeric model identifier.
Removes C<sreg-> from the model name and returns only the numeric model
identifier.
=item $stack->os_ver()
Returns the software version specified as major.minor.maint.
(B<s3AgentSwMajorVer>).(B<s3AgentSwMinorVer>).(B<s3AgentSwMaintVer>)
(C<s3AgentSwMajorVer>).(C<s3AgentSwMinorVer>).(C<s3AgentSwMaintVer>)
=item $stack->os_bin()
Returns the firmware version. (B<s3AgentFwVer>)
Returns the firmware version. (C<s3AgentFwVer>)
=item $s3000->mac()
@@ -422,19 +450,16 @@ Returns MAC of the advertised IP address of the device.
=item $s3000->layers()
Returns 00000011. Class emulates Layer 2 functionality through proprietary MIBs.
Returns 00000011. Class emulates Layer 2 functionality through proprietary
MIBs.
=back
=head2 Globals imported from SNMP::Info::Layer1
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -447,8 +472,9 @@ to a hash.
Returns reference to map of IIDs to Interface index.
Since hubs do not support ifIndex, the interface index is created using the
formula (board * 256 + port). This is required to support devices with more than one module.
Since hubs do not support C<ifIndex>, the interface index is created using the
formula (board * 256 + port). This is required to support devices with more
than one module.
=item $s3000->interfaces()
@@ -464,21 +490,22 @@ Returns half, hubs do not support full duplex.
=item $s3000->i_speed()
Returns 10000000. The hubs only support 10Mbs Ethernet.
Returns 10000000. The hubs only support 10 Mbs Ethernet.
=item $s3000->i_up()
Returns (B<s3EnetPortLinkStatus>) for each port. Translates on/off to up/down.
Returns (C<s3EnetPortLinkStatus>) for each port. Translates on/off to
up/down.
=item $s3000->i_up_admin()
Returns (B<s3EnetPortPartStatus>) for each port.
Returns (C<s3EnetPortPartStatus>) for each port.
=item $s3000->set_i_up_admin(state, ifIndex)
Sets port state, must be supplied with state and port ifIndex
Sets port state, must be supplied with state and port C<ifIndex>
State choices are 'up'or 'down'
State choices are 'up' or 'down'
Example:
my %if_map = reverse %{$s3000->interfaces()};
@@ -492,33 +519,30 @@ both the keys and values.
=item $s3000->fw_port()
Returns reference to map of IIDs of the SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable
to the Interface index.
Returns reference to map of IIDs of the
C<SYNOPTICS-ETHERNET-MIB::s3EnetShowNodesTable> to the Interface index.
=item $s3000->fw_mac()
(B<s3EnetShowNodesMacAddress>)
(C<s3EnetShowNodesMacAddress>)
=item $s3000->s3000_topo_port()
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
Returns reference to hash. Key: Table entry, Value:Port Number
(interface iid)
(B<s3EnetTopNmmPort>)
(C<s3EnetTopNmmPort>)
=item $s3000->s3000_topo_mac()
(B<s3EnetTopNmmMacAddr>)
(C<s3EnetTopNmmMacAddr>)
Returns reference to hash. Key: Table entry, Value:Remote MAC address
=back
=head2 Table Methods imported from SNMP::Info::Layer1
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer1 for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,84 +1,89 @@
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
# Max Baker
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
# $Id$
#
# Copyright (c) 2004,2005 Max Baker -- All changes from Version 0.7 on
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::Entity;
use SNMP::Info::PowerEthernet;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE $INIT/;
@SNMP::Info::Layer2::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity Exporter/;
@SNMP::Info::Layer2::ISA
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
@SNMP::Info::Layer2::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::Entity::MIBS,
);
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
);
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::PowerEthernet::GLOBALS,
'serial1' =>
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::Entity::FUNCS,
);
%FUNCS = (
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::Entity::MUNGE,
);
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::PowerEthernet::MUNGE,
);
# Method OverRides
# $l2->model() - Looks at sysObjectID which gives the oid of the system
# name, contained in a propriatry MIB.
# name, contained in a propriatry MIB.
sub model {
my $l2 = shift;
my $id = $l2->id();
my $model = &SNMP::translateObj($id);
my $l2 = shift;
my $id = $l2->id();
my $model = &SNMP::translateObj($id) || $id || '';
# HP
$model =~ s/^hpswitch//i;
@@ -91,15 +96,15 @@ sub model {
}
sub vendor {
my $l2 = shift;
my $l2 = shift;
my $model = $l2->model();
my $descr = $l2->description();
if ($model =~ /hp/i or $descr =~ /\bhp\b/i) {
if ( $model =~ /hp/i or $descr =~ /\bhp\b/i ) {
return 'hp';
}
if ($model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i) {
if ( $model =~ /catalyst/i or $descr =~ /(catalyst|cisco)/i ) {
return 'cisco';
}
@@ -107,46 +112,50 @@ sub vendor {
sub serial {
my $l2 = shift;
my $serial1 = $l2->serial1();
my $e_descr = $l2->e_descr() || {};
my $e_serial = $l2->e_serial() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
my $serial1 = $l2->serial1();
my $e_descr = $l2->e_descr() || {};
my $e_serial = $l2->e_serial() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
# precedence
# serial2,chassis parse,serial1
return $serial2 if (defined $serial2 and $serial2 !~ /^\s*$/);
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
return $serial1 if (defined $serial1 and $serial1 !~ /^\s*$/);
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
return $1
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
return undef;
return;
}
sub i_ignore {
my $l2 = shift;
my $l2 = shift;
my $partial = shift;
my $i_type = $l2->i_type();
my $i_type = $l2->i_type($partial) || {};
my %i_ignore = ();
foreach my $if (keys %$i_type){
foreach my $if ( keys %$i_type ) {
my $type = $i_type->{$if};
$i_ignore{$if}++
if $type =~ /(loopback|propvirtual|other|cpu)/i;
$i_ignore{$if}++
if $type =~ /(loopback|other|cpu)/i;
}
return \%i_ignore;
}
}
sub interfaces {
my $l2 = shift;
my $interfaces = $l2->i_index();
my $i_descr = $l2->i_description();
my $l2 = shift;
my $partial = shift;
my $interfaces = $l2->i_index($partial) || {};
my $i_descr = $l2->i_description($partial) || {};
# Replace the Index with the ifDescr field.
foreach my $iid (keys %$i_descr){
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid};
next unless defined $port;
$interfaces->{$iid} = $port;
@@ -159,7 +168,7 @@ __END__
=head1 NAME
SNMP::Info::Layer2 - Perl5 Interface to network devices serving Layer2 only.
SNMP::Info::Layer2 - SNMP Interface to network devices serving Layer2 only.
=head1 AUTHOR
@@ -171,7 +180,6 @@ Max Baker
my $l2 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -194,14 +202,15 @@ Max Baker
=head1 DESCRIPTION
This class is usually used as a superclass for more specific device classes listed under
SNMP::Info::Layer2::* Please read all docs under SNMP::Info first.
This class is usually used as a superclass for more specific device classes
listed under SNMP::Info::Layer2::* Please read all docs under SNMP::Info
first.
Provides abstraction to the configuration information obtainable from a
Layer2 device through SNMP. Information is stored in a number of MIBs.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $l2 = new SNMP::Info::Layer2(...);
@@ -242,27 +251,31 @@ These are methods that return scalar value from SNMP
Cross references $l2->id() with product IDs in the
Cisco MIBs.
For HP devices, removes 'hpswitch' from the name
For HP devices, removes C<'hpswitch'> from the name
For Cisco devices, removes 'sysid' from the name
For Cisco devices, removes c<'sysid'> from the name
=item $l2->vendor()
Trys to discover the vendor from $l2->model() and $l2->description()
Tries to discover the vendor from $l2->model() and $l2->description()
=item $l2->serial()
Returns serial number if available through SNMP
=back
=head2 Globals imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head1 TABLE METHODS
@@ -275,28 +288,29 @@ to a hash.
=item $l2->interfaces()
Creates a map between the interface identifier (iid) and the physical port name.
Creates a map between the interface identifier (iid) and the physical port
name.
Defaults to B<ifDescr> but checks and overrides with B<ifName>
Defaults to C<ifDescr> but checks and overrides with C<ifName>
=item $l2->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores ports with B<ifType> of loopback,propvirtual,other, and cpu
Ignores ports with C<ifType> of loopback, propvirtual, other, and cpu
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=cut

269
Info/Layer2/Airespace.pm Normal file
View File

@@ -0,0 +1,269 @@
# SNMP::Info::Layer2::Airespace
# $Id$
#
# Copyright (c) 2008 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::Layer2::Airespace;
use strict;
use Exporter;
use SNMP::Info::Bridge;
use SNMP::Info::CDP;
use SNMP::Info::Airespace;
@SNMP::Info::Layer2::Airespace::ISA
= qw/SNMP::Info::Airespace SNMP::Info::CDP SNMP::Info::Bridge Exporter/;
@SNMP::Info::Layer2::Airespace::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::CDP::MIBS, %SNMP::Info::Airespace::MIBS,
'AIRESPACE-SWITCHING-MIB' => 'agentInterfaceVlanId',
'CISCO-LWAPP-DOT11-CLIENT-MIB' => 'cldcClientCurrentTxRateSet',
);
%GLOBALS = (
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
%SNMP::Info::CDP::FUNCS, %SNMP::Info::Airespace::FUNCS,
# This needs to be cleaned up, but for now we pretend to
# have the CISCO-DOT11-MIB for signal strengths, etc.
'cd11_sigstrength' => 'bsnMobileStationRSSI', # kinda
'cd11_sigqual' => 'bsnMobileStationSnr', # kinda
'cd11_rxbyte' => 'bsnMobileStationBytesReceived',
'cd11_txbyte' => 'bsnMobileStationBytesSent',
'cd11_rxpkt' => 'bsnMobileStationPacketsReceived',
'cd11_txpkt' => 'bsnMobileStationPacketsSent',
'cd11_txrate' => 'cldcClientCurrentTxRateSet',
'cd11_rateset' => 'cldcClientDataRateSet',
);
%MUNGE = (
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::Airespace::MUNGE,
'cd11_rxpkt' => \&munge_64bits,
'cd11_txpkt' => \&munge_64bits,
'cd11_txrate' => \&munge_cd11_txrate,
'cd11_rateset' => \&munge_cd11_rateset,
);
sub os {
return 'cisco';
}
sub vendor {
return 'cisco';
}
sub model {
my $airespace = shift;
my $model = $airespace->airespace_model();
return unless defined $model;
return $model;
}
# vlan:
# AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId
sub cd11_mac {
my $airespace = shift;
my $cd11_sigstrength = $airespace->cd11_sigstrength();
my $ret = {};
foreach my $idx ( keys %$cd11_sigstrength ) {
my $mac = join( ":", map { sprintf "%02x", $_ } split /\./, $idx );
$ret->{$idx} = $mac
}
return $ret;
}
sub munge_cd11_txrate {
my $rate = shift;
if ( $rate ) {
return [ $rate * 1.0 ];
} else {
return [ 0.0 ];
}
}
sub munge_cd11_rateset {
my $rates = shift;
return [ map { $_ * 1.0 } split /,/, $rates ];
}
sub munge_64bits {
# The controller sometimes hands off a ridiculous value for packets.
# Just truncate it to 32 bits.
my $value = shift;
return $value & 0xffffffff;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Airespace - SNMP Interface to Cisco (Airespace) Wireless
Controllers
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
#Let SNMP::Info determine the correct subclass for you.
my $airespace = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $airespace->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from
Cisco (Airespace) Wireless Controllers 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 $airespace = new SNMP::Info::Layer2::Airespace(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Airespace
=item SNMP::Info::CDP
=item SNMP::Info::Bridge
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $airespace->vendor()
Returns 'cisco'
=item $airespace->os()
Returns 'cisco'
=item $airespace->model()
(C<agentInventoryMachineModel>)
=back
=head2 Global Methods imported from SNMP::Info::Airespace
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item cd11_mac()
=back
=head2 Overrides
=head2 Table Methods imported from SNMP::Info::Airespace
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head1 MUNGES
=over
=item munge_64bits()
=item munge_cd11_rateset()
=item munge_cd11_txrate()
=back
=cut

View File

@@ -1,102 +1,132 @@
# SNMP::Info::Layer2::Aironet
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008-2009 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
#
# 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
# * 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.
#
# 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::Layer2::Aironet;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Entity;
use SNMP::Info::EtherLike;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CDP;
use SNMP::Info::IEEE802dot11;
@SNMP::Info::Layer2::Aironet::ISA = qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
SNMP::Info::CiscoStats SNMP::Info::CiscoVTP SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::Aironet::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::Aironet::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'serial' => 'entPhysicalSerialNum.1',
'descr' => 'sysDescr'
);
%SNMP::Info::IEEE802dot11::GLOBALS,
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'serial' => 'entPhysicalSerialNum.1',
'descr' => 'sysDescr'
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::Entity::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CDP::FUNCS,
'i_ssidlist' => 'cd11IfAuxSsid',
'i_ssidbcast' => 'cd11IfAuxSsidBroadcastSsid',
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
);
%FUNCS = (
%SNMP::Info::IEEE802dot11::FUNCS,
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::Entity::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CDP::FUNCS,
'i_80211channel' => 'cd11IfPhyDsssCurrentChannel',
'c_dot11subif' => 'cDot11ClientSubIfIndex',
'cd11_rateset' => 'cDot11ClientDataRateSet',
'cd11_txrate' => 'cDot11ClientCurrentTxRateSet',
'cd11_uptime' => 'cDot11ClientUpTime',
'cd11_sigstrength' => 'cDot11ClientSignalStrength',
'cd11_sigqual' => 'cDot11ClientSigQuality',
'cd11_rxpkt' => 'cDot11ClientPacketsReceived',
'cd11_txpkt' => 'cDot11ClientPacketsSent',
'cd11_rxbyte' => 'cDot11ClientBytesReceived',
'cd11_txbyte' => 'cDot11ClientBytesSent',
'mbss_mac_addr' => 'cdot11MbssidIfMacAddress',
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::Entity::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CDP::MIBS,
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
);
%MIBS = (
%SNMP::Info::IEEE802dot11::MIBS,
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::Entity::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CDP::MIBS,
'CISCO-DOT11-IF-MIB' => 'cd11IfAuxSsid',
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
);
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
);
%MUNGE = (
%SNMP::Info::IEEE802dot11::MUNGE,
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CDP::MUNGE,
'cd11_txrate' => \&munge_cd11_txrate,
'cd11_rateset' => \&munge_cd11_txrate,
'mbss_mac_addr' => \&SNMP::Info::munge_mac,
);
# Use 802.11 power level without putting IEEE802dot11 in @ISA
*SNMP::Info::Layer2::Aironet::dot11_cur_tx_pwr_mw
= \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
sub vendor {
# Sorry, but it's true.
return 'cisco';
}
sub interfaces {
my $aironet = shift;
my $i_description = $aironet->i_description();
my $partial = shift;
my $i_description = $aironet->i_description($partial);
return $i_description;
}
@@ -104,7 +134,7 @@ sub interfaces {
# Tag on e_descr.1
sub description {
my $aironet = shift;
my $descr = $aironet->descr();
my $descr = $aironet->descr();
my $e_descr = $aironet->e_descr();
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
@@ -115,10 +145,12 @@ sub description {
# Fetch duplex from EtherLike
sub i_duplex {
my $aironet = shift;
my $el_duplex = $aironet->el_duplex();
my $partial = shift;
my $el_duplex = $aironet->el_duplex($partial);
my %i_duplex;
foreach my $d (keys %$el_duplex){
foreach my $d ( keys %$el_duplex ) {
my $val = $el_duplex->{$d};
next unless defined $val;
$i_duplex{$d} = 'full' if $val =~ /full/i;
@@ -128,12 +160,290 @@ sub i_duplex {
return \%i_duplex;
}
#
# IOS 12.3 introduces the cDot11ClientSubIfIndex in the
# cDot11ClientConfigInfoTable, which supplies the ifIndex
# of the VLAN Subinterface if one exists, or of the primary
# interface if there are not subinterfaces. 12.2 used the
# Q-BRIDGE-MIB dot1qTpFdbTable but that was removed in 12.3.
sub _aironet_special {
my $aironet = shift;
my $os_ver = $aironet->os_ver();
if ( defined($os_ver)
&& $os_ver =~ /^(\d+)\.(\d+)(\D|$)/
&& ( ( $1 == 12 && $2 >= 3 ) || $1 > 12 ) )
{
return 1;
}
}
#
# INDEX { ifIndex, cd11IfAuxSsid, cDot11ClientAddress }
sub _aironet_breakout_dot11idx {
my $oid = shift;
my @parts = split( /\./, $oid );
my $ifindex = shift(@parts);
my $ssidlen = shift(@parts);
my $ssid = pack( "C*", splice( @parts, 0, $ssidlen ) );
my $mac = join( ":", map { sprintf "%02x", $_ } @parts );
return ( $ifindex, $ssid, $mac );
}
sub fw_mac {
my $aironet = shift;
return $aironet->qb_fw_mac() unless _aironet_special($aironet);
my $c_dot11subif = $aironet->c_dot11subif();
my $fw_mac = {};
foreach my $i ( keys %$c_dot11subif ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
$fw_mac->{$i} = $mac;
}
return $fw_mac;
}
sub fw_port {
my $aironet = shift;
return $aironet->qb_fw_port() unless _aironet_special($aironet);
my $c_dot11subif = $aironet->c_dot11subif();
my $fw_port = {};
foreach my $i ( keys %$c_dot11subif ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
$fw_port->{$i} = $c_dot11subif->{$i} || $ifindex;
}
return $fw_port;
}
sub bp_index {
my $aironet = shift;
return $aironet->orig_bp_index() unless _aironet_special($aironet);
my $c_dot11subif = $aironet->c_dot11subif();
my $bp_index = {};
foreach my $i ( keys %$c_dot11subif ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($i);
my ($i) = $c_dot11subif->{$i} || $ifindex;
$bp_index->{$i} = $i;
}
return $bp_index;
}
###
#
# VLAN support
#
sub v_name {
my $aironet = shift;
my $v_name = {};
my $vlan_nameid = $aironet->cdot11SecVlanNameId();
foreach my $i ( keys %$vlan_nameid ) {
my @parts = split( /\./, $i );
my $namelen = shift(@parts);
my $name = pack( "C*", @parts );
$v_name->{$i} = $name;
}
return $v_name;
}
sub v_index {
my $aironet = shift;
return $aironet->cdot11SecVlanNameId();
}
sub i_vlan {
my $aironet = shift;
my $i_vlan = {};
my $idxmap = $aironet->cviRoutedVlanIfIndex();
foreach my $i ( keys %$idxmap ) {
my @parts = split( /\./, $i );
$i_vlan->{ $idxmap->{$i} } = $parts[0];
}
return $i_vlan;
}
# The MIB reports in units of half a megabit, e.g.,
# 5.5Mbps is reported as 11.
sub munge_cd11_txrate {
my $txrates = shift;
my @units = unpack( "C*", $txrates );
my @rates = map {
my $unit = $_;
$unit *= 0.5;
} @units;
return \@rates;
}
# cd11 INDEX
sub cd11_port {
my $aironet = shift;
my $cd11_sigstrength = $aironet->cd11_sigstrength();
my $interfaces = $aironet->interfaces();
my %ret;
foreach ( keys %$cd11_sigstrength ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
$ret{$_} = $interfaces->{$ifindex};
}
return \%ret;
}
sub cd11_ssid {
my $aironet = shift;
my $cd11_sigstrength = $aironet->cd11_sigstrength();
my %ret;
foreach ( keys %$cd11_sigstrength ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
$ret{$_} = $ssid;
}
return \%ret;
}
sub cd11_mac {
my $aironet = shift;
my $cd11_sigstrength = $aironet->cd11_sigstrength();
my %ret;
foreach ( keys %$cd11_sigstrength ) {
my ( $ifindex, $ssid, $mac ) = _aironet_breakout_dot11idx($_);
$ret{$_} = $mac;
}
return \%ret;
}
# Map VLAN N on interface I to its actual ifIndex.
sub _vlan_map_n_stack {
my $aironet = shift;
my $vlan_idx = $aironet->cviRoutedVlanIfIndex();
my $vlan_map = {};
foreach my $idx ( keys %$vlan_idx ) {
my ( $vlan, $num ) = split( /\./, $idx );
$vlan_map->{$vlan}->{$num} = $vlan_idx->{$idx};
}
return $vlan_map;
}
# When using MBSS, the ifTable reports the
# base MAC address, but the actual association is
# with a different MAC address for MBSS.
# This convoluted path seems to be necessary
# to get the right overrides.
sub i_mac {
my $aironet = shift;
# no partial is possible due to the levels
# of indirection.
# Start with the ifPhysAddress, and override
my $mbss_mac = $aironet->orig_i_mac();
my $mbss_mac_addr = $aironet->mbss_mac_addr();
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
my $vlan_map = $aironet->cviRoutedVlanIfIndex();
my $ifstack = $aironet->ifStackStatus();
my $vlan_list = {};
foreach my $idx ( keys %$vlan_map ) {
my ( $vlan, $num ) = split( /\./, $idx );
push( @{ $vlan_list->{$vlan} }, $vlan_map->{$idx} );
}
my $stack = {};
foreach my $idx ( keys %$ifstack ) {
my ( $upper, $lower ) = split( /\./, $idx );
$stack->{$upper}->{$lower} = $ifstack->{$idx};
}
# mbss_mac_addr index is (radio, ssid).
# ssid_vlan maps ssid->vlan.
# vlan_map maps vlan->[list of interfaces]
# ifstack allows us to pick the right interface
foreach my $idx ( keys %$mbss_mac_addr ) {
my ( $interface, @ssid ) = split( /\./, $idx );
my $vlan = $ssid_vlan->{ join( ".", scalar(@ssid), @ssid ) };
next unless defined($vlan);
foreach my $vlanif ( @{ $vlan_list->{$vlan} } ) {
if ( defined( $stack->{$vlanif}->{$interface} ) ) {
$mbss_mac->{$vlanif} = $mbss_mac_addr->{$idx};
}
}
}
return $mbss_mac;
}
sub i_ssidlist {
my $aironet = shift;
# no partial is possible due to the levels
# of indirection.
my $ssid_row = $aironet->cdot11SecInterfSsidRowStatus();
my $ssid_vlan = $aironet->cdot11SecAuxSsidVlan();
if ( !defined($ssid_row) || !defined($ssid_vlan) ) {
return $aironet->cd11IfAuxSsid();
}
my $ssidlist = {};
my $if_ssidcount = {};
my $vlan_map = $aironet->_vlan_map_n_stack();
foreach my $idx ( keys %$ssid_row ) {
next unless $ssid_row->{$idx} eq 'active';
# ssid_row index is radio.ssid
my ( $interface, $ssid ) = split( /\./, $idx, 2 );
my ( $len, @ssidt ) = split( /\./, $ssid );
my $mappedintf = $vlan_map->{ $ssid_vlan->{$ssid} }->{$interface};
next unless $mappedintf;
if ( !$if_ssidcount->{$mappedintf} ) {
$if_ssidcount->{$mappedintf} = 1;
}
my $ssidlist_idx
= sprintf( "%s.%d", $mappedintf, $if_ssidcount->{$mappedintf} );
$ssidlist->{$ssidlist_idx} = pack( "C*", @ssidt );
$if_ssidcount->{$mappedintf}++;
}
return $ssidlist;
}
sub i_ssidbcast {
my $aironet = shift;
my $partial = shift;
my $mbss_bcast = $aironet->cdot11SecAuxSsidMbssidBroadcast();
if ( !defined($mbss_bcast) ) {
return $aironet->cd11IfAuxSsidBroadcastSsid($partial);
}
my $map = {};
foreach my $key ( keys %$mbss_bcast ) {
my (@idx) = split( /\./, $key );
my $len = shift(@idx);
$map->{ pack( "C*", @idx ) } = $mbss_bcast->{$key};
}
# This needs to return the same indexes as i_ssidlist.
# mbss_bcast maps ssid -> broadcasting
# so we just replace the i_ssidlist values with the mbss_bcast ones.
my $i_ssidlist = $aironet->i_ssidlist();
my $i_ssidbcast = {};
foreach my $key ( keys %$i_ssidlist ) {
$i_ssidbcast->{$key} = $map->{ $i_ssidlist->{$key} };
}
return $i_ssidbcast;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running IOS.
SNMP::Info::Layer2::Aironet - SNMP Interface to Cisco Aironet devices running
IOS.
=head1 AUTHOR
@@ -145,7 +455,6 @@ Max Baker
my $aironet = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -157,7 +466,8 @@ Max Baker
=head1 DESCRIPTION
Provides interface to SNMP Data available on newer Aironet devices running Cisco IOS.
Provides interface to SNMP Data available on newer Aironet devices running
Cisco IOS.
Note there are two classes for Aironet devices :
@@ -173,8 +483,8 @@ This class is for devices running Cisco IOS software (newer)
=back
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $aironet = new SNMP::Info::Layer2::Aironet(...);
@@ -188,7 +498,9 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
=item SNMP::Info::EtherLike
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoConfig
=back
@@ -214,23 +526,47 @@ Adds info from method e_descr() from SNMP::Info::Entity
=item $aironet->vendor()
Returns 'cisco' :)
Returns 'cisco'
=item $aironet->description()
System description
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EtherLike
See documentation in SNMP::Info::EtherLike for details.
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
=over
=item $aironet->cd11_port()
Returns radio interfaces.
=item $aironet->cd11_mac()
Returns radio interface MAC addresses.
=item $aironet->cd11_ssid()
Returns radio interface ssid.
=item $aironet->dot11_cur_tx_pwr_mw()
Current transmit power, in milliwatts, of the radio interface.
=back
=head2 Overrides
@@ -240,22 +576,75 @@ See documentation in SNMP::Info::EtherLike for details.
Uses the i_description() field.
=item $aironet->i_mac()
MAC address of the interface. Note this is just the MAC of the port, not
anything connected to it.
=item $aironet->i_duplex()
Crosses information from SNMP::Info::EtherLike to get duplex info for interfaces.
Crosses information from SNMP::Info::EtherLike to get duplex info for
interfaces.
=item $aironet->bp_index()
Returns reference to hash of bridge port table entries map back to interface
identifier (iid)
=item $aironet->fw_mac()
Returns reference to hash of forwarding table MAC Addresses
=item $aironet->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
=item $aironet->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $aironet->v_index()
Returns VLAN IDs
=item $aironet->v_name()
Returns VLAN names
=item $aironet->i_ssidlist()
Returns a list of SSIDs associated with interfaces. This function
is C<MBSSID> aware, so when using C<MBSSID> can map SSIDs to the sub-interface
to which they belong.
=item $aironet->i_ssidbcast()
With the same keys as i_ssidlist, returns whether the given SSID is
being broadcast.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::EtherLike
See documentation in SNMP::Info::EtherLike for details.
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
=head1 Data Munging Callback Subroutines
=over
=item $aironet->munge_cd11_txrate()
Converts units of half a megabit to human readable string.
=back
=cut

View File

@@ -1,65 +1,62 @@
# SNMP::Info::Layer2::Allied
# Max Baker, Dmitry Sergienko <dmitry@trifle.net>
# $Id$
#
# Copyright (c) 2004 Max Baker
# Copyright (c) 2008 Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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 Netdisco nor the
# names of its contributors may be used to endorse or promote products
# * 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.
#
# 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::Layer2::Allied;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Layer1;
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Allied::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Allied::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS
);
$VERSION = '2.08';
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
'ip_adresses'=> 'atNetAddress',
'ip_mac' => 'atPhysAddress',
'i_name' => 'ifName',
'i_up2' => 'ifOperStatus',
);
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'AtiSwitch-MIB' => 'atiswitchProductType',
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'ip_adresses' => 'atNetAddress',
'ip_mac' => 'atPhysAddress',
);
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'AtiSwitch-MIB' => 'atiswitchProductType',
'AtiStackInfo-MIB' => 'atiswitchEnhancedStacking',
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub vendor {
return 'allied';
@@ -71,9 +68,9 @@ sub os {
sub os_ver {
my $allied = shift;
my $descr = $allied->description();
if ($descr =~ m/version (\d+\.\d+)/){
my $descr = $allied->description();
if ( $descr =~ m/version (\d+\.\d+)/ ) {
return $1;
}
}
@@ -83,50 +80,48 @@ sub model {
my $desc = $allied->description();
if ($desc =~ /(AT-80\d{2}\S*)/){
if ( $desc =~ /(AT-80\d{2}\S*)/ ) {
return $1;
}
return undef;
return;
}
sub ip {
my $allied = shift;
sub root_ip {
my $allied = shift;
my $ip_hash = $allied->ip_addresses();
my $ip;
my $found_ip;
foreach $ip (values %{$ip_hash}) {
my $found_ip = SNMP::Info::munge_ip($ip) if (defined $ip);
last; # this is only one IP address
foreach my $ip ( values %{$ip_hash} ) {
$found_ip = SNMP::Info::munge_ip($ip) if ( defined $ip );
last; # this is only one IP address
}
return $found_ip;
}
sub mac{
my $allied = shift;
sub mac {
my $allied = shift;
my $mac_hash = $allied->ip_mac();
my $mac;
my $found_mac;
foreach $mac (values %{$mac_hash}) {
foreach my $mac ( values %{$mac_hash} ) {
$found_mac = SNMP::Info::munge_mac($mac);
last; # this is only one MAC address
last; # this is only one MAC address
}
return $found_mac;
}
sub i_up {
my $allied = shift;
my $allied = shift;
my $partial = shift;
my $i_up = SNMP::Info::Layer1::i_up($allied);
#my $i_up2 = $allied->i_up2() || {};
my $i_up = SNMP::Info::Layer1::i_up( $allied, $partial );
foreach my $port (keys %$i_up){
foreach my $port ( keys %$i_up ) {
my $up = $i_up->{$port};
$i_up->{$port} = 'down' if $up eq 'linktesterror';
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
$i_up->{$port} = 'up' if $up eq 'nolinktesterror';
}
return $i_up;
}
1;
@@ -134,7 +129,7 @@ __END__
=head1 NAME
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesyn switches
SNMP::Info::Layer2::Allied - SNMP Interface to Allied Telesis switches
=head1 AUTHOR
@@ -146,14 +141,13 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net>
my $allied = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myhub',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $l1->class();
my $class = $allied->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -166,7 +160,7 @@ inherited methods.
=over
=item SNMP::Info::Layer1
=item SNMP::Info::Layer2
=back
@@ -174,16 +168,18 @@ inherited methods.
=over
=item ATI-MIB
=item F<AtiSwitch-MIB>
Download for your device from http://www.allied-telesyn.com/allied/support/
=item F<AtiStackInfo-MIB>
=item Inherited Classes
MIBs listed in SNMP::Info::Layer1 and its inherited classes.
Download for your device from ftp://ftp.allied-telesyn.com/pub/switches/mibs/
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -206,30 +202,30 @@ Culls Version from description()
=item $allied->root_ip()
Returns IP Address of Managed Hub.
Returns IP Address of Managed Device.
(B<actualIpAddr>)
(C<actualIpAddr>)
=item $allied->model()
Trys to cull out AT-nnnnX out of the description field.
Tries to cull out C<AT-nnnnX> out of the description field.
=item $allied->mac()
Returns device MAC.
=back
=head2 Global Methods imported from SNMP::Info::Layer1
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer1 for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
=head2 Overrides
=over
=item $allied->i_name()
Returns reference to map of IIDs to human-set port name.
=item $allied->i_up()
Returns reference to map of IIDs to link status. Changes
@@ -237,10 +233,8 @@ the values of ati_up() to 'up' and 'down'.
=back
=head2 Allied MIB
=head2 Table Methods imported from SNMP::Info::Layer2
=over
=back
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,420 +0,0 @@
# SNMP::Info::Layer2::Aruba
# Eric Miller
# $Id$
#
# Copyright (c) 2005 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::Layer2::Aruba;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
@SNMP::Info::Layer2::Aruba::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
@SNMP::Info::Layer2::Aruba::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
'WLSX-SWITCH-MIB' => 'wlsxHostname',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
'i_index2' => 'ifIndex',
'i_name2' => 'ifName',
# WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
# Table index leafs do not return information
# therefore unable to use apESSID. We extract
# the information from the IID instead.
#'aruba_ap_essid' => 'apESSID',
'aruba_ap_name' => 'apLocation',
'aruba_ap_ip' => 'apIpAddress',
# WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
# Table index leafs do not return information
# therefore unable to use staAccessPointBSSID
# or staPhyAddress. We extract the information from
# the IID instead.
#'fw_port' => 'staAccessPointBSSID',
#'fw_mac' => 'staPhyAddress',
'fw_user' => 'staUserName',
);
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
);
sub layers {
return '00000011';
}
sub os {
return 'airos';
}
sub vendor {
return 'aruba';
}
sub os_ver {
my $aruba = shift;
my $descr = $aruba->description();
return undef unless defined $descr;
if ($descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/){
return $1;
}
return undef;
}
sub model {
my $aruba = shift;
my $id = $aruba->id();
return undef unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
return $model;
}
# Thin APs do not support ifMIB requirement
sub i_index {
my $aruba = shift;
my $i_index = $aruba->i_index2();
my $ap_index = $aruba->aruba_ap_name();
my %if_index;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
$if_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id (keys %$ap_index){
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join(':',map {sprintf("%02x",$_)} split(/\./,$ap_id));
$if_index{$ap_id} = $mac;
}
return \%if_index;
}
sub interfaces {
my $aruba = shift;
my $i_index = $aruba->i_index();
my $i_descr = $aruba->i_description();
my %if;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
# Replace the Index with the ifDescr field.
my $port = $i_descr->{$iid};
next unless defined $port;
$if{$iid} = $port;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
$if{$index} = $index;
}
else {
next;
}
}
return \%if;
}
sub i_name {
my $aruba = shift;
my $i_index = $aruba->i_index();
my $i_name2 = $aruba->i_name2();
my $ap_name = $aruba->aruba_ap_name();
my %i_name;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
if ($index =~ /^\d+$/ ) {
my $name = $i_name2->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
elsif ($index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/) {
my $name = $ap_name->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
else {
next;
}
}
return \%i_name;
}
# Wireless switches do not support the standard Bridge MIB
sub bp_index {
my $aruba = shift;
my $i_index = $aruba->i_index2();
my $ap_index = $aruba->aruba_ap_name();
my %bp_index;
foreach my $iid (keys %$i_index){
my $index = $i_index->{$iid};
next unless defined $index;
$bp_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id (keys %$ap_index){
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join(':',map {sprintf("%02x",$_)} split(/\./,$ap_id));
$bp_index{$mac} = $mac;
}
return \%bp_index;
}
sub fw_port {
my $aruba = shift;
my $fw_idx = $aruba->fw_user();
my %fw_port;
foreach my $iid (keys %$fw_idx){
if ($iid =~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/) {
my $port = join(':',map {sprintf("%02x",$_)} split(/\./,$2));
$fw_port{$iid} = $port;
}
else {
next;
}
}
return \%fw_port;
}
sub fw_mac {
my $aruba = shift;
my $fw_idx = $aruba->fw_user();
my %fw_mac;
foreach my $iid (keys %$fw_idx){
if ($iid =~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/) {
my $mac = join(':',map {sprintf("%02x",$_)} split(/\./,$1));
$fw_mac{$iid} = $mac;
}
else {
next;
}
}
return \%fw_mac;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Aruba - SNMP Interface to Aruba wireless switches
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $aruba = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $aruba->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::Layer2::Aruba is a subclass of SNMP::Info that provides an interface
to Aruba wireless switches. The Aruba platform utilizes intelligent wireless
switches which control thin access points. The thin access points themselves
are unable to be polled for end station information.
This class emulates bridge functionality for the wireless switch. This enables
end station MAC addresses collection and correlation to the thin access point
the end station is using for communication.
For speed or debugging purposes you can call the subclass directly, but not after
determining a more specific class using the method above.
my $aruba = new SNMP::Info::Layer2::Aruba(...);
=head2 Inherited Classes
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=back
=head2 Required MIBs
=over
=item WLSX-SWITCH-MIB
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $aruba->model()
Returns model type. Cross references $aruba->id() with product IDs in the
Aruba MIB.
=item $aruba->vendor()
Returns 'aruba'
=item $aruba->os()
Returns 'airos'
=item $aruba->os_ver()
Returns the software version extracted from B<sysDescr>
=back
=head2 Overrides
=over
=item $aruba->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=back
=head1 TABLE ENTRIES
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $aruba->i_index()
Returns reference to map of IIDs to Interface index.
Extends ifIndex to support thin APs as device interfaces.
=item $aruba->interfaces()
Returns reference to map of IIDs to ports. Thin APs are implemented as device
interfaces. The thin AP MAC address is used as the port identifier.
=item $aruba->i_name()
Interface name. Returns (B<ifName>) for Ethernet interfaces and (B<apLocation>)
for thin AP interfaces.
=item $aruba->bp_index()
Simulates bridge MIB by returning reference to a hash containing the index for
both the keys and values.
=item $aruba->fw_port()
(B<staAccessPointBSSID>) as extracted from the IID.
=item $aruba->fw_mac()
(B<staPhyAddress>) as extracted from the IID.
=back
=head2 Aruba Switch AP Table (B<wlsxSwitchAccessPointTable>)
=over
=item $aruba->aruba_ap_name()
(B<apLocation>)
=item $aruba->aruba_ap_ip()
(B<apIpAddress>)
=back
=head2 Aruba Switch Station Management Table (B<wlsxSwitchStationMgmtTable>)
=over
=item $aruba->fw_user()
(B<staUserName>)
=cut

View File

@@ -1,133 +1,137 @@
# SNMP::Info::Layer2::Bay
# Max Baker
# $Id$
# This module depricated. See Layer2::BayStack
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2::Bay;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Bay::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Bay::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS,
'cdp_id' => 's5EnMsTopIpAddr',
'cdp_run' => 's5EnMsTopStatus',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'cdp_id' => 's5EnMsTopIpAddr',
'cdp_run' => 's5EnMsTopStatus',
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
'imac2' => 'ifPhysAddress',
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
'bay_topo_slot' => 's5EnMsTopNmmSlot',
'bay_topo_port' => 's5EnMsTopNmmPort',
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
'bay_topo_seg' => 's5EnMsTopNmmSegId',
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'imac2' => 'ifPhysAddress',
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'SYNOPTICS-ROOT-MIB' => 'synoptics',
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
);
# S5-ETH-MULTISEG-TOPOLOGY-MIB::s5EnMsTopNmmTable
'bay_topo_slot' => 's5EnMsTopNmmSlot',
'bay_topo_port' => 's5EnMsTopNmmPort',
'bay_topo_ip' => 's5EnMsTopNmmIpAddr',
'bay_topo_seg' => 's5EnMsTopNmmSegId',
'bay_topo_mac' => 's5EnMsTopNmmMacAddr',
'bay_topo_platform' => 's5EnMsTopNmmChassisType',
'bay_topo_localseg' => 's5EnMsTopNmmLocalSeg',
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'SYNOPTICS-ROOT-MIB' => 'synoptics',
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop'
);
delete $MIBS{'CISCO-CDP-MIB'};
# 450's report full duplex as speed = 20mbps?!
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
'i_mac2' => \&SNMP::Info::munge_mac ,
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
sub os {
return 'bay';
}
sub os_ver {
my $bay = shift;
my $bay = shift;
my $descr = $bay->description();
return undef unless defined $descr;
return unless defined $descr;
# 303 / 304
if ($descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/){
if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
# 450
if ($descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/){
if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return undef;
return;
}
sub os_bin {
my $bay = shift;
my $bay = shift;
my $descr = $bay->description();
return undef unless defined $descr;
return unless defined $descr;
# 303 / 304
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
return $1;
}
# 450
if ($descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/){
if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return undef;
return;
}
sub vendor {
# or nortel, or synopsis?
return 'bay';
}
sub i_ignore {
my $bay = shift;
my $bay = shift;
my $descr = $bay->description();
my $i_type = $bay->i_type();
my %i_ignore;
foreach my $if (keys %$i_type){
my $type = $i_type->{$if};
foreach my $if ( keys %$i_type ) {
my $type = $i_type->{$if};
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
}
@@ -135,49 +139,48 @@ sub i_ignore {
}
sub interfaces {
my $bay = shift;
my $bay = shift;
my $i_index = $bay->i_index();
return $i_index;
}
sub i_mac {
my $bay = shift;
sub i_mac {
my $bay = shift;
my $i_mac = $bay->i_mac2();
# Bay 303's with a hw rev < 2.11.4.5 report the mac as all zeros
foreach my $iid (keys %$i_mac){
foreach my $iid ( keys %$i_mac ) {
my $mac = $i_mac->{$iid};
delete $i_mac->{$iid} if $mac eq '00:00:00:00:00:00';
}
return $i_mac;
}
sub model {
my $bay = shift;
my $id = $bay->id();
return undef unless defined $id;
my $id = $bay->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^sreg-//i;
my $descr = $bay->description();
return '303' if ($descr =~ /\D303\D/);
return '304' if ($descr =~ /\D304\D/);
return '450' if ($model =~ /BayStack450/);
return '303' if ( $descr =~ /\D303\D/ );
return '304' if ( $descr =~ /\D304\D/ );
return '450' if ( $model =~ /BayStack450/ );
return $model;
}
# Hack in some CDP type stuff
sub c_if {
my $bay = shift;
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my %c_if;
foreach my $entry (keys %$bay_topo_port){
foreach my $entry ( keys %$bay_topo_port ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
@@ -187,29 +190,30 @@ sub c_if {
}
sub c_ip {
my $bay = shift;
my $bay = shift;
my $bay_topo_ip = $bay->bay_topo_ip();
my $bay_topo_port = $bay->bay_topo_port();
my $ip = $bay->cdp_ip();
my $ip = $bay->cdp_ip();
# Count the number of devices seen on each port.
# more than one device seen means connected to a non-bay
# device, but other bay devices are squawking further away.
my %ip_port;
foreach my $entry (keys %$bay_topo_ip){
foreach my $entry ( keys %$bay_topo_ip ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if ($port =~ /^[\d\.]+$/ and $port == 0);
my $ip = $bay_topo_ip->{$entry};
push(@{$ip_port{$port}},$ip);
next if ( $port =~ /^[\d\.]+$/ and $port == 0 );
my $ip = $bay_topo_ip->{$entry};
push( @{ $ip_port{$port} }, $ip );
}
my %c_ip;
foreach my $port (keys %ip_port){
foreach my $port ( keys %ip_port ) {
my $ips = $ip_port{$port};
if (scalar @$ips == 1) {
if ( scalar @$ips == 1 ) {
$c_ip{"$port.1"} = $ips->[0];
} else {
}
else {
$c_ip{"$port.1"} = $ips;
}
}
@@ -218,12 +222,12 @@ sub c_ip {
}
sub c_port {
my $bay = shift;
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my $bay_topo_seg = $bay->bay_topo_seg();
my $bay_topo_seg = $bay->bay_topo_seg();
my %c_port;
foreach my $entry (keys %$bay_topo_seg){
foreach my $entry ( keys %$bay_topo_seg ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
@@ -231,11 +235,11 @@ sub c_port {
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_port{"$port.1"};
my $seg = $bay_topo_seg->{$entry};
my $seg = $bay_topo_seg->{$entry};
# Segment id is (256 * remote slot_num) + (remote_port)
my $remote_port = $seg % 256;
$c_port{"$port.1"} = $remote_port;
}
@@ -243,20 +247,19 @@ sub c_port {
}
sub c_platform {
my $bay = shift;
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my $bay_topo_platform = $bay->bay_topo_platform();
my %c_platform;
foreach my $entry (keys %$bay_topo_platform){
foreach my $entry ( keys %$bay_topo_platform ) {
my $port = $bay_topo_port->{$entry} || 0;
next if $port == 0;
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_platform{"$port.1"};
my $platform = $bay_topo_platform->{$entry};
my $platform = $bay_topo_platform->{$entry};
$c_platform{"$port.1"} = $platform;
}
@@ -277,15 +280,15 @@ Max Baker
=head1 SYNOPSIS
This module is Depricated. Please use Layer2::BayStack instead.
This module is Deprecated. Please use Layer2::BayStack instead.
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Bay 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $bay = new SNMP::Info::Layer2::Bay(...);
@@ -301,25 +304,16 @@ a more specific class using the method above.
=over
=item SYNOPTICS-ROOT-MIB
=item F<SYNOPTICS-ROOT-MIB>
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
=item Inherited classes
MIBs required by SNMP::Info::Layer2 and its superclasses.
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
=back
Bay MIBs can be found on the CD that came with your product.
Or, if you still have a service contract they can be downloaded at
www.nortelnetworks.com
They have also been seen at : http://www.inotech.com/mibs/vendor/baynetworks/synoptics/synoptics.asp
Or http://www.oidview.com/mibs/detail.html under Synoptics. Check also www.mibdepot.com
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -332,31 +326,43 @@ Returns 'bay' :)
=item $bay->model()
Cross references $bay->id() to the SYNOPTICS-MIB and returns
Cross references $bay->id() to the F<SYNOPTICS-MIB> and returns
the results. 303s and 304s have the same ID, so we have a hack
to return depending on which it is.
Removes sreg- from the model name
Removes C<sreg-> from the model name
=item $baystack->os()
Returns 'bay'.
=item $bay->os_ver()
Returns the os version extracted from C<sysDescr>.
=item $bay->os_bin()
Returns the firmware version extracted from C<sysDescr>.
=item $bay->cdp_id()
Returns the IP that the device is sending out for its Nmm topology info.
(B<s5EnMsTopIpAddr>)
(C<s5EnMsTopIpAddr>)
=item $bay->cdp_run()
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device.
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device.
(B<s5EnMsTopStatus>)
(C<s5EnMsTopStatus>)
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -369,17 +375,17 @@ to a hash.
Returns reference to map of IIDs to physical ports.
Currently simply returns the B<ifIndex>
Currently simply returns the C<ifIndex>
=item $bay->i_ignore()
Returns reference to hash of IIDs to ignore.
Simply calls the SNMP::Info::Layer2::i_ignore() fn for this.
Simply calls the SNMP::Info::Layer2::i_ignore() for this.
=item $bay->i_mac()
Returns the B<ifPhysAddress> table entries.
Returns the C<ifPhysAddress> table entries.
Removes all entries matching '00:00:00:00:00:00' -- Certain
older revisions of Bay 303 and 304 firmware report all zeros
@@ -387,7 +393,7 @@ for each port mac.
=back
=head2 Psuedo CDP information
=head2 Pseudo CDP information
All entries with port=0 are local and ignored.
@@ -395,21 +401,31 @@ All entries with port=0 are local and ignored.
=item $bay->c_if()
Returns referenece to hash. Key: port.1 Value: port (iid)
Returns reference to hash. Key: port.1 Value: port (iid)
=item $bay->c_ip()
Returns referenece to hash. Key: port.1
Returns reference to hash. Key: port.1
The value of each hash entry can either be a scalar or an array.
A scalar value is most likely a direct neighbor to that port.
It is possible that there is a non-bay device in between this device and the remote device.
It is possible that there is a non-bay device in between this device and the
remote device.
An array value represents a list of seen devices. The only time you will get an array
of nieghbors, is if there is a non-bay device in between two or more devices.
An array value represents a list of seen devices. The only time you will get
an array of neighbors, is if there is a non-bay device in between two or more
devices.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $bay->c_port()
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
=item $bay->c_platform()
Returns reference to hash. Key: IID, Value: Remote device type
=item $bay->port()
Returns reference to hash. Key: port.1 Value: port
@@ -420,7 +436,7 @@ Returns reference to hash. Key: port.1 Value: Remote Device Type
=back
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
=over
@@ -428,28 +444,29 @@ Returns reference to hash. Key: port.1 Value: Remote Device Type
Returns reference to hash. Key: Table entry, Value:slot number
(B<s5EnMsTopNmmSlot>)
(C<s5EnMsTopNmmSlot>)
=item $bay->bay_topo_port()
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
Returns reference to hash. Key: Table entry, Value:Port Number
(interface iid)
(B<s5EnMsTopNmmPort>)
(C<s5EnMsTopNmmPort>)
=item $bay->bay_topo_ip()
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
(B<s5EnMsTopNmmIpAddr>)
(C<s5EnMsTopNmmIpAddr>)
=item $bay->bay_topo_seg()
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
(B<s5EnMsTopNmmSegId>)
(C<s5EnMsTopNmmSegId>)
=item $bay->bay_topo_mac
(B<s5EnMsTopNmmMacAddr>)
(C<s5EnMsTopNmmMacAddr>)
Returns reference to hash. Key: Table entry, Value:Remote MAC address
@@ -457,18 +474,19 @@ Returns reference to hash. Key: Table entry, Value:Remote MAC address
Returns reference to hash. Key: Table entry, Value:Remote Device Type
(B<s5EnMsTopNmmChassisType>)
(C<s5EnMsTopNmmChassisType>)
=item $bay->bay_topo_localseg
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg()
is local
(B<s5EnMsTopNmmLocalSeg>)
(C<s5EnMsTopNmmLocalSeg>)
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,124 +1,128 @@
# SNMP::Info::Layer2::Baystack
# Eric Miller
# $Id$
#
# Copyright (c) 2004-6 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2::Baystack;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::SONMP;
use SNMP::Info::RapidCity;
use SNMP::Info::NortelStack;
use SNMP::Info::RapidCity;
use SNMP::Info::LLDP;
use SNMP::Info::Layer3;
@SNMP::Info::Layer2::Baystack::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::RapidCity SNMP::Info::NortelStack Exporter/;
@SNMP::Info::Layer2::Baystack::ISA
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack
SNMP::Info::RapidCity SNMP::Info::LLDP
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::SONMP::MIBS,
%SNMP::Info::RapidCity::MIBS,
%SNMP::Info::NortelStack::MIBS,
);
$VERSION = '2.08';
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
%SNMP::Info::RapidCity::GLOBALS,
%SNMP::Info::NortelStack::GLOBALS,
);
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::SONMP::FUNCS,
%SNMP::Info::RapidCity::FUNCS,
%SNMP::Info::NortelStack::FUNCS,
'i_name2' => 'ifName',
'i_mac2' => 'ifPhysAddress',
# From RFC1213-MIB
'at_index' => 'ipNetToMediaIfIndex',
'at_paddr' => 'ipNetToMediaPhysAddress',
'at_netaddr' => 'ipNetToMediaNetAddress',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
);
# 450's report full duplex as speed = 20mbps?!
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
$SNMP::Info::SPEED_MAP{20_000_000} = '10 Mbps';
$SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
$SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::SONMP::MUNGE,
%SNMP::Info::RapidCity::MUNGE,
%SNMP::Info::NortelStack::MUNGE,
'i_mac2' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::RapidCity::MUNGE, %SNMP::Info::NortelStack::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
sub os {
my $baystack = shift;
my $descr = $baystack->description();
my $model = $baystack->model();
my $descr = $baystack->description();
my $model = $baystack->model();
if ((defined $model and $model =~ /(470|460|BPS|5510|5520|5530)/) and (defined $descr and $descr =~ m/SW:v[3-5]/i)) {
return 'boss';
if ( ( defined $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
{
return 'bes';
}
return 'baystack';
if (
(
(defined $model and $model =~ /(420|425|BPS)/ )
and
(defined $descr and $descr =~ m/SW:v[1-2]/i )
)
or
(
(defined $model and $model =~ /(410|450|380)/ )
)
)
{
return 'baystack';
}
return 'boss';
}
sub os_bin {
my $baystack = shift;
my $descr = $baystack->description();
return undef unless defined $descr;
my $descr = $baystack->description();
return unless defined $descr;
# 303 / 304
if ($descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/){
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
return $1;
}
# 450
if ($descr =~ m/FW:V(\d+\.\d+)/){
if ( $descr =~ m/FW:V(\d+\.\d+)/ ) {
return $1;
}
if ($descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i){
if ( $descr =~ m/FW:(\d+\.\d+\.\d+\.\d+)/i ) {
return $1;
}
return undef;
return;
}
sub vendor {
@@ -127,49 +131,41 @@ sub vendor {
sub model {
my $baystack = shift;
my $id = $baystack->id();
return undef unless defined $id;
my $id = $baystack->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
my $descr = $baystack->description();
return '303' if (defined $descr and $descr =~ /\D303\D/);
return '304' if (defined $descr and $descr =~ /\D304\D/);
return 'BPS' if ($model =~ /BPS2000/i);
return $2 if ($model =~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)(\d+)/);
return '303' if ( defined $descr and $descr =~ /\D303\D/ );
return '304' if ( defined $descr and $descr =~ /\D304\D/ );
return 'BPS' if ( $model =~ /BPS2000/i );
return $2
if ( $model
=~ /(ES|ERS|BayStack|EthernetRoutingSwitch|EthernetSwitch)-?(\d+)/ );
return $model;
}
sub i_ignore {
my $baystack = shift;
my $i_type = $baystack->i_type();
my %i_ignore;
foreach my $if (keys %$i_type){
my $type = $i_type->{$if};
next unless defined $type;
$i_ignore{$if}++ if $type =~ /(54|loopback|propvirtual|cpu)/i;
}
return \%i_ignore;
}
sub interfaces {
my $baystack = shift;
my $i_index = $baystack->i_index();
my $partial = shift;
my $i_index = $baystack->i_index($partial) || {};
my $index_factor = $baystack->index_factor();
my $slot_offset = $baystack->slot_offset();
my $slot_offset = $baystack->slot_offset();
my %if;
foreach my $iid (keys %$i_index){
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
# Ignore cascade ports
next if $index > 513;
my $port = ($index % $index_factor);
my $slot = (int($index / $index_factor)) + $slot_offset;
# Ignore cascade ports
next if $index > $index_factor * 8;
my $port = ( $index % $index_factor );
my $slot = ( int( $index / $index_factor ) ) + $slot_offset;
my $slotport = "$slot.$port";
$if{$iid} = $slotport;
@@ -177,59 +173,310 @@ sub interfaces {
return \%if;
}
sub i_mac {
sub i_mac {
my $baystack = shift;
my $i_mac = $baystack->i_mac2();
my $partial = shift;
my $i_mac = $baystack->orig_i_mac($partial) || {};
my %i_mac;
# Baystack 303's with a hw rev < 2.11.4.5 report the mac as all zeros
foreach my $iid (keys %$i_mac){
foreach my $iid ( keys %$i_mac ) {
my $mac = $i_mac->{$iid};
next unless defined $mac;
next if $mac eq '00:00:00:00:00:00';
$i_mac{$iid}=$mac;
$i_mac{$iid} = $mac;
}
return \%i_mac;
}
sub i_name {
my $baystack = shift;
my $i_index = $baystack->i_index();
my $i_alias = $baystack->i_alias();
my $i_name2 = $baystack->i_name2();
my $partial = shift;
my $i_index = $baystack->i_index($partial) || {};
my $i_alias = $baystack->i_alias($partial) || {};
my $i_name2 = $baystack->orig_i_name($partial) || {};
my %i_name;
foreach my $iid (keys %$i_name2){
my $name = $i_name2->{$iid};
foreach my $iid ( keys %$i_name2 ) {
my $name = $i_name2->{$iid};
my $alias = $i_alias->{$iid};
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
$alias :
$name;
$i_name{$iid}
= ( defined $alias and $alias !~ /^\s*$/ )
? $alias
: $name;
}
return \%i_name;
}
sub index_factor {
my $baystack = shift;
my $model = $baystack->model();
my $os = $baystack->os();
my $op_mode = $baystack->ns_op_mode();
my $baystack = shift;
my $model = $baystack->model();
my $os = $baystack->os();
my $os_ver = $baystack->os_ver();
my $op_mode = $baystack->ns_op_mode();
$op_mode = 'pure' unless defined $op_mode;
if ( $os_ver =~ m/^(\d+)\./ ) {
$os_ver = $1;
} else {
$os_ver = 1;
}
my $index_factor = 32;
$index_factor = 64 if ((defined $model and $model =~ /(470)/) or ($os eq 'boss') and ($op_mode eq 'pure'));
$index_factor = 64
if ( ( defined $model and $model =~ /(470)/ )
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
$index_factor = 128
if ( ( defined $model and $model =~ /(5[56]\d\d)/ )
and ( $os_ver >= 6 ) );
return $index_factor;
}
# Use SONMP and/or LLDP
sub hasCDP {
my $baystack = shift;
return $baystack->hasLLDP() || $baystack->SUPER::hasCDP();
}
sub c_ip {
my $baystack = shift;
my $partial = shift;
my $cdp = $baystack->SUPER::c_ip($partial) || {};
my $lldp = $baystack->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_if($partial) || {};
my $cdp = $baystack->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_port($partial) || {};
my $cdp = $baystack->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_id($partial) || {};
my $cdp = $baystack->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $baystack = shift;
my $partial = shift;
my $lldp = $baystack->lldp_rem_sysdesc($partial) || {};
my $cdp = $baystack->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
# Newer devices support ENTITY-MIB, use if available otherwise use proprietary
# methods.
sub e_index {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_index($partial) || $stack->ns_e_index($partial);
}
sub e_class {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_class($partial) || $stack->ns_e_class($partial);
}
sub e_descr {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_descr($partial) || $stack->ns_e_descr($partial);
}
sub e_name {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_name($partial) || $stack->ns_e_name($partial);
}
sub e_fwver {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_fwver($partial) || $stack->ns_e_fwver($partial);
}
sub e_hwver {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_hwver($partial) || $stack->ns_e_hwver($partial);
}
sub e_parent {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_parent($partial) || $stack->ns_e_parent($partial);
}
sub e_pos {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_pos($partial) || $stack->ns_e_pos($partial);
}
sub e_serial {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_serial($partial) || $stack->ns_e_serial($partial);
}
sub e_swver {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_swver($partial) || $stack->ns_e_swver($partial);
}
sub e_type {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_type($partial) || $stack->ns_e_type($partial);
}
sub e_vendor {
my $stack = shift;
my $partial = shift;
return $stack->SUPER::e_vendor($partial) || $stack->ns_e_vendor($partial);
}
# fix for stack of switches without POE on module 1
# https://sourceforge.net/tracker/?func=detail&aid=3317739&group_id=70362&atid=527529
sub peth_port_ifindex {
my $stack = shift;
my $partial = shift;
my %peth_port_ifindex = ();
my $poe_port_st = $stack->peth_port_status($partial);
my $if_index = $stack->interfaces($partial);
foreach my $i (keys %$if_index) {
next unless defined $poe_port_st->{$if_index->{$i}};
$peth_port_ifindex{$if_index->{$i}} = $i;
}
return \%peth_port_ifindex;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack) Switches
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
Switches
=head1 AUTHOR
@@ -241,7 +488,6 @@ Eric Miller
my $baystack = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -256,8 +502,8 @@ Eric Miller
Provides abstraction to the configuration information obtainable from a Nortel
Ethernet Switch (Baystack) 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $baystack = new SNMP::Info::Layer2::Baystack(...);
@@ -265,36 +511,36 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::SONMP
=item SNMP::Info::NortelStack
=item SNMP::Info::SONMP
=item SNMP::Info::RapidCity
=item SNMP::Info::LLDP
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See SNMP::Info::NortelStack for its own MIB requirements.
See SNMP::Info::SONMP for its own MIB requirements.
See SNMP::Info::RapidCity for its own MIB requirements.
=back
=head2 Inherited MIBs
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::NortelStack/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::RapidCity/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -307,14 +553,13 @@ Returns 'nortel'
=item $baystack->model()
Cross references $baystack->id() to the SYNOPTICS-MIB and returns
Cross references $baystack->id() to the F<SYNOPTICS-MIB> and returns
the results. 303s and 304s have the same ID, so we have a hack
to return depending on which it is.
Returns BPS for Business Policy Switch
For BayStack, EthernetRoutingSwitch, or EthernetSwitch extracts and returns
the switch numeric designation.
For others extracts and returns the switch numeric designation.
=item $baystack->os()
@@ -322,7 +567,7 @@ Returns 'baystack' or 'boss' depending on software version.
=item $baystack->os_bin()
Returns the firmware version extracted from B<sysDescr>.
Returns the firmware version extracted from C<sysDescr>.
=back
@@ -343,27 +588,27 @@ Returns either 32 or 64 based upon the formula.
=back
=head2 Globals imported from SNMP::Info
=head2 Global Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::NortelStack
See documentation in SNMP::Info::NortelStack for details.
=head2 Global Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::RapidCity
See documentation in SNMP::Info::RapidCity for details.
See L<SNMP::Info::RapidCity/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -376,7 +621,8 @@ to a hash.
Returns reference to the map between IID and physical Port.
Slot and port numbers on the Baystack switches are determined by the formula:
Slot and port numbers on the Baystack switches are determined by the
formula:
port = (Interface index % Index factor)
slot = (int(Interface index / Index factor)) + Slot offset
@@ -389,59 +635,156 @@ Returns reference to hash of IIDs to ignore.
=item $baystack->i_mac()
Returns the B<ifPhysAddress> table entries.
Returns the C<ifPhysAddress> table entries.
Removes all entries matching '00:00:00:00:00:00' -- Certain
revisions of Baystack firmware report all zeros for each port mac.
=item $baystack->i_name()
Crosses ifName with ifAlias and returns the human set port name if exists.
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
exists.
=item $poe->peth_port_ifindex()
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
=back
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
=head2 F<ENTITY-MIB> Information
For older devices which do not support F<ENTITY-MIB>, these methods emulate
Physical Table methods using F<S5-CHASSIS-MIB>. See
L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods.
=over
=item $baystack->at_index()
=item $baystack->e_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_index().
Note that this is based on C<entPhysicalDescr> due to implementation
details of SNMP::Info::Entity::e_index().
(B<ipNetToMediaIfIndex>)
=item $baystack->e_class()
=item $baystack->at_paddr()
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
Returns reference to hash. Maps ARP table entries to MAC addresses.
=item $baystack->e_descr()
(B<ipNetToMediaPhysAddress>)
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
=item $baystack->at_netaddr()
=item $baystack->e_name()
Returns reference to hash. Maps ARP table entries to IPs
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
(B<ipNetToMediaNetAddress>)
=item $baystack->e_fwver()
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
ns_e_fwver().
=item $baystack->e_hwver()
If the device doesn't support C<entPhysicalHardwareRev>, this will try
ns_e_hwver().
=item $baystack->e_parent()
If the device doesn't support C<entPhysicalContainedIn>, this will try
ns_e_parent().
=item $baystack->e_pos()
If the device doesn't support C<entPhysicalParentRelPos>, this will try
ns_e_pos().
=item $baystack->e_serial()
If the device doesn't support C<entPhysicalSerialNum>, this will try
ns_e_serial().
=item $baystack->e_swver()
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
ns_e_swver().
=item $baystack->e_type()
If the device doesn't support C<entPhysicalVendorType>, this will try
ns_e_type().
=item $baystack->e_vendor()
If the device doesn't support C<entPhysicalMfgName>, this will try
ns_e_vendor().
=back
=head2 Table Methods imported from SNMP::Info
=head2 Topology information
See documentation in SNMP::Info for details.
Based upon the software version devices may support SynOptics Network
Management Protocol (SONMP) and Link Layer Discovery Protocol (LLDP). These
methods will query both and return the combination of all information. As a
result, there may be identical topology information returned from the two
protocols causing duplicate entries. It is the calling program's
responsibility to identify any duplicate entries and remove duplicates if
necessary.
=head2 Table Methods imported from SNMP::Info::Bridge
=over
See documentation in SNMP::Info::Bridge for details.
=item $baystack->hasCDP()
=head2 Table Methods imported from SNMP::Info::NortelStack
Returns true if the device is running either SONMP or LLDP.
See documentation in SNMP::Info::NortelStack for details.
=item $baystack->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $baystack->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-SONMP/LLDP device in between two or
more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $baystack->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $baystack->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $baystack->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::NortelStack
See L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::RapidCity
See documentation in SNMP::Info::RapidCity for details.
See L<SNMP::Info::RapidCity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -1,95 +1,100 @@
# SNMP::Info::Layer2::C1900
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2::C1900;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoVTP
SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
SNMP::Info::CiscoConfig SNMP::Info::Layer2
Exporter/;
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'c1900_flash_status' => 'upgradeFlashBankStatus',
);
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'c1900_flash_status' => 'upgradeFlashBankStatus',
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
'i_type2' => 'ifType',
'i_name2' => 'ifName',
# ESSWITCH-MIB
'c1900_p_index' => 'swPortIndex',
'c1900_p_ifindex' => 'swPortIfIndex',
'c1900_p_duplex' => 'swPortDuplexStatus',
'c1900_p_duplex_admin' => 'swPortFullDuplex',
'c1900_p_name' => 'swPortName',
'c1900_p_up_admin' => 'swPortAdminStatus',
'c1900_p_type' => 'swPortMediaCapability',
'c1900_p_media' => 'swPortConnectorType',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
# Also known as the ESSWITCH-MIB
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
);
# ESSWITCH-MIB
'c1900_p_index' => 'swPortIndex',
'c1900_p_ifindex' => 'swPortIfIndex',
'c1900_p_duplex' => 'swPortDuplexStatus',
'c1900_p_duplex_admin' => 'swPortFullDuplex',
'c1900_p_name' => 'swPortName',
'c1900_p_up_admin' => 'swPortAdminStatus',
'c1900_p_type' => 'swPortMediaCapability',
'c1900_p_media' => 'swPortConnectorType',
);
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
# Also known as the ESSWITCH-MIB
'STAND-ALONE-ETHERNET-SWITCH-MIB' => 'series2000'
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
);
sub bulkwalk_no { return 1; }
sub cisco_comm_indexing { return 1; }
sub vendor {
return 'cisco';
}
sub os {
return 'catalyst';
}
@@ -100,123 +105,171 @@ sub os_ver {
# Check for superclass one
my $os_ver = $c1900->SUPER::os_ver();
return $os_ver if defined $os_ver;
my $c1900_flash_status = $c1900->c1900_flash_status();
return undef unless defined $c1900_flash_status;
if ($c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/){
my $c1900_flash_status = $c1900->c1900_flash_status();
return unless defined $c1900_flash_status;
if ( $c1900_flash_status =~ m/V(\d+\.\d+(\.\d+)?)/ ) {
return $1;
}
return undef;
}
return;
}
sub bulkwalk_no { 1; }
sub cisco_comm_indexing { 1; }
sub interfaces {
my $c1900 = shift;
my $i_descr = $c1900->i_description();
my $c1900 = shift;
my $partial = shift;
foreach my $iid (keys %$i_descr){
my $i_descr = $c1900->i_description($partial) || {};
foreach my $iid ( keys %$i_descr ) {
$i_descr->{$iid} =~ s/\s*$//;
}
return $i_descr;
}
sub i_duplex {
my $c1900 = shift;
my $interfaces = $c1900->interfaces();
my $c1900_p_index = $c1900->c1900_p_index();
my $c1900_p_duplex = $c1900->c1900_p_duplex();
my $c1900 = shift;
my $partial = shift;
my %reverse_1900 = reverse %$c1900_p_index;
my $c1900_p_duplex = $c1900->c1900_p_duplex($partial) || {};
my %i_duplex;
foreach my $if (keys %$interfaces){
my $port_1900 = $reverse_1900{$if};
next unless defined $port_1900;
my $duplex = $c1900_p_duplex->{$port_1900};
next unless defined $duplex;
foreach my $if ( keys %$c1900_p_duplex ) {
my $duplex = $c1900_p_duplex->{$if};
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$i_duplex{$if}=$duplex;
$i_duplex{$if} = $duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $c1900 = shift;
my $interfaces = $c1900->interfaces();
my $c1900_p_index = $c1900->c1900_p_index();
my $c1900_p_admin = $c1900->c1900_p_duplex_admin();
my $c1900 = shift;
my $partial = shift;
my %reverse_1900 = reverse %$c1900_p_index;
my $c1900_p_admin = $c1900->c1900_p_duplex_admin($partial) || {};
my %i_duplex_admin;
foreach my $if (keys %$interfaces){
my $port_1900 = $reverse_1900{$if};
next unless defined $port_1900;
my $duplex = $c1900_p_admin->{$port_1900};
next unless defined $duplex;
foreach my $if ( keys %$c1900_p_admin ) {
my $duplex = $c1900_p_admin->{$if};
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /disabled/i;
$duplex = 'full' if $duplex =~ /flow control/i;
$duplex = 'full' if $duplex =~ /enabled/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex_admin{$if}=$duplex;
$i_duplex_admin{$if} = $duplex;
}
return \%i_duplex_admin;
}
sub i_type {
my $c1900 = shift;
my $i_type = $c1900->i_type2();
my $c1900_p_index = $c1900->c1900_p_index();
my $c1900_p_type = $c1900->c1900_p_type();
my $c1900_p_media = $c1900->c1900_p_media();
foreach my $p_iid (keys %$c1900_p_index){
my $port = $c1900_p_index->{$p_iid};
my $type = $c1900_p_type->{$p_iid};
my $media = $c1900_p_media->{$p_iid};
next unless defined $port;
next unless defined $type;
next unless defined $media;
$i_type->{$port} = "$type $media";
}
return $i_type;
}
sub i_name {
my $c1900 = shift;
my $i_name = $c1900->i_name2();
my $c1900_p_name = $c1900->c1900_p_name();
foreach my $port (keys %$c1900_p_name){
my $c1900 = shift;
my $partial = shift;
my $i_name = $c1900->orig_i_name($partial) || {};
my $c1900_p_name = $c1900->c1900_p_name($partial) || {};
foreach my $port ( keys %$c1900_p_name ) {
my $name = $c1900_p_name->{$port};
next unless defined $name;
next unless $name !~ /^\s*$/;
$i_name->{$port} = $name;
}
return $i_name;
}
sub set_i_duplex_admin {
my $c1900 = shift;
my ( $duplex, $port ) = @_;
# map a textual duplex to an integer one the switch understands
my %duplexes = qw/full 1 half 2 auto 3/;
my $iid = $c1900->c1900_p_ifindex($port);
$duplex = lc($duplex);
return 0 unless defined $duplexes{$duplex};
return $c1900->set_c1900_p_duplex_admin( $duplexes{$duplex}, $iid );
}
sub i_vlan {
my $c1900 = shift;
my $partial = shift;
# Overlap allows more than one VLAN per port. Unable to determine default
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
|| $c1900->vlanAllowMembershipOverlap()
|| 'disabled';
if ( $overlap eq 'enabled' ) {
return;
}
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|| $c1900->vlanMemberPortOfVlan();
my $i_pvid = {};
foreach my $idx ( keys %$member_of ) {
my @values = split( /\./, $idx );
my ( $vlan, $port ) = @values;
next unless $vlan;
next unless $port;
next if ( defined $partial and $port !~ /^$partial$/ );
my $value = $member_of->{$idx};
next if ( $value eq 'false' );
$i_pvid->{$port} = $vlan;
}
return $i_pvid;
}
sub i_vlan_membership {
my $c1900 = shift;
my $partial = shift;
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|| $c1900->vlanMemberPortOfVlan();
my $i_vlan_membership = {};
foreach my $idx ( keys %$member_of ) {
my @values = split( /\./, $idx );
my ( $vlan, $port ) = @values;
next unless $vlan;
next unless $port;
next if ( defined $partial and $port !~ /^$partial$/ );
my $value = $member_of->{$idx};
next if ( $value eq 'false' );
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
return $i_vlan_membership;
}
sub bp_index {
my $c1900 = shift;
my $partial = shift;
my $if_index = $c1900->i_index($partial);
my $index = $c1900->orig_bp_index($partial) || {};
foreach my $iid ( keys %$if_index ) {
$index->{$iid} = $iid if(!defined $index->{$iid});
}
return $index;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::C1900 - Perl5 Interface to SNMP data from Cisco Catlyst 1900 Network Switches running CatOS
SNMP::Info::Layer2::C1900 - SNMP Interface to data from Cisco Catalyst 1900
Network Switches running CatOS
=head1 AUTHOR
@@ -228,7 +281,6 @@ Max Baker
my $c1900 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 1
@@ -240,13 +292,13 @@ Max Baker
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a Catalyst 1900 device through SNMP.
See SNMP::Info for full documentation
Provides abstraction to the configuration information obtainable from a
Catalyst 1900 device through SNMP. See SNMP::Info for full documentation
Note that most of these devices only talk SNMP version 1, but not all.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $c1900 = new SNMP::Info::Layer2::C1900(...);
@@ -254,6 +306,12 @@ a more specific class using the method above.
=over
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoConfig
=item SNMP::Info::Layer2
=back
@@ -262,34 +320,36 @@ a more specific class using the method above.
=over
=item STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)
=item F<STAND-ALONE-ETHERNET-SWITCH-MIB (ESSWITCH-MIB)>
ESSWITCH-MIB is included in the Version 1 MIBS from Cisco.
F<ESSWITCH-MIB> is included in the Version 1 MIBs from Cisco.
They can be found at ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
=item Inherited Classes' MIBs
MIBs listed in SNMP::Info::Layer2
=back
=head2 Inherited MIBs
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $c1900->bulkwalk_no
Return C<1>. Bulkwalk is turned off for this class.
=item $c1900->c1900_flash_status()
Usually contains the version of the software loaded in flash.
Used by os_ver()
B<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
C<STAND-ALONE-ETHERNET-SWITCH-MIB::upgradeFlashBankStatus>
=item $c1900->os()
@@ -308,43 +368,92 @@ Returns 'cisco' :)
=back
=head2 Overrides
=over
=item $c1900->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=item $c1900->bulkwalk_no
Return C<1>. Bulkwalk is turned off for this class.
=back
=head2 Globals imported from SNMP::Info::CDP
See L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $c1900->interfaces()
Returns reference to the map between IID and physical Port.
=item $c1900->i_duplex()
Returns reference to map of IIDs to current link duplex
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex;
=item $c1900->i_duplex_admin()
Returns reference to hash of IIDs to admin duplex setting
Crosses $c1900->c1900_p_index() with $c1900->c1900_p_duplex_admin;
=item $c1900->i_name()
Crosses ifName with c1900_p_name() and returns the human set port name if exists.
Crosses C<ifName> with $c1900->c1900_p_name() and returns the human set port
name if exists.
=item $c1900->i_type()
=item $c1900->i_vlan()
Returns reference to hash of IID to port type
Returns a mapping between the interface and the VLAN / bridge group if overlap
is not enabled.
Takes the default ifType and overrides it with
=item $c1900->i_vlan_membership()
c1900_p_type() and c1900_p_media() if they exist.
Returns reference to hash of arrays: key = interface, value = array of VLAN /
bridge group IDs.
Example:
my $interfaces = $c1900->interfaces();
my $vlans = $c1900->i_vlan_membership();
foreach my $iid (sort keys %$interfaces) {
my $port = $interfaces->{$iid};
my $vlan = join(',', sort(@{$vlans->{$iid}}));
print "Port: $port VLAN: $vlan\n";
}
=item $c1900->bp_index()
Returns a bp_index that contains the original bp_index entries and extra
entries for those interfaces listed in if_index, as some C1900 devices do not
return complete bp_indexes.
=back
=head2 STAND-ALONE-ETHERNET-SWITCH-MIB Switch Port Table Entries:
=head2 F<STAND-ALONE-ETHERNET-SWITCH-MIB> Switch Port Table Entries:
=over
@@ -352,48 +461,81 @@ c1900_p_type() and c1900_p_media() if they exist.
Maps the Switch Port Table to the IID
B<swPortIfIndex>
C<swPortIfIndex>
=item $c1900->c1900_p_duplex()
Gives Port Duplex Info
B<swPortDuplexStatus>
(C<swPortDuplexStatus>)
=item $c1900->c1900_p_duplex_admin()
Gives admin setting for Duplex Info
B<swPortFullDuplex>
(C<swPortFullDuplex>)
=item $c1900->c1900_p_name()
Gives human set name for port
B<swPortName>
(C<swPortName>)
=item $c1900->c1900_p_up_admin()
Gives Admin status of port enabled.
B<swPortAdminStatus>
(C<swPortAdminStatus>)
=item $c1900->c1900_p_type()
Gives Type of port, ie. "general-ethernet"
Gives Type of port, i.e. C<"general-ethernet">
B<swPortMediaCapability>
(C<swPortMediaCapability>)
=item $c1900->c1900_p_media()
Gives the media of the port , ie "fiber-sc"
Gives the media of the port , i.e. "C<fiber-sc>"
B<swPortConnectorType>
(C<swPortConnectorType>)
=back
=head2 Table Methods imported from SNMP::Info::CDP
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=over
=item $c1900->set_i_duplex_admin(duplex, ifIndex)
Sets port duplex, must be supplied with duplex and port C<ifIndex>. Speed
choices are 'auto', 'half', 'full'.
Example:
my %if_map = reverse %{$c1900->interfaces()};
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
or die "Couldn't change port duplex. ",$c1900->error(1);
=back
=cut

View File

@@ -1,207 +1,204 @@
# SNMP::Info::Layer2::C2900
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2::C2900;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoVTP
SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
@SNMP::Info::Layer2::C2900::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig
SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
);
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
'i_name' => 'ifAlias',
# C2900PortEntry
'c2900_p_index' => 'c2900PortIfIndex',
'c2900_p_duplex' => 'c2900PortDuplexStatus',
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
'i_name' => 'ifAlias',
%MIBS = ( %SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
'CISCO-C2900-MIB' => 'ciscoC2900MIB',
);
# C2900PortEntry
'c2900_p_index' => 'c2900PortIfIndex',
'c2900_p_duplex' => 'c2900PortDuplexStatus',
'c2900_p_duplex_admin' => 'c2900PortDuplexState',
'c2900_p_speed_admin' => 'c2900PortAdminSpeed',
);
%MUNGE = (%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
);
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoVTP::MIBS, 'CISCO-C2900-MIB' => 'ciscoC2900MIB',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
sub vendor {
return 'cisco';
}
sub cisco_comm_indexing {
1;
return 1;
}
sub i_duplex {
my $c2900 = shift;
my $interfaces = $c2900->interfaces();
my $c2900_p_index = $c2900->c2900_p_index();
my $c2900 = shift;
my $partial = shift;
my $interfaces = $c2900->interfaces($partial);
my $c2900_p_index = $c2900->c2900_p_index() || {};
my $c2900_p_duplex = $c2900->c2900_p_duplex();
my %reverse_2900 = reverse %$c2900_p_index;
my %i_duplex;
foreach my $if (keys %$interfaces){
foreach my $if ( keys %$interfaces ) {
my $port_2900 = $reverse_2900{$if};
next unless defined $port_2900;
my $duplex = $c2900_p_duplex->{$port_2900};
next unless defined $duplex;
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$i_duplex{$if}=$duplex;
$i_duplex{$if} = $duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $c2900 = shift;
my $interfaces = $c2900->interfaces();
my $c2900_p_index = $c2900->c2900_p_index();
my $c2900 = shift;
my $partial = shift;
my $interfaces = $c2900->interfaces($partial);
my $c2900_p_index = $c2900->c2900_p_index() || {};
my $c2900_p_admin = $c2900->c2900_p_duplex_admin();
my %reverse_2900 = reverse %$c2900_p_index;
my %i_duplex_admin;
foreach my $if (keys %$interfaces){
foreach my $if ( keys %$interfaces ) {
my $port_2900 = $reverse_2900{$if};
next unless defined $port_2900;
my $duplex = $c2900_p_admin->{$port_2900};
next unless defined $duplex;
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex_admin{$if}=$duplex;
$i_duplex_admin{$if} = $duplex;
}
return \%i_duplex_admin;
}
### we want to be able to set speed on 2900 class switches
###
### $info->set_i_speed_admin("100", ifIndex);
### speed choices are 'auto', '10', '100'
###
sub set_i_speed_admin {
my $c2900 = shift;
my ( $speed, $iid ) = @_;
# map speeds to those the switch will understand
my %speeds = qw/auto 1 10 10000000 100 100000000/;
my $c2900 = shift;
my ($speed, $iid) = @_;
my $c2900_p_index = $c2900->c2900_p_index();
my $c2900_p_index = $c2900->c2900_p_index() || {};
my %reverse_2900 = reverse %$c2900_p_index;
$speed = lc($speed);
return 0 unless defined $speeds{$speed};
return unless defined $speeds{$speed};
# account for weirdness of c2900 mib
$iid = $reverse_2900{$iid};
return $c2900->set_c2900_p_speed_admin($speeds{$speed}, $iid);
return $c2900->set_c2900_p_speed_admin( $speeds{$speed}, $iid );
}
### we want to be able to set duplex on 2900 class switches
###
### $info->set_i_duplex_admin("half", ifIndex);
### duplex choices are 'auto', 'half', 'full'
###
sub set_i_duplex_admin {
my $c2900 = shift;
my ( $duplex, $iid ) = @_;
# map a textual duplex to an integer one the switch understands
my %duplexes = qw/full 1 half 2 auto 3/;
my $c2900 = shift;
my ($duplex, $iid) = @_;
my $c2900_p_index = $c2900->c2900_p_index();
my $c2900_p_index = $c2900->c2900_p_index() || {};
my %reverse_2900 = reverse %$c2900_p_index;
$duplex = lc($duplex);
return 0 unless defined $duplexes{$duplex};
return unless defined $duplexes{$duplex};
# account for weirdness of c2900 mib
$iid = $reverse_2900{$iid};
return $c2900->set_c2900_p_duplex_admin($duplexes{$duplex}, $iid);
return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
}
# Use i_descritption for port key, cuz i_name can be manually entered.
sub interfaces {
my $c2900 = shift;
my $interfaces = $c2900->i_index();
my $i_descr = $c2900->i_description();
my $c2900 = shift;
my $partial = shift;
my $interfaces = $c2900->i_index($partial) || {};
my $i_descr = $c2900->i_description($partial) || {};
my %if;
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $port = $i_descr->{$iid};
next unless defined $port;
$port =~ s/\./\//g if( $port =~ /\d+\.\d+$/);
$port =~ s/\./\//g if ( $port =~ /\d+\.\d+$/ );
$port =~ s/[^\d\/,()\w]+//gi;
$if{$iid} = $port;
}
return \%if
return \%if;
}
1;
@@ -209,7 +206,8 @@ __END__
=head1 NAME
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches running IOS
SNMP::Info::Layer2::C2900 - SNMP Interface to Cisco Catalyst 2900 Switches
running IOS
=head1 AUTHOR
@@ -219,16 +217,16 @@ Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $c2900 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $c2900->class();
my $class = $c2900->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -236,8 +234,8 @@ Max Baker
Provides abstraction to the configuration information obtainable from a
C2900 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $c2900 = new SNMP::Info::Layer2::C2900(...);
@@ -245,28 +243,40 @@ a more specific class using the method above.
=over
=item SNMP::Info::Layer2
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoConfig
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item CISCO-C2900-MIB
=item F<CISCO-C2900-MIB>
Part of the v2 MIBs from Cisco.
=item Inherited Classes' MIBs
See SNMP::Info::Layer2 for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
=back
=head2 Inherited MIBs
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -277,19 +287,35 @@ These are methods that return scalar value from SNMP
=item $c2900->vendor()
Returns 'cisco' :)
Returns 'cisco' :)
=item $c2900->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Globals imported from SNMP::Info::CiscoVTP
See L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -300,36 +326,98 @@ to a hash.
=item $c2900->interfaces()
Returns reference to the map between IID and physical Port.
Returns reference to the map between IID and physical Port.
On the 2900 devices i_name isn't reliable, so we override to just the description.
On the 2900 devices i_name isn't reliable, so we override to just the
description.
Next all dots are changed for forward slashes so that the physical port name
is the same as the broadcasted CDP port name.
(Ethernet0.1 -> Ethernet0/1)
Next all dots are changed for forward slashes so that the physical port name
is the same as the broad-casted CDP port name.
(Ethernet0.1 -> Ethernet0/1)
Also, any weird characters are removed, as I saw a few pop up.
Also, any weird characters are removed, as I saw a few pop up.
=item $c2900->i_duplex()
Returns reference to map of IIDs to current link duplex
Returns reference to map of IIDs to current link duplex
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex;
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex()
=item $c2900->i_duplex_admin()
Returns reference to hash of IIDs to admin duplex setting
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin;
Returns reference to hash of IIDs to admin duplex setting
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
=back
=head2 F<C2900-MIB> Port Entry Table
=over
=item $c2900->c2900_p_index()
Maps the Switch Port Table to the IID
(C<c2900PortIfIndex>)
=item $c2900->c2900_p_duplex()
Gives Port Duplex Info
(C<c2900PortDuplexStatus>)
=item $c2900->c2900_p_duplex_admin()
Gives admin setting for Duplex Info
(C<c2900PortDuplexState>)
=item $c2900->c2900_p_speed_admin()
Gives Admin speed of port
(C<c2900PortAdminSpeed>)
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=over
=item $c2900->set_i_speed_admin(speed, ifIndex)
Sets port speed, must be supplied with speed and port ifIndex
Sets port speed, must be supplied with speed and port C<ifIndex>
Speed choices are 'auto', '10', '100'
Speed choices are 'auto', '10', '100'
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin to
utilize port ifIndex.
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_speed_admin() to utilize
port C<ifIndex>.
Example:
my %if_map = reverse %{$c2900->interfaces()};
@@ -338,12 +426,12 @@ to a hash.
=item $c2900->set_i_duplex_admin(duplex, ifIndex)
Sets port duplex, must be supplied with duplex and port ifIndex
Sets port duplex, must be supplied with duplex and port C<ifIndex>
Speed choices are 'auto', 'half', 'full'
Speed choices are 'auto', 'half', 'full'
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin to
utilize port ifIndex.
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin() to utilize
port C<ifIndex>.
Example:
my %if_map = reverse %{$c2900->interfaces()};
@@ -352,43 +440,4 @@ to a hash.
=back
=head2 C2900-MIB Port Entry Table
=over
=item $c2900->c2900_p_index()
Maps the Switch Port Table to the IID
B<c2900PortIfIndex>
=item $c2900->c2900_p_duplex()
Gives Port Duplex Info
B<c2900PortDuplexStatus>
=item $c2900->c2900_p_duplex_admin()
Gives admin setting for Duplex Info
B<c2900PortDuplexState>
=item $c2900->c2900_p_speed_admin()
Gives Admin speed of port
B<c2900PortAdminSpeed>
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
=cut

View File

@@ -1,89 +1,82 @@
# SNMP::Info::Layer2::Catalyst
# Max Baker
# $Id$
#
# Copyright (c) 2002,2003 Regents of the University of California
# Copyright (c) 2003,2004 Max Baker changes from version 0.8 and beyond
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Layer2::Catalyst;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CiscoStack;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoPortSecurity;
use SNMP::Info::Layer2;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
@SNMP::Info::Layer2::Catalyst::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoStack
SNMP::Info::CiscoVTP SNMP::Info::CDP SNMP::Info::CiscoStats Exporter/;
@SNMP::Info::Layer2::Catalyst::ISA
= qw/SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
SNMP::Info::CDP SNMP::Info::CiscoStats
SNMP::Info::CiscoPortSecurity
SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoStack::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
);
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoStats::MIBS, %SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoVTP::MIBS, %SNMP::Info::CiscoStack::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
);
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoStats::FUNCS, %SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS, %SNMP::Info::CiscoStack::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
);
# Need to specify this or it might grab the ones out of L2 instead of CiscoStack
*SNMP::Info::Layer2::Catalyst::serial = \&SNMP::Info::CiscoStack::serial;
*SNMP::Info::Layer2::Catalyst::interfaces = \&SNMP::Info::CiscoStack::interfaces;
*SNMP::Info::Layer2::Catalyst::i_duplex = \&SNMP::Info::CiscoStack::i_duplex;
*SNMP::Info::Layer2::Catalyst::i_type = \&SNMP::Info::CiscoStack::i_type;
*SNMP::Info::Layer2::Catalyst::i_name = \&SNMP::Info::CiscoStack::i_name;
*SNMP::Info::Layer2::Catalyst::i_duplex_admin = \&SNMP::Info::CiscoStack::i_duplex_admin;
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE, %SNMP::Info::CiscoStack::MUNGE,
);
# Overidden Methods
@@ -94,9 +87,9 @@ sub i_physical {
my $p_port = $cat->p_port();
my %i_physical;
foreach my $port (keys %$p_port) {
foreach my $port ( keys %$p_port ) {
my $iid = $p_port->{$port};
$i_physical{$iid} = 1;
$i_physical{$iid} = 1;
}
return \%i_physical;
}
@@ -110,29 +103,29 @@ sub os {
}
sub os_ver {
my $cat = shift;
my $cat = shift;
my $os_ver = $cat->SUPER::os_ver();
return $os_ver if defined $os_ver;
my $m_swver = $cat->m_swver();
return undef unless defined $m_swver;
return unless defined $m_swver;
# assume .1 entry is the chassis and the sw version we want.
return $m_swver->{1} if defined $m_swver->{1};
return undef;
return;
}
# Workaround for incomplete bp_index
sub bp_index {
my $cat = shift;
my $cat = shift;
my $p_index = $cat->p_port();
my $b_index = $cat->p_oidx();
my %bp_index;
foreach my $iid (keys %$p_index){
foreach my $iid ( keys %$p_index ) {
my $ifidx = $p_index->{$iid};
next unless defined $ifidx;
my $bpidx = $b_index->{$iid}||0;
my $bpidx = $b_index->{$iid} || 0;
$bp_index{$bpidx} = $ifidx;
}
@@ -140,7 +133,44 @@ sub bp_index {
}
sub cisco_comm_indexing {
1;
return 1;
}
sub interfaces {
my $cat = shift;
my $partial = shift;
my $i_index = $cat->i_index($partial);
my $portnames = $cat->p_port() || {};
my %portmap = reverse %$portnames;
my %interfaces = ();
foreach my $iid ( keys %$i_index ) {
next unless defined $iid;
my $if = $i_index->{$iid};
$if =~ s/\./\// if $if;
my $port = $portmap{$iid};
$port =~ s/\./\// if $port;
$interfaces{$iid} = $port || $if;
}
return \%interfaces;
}
sub i_name {
my $cat = shift;
my $partial = shift;
my $p_port = $cat->p_port() || {};
my $p_name = $cat->p_name() || {};
my %i_name;
foreach my $port ( keys %$p_name ) {
my $iid = $p_port->{$port};
next unless defined $iid;
next if ( defined $partial and $iid !~ /^$partial$/ );
$i_name{$iid} = $p_name->{$port};
}
return \%i_name;
}
1;
@@ -148,7 +178,8 @@ __END__
=head1 NAME
SNMP::Info::Layer2::Catalyst - Perl5 Interface to Cisco Catalyst devices running Catalyst OS.
SNMP::Info::Layer2::Catalyst - SNMP Interface to Cisco Catalyst devices
running Catalyst OS.
=head1 AUTHOR
@@ -160,7 +191,6 @@ Max Baker
my $cat = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -172,22 +202,25 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info subclass to provide information for Cisco Catalyst series switches running CatOS.
SNMP::Info subclass to provide information for Cisco Catalyst series switches
running CatOS.
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode) families.
This class includes the Catalyst 2920, 4000, 5000, 6000 (hybrid mode)
families.
This subclass is not for all devices that have the name Catalyst. Note that some Catalyst
switches run IOS, like the 2900 and 3550 families. Cisco Catalyst 1900 switches use their
own MIB and have a separate subclass. Use the method above to have SNMP::Info determine the
appropriate subclass before using this class directly.
This subclass is not for all devices that have the name Catalyst. Note that
some Catalyst switches run IOS, like the 2900 and 3550 families. Cisco
Catalyst 1900 switches use their own MIB and have a separate subclass. Use
the method above to have SNMP::Info determine the appropriate subclass before
using this class directly.
See SNMP::Info::device_type() for specifics.
Note: Some older Catalyst switches will only talk SNMP version 1. Some newer ones will not
return all their data if connected via Version 1.
Note: Some older Catalyst switches will only talk SNMP version 1. Some
newer ones will not return all their data if connected via Version 1.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $cat = new SNMP::Info::Layer2::Catalyst(...);
@@ -195,11 +228,17 @@ a more specific class using the method above.
=over
=item SNMP::Info::Layer2
=item SNMP::Info::CiscoStack
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStack
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::Layer2
=back
@@ -209,11 +248,18 @@ a more specific class using the method above.
=item Inherited Classes' MIBs
See SNMP::Info::Layer2 for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStack for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
=back
@@ -238,21 +284,37 @@ it grabs $cat->m_swver()->{1} and uses that.
Returns 'cisco'
=item $cat->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in SNMP::Info::CiscoStack for details.
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -261,25 +323,54 @@ to a hash.
=over
=item $cat->interfaces()
Returns the map between SNMP Interface Identifier (iid) and physical port
name.
=item $cat->i_name()
Returns reference to hash of iid to human set name.
C<portName>
=item $cat->i_physical()
Returns a map to IID for ports that are physical ports, not vlans, etc.
=item $cat->bp_index()
Returns reference to hash of bridge port table entries map back to interface identifier (iid)
Returns reference to hash of bridge port table entries map back to interface
identifier (iid)
Crosses (B<portCrossIndex>) to (B<portIfIndex>) since some devices seem to have
problems with BRIDGE-MIB
Crosses (C<portCrossIndex>) to (C<portIfIndex>) since some devices seem to
have problems with F<BRIDGE-MIB>
=back
=head2 Table Methods imported from SNMP::Info::CiscoStack
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
=head2 Table Methods imported from SNMP::Info::Layer2::CiscoStack
See documentation in SNMP::Info::Layer2::CiscoStack for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,96 +1,102 @@
# SNMP::Info::Layer2::Centillion
# Eric Miller
# $Id$
#
# Copyright (c) 2004 Eric Miller
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer2::Centillion;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::NortelStack;
use SNMP::Info::SONMP;
@SNMP::Info::Layer2::Centillion::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer2::Centillion::ISA
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::NortelStack SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer2::Centillion::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'CENTILLION-DOT3-EXTENSIONS-MIB' => 'cnDot3ExtnTable',
'S5-COMMON-STATS-MIB' => 's5CmStat',
'CENTILLION-VLAN-MIB' => 'cnVlanENETMgt',
'CENTILLION-CONFIG-MIB' => 'sysTFTPStart',
);
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'CENTILLION-DOT3-EXTENSIONS-MIB' => 'cnDot3ExtnTable',
'S5-COMMON-STATS-MIB' => 's5CmStat',
'CENTILLION-VLAN-MIB' => 'cnVlanENETMgt',
'CENTILLION-CONFIG-MIB' => 'sysTFTPStart',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
'tftp_action' => 'sysTFTPStart',
'tftp_host' => 'sysTFTPIpAddress',
'tftp_file' => 'sysTFTPFileName',
'tftp_type' => 'sysTFTPFileType',
'tftp_result' => 'sysTFTPResult',
);
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
'tftp_action' => 'sysTFTPStart',
'tftp_host' => 'sysTFTPIpAddress',
'tftp_file' => 'sysTFTPFileName',
'tftp_type' => 'sysTFTPFileType',
'tftp_result' => 'sysTFTPResult',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
# CENTILLION-DOT3-EXTENSIONS-MIB::cnDot3ExtnTable
'centillion_p_index' => 'cnDot3ExtnIfIndex',
'centillion_p_duplex' => 'cnDot3ExtnIfOperConnectionType',
'centillion_p_duplex_admin' => 'cnDot3ExtnIfAdminConnectionType',
# S5-COMMON-STATS-MIB::s5CmSNodeTable
'fw_mac' => 's5CmSNodeMacAddr',
'fw_port' => 's5CmSNodeIfIndx',
# CENTILLION-VLAN-MIB::cnVlanPortMemberTable
'centillion_i_vlan_index' => 'cnVlanPortMemberIfIndex',
'centillion_i_vlan' => 'cnVlanPortMemberVID',
'centillion_i_vlan_type' => 'cnVlanPortMemberIngressType',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::NortelStack::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
# CENTILLION-DOT3-EXTENSIONS-MIB::cnDot3ExtnTable
'centillion_p_index' => 'cnDot3ExtnIfIndex',
'centillion_p_duplex' => 'cnDot3ExtnIfOperConnectionType',
'centillion_p_duplex_admin' => 'cnDot3ExtnIfAdminConnectionType',
# S5-COMMON-STATS-MIB::s5CmSNodeTable
'fw_mac' => 's5CmSNodeMacAddr',
'fw_port' => 's5CmSNodeIfIndx',
# CENTILLION-VLAN-MIB::cnVlanPortMemberTable
'centillion_i_vlan_index' => 'cnVlanPortMemberIfIndex',
'centillion_i_vlan' => 'cnVlanPortMemberVID',
'centillion_i_vlan_type' => 'cnVlanPortMemberIngressType',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::NortelStack::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
sub os {
return 'centillion';
@@ -102,12 +108,13 @@ sub vendor {
sub i_ignore {
my $centillion = shift;
my $descr = $centillion->i_description();
my $descr = $centillion->i_description();
my %i_ignore;
foreach my $if (keys %$descr){
foreach my $if ( keys %$descr ) {
my $type = $descr->{$if};
# Skip virtual interfaces
# Skip virtual interfaces
$i_ignore{$if}++ if $type =~ /(VE|VID|vc|lp)/i;
}
return \%i_ignore;
@@ -115,24 +122,25 @@ sub i_ignore {
sub interfaces {
my $centillion = shift;
my $i_index = $centillion->i_index();
my $i_descr = $centillion->i_description();
my $i_index = $centillion->i_index();
my $i_descr = $centillion->i_description();
my %if;
foreach my $iid (keys %$i_index){
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
my $descr = $i_descr->{$iid};
# Skip ATM and virtual interfaces
next if $descr =~ /(VE|VID|vc|lp)/i;
my $descr = $i_descr->{$iid};
# Index numbers are deterministic slot * 256 + port
my $port = $index % 256;
my $slot = int($index / 256);
# Skip ATM and virtual interfaces
next if $descr =~ /(VE|VID|vc|lp)/i;
# Index numbers are deterministic slot * 256 + port
my $port = $index % 256;
my $slot = int( $index / 256 );
my $slotport = "$slot.$port";
$slotport = "$descr" if $descr =~ /(mcp)/i;
$slotport = "$descr" if $descr =~ /(mcp)/i;
$if{$index} = $slotport;
}
@@ -141,89 +149,89 @@ sub interfaces {
sub i_duplex {
my $centillion = shift;
my $port_index = $centillion->centillion_p_index();
my $port_duplex = $centillion->centillion_p_duplex();
my %i_duplex;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
my $duplex = $port_duplex->{$iid};
next unless defined $duplex;
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$i_duplex{$index}=$duplex;
$i_duplex{$index} = $duplex;
}
return \%i_duplex;
}
sub i_duplex_admin {
my $centillion = shift;
my $port_index = $centillion->centillion_p_index();
my $port_admin = $centillion->centillion_p_duplex_admin();
my %i_duplex_admin;
foreach my $iid (keys %$port_index){
foreach my $iid ( keys %$port_index ) {
my $index = $port_index->{$iid};
next unless defined $index;
my $duplex = $port_admin->{$iid};
next unless defined $duplex;
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex_admin{$index}=$duplex;
$i_duplex_admin{$index} = $duplex;
}
return \%i_duplex_admin;
}
sub i_vlan {
my $centillion = shift;
my $cn_vlan_index = $centillion->centillion_i_vlan_index();
my $cn_vlan = $centillion->centillion_i_vlan();
my $cn_vlan = $centillion->centillion_i_vlan();
my %i_vlan;
foreach my $iid (keys %$cn_vlan_index){
foreach my $iid ( keys %$cn_vlan_index ) {
my $index = $cn_vlan_index->{$iid};
next unless defined $index;
my $vlan = $cn_vlan->{$iid};
next unless defined $vlan;
$i_vlan{$index}=$vlan;
next unless defined $vlan;
$i_vlan{$index} = $vlan;
}
return \%i_vlan;
}
sub model {
my $centillion = shift;
my $id = $centillion->id();
return undef unless defined $id;
my $id = $centillion->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^sreg-//i;
return '5000BH' if ($model =~ /5000BH/);
return '5005BH' if ($model =~ /5005BH/);
return 'C100' if ($model =~ /Centillion100/);
return 'C50N' if ($model =~ /Centillion50N/);
return 'C50T' if ($model =~ /Centillion50T/);
return '5000BH' if ( $model =~ /5000BH/ );
return '5005BH' if ( $model =~ /5005BH/ );
return 'C100' if ( $model =~ /Centillion100/ );
return 'C50N' if ( $model =~ /Centillion50N/ );
return 'C50T' if ( $model =~ /Centillion50T/ );
return $model;
}
sub bp_index {
my $centillion = shift;
my $index = $centillion->fw_port();
my $index = $centillion->fw_port();
my %bp_index;
foreach my $iid (keys %$index){
foreach my $iid ( keys %$index ) {
my $b_index = $index->{$iid};
next unless defined $b_index;
#Index value is the same as ifIndex
#Index value is the same as ifIndex
$bp_index{$b_index} = $b_index;
}
@@ -238,13 +246,13 @@ sub slot_offset {
return 0;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based ATM Switches
SNMP::Info::Layer2::Centillion - SNMP Interface to Nortel Centillion based
ATM Switches
=head1 AUTHOR
@@ -256,7 +264,6 @@ Eric Miller
my $centillion = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -271,8 +278,8 @@ Eric Miller
Provides abstraction to the configuration information obtainable from a
Centillion 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $centillion = new SNMP::Info::Layer2::centillion(...);
@@ -297,35 +304,26 @@ than bridge group based.
=over
=item CENTILLION-DOT3-EXTENSIONS-MIB
=item F<CENTILLION-DOT3-EXTENSIONS-MIB>
=item S5-COMMON-STATS-MIB
=item F<S5-COMMON-STATS-MIB>
=item CENTILLION-VLAN-MIB
=item F<CENTILLION-VLAN-MIB>
=item CENTILLION-CONFIG-MIB
=item F<CENTILLION-CONFIG-MIB>
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::NortelStack for its own MIB requirements.
See L<SNMP::Info::NortelStack/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::SONMP for its own MIB requirements.
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
=back
MIBs can be found on the CD that came with your product.
Or, they can be downloaded directly from Nortel Networks regardless of support
contract status.
Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support,
Select by Product Families, Centillion, Centillion C100-C50 ATM Speed Modules,
Software. Filter on mibs and download the latest version's archive.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -338,10 +336,10 @@ Returns 'Nortel'
=item $centillion->model()
Cross references $centillion->id() to the SYNOPTICS-MIB and returns
Cross references $centillion->id() to the F<SYNOPTICS-MIB> and returns
the results.
Removes sreg- from the model name
Removes C<sreg-> from the model name
=item $centillion->os()
@@ -349,23 +347,23 @@ Returns 'Centillion'
=item $centillion->tftp_action()
(B<sysTFTPStart>)
(C<sysTFTPStart>)
=item $centillion->tftp_host()
(B<sysTFTPIpAddress>)
(C<sysTFTPIpAddress>)
=item $centillion->tftp_file()
(B<sysTFTPFileName>)
(C<sysTFTPFileName>)
=item $centillion->tftp_type()
(B<sysTFTPFileType>)
(C<sysTFTPFileType>)
=item $centillion->tftp_result()
(B<sysTFTPResult>)
(C<sysTFTPResult>)
=back
@@ -375,7 +373,8 @@ Returns 'Centillion'
=item $centillion->layers()
Returns 00000011. Class emulates Layer 2 functionality through proprietary MIBs.
Returns 00000011. Class emulates Layer 2 functionality through proprietary
MIBs.
=item $centillion->index_factor()
@@ -391,21 +390,21 @@ start at 0. Returns 0.
=head2 Globals imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::NortelStack
See documentation in SNMP::Info::NortelStack for details.
See documentation in L<SNMP::Info::NortelStack/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -418,7 +417,8 @@ to a hash.
Returns reference to the map between IID and physical Port.
Slot and port numbers on the Passport switches are determined by the formula:
Slot and port numbers on the Passport switches are determined by the
formula:
port = index % 256
slot = int(index / 256)
@@ -438,23 +438,23 @@ Returns reference to hash of IIDs to ignore.
=item $centillion->fw_mac()
(B<s5CmSNodeMacAddr>)
(C<s5CmSNodeMacAddr>)
=item $centillion->fw_port()
(B<s5CmSNodeIfIndx>)
(C<s5CmSNodeIfIndx>)
=item $centillion->bp_index()
Returns a mapping between ifIndex and the Bridge Table.
Returns a mapping between C<ifIndex> and the Bridge Table.
=item $centillion->i_vlan()
Returns a mapping between ifIndex and the VLAN.
Returns a mapping between C<ifIndex> and the VLAN.
=back
=head2 Centillion 802.3 Extension Table (B<cnDot3ExtnTable>)
=head2 Centillion 802.3 Extension Table (C<cnDot3ExtnTable>)
=over
@@ -462,23 +462,23 @@ Returns a mapping between ifIndex and the VLAN.
Returns reference to hash. Maps table IIDs to Interface IIDs
(B<cnDot3ExtnIfIndex>)
(C<cnDot3ExtnIfIndex>)
=item $centillion->centillion_p_duplex()
Returns reference to hash. Maps port operational duplexes to IIDs
(B<cnDot3ExtnIfOperConnectionType>)
(C<cnDot3ExtnIfOperConnectionType>)
=item $centillion->rc_centillion_p_duplex_admin()
Returns reference to hash. Maps port admin duplexes to IIDs
(B<cnDot3ExtnIfAdminConnectionType>)
(C<cnDot3ExtnIfAdminConnectionType>)
=back
=head2 Centillion VLAN Table (B<cnVlanPortMemberTable>)
=head2 Centillion VLAN Table (C<cnVlanPortMemberTable>)
=over
@@ -486,36 +486,36 @@ Returns reference to hash. Maps port admin duplexes to IIDs
Returns reference to hash. Key: Table entry, Value: Index
(B<cnVlanPortMemberIfIndex>)
(C<cnVlanPortMemberIfIndex>)
=item $centillion->centillion_i_vlan()
Returns reference to hash. Key: Table entry, Value: VLAN ID
(B<cnVlanPortMemberVID>)
(C<cnVlanPortMemberVID>)
=item $centillion->centillion_i_vlan_type()
Returns reference to hash. Key: Table entry, Value: VLAN Type
(B<cnVlanPortMemberIngressType>)
(C<cnVlanPortMemberIngressType>)
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::NortelStack
See documentation in SNMP::Info::NortelStack for details.
See documentation in L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=cut

View File

@@ -1,99 +1,91 @@
# SNMP::Info::Layer2::Cisco
# Max Baker
# $Id$
#
# Copyright (c) 2006 Max Baker
#
# Redistribution and use in source and binary forms, with or without
# Copyright (c) 2008 Max Baker
# 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
# * 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.
#
# 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::Layer2::Cisco;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoRTT;
use SNMP::Info::CiscoQOS;
use SNMP::Info::CiscoConfig;
use SNMP::Info::Layer2;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
$VERSION = 1.04;
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::Layer2 SNMP::Info::CiscoVTP
SNMP::Info::CDP SNMP::Info::CiscoStats
SNMP::Info::CiscoImage SNMP::Info::CiscoRTT
SNMP::Info::CiscoQOS Exporter/;
@SNMP::Info::Layer2::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
SNMP::Info::CiscoConfig SNMP::Info::Layer2
Exporter/;
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CiscoRTT::MIBS,
%SNMP::Info::CiscoQOS::MIBS,
);
%SNMP::Info::Layer2::MIBS, %SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoQOS::MIBS, %SNMP::Info::CiscoRTT::MIBS,
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS, %SNMP::Info::CiscoVTP::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoRTT::GLOBALS,
%SNMP::Info::CiscoQOS::GLOBALS,
);
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoQOS::GLOBALS, %SNMP::Info::CiscoRTT::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS, %SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS, %SNMP::Info::CiscoVTP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CiscoRTT::FUNCS,
%SNMP::Info::CiscoQOS::FUNCS,
);
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoQOS::FUNCS, %SNMP::Info::CiscoRTT::FUNCS,
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS, %SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CiscoRTT::MUNGE,
%SNMP::Info::CiscoQOS::MUNGE,
);
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoQOS::MUNGE, %SNMP::Info::CiscoRTT::MUNGE,
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
);
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Cisco - Perl5 Interface to L3 and L2+L3 IOS Cisco Device
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
that are not covered in other classes.
=head1 AUTHOR
@@ -104,12 +96,12 @@ Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $cisco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -124,8 +116,6 @@ Subclass for Generic Cisco Routers running IOS
=over
=item SNMP::Info::Layer2
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
@@ -134,6 +124,14 @@ Subclass for Generic Cisco Routers running IOS
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoRTT
=item SNMP::Info::CiscoQOS
=item SNMP::Info::CiscoConfig
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
@@ -142,15 +140,21 @@ Subclass for Generic Cisco Routers running IOS
=item Inherited Classes' MIBs
See SNMP::Info::Layer2 for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStats for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CDP for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoImage for its own MIB requirements.
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
=back
@@ -166,49 +170,73 @@ These are methods that return scalar value from SNMP
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,85 +1,81 @@
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
# $Id$
#
# Copyright (c) 2005 Max Baker
# Copyright (c) 2008 Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer2::Foundry;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::FDP;
use SNMP::Info::EtherLike;
use SNMP::Info::MAU;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
@SNMP::Info::Layer2::Foundry::ISA = qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer2::Foundry::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::FDP SNMP::Info::EtherLike
SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer2::Foundry::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::Layer2::MIBS,
%SNMP::Info::FDP::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::MAU::MIBS,
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
);
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::FDP::MIBS,
%SNMP::Info::EtherLike::MIBS, %SNMP::Info::MAU::MIBS,
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::FDP::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
);
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::FDP::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS, %SNMP::Info::MAU::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::FDP::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::MAU::FUNCS,
'test' => 'dot1dStpPortState',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS, %SNMP::Info::FDP::FUNCS,
%SNMP::Info::EtherLike::FUNCS, %SNMP::Info::MAU::FUNCS,
'test' => 'dot1dStpPortState',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::FDP::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::MAU::MUNGE,
);
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::FDP::MUNGE,
%SNMP::Info::EtherLike::MUNGE, %SNMP::Info::MAU::MUNGE,
);
# Method OverRides
#sub bulkwalk_no { 1;}
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
*SNMP::Info::Layer2::Foundry::i_duplex_admin = \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
*SNMP::Info::Layer2::Foundry::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
*SNMP::Info::Layer2::Foundry::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer2::Foundry::i_vlan = \&SNMP::Info::Bridge::qb_i_vlan_t;
# todo doc these
@@ -90,19 +86,19 @@ sub os_ver {
# find entity table entry for "stackmanaget.1"
my $unit_iid = undef;
foreach my $e (keys %$e_name){
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'stackmanaget.1';
}
# Default to OID method if no dice.
unless (defined $unit_iid){
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_fwver = $foundry->e_fwver();
if (defined $e_fwver->{$unit_iid}){
if ( defined $e_fwver->{$unit_iid} ) {
return $e_fwver->{$unit_iid};
}
@@ -117,25 +113,25 @@ sub model {
# find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e (keys %$e_name){
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
# Default to OID method if no dice.
unless (defined $unit_iid){
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_model = $foundry->e_model();
if (defined $e_model->{$unit_iid}){
if ( defined $e_model->{$unit_iid} ) {
return $e_model->{$unit_iid};
}
# Not found in ENTITY-MIB, go up a level.
return $foundry->SUPER::model();
}
sub serial {
@@ -145,11 +141,11 @@ sub serial {
# find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e (keys %$e_name){
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
return undef unless defined $unit_iid;
return unless defined $unit_iid;
# Look up serial of found entry.
my $e_serial = $foundry->e_serial();
@@ -163,13 +159,13 @@ sub interfaces {
my $i_descr = $foundry->i_description;
my $i_name = $foundry->i_name;
# use ifName only if it is in portn
# use ifName only if it is in portn
# format. For EdgeIrons
# else use ifDescr
foreach my $iid (keys %$i_name){
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name
$i_descr->{$iid} = $name
if $name =~ /^port\d+/i;
}
@@ -178,21 +174,21 @@ sub interfaces {
sub i_ignore {
my $foundry = shift;
my $i_type = $foundry->i_type();
my $i_type = $foundry->i_type();
my %i_ignore = ();
foreach my $iid (keys %$i_type){
foreach my $iid ( keys %$i_type ) {
my $type = $i_type->{$iid} || '';
$i_ignore{$iid}++
$i_ignore{$iid}++
# 33 is the console port
if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
}
return \%i_ignore;
}
sub os {
sub os {
return 'foundry';
}
@@ -202,14 +198,15 @@ sub vendor {
# this hangs on a edgeiron24g
# TODO: check by devicetype and deferr to SUPER if not bad device
sub stp_p_state { undef; }
sub stp_p_state { return; }
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Foundry - Perl5 Interface to Foundry FastIron Network Devices
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
Devices
=head1 AUTHOR
@@ -217,22 +214,26 @@ Max Baker
=head1 SYNOPSIS
This module is Deprecated. Please use Layer3::Foundry instead.
# Let SNMP::Info determine the correct subclass for you.
my $foundry = 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 = $foundry->class();
my $class = $foundry->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This module is Deprecated. Please use Layer3::Foundry instead.
This module provides support for Foundry EdgeIron Switches
=head2 Inherited Classes
@@ -249,7 +250,7 @@ This module provides support for Foundry EdgeIron Switches
=over
=item FOUNDRY-SN-ROOT-MIB
=item F<FOUNDRY-SN-ROOT-MIB>
=item Inherited Classes' MIBs
@@ -263,19 +264,37 @@ These are methods that return scalar value from SNMP
=over
=item todo
=item $foundry->model()
Returns model type.
=item $foundry->vendor()
Returns 'foundry'
=item $foundry->os()
Returns 'foundry'
=item $foundry->os_ver()
Returns the software version
=item $foundry->serial()
Returns the serial number
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::FDP
See documentation in SNMP::Info::FDP for details.
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -284,16 +303,47 @@ to a hash.
=over
=item todo2
=item $foundry->interfaces()
Returns reference to hash of interface names to iids.
=item $foundry->i_ignore()
Returns reference to hash of interfaces to be ignored.
Ignores interfaces with descriptions of tunnel,loopback,null
=item $foundry->i_duplex()
Returns reference to hash of interface link duplex status.
Crosses $foundry->sw_duplex() with $foundry->sw_index()
=item $foundry->i_duplex_admin()
Returns reference to hash of interface administrative duplex status.
=item $foundry->stp_p_state()
"The port's current state as defined by application of the Spanning Tree
Protocol.
Skipped if device is an EdgeIron 24G due to reports of hangs.
(C<dot1dStpPortState>)
=item $foundry->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::FDP
See documentation in SNMP::Info::FDP for details.
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
=cut

File diff suppressed because it is too large Load Diff

721
Info/Layer2/HP4000.pm Normal file
View File

@@ -0,0 +1,721 @@
# SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,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::Layer2::HP4000;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::CDP;
@SNMP::Info::Layer2::HP4000::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::MAU
SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CDP::MIBS,
'RFC1271-MIB' => 'logDescription',
'HP-ICF-OID' => 'hpSwitch4000',
'HP-VLAN' => 'hpVlanMemberIndex',
'STATISTICS-MIB' => 'hpSwitchCpuStat',
'NETSWITCH-MIB' => 'hpMsgBufFree',
'CONFIG-MIB' => 'hpSwitchConfig',
'SEMI-MIB' => 'hpHttpMgSerialNumber',
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'serial1' => 'hpHttpMgSerialNumber.0',
'hp_cpu' => 'hpSwitchCpuStat.0',
'hp_mem_total' => 'hpGlobalMemTotalBytes.1',
'mem_free' => 'hpGlobalMemFreeBytes.1',
'mem_used' => 'hpGlobalMemAllocBytes.1',
'os_version' => 'hpSwitchOsVersion.0',
'os_bin' => 'hpSwitchRomVersion.0',
'mac' => 'hpSwitchBaseMACAddress.0',
'hp_vlans' => 'hpVlanNumber',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::CDP::FUNCS,
'bp_index2' => 'dot1dBasePortIfIndex',
'i_type2' => 'ifType',
# RFC1271
'l_descr' => 'logDescription',
# HP-VLAN-MIB
'hp_v_index' => 'hpVlanDot1QID',
'hp_v_name' => 'hpVlanIdentName',
'hp_v_state' => 'hpVlanIdentState',
'hp_v_type' => 'hpVlanIdentType',
'hp_v_status' => 'hpVlanIdentStatus',
'hp_v_mac' => 'hpVlanAddrPhysAddress',
'hp_v_if_index' => 'hpVlanMemberIndex',
'hp_v_if_tag' => 'hpVlanMemberTagged2',
# CONFIG-MIB::hpSwitchPortTable
'hp_duplex' => 'hpSwitchPortEtherMode',
'hp_duplex_admin' => 'hpSwitchPortFastEtherMode',
'vendor_i_type' => 'hpSwitchPortType',
# HP-ICF-CHASSIS
'hp_s_oid' => 'hpicfSensorObjectId',
'hp_s_name' => 'hpicfSensorDescr',
'hp_s_status' => 'hpicfSensorStatus',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
%SNMP::Info::CDP::MUNGE
);
%MODEL_MAP = (
'J4093A' => '2424M',
'J4110A' => '8000M',
'J4120A' => '1600M',
'J4121A' => '4000M',
'J4122A' => '2400M',
'J4122B' => '2424M',
);
# Method Overrides
sub cpu {
my $hp = shift;
return $hp->hp_cpu();
}
sub mem_total {
my $hp = shift;
return $hp->hp_mem_total();
}
sub os {
return 'hp';
}
sub os_ver {
my $hp = shift;
my $os_version = $hp->os_version();
return $os_version if defined $os_version;
# Some older ones don't have this value,so we cull it from the description
my $descr = $hp->description();
if ( $descr =~ m/revision ([A-Z]{1}\.\d{2}\.\d{2})/ ) {
return $1;
}
return;
}
# Lookup model number, and translate the part number to the common number
sub model {
my $hp = shift;
my $id = $hp->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^hpswitch//i;
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
}
sub interfaces {
my $hp = shift;
my $interfaces = $hp->i_index();
my $i_descr = $hp->i_description();
my %if;
foreach my $iid ( keys %$interfaces ) {
my $descr = $i_descr->{$iid};
next unless defined $descr;
$if{$iid} = $descr if ( defined $descr and length $descr );
}
return \%if
}
sub i_name {
my $hp = shift;
my $i_alias = $hp->i_alias();
my $e_name = $hp->e_name();
my $e_port = $hp->e_port();
my %i_name;
foreach my $port ( keys %$e_name ) {
my $iid = $e_port->{$port};
next unless defined $iid;
my $alias = $i_alias->{$iid};
next unless defined $iid;
$i_name{$iid} = $e_name->{$port};
# Check for alias
$i_name{$iid} = $alias if ( defined $alias and length($alias) );
}
return \%i_name;
}
sub i_duplex {
my $hp = shift;
return $hp->mau_i_duplex();
}
sub i_duplex_admin {
my $hp = shift;
my $partial = shift;
# Try HP MIB first
my $hp_duplex = $hp->hp_duplex_admin($partial);
if ( defined $hp_duplex and scalar( keys %$hp_duplex ) ) {
my %i_duplex;
foreach my $if ( keys %$hp_duplex ) {
my $duplex = $hp_duplex->{$if};
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$duplex = 'auto' if $duplex =~ /auto/i;
$i_duplex{$if} = $duplex;
}
return \%i_duplex;
}
else {
return $hp->mau_i_duplex_admin();
}
}
sub vendor {
return 'hp';
}
sub log {
my $hp = shift;
my $log = $hp->l_descr();
my $logstring = undef;
foreach my $val ( values %$log ) {
next if $val =~ /^Link\s+(Up|Down)/;
$logstring .= "$val\n";
}
return $logstring;
}
sub slots {
my $hp = shift;
my $e_name = $hp->e_name();
return unless defined $e_name;
my $slots;
foreach my $slot ( keys %$e_name ) {
$slots++ if $e_name->{$slot} =~ /slot/i;
}
return $slots;
}
sub fan {
my $hp = shift;
return &_sensor( $hp, 'fan' );
}
sub ps1_status {
my $hp = shift;
return &_sensor( $hp, 'power', '^power supply 1' )
|| &_sensor( $hp, 'power', '^power supply sensor' );
}
sub ps2_status {
my $hp = shift;
return &_sensor( $hp, 'power', '^power supply 2' )
|| &_sensor( $hp, 'power', '^redundant' );
}
sub _sensor {
my $hp = shift;
my $search_type = shift || 'fan';
my $search_name = shift || '';
my $hp_s_oid = $hp->hp_s_oid();
my $result;
foreach my $sensor ( keys %$hp_s_oid ) {
my $sensortype = &SNMP::translateObj( $hp_s_oid->{$sensor} );
if ( $sensortype =~ /$search_type/i ) {
my $sensorname = $hp->hp_s_name()->{$sensor};
my $sensorstatus = $hp->hp_s_status()->{$sensor};
if ( $sensorname =~ /$search_name/i ) {
$result = $sensorstatus;
}
}
}
return $result;
}
# Bridge MIB does not map Bridge Port to ifIndex correctly on older models, but Bridge Port equals ifIndex in these devices
sub bp_index {
my $hp = shift;
my $partial = shift;
my $if_index = $hp->i_index($partial);
my %mod_bp_index;
foreach my $iid ( keys %$if_index ) {
$mod_bp_index{$iid} = $iid;
}
return \%mod_bp_index;
}
# VLAN methods. Devices in this class use the proprietary HP-VLAN-MIB.
sub v_index {
my $hp = shift;
my $partial = shift;
return $hp->hp_v_index($partial);
}
sub v_name {
my $hp = shift;
my $partial = shift;
return $hp->hp_v_name($partial);
}
sub i_vlan {
my $hp = shift;
# the hpvlanmembertagged2 table has an entry in the form of
# vlan.interface = /untagged/no/tagged/auto
my $i_vlan = {};
my $hp_v_index = $hp->hp_v_index();
my $hp_v_if_tag = $hp->hp_v_if_tag();
foreach my $row ( keys %$hp_v_if_tag ) {
my ( $index, $if ) = split( /\./, $row );
my $tag = $hp_v_if_tag->{$row};
my $vlan = $hp_v_index->{$index};
next unless ( defined $tag and $tag =~ /untagged/ );
$i_vlan->{$if} = $vlan if defined $vlan;
}
return $i_vlan;
}
sub i_vlan_membership {
my $hp = shift;
my $i_vlan_membership = {};
my $hp_v_index = $hp->hp_v_index();
my $hp_v_if_tag = $hp->hp_v_if_tag();
foreach my $row ( keys %$hp_v_if_tag ) {
my ( $index, $if ) = split( /\./, $row );
my $tag = $hp_v_if_tag->{$row};
my $vlan = $hp_v_index->{$index};
next unless ( defined $tag );
next if ( $tag eq 'no' );
push( @{ $i_vlan_membership->{$if} }, $vlan );
}
return $i_vlan_membership;
}
sub set_i_vlan {
my $hp = shift;
my $rv;
my $hp_v_index = $hp->hp_v_index();
my $hp_v_if_tag = $hp->hp_v_if_tag();
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
my $vlan = shift;
my $iid = shift;
my $old_untagged;
# Hash to lookup VLAN index of the VID (dot1q tag)
my %vl_trans = reverse %$hp_v_index;
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
my $vlan_index = $vl_trans{$vlan};
if (defined $vlan_index) {
# First, loop through table to determine current untagged vlan for the port we're about to change
foreach my $row (keys %$hp_v_if_tag){
my ($index,$if) = split(/\./,$row);
if ($if == $iid and $hp_v_if_tag->{$row} =~ /untagged/) {
# Store the row information of the current untagged VLAN and temporarily set it to tagged
$old_untagged = $row;
$rv = $hp->set_hp_v_if_tag(1, $row);
last;
}
}
# Then set our port untagged in the desired VLAN
my $rv = $hp->set_hp_v_if_tag(2, "$vlan_index.$iid");
if (defined $rv) {
# If vlan change is successful, remove VLAN that used to be untagged from the port
if (defined $old_untagged) {
$rv = $hp->set_hp_v_if_tag(3, $old_untagged);
$hp->error_throw("Error removing previous untagged vlan from port, should never happen...\n") unless defined $rv;
}
} else {
# If vlan change was not succesful, try to revert to the old situation.
if (defined $old_untagged) {
$rv = $hp->set_hp_v_if_tag(2, $old_untagged) if defined $old_untagged;
if (defined $rv) {
$hp->error_throw("VLAN change failed, restored port to previous configuration.\n");
} else {
$hp->error_throw("VLAN change failed, unable to restore old configuration. Check device.\n");
}
}
}
} else {
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
}
} else {
$hp->error_throw("Error retrieving VLAN information from device.\n");
}
return $rv;
}
sub set_i_vlan_tagged {
my $hp = shift;
my $vlan = shift;
my $iid = shift;
my $rv;
my $hp_v_index = $hp->hp_v_index();
if (defined $hp_v_index and scalar(keys %$hp_v_index)){
# Hash to lookup VLAN index of the VID (dot1q tag)
my %vl_trans = reverse %$hp_v_index;
# Translate the VLAN identifier (tag) value to the index used by the HP-VLAN MIB
my $vlan_index = $vl_trans{$vlan};
if (defined $vlan_index) {
# Set our port tagged in the desired VLAN
$rv = $hp->set_hp_v_if_tag(1, "$vlan_index.$iid");
} else {
$hp->error_throw("Requested VLAN (VLAN ID: $vlan) not available on device.\n");
}
}
return $rv;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::HP4000 - SNMP Interface to older HP ProCurve Switches (1600, 2400, 2424M, 4000 and 8000)
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $hp = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $hp->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
HP ProCurve Switch via SNMP.
Note: Some HP Switches will connect via SNMP version 1, but a lot of config
data will not be available. Make sure you try and connect with Version 2
first, and then fail back to version 1.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $hp = new SNMP::Info::Layer2::HP4000(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::MAU
=back
=head2 Required MIBs
=over
=item F<RFC1271-MIB>
Included in V2 mibs from Cisco
=item F<HP-ICF-OID>
=item F<HP-VLAN>
(this MIB new with SNMP::Info 0.8)
=item F<STATISTICS-MIB>
=item F<NETSWITCH-MIB>
=item F<CONFIG-MIB>
=back
The last five MIBs listed are from HP and can be found at
L<http://www.hp.com/rnd/software> or
L<http://www.hp.com/rnd/software/MIBs.htm>
=head1 Change Log
Version 0.4 - Removed F<ENTITY-MIB> e_*() methods to separate sub-class -
SNMP::Info::Entity
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $hp->cpu()
Returns CPU Utilization in percentage.
=item $hp->log()
Returns all the log entries from the switch's log that are not Link up or
down messages.
=item $hp->mem_free()
Returns bytes of free memory
=item $hp->mem_total()
Return bytes of total memory
=item $hp->mem_used()
Returns bytes of used memory
=item $hp->model()
Returns the model number of the HP Switch. Will translate between the HP Part
number and the common model number with this map :
%MODEL_MAP = (
'J4093A' => '2424M',
'J4110A' => '8000M',
'J4120A' => '1600M',
'J4121A' => '4000M',
'J4122A' => '2400M',
'J4122B' => '2424M',
);
=item $hp->os()
Returns hp
=item $hp->os_bin()
C<hpSwitchRomVersion.0>
=item $hp->os_ver()
Tries to use os_version() and if that fails will try and cull the version from
the description field.
=item $hp->os_version()
C<hpSwitchOsVersion.0>
=item $hp->serial()
Returns serial number if available through SNMP
=item $hp->slots()
Returns number of entries in $hp->e_name that have 'slot' in them.
=item $hp->vendor()
hp
=item $hp->fan()
Returns fan status
=item $hp->ps1_status()
Power supply 1 status
=item $hp->ps2_status()
Power supply 2 status
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $hp->interfaces()
Uses $hp->i_description()
=item $hp->i_duplex()
Returns reference to map of IIDs to current link duplex.
=item $hp->i_duplex_admin()
Returns reference to hash of IIDs to admin duplex setting.
=item $hp->vendor_i_type()
Returns reference to hash of IIDs to HP specific port type (hpSwitchPortType).
=item $hp->i_name()
Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
=item $hp->i_vlan()
Returns a mapping between C<ifIndex> and the PVID (default VLAN) or untagged
port when using F<HP-VLAN>.
=item $hp->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the egress list for the port.
It is the union of tagged, untagged, and auto ports.
Example:
my $interfaces = $hp->interfaces();
my $vlans = $hp->i_vlan_membership();
foreach my $iid (sort keys %$interfaces) {
my $port = $interfaces->{$iid};
my $vlan = join(',', sort(@{$vlans->{$iid}}));
print "Port: $port VLAN: $vlan\n";
}
=item $hp->v_index()
Returns VLAN IDs
=item $hp->v_name()
Returns VLAN names
=item $hp->bp_index()
Returns reference to hash of bridge port table entries map back to interface
identifier (iid)
Returns (C<ifIndex>) for both key and value for 1600, 2424, 4000, and 8000
models since they seem to have problems with F<BRIDGE-MIB>
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=over
=item set_i_vlan()
=item set_i_vlan_tagged()
=cut

209
Info/Layer2/HPVC.pm Normal file
View File

@@ -0,0 +1,209 @@
# SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
#
# Copyright (c) 2011 Jeroen van Ingen
#
# 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::Layer2::HPVC;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::HPVC::ISA
= qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'HPVC-MIB' => 'vcDomainName',
'CPQSINFO-MIB' => 'cpqSiSysSerialNum',
'HPVCMODULE-MIB' => 'vcModuleDomainName',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'serial1' => 'cpqSiSysSerialNum.0',
'os_ver' => 'cpqHoSWRunningVersion.1',
'os_bin' => 'cpqHoFwVerVersion.1',
'productname' => 'cpqSiProductName.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer2::MUNGE,
);
# Method Overrides
sub os {
return 'hpvc';
}
sub vendor {
return 'hp';
}
sub model {
my $hp = shift;
return $hp->productname();
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $hp = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $hp->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
HP VirtualConnect Switch via 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 $hp = new SNMP::Info::Layer2::HPVC(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<HPVC-MIB>
=item F<CPQSINFO-MIB>
=item F<HPVCMODULE-MIB>
=back
All required MIBs can be found in the netdisco-mibs package.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $hp->os()
Returns hpvc
=item $hp->os_bin()
C<cpqHoFwVerVersion.1>
=item $hp->os_ver()
C<cpqHoSWRunningVersion.1>
=item $hp->serial()
C<cpqSiSysSerialNum.0>
=item $hp->vendor()
hp
=item $hp->model()
C<cpqSiProductName.0>
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head1 MUNGES
=over
=back
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=cut

180
Info/Layer2/Kentrox.pm Normal file
View File

@@ -0,0 +1,180 @@
package SNMP::Info::Layer2::Kentrox;
# Copyright (c) 2011 Netdisco Project
# 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.
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Kentrox::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Kentrox::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
#from DATASMART-MIB
# MIB isn't yet in netdisco-mibs (not clear permission)
# ... when it is, this can change to dsScWyv
'ds_sysinfo' => '.1.3.6.1.4.1.181.2.2.12.15.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub os {
return 'Kentrox';
}
sub os_ver {
my $dsver = shift;
my $descr = $dsver->description();
if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
return $1;
}
}
sub serial {
my $dsserial = shift;
my $serial = $dsserial->ds_sysinfo();
if ( $serial =~ /SERIAL\s(\S+)/){
my $str = substr($1,8,10);
return $str;
}
}
sub vendor {
return 'Kentrox';
}
sub model {
my $dsmodel = shift;
my $descr = $dsmodel->description();
if ( $descr =~ /^(\S+\s\S+)/){
return $1;
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Kentrox - SNMP Interface to L2 Kentrox DataSMART DSU/CSU
=head1 AUTHOR
phishphreek@gmail.com
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $router = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $router->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Kentrox DataSMART DSU/CSU
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
=item $router->os()
=item $router->os_ver()
=item $router->model()
=item $router->serial()
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,74 +1,69 @@
# SNMP::Info::Layer2::N2270
# Eric Miller
# $Id$
#
# Copyright (c) 2005 Eric Miller
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer2::N2270;
$VERSION = '1.04';
use strict;
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::SONMP;
use SNMP::Info::Airespace;
@SNMP::Info::Layer2::N2270::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
@SNMP::Info::Layer2::N2270::ISA
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP SNMP::Info::Airespace Exporter/;
@SNMP::Info::Layer2::N2270::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::SONMP::MIBS,
%SNMP::Info::Airespace::MIBS,
);
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS,
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
%SNMP::Info::Airespace::GLOBALS,
);
%SNMP::Info::GLOBALS, %SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::SONMP::GLOBALS, %SNMP::Info::Airespace::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::SONMP::FUNCS,
%SNMP::Info::Airespace::FUNCS,
);
%FUNCS = (
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
%SNMP::Info::SONMP::FUNCS, %SNMP::Info::Airespace::FUNCS,
);
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::SONMP::MUNGE,
%SNMP::Info::Airespace::MUNGE,
);
%MUNGE = (
%SNMP::Info::MUNGE, %SNMP::Info::Bridge::MUNGE,
%SNMP::Info::SONMP::MUNGE, %SNMP::Info::Airespace::MUNGE,
);
sub os {
return 'nortel';
@@ -80,8 +75,8 @@ sub vendor {
sub model {
my $n2270 = shift;
my $id = $n2270->id();
return undef unless defined $id;
my $id = $n2270->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^sreg-WLANSecuritySwitch//i;
@@ -102,7 +97,8 @@ __END__
=head1 NAME
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless Switch
SNMP::Info::Layer2::N2270 - SNMP Interface to Nortel 2270 Series Wireless
Switch
=head1 AUTHOR
@@ -115,7 +111,6 @@ Eric Miller
my $n2270 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -131,8 +126,8 @@ Eric Miller
Provides abstraction to the configuration information obtainable from a
Nortel 2270 Series Wireless Switch 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $n2270 = new SNMP::Info::Layer2::N2270(...);
@@ -156,13 +151,13 @@ my $n2270 = new SNMP::Info::Layer2::N2270(...);
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::SONMP for its own MIB requirements.
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::Airespace for its own MIB requirements.
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
=back
@@ -182,10 +177,10 @@ Returns 'nortel'
=item $n2270->model()
Cross references $bayhub->id() to the SYNOPTICS-ROOT-MIB and returns
Cross references $bayhub->id() to the F<SYNOPTICS-ROOT-MIB> and returns
the results.
Removes sreg-WLANSecuritySwitch from the model name
Removes C<sreg-WLANSecuritySwitch> from the model name
=back
@@ -207,21 +202,21 @@ start at 0. Returns 0.
=head2 Globals imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See documentation in L<SNMP::Info::SONMP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Airespace
See documentation in SNMP::Info::Airespace for details.
See documentation in L<SNMP::Info::Airespace/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -236,18 +231,18 @@ to a hash.
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Airespace
See documentation in SNMP::Info::Airespace for details.
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
=cut

View File

@@ -1,178 +1,156 @@
# SNMP::Info::Layer2::NAP222x
# Eric Miller
# $Id$
#
# Copyright (c) 2004 Eric Miller
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer2::NAP222x;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::SONMP;
use SNMP::Info::IEEE802dot11;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::NAP222x::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer2::NAP222x::ISA
= qw/SNMP::Info::SONMP SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::NAP222x::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::SONMP::MIBS,
'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
);
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
%SNMP::Info::SONMP::MIBS, 'NORTEL-WLAN-AP-MIB' => 'ntWlanSwHardwareVer',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
'nt_hw_ver' => 'ntWlanSwHardwareVer',
'nt_fw_ver' => 'ntWlanSwBootRomVer',
'nt_sw_ver' => 'ntWlanSwOpCodeVer',
'nt_cc' => 'ntWlanSwCountryCode',
'tftp_action' => 'ntWlanTransferStart',
'tftp_host' => 'ntWlanFileServer',
'tftp_file' => 'ntWlanDestFile',
'tftp_type' => 'ntWlanFileType',
'tftp_result' => 'ntWlanFileTransferStatus',
'tftp_xtype' => 'ntWlanTransferType',
'tftp_src_file' => 'ntWlanSrcFile',
'ftp_user' => 'ntWlanUserName',
'ftp_pass' => 'ntWlanPassword',
);
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::IEEE802dot11::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
'nt_hw_ver' => 'ntWlanSwHardwareVer',
'nt_fw_ver' => 'ntWlanSwBootRomVer',
'nt_sw_ver' => 'ntWlanSwOpCodeVer',
'nt_cc' => 'ntWlanSwCountryCode',
'tftp_action' => 'ntWlanTransferStart',
'tftp_host' => 'ntWlanFileServer',
'tftp_file' => 'ntWlanDestFile',
'tftp_type' => 'ntWlanFileType',
'tftp_result' => 'ntWlanFileTransferStatus',
'tftp_xtype' => 'ntWlanTransferType',
'tftp_src_file' => 'ntWlanSrcFile',
'ftp_user' => 'ntWlanUserName',
'ftp_pass' => 'ntWlanPassword',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::SONMP::FUNCS,
'i_name2' => 'ifName',
'bp_index_2' => 'dot1dTpFdbPort',
# From ntWlanPortTable
'nt_prt_name' => 'ntWlanPortName',
'nt_dpx_admin' => 'ntWlanPortCapabilities',
'nt_auto' => 'ntWlanPortAutonegotiation',
'nt_dpx' => 'ntWlanPortSpeedDpxStatus',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::IEEE802dot11::FUNCS,
%SNMP::Info::SONMP::FUNCS,
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
# From ntWlanPortTable
'nt_prt_name' => 'ntWlanPortName',
'nt_dpx_admin' => 'ntWlanPortCapabilities',
'nt_auto' => 'ntWlanPortAutonegotiation',
'nt_dpx' => 'ntWlanPortSpeedDpxStatus',
# From ntWlanDot11PhyOperationTable
'nt_i_broadcast' => 'ntWlanDot11ClosedSystem',
# From ntWlanApVlanTable
'nt_i_vlan' => 'ntWlanApVlanDefaultVid',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
sub os {
return 'nortel';
}
sub os_ver {
my $nap222x = shift;
my $ver = $nap222x->nt_sw_ver();
return undef unless defined $ver;
if ($ver =~ m/(\d+\.\d+\.\d+\.\d+)/){
return $1;
}
return undef;
}
sub os_bin {
my $nap222x = shift;
my $bin = $nap222x->nt_fw_ver();
return undef unless defined $bin;
my $bin = $nap222x->nt_fw_ver();
return unless defined $bin;
if ($bin =~ m/(\d+\.\d+\.\d+)/){
if ( $bin =~ m/(\d+\.\d+\.\d+)/ ) {
return $1;
}
return undef;
}
sub vendor {
return 'nortel';
}
return;
}
sub model {
my $nap222x = shift;
my $descr = $nap222x->description();
return undef unless defined $descr;
my $descr = $nap222x->description();
return unless defined $descr;
return 'AP-2220' if ($descr =~ /2220/);
return 'AP-2221' if ($descr =~ /2221/);
return 'AP-2225' if ($descr =~ /2225/);
return undef;
return 'AP-2220' if ( $descr =~ /2220/ );
return 'AP-2221' if ( $descr =~ /2221/ );
return;
}
sub mac {
my $nap222x = shift;
my $i_mac = $nap222x->i_mac();
my $i_mac = $nap222x->i_mac();
# Return Interface MAC
foreach my $entry (keys %$i_mac){
# Return Interface MAC
foreach my $entry ( keys %$i_mac ) {
my $sn = $i_mac->{$entry};
next unless $sn;
return $sn;
}
return undef;
return;
}
sub serial {
my $nap222x = shift;
my $i_mac = $nap222x->i_mac();
my $i_mac = $nap222x->i_mac();
# Return Interface MAC
foreach my $entry (keys %$i_mac){
# Return Interface MAC
foreach my $entry ( keys %$i_mac ) {
my $sn = $i_mac->{$entry};
next unless $sn;
return $sn;
}
return undef;
}
sub i_ignore {
my $nap222x = shift;
my $descr = $nap222x->i_description();
my %i_ignore;
foreach my $if (keys %$descr){
my $type = $descr->{$if};
# Skip virtual interfaces
$i_ignore{$if}++ if $type =~ /(loopback|lo|other)/i;
}
return \%i_ignore;
return;
}
sub interfaces {
my $nap222x = shift;
my $interfaces = $nap222x->i_index();
my $description = $nap222x->i_description();
my $partial = shift;
my $interfaces = $nap222x->i_index($partial) || {};
my $description = $nap222x->i_description($partial) || {};
my %interfaces = ();
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $desc = $description->{$iid};
next unless defined $desc;
next if $desc =~ /lo/i;
@@ -184,25 +162,26 @@ sub interfaces {
sub i_duplex {
my $nap222x = shift;
my $mode = $nap222x->nt_dpx();
my $port_name = $nap222x->nt_prt_name();
my $interfaces = $nap222x->interfaces();
my $partial = shift;
my $mode = $nap222x->nt_dpx($partial) || {};
my $port_name = $nap222x->nt_prt_name($partial) || {};
my $interfaces = $nap222x->interfaces($partial) || {};
my %i_duplex;
foreach my $if (keys %$interfaces){
foreach my $if ( keys %$interfaces ) {
my $port = $interfaces->{$if};
next unless $port =~ /dp/i;
foreach my $idx (keys %$mode) {
my $name = $port_name->{$idx}||'unknown';
foreach my $idx ( keys %$mode ) {
my $name = $port_name->{$idx} || 'unknown';
next unless $name eq $port;
my $duplex = $mode->{$idx};
$duplex = 'other' unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
$i_duplex{$if}=$duplex;
$i_duplex{$if} = $duplex;
}
}
return \%i_duplex;
@@ -210,28 +189,31 @@ sub i_duplex {
sub i_duplex_admin {
my $nap222x = shift;
my $dpx_admin = $nap222x->nt_dpx_admin();
my $nt_auto = $nap222x->nt_auto();
my $interfaces = $nap222x->interfaces();
my $port_name = $nap222x->nt_prt_name();
my $partial = shift;
my $dpx_admin = $nap222x->nt_dpx_admin($partial) || {};
my $nt_auto = $nap222x->nt_auto($partial) || {};
my $interfaces = $nap222x->interfaces($partial) || {};
my $port_name = $nap222x->nt_prt_name($partial) || {};
my %i_duplex_admin;
foreach my $if (keys %$interfaces){
foreach my $if ( keys %$interfaces ) {
my $port = $interfaces->{$if};
next unless $port =~ /dp/i;
foreach my $idx (keys %$dpx_admin) {
my $name = $port_name->{$idx}||'unknown';
foreach my $idx ( keys %$dpx_admin ) {
my $name = $port_name->{$idx} || 'unknown';
next unless $name eq $port;
my $duplex = $dpx_admin->{$idx};
my $auto = $nt_auto->{$idx};
my $auto = $nt_auto->{$idx};
$duplex = 'other' unless defined $duplex;
$duplex = 'half' if ($duplex =~ /half/i and $auto =~ /disabled/i);
$duplex = 'full' if ($duplex =~ /full/i and $auto =~ /disabled/i);
$duplex = 'half'
if ( $duplex =~ /half/i and $auto =~ /disabled/i );
$duplex = 'full'
if ( $duplex =~ /full/i and $auto =~ /disabled/i );
$duplex = 'auto' if $auto =~ /enabled/i;
$i_duplex_admin{$if}=$duplex;
$i_duplex_admin{$if} = $duplex;
}
}
return \%i_duplex_admin;
@@ -239,18 +221,20 @@ sub i_duplex_admin {
sub i_name {
my $nap222x = shift;
my $interfaces = $nap222x->interfaces();
my $partial = shift;
my $interfaces = $nap222x->interfaces($partial) || {};
my %i_name;
foreach my $if (keys %$interfaces){
foreach my $if ( keys %$interfaces ) {
my $desc = $interfaces->{$if};
next unless defined $desc;
next unless defined $desc;
my $name = 'unknown';
$name = 'Ethernet Interface' if $desc =~ /dp/i;
$name = 'Ethernet Interface' if $desc =~ /dp/i;
$name = 'Wireless Interface B' if $desc =~ /ndc/i;
$name = 'Wireless Interface A' if $desc =~ /ar/i;
$i_name{$if} = $name;
}
return \%i_name;
@@ -259,28 +243,131 @@ sub i_name {
# dot1dBasePortTable does not exist and dot1dTpFdbPort does not map to ifIndex
sub bp_index {
my $nap222x = shift;
my $interfaces = $nap222x->interfaces();
my $partial = shift;
my $interfaces = $nap222x->interfaces($partial) || {};
my %bp_index;
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $desc = $interfaces->{$iid};
next unless defined $desc;
next unless $desc =~ /(ndc|ar)/i;
my $port = 1;
$port = 2 if $desc =~ /ndc/i;
$bp_index{$port} = $iid;
$bp_index{$port} = $iid;
}
return \%bp_index;
}
# Indicies don't match anywhere in these devices! Need to override to match
# IfIndex.
sub i_ssidlist {
my $nap222x = shift;
my $partial = shift;
# modify partial to match index
if ( defined $partial ) {
$partial = $partial - 2;
}
my $ssids = $nap222x->orig_i_ssidlist($partial) || {};
my %i_ssidlist;
foreach my $iid ( keys %$ssids ) {
my $port = $iid + 2;
my $ssid = $ssids->{$iid};
next unless defined $ssid;
$i_ssidlist{$port} = $ssid;
}
return \%i_ssidlist;
}
sub i_ssidbcast {
my $nap222x = shift;
my $partial = shift;
# modify partial to match index
if ( defined $partial ) {
$partial = $partial - 2;
}
my $bcast = $nap222x->nt_i_broadcast($partial) || {};
my %i_ssidbcast;
foreach my $iid ( keys %$bcast ) {
my $port = $iid + 2;
my $bc = $bcast->{$iid};
next unless defined $bc;
$i_ssidbcast{$port} = $bc;
}
return \%i_ssidbcast;
}
sub i_80211channel {
my $nap222x = shift;
my $partial = shift;
# modify partial to match index
if ( defined $partial ) {
$partial = $partial - 2;
}
my $phy_type = $nap222x->dot11_phy_type($partial) || {};
my $cur_freq = $nap222x->dot11_cur_freq() || {};
my $cur_ch = $nap222x->dot11_cur_ch() || {};
my %i_80211channel;
foreach my $iid ( keys %$phy_type ) {
my $port = $iid + 2;
my $type = $phy_type->{$iid};
next unless defined $type;
if ( $type =~ /dsss/ ) {
my $ch = $cur_ch->{1};
next unless defined $ch;
$i_80211channel{$port} = $ch;
}
elsif ( $type =~ /ofdm/ ) {
my $ch = $cur_freq->{0};
next unless defined $ch;
$i_80211channel{$port} = $ch;
}
else {
next;
}
}
return \%i_80211channel;
}
sub i_vlan {
my $nap222x = shift;
my $partial = shift;
# modify partial to match index
if ( defined $partial ) {
$partial = $partial - 2;
}
my $vlans = $nap222x->nt_i_vlan($partial) || {};
my %i_vlan;
foreach my $iid ( keys %$vlans ) {
my $port = $iid + 2;
my $vlan = $vlans->{$iid};
next unless defined $vlan;
$i_vlan{$port} = $vlan;
}
return \%i_vlan;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::nap222x - SNMP Interface to Nortel 2220 Series Access Points
SNMP::Info::Layer2::NAP222x - SNMP Interface to Nortel 2220 Series Access
Points
=head1 AUTHOR
@@ -292,14 +379,13 @@ Eric Miller
my $nap222x = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $nap222x->class();
my $class = $nap222x->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -307,47 +393,39 @@ Eric Miller
Provides abstraction to the configuration information obtainable from a Nortel
2220 series wireless Access Points 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $nap222x = new SNMP::Info::Layer2::nap222x(...);
my $nap222x = new SNMP::Info::Layer2::NAP222x(...);
=head2 Inherited Classes
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::SONMP
=item SNMP::Info::IEEE802dot11
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item NORTEL-WLAN-AP-MIB
=item Inherited classes
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See SNMP::Info::SONMP for its own MIB requirements.
=item F<NORTEL-WLAN-AP-MIB>
=back
MIBs can be found on the CD that came with your product.
=head2 Inherited MIBs
Or, they can be downloaded directly from Nortel Networks regardless of support
contract status.
See L<SNMP::Info::SONMP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support,
Select by Product Families, Wireless LAN, WLAN - Access Point 2220, Software.
Filter on mibs and download the latest version's archive.
=head1 GLOBALS
@@ -355,25 +433,17 @@ These are methods that return scalar value from SNMP
=over
=item $nap222x->vendor()
Returns 'Nortel'
=item $nap222x->model()
Returns the model extracted from B<sysDescr>.
Returns the model extracted from C<sysDescr>.
=item $nap222x->os()
Returns 'Nortel'
=item $nap222x->os_ver()
Returns the software version extracted from B<ntWlanSwOpCodeVer>.
Returns 'nortel'
=item $nap222x->os_bin()
Returns the firmware version extracted from B<ntWlanSwBootRomVer>.
Returns the firmware version extracted from C<ntWlanSwBootRomVer>.
=item $nap222x->mac()
@@ -387,65 +457,65 @@ Returns the MAC address of the first Ethernet Interface.
Returns the hardware version.
B<ntWlanSwHardwareVer>
(C<ntWlanSwHardwareVer>)
=item $nap222x->nt_cc()
Returns the country code of the AP.
B<ntWlanSwHardwareVer>
(C<ntWlanSwHardwareVer>)
=item $nap222x->tftp_action()
B<ntWlanTransferStart>
(C<ntWlanTransferStart>)
=item $nap222x->tftp_host()
B<ntWlanFileServer>
(C<ntWlanFileServer>)
=item $nap222x->tftp_file()
B<ntWlanDestFile>
(C<ntWlanDestFile>)
=item $nap222x->tftp_type()
B<ntWlanFileType>
(C<ntWlanFileType>)
=item $nap222x->tftp_result()
B<ntWlanFileTransferStatus>
(C<ntWlanFileTransferStatus>)
=item $nap222x->tftp_xtype()
B<ntWlanTransferType>
(C<ntWlanTransferType>)
=item $nap222x->tftp_src_file()
B<ntWlanSrcFile>
(C<ntWlanSrcFile>)
=item $nap222x->ftp_user()
B<ntWlanUserName>
(C<ntWlanUserName>)
=item $nap222x->ftp_pass()
B<ntWlanPassword>
(C<ntWlanPassword>)
=back
=head2 Globals imported from SNMP::Info
=head2 Globals imported from SNMP::Info::SONMP
See documentation in SNMP::Info for details.
See L<SNMP::Info::SONMP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::SONMP
=head2 Global Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -458,21 +528,17 @@ to a hash.
Returns reference to map of IIDs to physical ports.
=item $nap222x->i_ignore()
Returns reference to hash of IIDs to ignore.
=item $nap222x->i_duplex()
Returns reference to hash. Maps port operational duplexes to IIDs.
B<ntWlanPortSpeedDpxStatus>
(C<ntWlanPortSpeedDpxStatus>)
=item $nap222x->i_duplex_admin()
Returns reference to hash. Maps port admin duplexes to IIDs.
B<ntWlanPortCapabilities>
(C<ntWlanPortCapabilities>)
=item $nap222x->i_name()
@@ -480,21 +546,41 @@ Returns a human name based upon port description.
=item $nap222x->bp_index()
Returns a mapping between ifIndex and the Bridge Table. This does not exist in
the MIB and bridge port index is not the same as ifIndex so it is created.
Returns a mapping between C<ifIndex> and the Bridge Table. This does not
exist in the MIB and bridge port index is not the same as C<ifIndex> so it is
created.
=item $nap222x->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
=item $nap222x->i_ssidbcast()
Returns reference to hash. Indicates whether the SSID is broadcast.
=item $nap222x->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
=item $nap222x->i_vlan()
The default Vlan ID of the radio interfaces.
(C<ntWlanApVlanDefaultVid>)
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

321
Info/Layer2/Netgear.pm Normal file
View File

@@ -0,0 +1,321 @@
# SNMP::Info::Layer2::Netgear
# $Id$
#
# Copyright (c) 2008 Bill Fenner
# 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::Layer2::Netgear;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::LLDP;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( %SNMP::Info::Layer2::MIBS, %SNMP::Info::LLDP::MIBS, );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
ng_serial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
ng_osver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::LLDP::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::LLDP::MUNGE, );
sub vendor {
return 'netgear';
}
sub os {
return 'netgear';
}
# Wish the OID-based method worked, but netgear scatters
# the sysObjectID values across all the device MIBs, and
# makes the device MIBs state secrets.
# They seem to set sysDescr to the model number, though,
# so we'll use that.
sub model {
my $netgear = shift;
return $netgear->description();
}
#
# This is model-dependent. Some netgear brand devices don't implement
# the bridge MIB forwarding table, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
my $netgear = shift;
my $ret = $netgear->qb_fw_mac();
$ret = $netgear->orig_fw_mac() if ( !defined($ret) );
return $ret;
}
sub fw_port {
my $netgear = shift;
my $ret = $netgear->qb_fw_port();
$ret = $netgear->orig_fw_port() if ( !defined($ret) );
return $ret;
}
# these seem to work for GSM models but not GS
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
sub os_ver {
my $self = shift;
return if $self->model and $self->model =~ m/GS\d/i;
return $self->ng_osver();
}
sub serial {
my $self = shift;
return if $self->model and $self->model =~ m/GS\d/i;
return $self->ng_serial();
}
# Use LLDP
sub hasCDP {
my $netgear = shift;
return $netgear->hasLLDP();
}
sub c_ip {
my $netgear = shift;
my $partial = shift;
return $netgear->lldp_ip($partial);
}
sub c_if {
my $netgear = shift;
my $partial = shift;
return $netgear->lldp_if($partial);
}
sub c_port {
my $netgear = shift;
my $partial = shift;
return $netgear->lldp_port($partial);
}
sub c_id {
my $netgear = shift;
my $partial = shift;
return $netgear->lldp_id($partial);
}
sub c_platform {
my $netgear = shift;
my $partial = shift;
return $netgear->lldp_rem_sysdesc($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Netgear - SNMP Interface to Netgear switches
=head1 AUTHOR
Bill Fenner and Zoltan Erszenyi,
Hacked in LLDP support from Baystack.pm by
Nic Bernstein <nic@onlight.com>
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $netgear = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $netgear->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Netgear device through SNMP. See inherited classes' documentation for
inherited methods.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
classes.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $netgear->vendor()
Returns 'netgear'
=item $netgear->os()
Returns 'netgear'
=item $netgear->model()
Returns description()
=item $netgear->os_ver()
Returns OS Version.
=item $netgear->serial()
Returns Serial Number.
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of
a reference to a hash.
=head2 Overrides
=over
=item $netgear->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=item $netgear->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=back
=head2 Topology information
Based upon the software version devices may support Link Layer Discovery
Protocol (LLDP).
=over
=item $netgear->hasCDP()
Returns true if the device is running LLDP.
=item $netgear->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $netgear->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-LLDP device in between two or
more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $netgear->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $netgear->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $netgear->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,64 +1,70 @@
# SNMP::Info::Layer2::Orinoco
# Eric Miller
# $Id$
#
# Copyright (c) 2004-6 Eric Miller
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::Layer2::Orinoco;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::IEEE802dot11;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Orinoco::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
@SNMP::Info::Layer2::Orinoco::ISA
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
);
$VERSION = '2.08';
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::IEEE802dot11::MIBS,
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
);
#'ORiNOCO-MIB' => 'orinoco',
);
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
);
%GLOBALS
= ( %SNMP::Info::Layer2::GLOBALS, %SNMP::Info::IEEE802dot11::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::IEEE802dot11::FUNCS,
# ORiNOCO-MIB:oriWirelessIfPropertiesTable
#'ori_ssid' => 'oriWirelessIfNetworkName',
#'ori_channel' => 'oriWirelessIfChannel',
#'ori_closed_sys' => 'oriWirelessIfClosedSystem',
# ORiNOCO-MIB:oriSystemInvMgmtComponentTable
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
sub os {
return 'orinoco';
@@ -66,32 +72,34 @@ sub os {
sub os_ver {
my $orinoco = shift;
my $descr = $orinoco->description();
return undef unless defined $descr;
return unless defined $descr;
if ($descr =~ m/V(\d+\.\d+)/){
if ( $descr =~ m/V(\d+\.\d+)/ ) {
return $1;
}
if ($descr =~ m/v(\d+\.\d+\.\d+)/){
if ( $descr =~ m/v(\d+\.\d+\.\d+)/ ) {
return $1;
}
return undef;
return;
}
sub os_bin {
my $orinoco = shift;
my $descr = $orinoco->description();
return undef unless defined $descr;
return unless defined $descr;
if ($descr =~ m/V(\d+\.\d+)$/){
if ( $descr =~ m/V(\d+\.\d+)$/ ) {
return $1;
}
if ($descr =~ m/v(\d+\.\d+\.\d+)$/){
if ( $descr =~ m/v(\d+\.\d+\.\d+)$/ ) {
return $1;
}
return undef;
return;
}
sub vendor {
@@ -100,31 +108,38 @@ sub vendor {
sub model {
my $orinoco = shift;
my $descr = $orinoco->description();
return undef unless defined $descr;
return $1 if ($descr =~ /(AP-\d+)/);
return 'WavePOINT-II' if ($descr =~ /WavePOINT-II/);
return undef;
my $descr = $orinoco->description();
return unless defined $descr;
return $1 if ( $descr =~ /(AP-\d+)/ );
return 'WavePOINT-II' if ( $descr =~ /WavePOINT-II/ );
return 'Outdoor Router' if ( $descr =~ /Wireless Router/ );
return;
}
sub serial {
my $orinoco = shift;
my $descr = $orinoco->description();
return undef unless defined $descr;
$descr = $1 if $descr =~ /SN-(\S+)/;
my $descr = $orinoco->description();
return unless defined $descr;
$descr = $1 if $descr =~ /SN-(\S+)/;
return $descr;
}
sub i_ignore {
my $orinoco = shift;
my $descr = $orinoco->i_description();
my $partial = shift;
my $descr = $orinoco->i_description($partial) || {};
my %i_ignore;
foreach my $if (keys %$descr){
foreach my $if ( keys %$descr ) {
my $type = $descr->{$if};
# Skip virtual interfaces
# Skip virtual interfaces
$i_ignore{$if}++ if $type =~ /(lo|empty|PCMCIA)/i;
}
return \%i_ignore;
@@ -132,22 +147,40 @@ sub i_ignore {
sub interfaces {
my $orinoco = shift;
my $interfaces = $orinoco->i_index();
my $descriptions = $orinoco->i_description();
my $partial = shift;
my $interfaces = $orinoco->i_index($partial) || {};
my $descriptions = $orinoco->i_description($partial) || {};
my %interfaces = ();
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
next if $desc =~ /(lo|empty|PCMCIA)/i;
$desc = 'AMD' if $desc =~ /AMD/;
$desc = 'AMD' if $desc =~ /AMD/;
$interfaces{$iid} = $desc;
}
return \%interfaces;
}
#sub i_ssidbcast {
# my $orinoco = shift;
# my $partial = shift;
#
# my $bcast = $orinoco->ori_closed_sys($partial) || {};
#
# my %i_ssidbcast;
# foreach my $iid (keys %$bcast){
# my $bc = $bcast->{$iid};
# next unless defined $bc;
#
# $i_ssidbcast{$iid} = $bc;
# }
# return \%i_ssidbcast;
#}
1;
__END__
@@ -165,23 +198,23 @@ Eric Miller
my $orinoco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $orinoco->class();
my $class = $orinoco->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a Orinoco
Access Point through SNMP.
Provides abstraction to the configuration information obtainable from
Orinoco Access Point through SNMP. Orinoco devices have been manufactured
by Proxim, Agere, and Lucent.
For speed or debugging purposes you can call the subclass directly, but not after
determining a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $orinoco = new SNMP::Info::Layer2::Orinoco(...);
@@ -189,9 +222,9 @@ determining a more specific class using the method above.
=over
=item SNMP::Info
=item SNMP::Info::Layer2
=item SNMP::Info::Bridge
=item SNMP::Info::IEEE802dot11
=back
@@ -199,14 +232,16 @@ determining a more specific class using the method above.
=over
=item Inherited classes
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
None.
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IEEE802dot11/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -215,11 +250,11 @@ These are methods that return scalar value from SNMP
=item $orinoco->vendor()
Returns 'Proxim' :)
Returns 'proxim'
=item $orinoco->model()
Returns the model extracted from B<sysDescr>.
Returns the model extracted from C<sysDescr>.
=item $orinoco->os()
@@ -227,27 +262,27 @@ Returns 'Orinoco'
=item $orinoco->os_ver()
Returns the software version extracted from B<sysDescr>.
Returns the software version extracted from C<sysDescr>.
=item $orinoco->os_bin()
Returns the firmware version extracted from B<sysDescr>.
Returns the firmware version extracted from C<sysDescr>.
=item $orinoco->serial()
Returns the serial number extracted from B<sysDescr>.
Returns the serial number extracted from C<sysDescr>.
=back
=head2 Globals imported from SNMP::Info
=head2 Global Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info for details.
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::IEEE802dot11/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -266,12 +301,12 @@ Returns reference to hash of IIDs to ignore.
=back
=head2 Table Methods imported from SNMP::Info
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info for details.
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
=head2 Table Methods imported from SNMP::Info::IEEE802dot11
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
=cut

View File

@@ -1,67 +1,63 @@
# SNMP::Info::Layer2::ZyXEL_DSLAM
# Dmitry Sergienko <dmitry@trifle.net>
# $Id$
#
# Copyright (c) 2004 Max Baker
# Copyright (c) 2008 Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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 Netdisco nor the
# names of its contributors may be used to endorse or promote products
# * 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.
#
# 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::Layer2::ZyXEL_DSLAM;
$VERSION = '1.04';
# $Id$
use strict;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::ZyXEL_DSLAM::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::ZyXEL_DSLAM::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE $AUTOLOAD $INIT $DEBUG/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
# Set for No CDP
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS
);
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
%FUNCS = (%SNMP::Info::Layer2::FUNCS,
'ip_adresses' => 'ipAdEntAddr',
'i_name' => 'ifDescr',
'i_description' => 'adslLineConfProfile',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'ip_adresses' => 'ipAdEntAddr',
'i_name' => 'ifDescr',
'i_description' => 'adslLineConfProfile',
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'ADSL-LINE-MIB' => 'adslLineConfProfile'
);
%MUNGE = (%SNMP::Info::Layer2::MUNGE
);
%MIBS
= ( %SNMP::Info::Layer2::MIBS, 'ADSL-LINE-MIB' => 'adslLineConfProfile' );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE );
sub layers {
my $zyxel = shift;
my $zyxel = shift;
my $layers = $zyxel->layers();
return $layers if defined $layers;
@@ -80,11 +76,11 @@ sub os {
sub os_ver {
my $zyxel = shift;
my $descr = $zyxel->description();
if ($descr =~ m/version (\S+) /){
if ( $descr =~ m/version (\S+) / ) {
return $1;
}
return undef;
return;
}
sub model {
@@ -92,23 +88,26 @@ sub model {
my $desc = $zyxel->description();
if ($desc =~ /8-port ADSL Module\(Annex A\)/){
if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
return "AAM1008-61";
} elsif ($desc =~ /8-port ADSL Module\(Annex B\)/){
}
elsif ( $desc =~ /8-port ADSL Module\(Annex B\)/ ) {
return "AAM1008-63";
}
return undef;
return;
}
sub ip{
my $zyxel = shift;
sub ip {
my $zyxel = shift;
my $ip_hash = $zyxel->ip_addresses();
my $ip;
foreach $ip (keys %{$ip_hash}) {
my $found_ip = $ip if (defined $ip and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/);
my $found_ip;
foreach my $ip ( keys %{$ip_hash} ) {
$found_ip = $ip
if ( defined $ip
and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
}
return $ip;
return $found_ip;
}
1;
__END__
@@ -127,7 +126,6 @@ Dmitry Sergienko (C<dmitry@trifle.net>)
my $zyxel = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myhub',
Community => 'public',
Version => 1
@@ -155,13 +153,12 @@ inherited methods.
=over
=item ADSL-LINE-MIB
This MIB assumedly obtainable through ZyXEL or possibly included with your device.
=item F<ADSL-LINE-MIB>
=item Inherited Classes
MIBs listed in SNMP::Info::Layer2 and their inherited classes.
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and their inherited
classes.
=back
@@ -189,19 +186,23 @@ Culls Version from description()
Returns IP Address of DSLAM.
(B<ipAdEntAddr>)
(C<ipAdEntAddr>)
=item $zyxel->model()
Trys to cull out model out of the description field.
Tries to cull out model out of the description field.
=item $zyxel->layers()
Returns 00000011.
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
=head2 Overrides
@@ -209,7 +210,7 @@ See documentation in SNMP::Info::Layer2 for details.
=item $zyxel->i_name()
Returns reference to map of IIDs to port name (B<ifDescr>).
Returns reference to map of IIDs to port name (C<ifDescr>).
=item $zyxel->i_description()
@@ -219,6 +220,6 @@ Returns reference to map of IIDs to human-set port description (profile name).
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in SNMP::Info::Layer2 for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,127 +1,179 @@
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker -- All changes from Version 0.7 on
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::EtherLike;
use SNMP::Info::Entity;
use SNMP::Info::PowerEthernet;
use SNMP::Info::IPv6;
use SNMP::Info::AdslLine;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
@SNMP::Info::Layer3::ISA = qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::EtherLike
SNMP::Info::Entity Exporter/;
@SNMP::Info::Layer3::ISA = qw/
SNMP::Info::PowerEthernet SNMP::Info::IPv6
SNMP::Info::Entity SNMP::Info::EtherLike
SNMP::Info::Bridge SNMP::Info::AdslLine
SNMP::Info Exporter/;
@SNMP::Info::Layer3::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::Entity::MIBS,
'IP-MIB' => 'ipNetToMediaIfIndex',
'OSPF-MIB' => 'ospfRouterId',
'BGP4-MIB' => 'bgpIdentifier',
);
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::AdslLine::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::Entity::MIBS,
%SNMP::Info::PowerEthernet::MIBS,
%SNMP::Info::IPv6::MIBS,
'IP-MIB' => 'ipNetToMediaIfIndex',
'OSPF-MIB' => 'ospfRouterId',
'BGP4-MIB' => 'bgpIdentifier',
);
%GLOBALS = (
# Inherit the super class ones
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
'mac' => 'ifPhysAddress.1',
'serial1' => '.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
'router_ip' => 'ospfRouterId.0',
'bgp_id' => 'bgpIdentifier.0',
'bgp_local_as' => 'bgpLocalAs.0',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::Entity::FUNCS,
# IFMIB
'i_name2' => 'ifName',
# Obsolete Address Translation Table (ARP Cache)
'old_at_index' => 'atIfIndex',
'old_at_paddr' => 'atPhysAddress',
'old_at_netaddr' => 'atNetAddress',
# IP-MIB IP Net to Media Table (ARP Cache)
'at_index' => 'ipNetToMediaIfIndex',
'at_paddr' => 'ipNetToMediaPhysAddress',
'at_netaddr' => 'ipNetToMediaNetAddress',
# OSPF
'ospf_ip' => 'ospfHostIpAddress',
# BGP Peer Table
'bgp_peers' => 'bgpPeerLocalAddr',
'bgp_peer_id' => 'bgpPeerIdentifier',
'bgp_peer_state' => 'bgpPeerState',
'bgp_peer_as' => 'bgpPeerRemoteAs',
'bgp_peer_addr' => 'bgpPeerRemoteAddr',
'bgp_peer_fsm_est_trans' => 'bgpPeerFsmEstablishedTransitions',
'bgp_peer_in_tot_msgs' => 'bgpPeerInTotalMessages',
'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime',
'bgp_peer_in_upd' => 'bgpPeerInUpdates',
'bgp_peer_out_tot_msgs' => 'bgpPeerOutTotalMessages',
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
);
# Inherit the super class ones
%SNMP::Info::GLOBALS,
%SNMP::Info::AdslLine::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::PowerEthernet::GLOBALS,
%SNMP::Info::IPv6::GLOBALS,
'mac' => 'ifPhysAddress.1',
'serial1' =>
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
'router_ip' => 'ospfRouterId.0',
'bgp_id' => 'bgpIdentifier.0',
'bgp_local_as' => 'bgpLocalAs.0',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::AdslLine::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::Entity::FUNCS,
%SNMP::Info::PowerEthernet::FUNCS,
%SNMP::Info::IPv6::FUNCS,
# Obsolete Address Translation Table (ARP Cache)
'old_at_index' => 'atIfIndex',
'old_at_paddr' => 'atPhysAddress',
'old_at_netaddr' => 'atNetAddress',
# IP-MIB IP Net to Media Table (ARP Cache)
'at_index' => 'ipNetToMediaIfIndex',
'at_paddr' => 'ipNetToMediaPhysAddress',
'at_netaddr' => 'ipNetToMediaNetAddress',
# OSPF-MIB::ospfIfTable
'ospf_if_ip' => 'ospfIfIpAddress',
'ospf_if_area' => 'ospfIfAreaId',
'ospf_if_type' => 'ospfIfType',
'ospf_if_hello' => 'ospfIfHelloInterval',
'ospf_if_dead' => 'ospfIfRtrDeadInterval',
'ospf_if_admin' => 'ospfIfAdminStat',
'ospf_if_state' => 'ospfIfState',
# OSPF-MIB::ospfNbrTable
'ospf_ip' => 'ospfHostIpAddress',
'ospf_peers' => 'ospfNbrIpAddr',
'ospf_peer_id' => 'ospfNbrRtrId',
'ospf_peer_state' => 'ospfNbrState',
# BGP4-MIB::bgpPeerTable
'bgp_peers' => 'bgpPeerLocalAddr',
'bgp_peer_id' => 'bgpPeerIdentifier',
'bgp_peer_state' => 'bgpPeerState',
'bgp_peer_as' => 'bgpPeerRemoteAs',
'bgp_peer_addr' => 'bgpPeerRemoteAddr',
'bgp_peer_fsm_est_trans' => 'bgpPeerFsmEstablishedTransitions',
'bgp_peer_in_tot_msgs' => 'bgpPeerInTotalMessages',
'bgp_peer_in_upd_el_time' => 'bgpPeerInUpdateElapsedTime',
'bgp_peer_in_upd' => 'bgpPeerInUpdates',
'bgp_peer_out_tot_msgs' => 'bgpPeerOutTotalMessages',
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
# IP-MIB Net to Physical Table (ARP Cache)
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
'n2p_ptype' => 'ipNetToPhysicalType',
'n2p_pstate' => 'ipNetToPhysicalState',
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::Entity::MUNGE,
'old_at_paddr' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
);
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::AdslLine::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::PowerEthernet::MUNGE,
%SNMP::Info::IPv6::MUNGE,
'old_at_paddr' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
);
# Method OverRides
sub root_ip {
my $l3 = shift;
my $router_ip = $l3->router_ip();
my $ospf_ip = $l3->ospf_ip();
my $router_ip = $l3->router_ip();
my $ospf_ip = $l3->ospf_ip();
# if the router ip exists and is a route advertised by the device we prefer
# it over the others
return $router_ip
if (( defined $router_ip )
and ( $router_ip ne '0.0.0.0' )
and ( grep { $ospf_ip->{$_} eq $router_ip } (keys %$ospf_ip))
and ( $l3->snmp_connect_ip($router_ip) ) );
# return the first one found here (should be only one)
if (defined $ospf_ip and scalar(keys %$ospf_ip)){
foreach my $key (keys %$ospf_ip){
if ( defined $ospf_ip and scalar( keys %$ospf_ip ) ) {
foreach my $key ( keys %$ospf_ip ) {
my $ip = $ospf_ip->{$key};
next if $ip eq '0.0.0.0';
next unless $l3->snmp_connect_ip($ip);
@@ -130,19 +182,20 @@ sub root_ip {
}
}
return $router_ip if ( (defined $router_ip) and ($router_ip ne '0.0.0.0') and ($l3->snmp_connect_ip($router_ip)) );
return undef;
return;
}
sub i_ignore {
my $l3 = shift;
my $interfaces = $l3->interfaces();
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if (keys %$interfaces) {
foreach my $if ( keys %$interfaces ) {
# lo -> cisco aironet 350 loopback
if ($interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i){
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
$i_ignore{$if}++;
}
}
@@ -151,34 +204,37 @@ sub i_ignore {
sub serial {
my $l3 = shift;
my $serial1 = $l3->serial1();
my $e_descr = $l3->e_descr() || {};
my $e_serial = $l3->e_serial() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
my $serial1 = $l3->serial1();
my $e_descr = $l3->e_descr() || {};
my $e_serial = $l3->e_serial() || {};
my $serial2 = $e_serial->{1} || undef;
my $chassis = $e_descr->{1} || undef;
# precedence
# serial2,chassis parse,serial1
return $serial2 if (defined $serial2 and $serial2 !~ /^\s*$/);
return $1 if (defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i);
return $serial1 if (defined $serial1 and $serial1 !~ /^\s*$/);
return $serial2 if ( defined $serial2 and $serial2 !~ /^\s*$/ );
return $1
if ( defined $chassis and $chassis =~ /serial#?:\s*([a-z0-9]+)/i );
return $serial1 if ( defined $serial1 and $serial1 !~ /^\s*$/ );
return undef;
return;
}
# $l3->model() - the sysObjectID returns an IID to an entry in
# $l3->model() - the sysObjectID returns an IID to an entry in
# the CISCO-PRODUCT-MIB. Look it up and return it.
sub model {
my $l3 = shift;
my $id = $l3->id();
unless (defined $id){
print " SNMP::Info::Layer3::model() - Device does not support sysObjectID\n" if $l3->debug();
return undef;
unless ( defined $id ) {
print
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
if $l3->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
@@ -190,31 +246,35 @@ sub model {
}
sub i_name {
my $l3 = shift;
my $i_index = $l3->i_index();
my $i_alias = $l3->i_alias();
my $i_name2 = $l3->i_name2();
my $l3 = shift;
my $partial = shift;
my $i_index = $l3->i_index($partial);
my $i_alias = $l3->i_alias($partial);
my $i_name2 = $l3->orig_i_name($partial);
my %i_name;
foreach my $iid (keys %$i_name2){
my $name = $i_name2->{$iid};
foreach my $iid ( keys %$i_name2 ) {
my $name = $i_name2->{$iid};
my $alias = $i_alias->{$iid};
$i_name{$iid} = (defined $alias and $alias !~ /^\s*$/) ?
$alias :
$name;
$i_name{$iid}
= ( defined $alias and $alias !~ /^\s*$/ )
? $alias
: $name;
}
return \%i_name;
}
sub i_duplex {
my $l3 = shift;
my $l3 = shift;
my $partial = shift;
my $el_index = $l3->el_index($partial);
my $el_duplex = $l3->el_duplex($partial);
my $el_index = $l3->el_index();
my $el_duplex = $l3->el_duplex();
my %i_index;
foreach my $el_port (keys %$el_duplex){
foreach my $el_port ( keys %$el_duplex ) {
my $iid = $el_index->{$el_port};
next unless defined $iid;
my $duplex = $el_duplex->{$el_port};
@@ -230,18 +290,20 @@ sub i_duplex {
# $l3->interfaces() - Map the Interfaces to their physical names
sub interfaces {
my $l3 = shift;
my $interfaces = $l3->i_index();
my $descriptions = $l3->i_description();
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->i_index($partial);
my $descriptions = $l3->i_description($partial);
my %interfaces = ();
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
$interfaces{$iid} = $desc;
}
return \%interfaces;
}
@@ -249,38 +311,48 @@ sub vendor {
my $l3 = shift;
my $descr = $l3->description();
my $id = $l3->id();
return 'cisco' if ($descr =~ /(cisco|\bios\b)/i);
return 'foundry' if ($descr =~ /foundry/i);
# .1.3.6.1.4.1.9.1 is the CISCO-PRODUCTS-MIB
# .1.3.6.1.4.1.9.9.368.4 is an old tree that Cisco CSSs were numbered from
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.1.\E\d+$/;
return 'cisco' if $id =~ /^\Q.1.3.6.1.4.1.9.9.368.4.\E\d+/;
return 'cisco' if ( $descr =~ /(cisco|\bios\b)/i );
return 'foundry' if ( $descr =~ /foundry/i );
return 'unknown';
}
sub at_index {
my $l3 = shift;
my $l3 = shift;
my $partial = shift;
return $l3->orig_at_index() || $l3->old_at_index();
return $l3->orig_at_index($partial) || $l3->old_at_index($partial);
}
sub at_paddr {
my $l3 = shift;
my $l3 = shift;
my $partial = shift;
return $l3->orig_at_paddr() || $l3->old_at_paddr();
return $l3->orig_at_paddr($partial) || $l3->old_at_paddr($partial);
}
sub at_netaddr {
my $l3 = shift;
my $l3 = shift;
my $partial = shift;
return $l3->orig_at_netaddr() || $l3->old_at_netaddr();
return $l3->orig_at_netaddr($partial) || $l3->old_at_netaddr($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3 - Perl5 Interface to network devices serving Layer3 or Layers 2 & 3
SNMP::Info::Layer3 - SNMP Interface to network devices serving Layer3 or
Layers 2 & 3
=head1 AUTHOR
@@ -292,14 +364,13 @@ Max Baker
my $l3 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $l3->class();
my $class = $l3->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
# Let's get some basic Port information
@@ -315,14 +386,15 @@ Max Baker
=head1 DESCRIPTION
This class is usually used as a superclass for more specific device classes listed under
SNMP::Info::Layer3::* Please read all docs under SNMP::Info first.
This class is usually used as a superclass for more specific device classes
listed under SNMP::Info::Layer3::* Please read all docs under SNMP::Info
first.
Provides generic methods for accessing SNMP data for Layer 3 network devices.
Includes support for Layer2+3 devices.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $l3 = new SNMP::Info::Layer3(...);
@@ -332,29 +404,43 @@ a more specific class using the method above.
=item SNMP::Info
=item SNMP::Info::Bridge
For L2/L3 devices.
=item SNMP::Info::Bridge (For L2/L3 devices)
=item SNMP::Info::EtherLike
=item SNMP::Info::Entity
=item SNMP::Info::PowerEthernet
=item SNMP::Info::IPv6
=back
=head2 Required MIBs
=over
=item OSPF-MIB
=item F<IP-MIB>
=item BGP4-MIB
=item F<OSPF-MIB>
=item Inherited Classes
MIBs required by the inherited classes listed above.
=item F<BGP4-MIB>
=back
MIBs can be found in the netdisco-mibs package.
=head2 Inherited MIBs
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::EtherLike/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Entity/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
@@ -366,15 +452,15 @@ These are methods that return scalar value from SNMP
Returns root port mac address
(B<ifPhysAddress.1>)
(C<ifPhysAddress.1>)
=item $l3->router_ip()
(B<ospfRouterId.0>)
(C<ospfRouterId.0>)
=item $l3->bgp_id()
(B<bgpIdentifier.0>)
(C<bgpIdentifier.0>)
Returns the BGP identifier of the local system
@@ -382,7 +468,7 @@ Returns the BGP identifier of the local system
Returns the local autonomous system number
(B<bgpLocalAs.0>)
(C<bgpLocalAs.0>)
=back
@@ -392,37 +478,44 @@ Returns the local autonomous system number
=item $l3->model()
Trys to reference $l3->id() to one of the product MIBs listed above
Tries to reference $l3->id() to one of the product MIBs listed above
Removes 'cisco' from cisco devices for readability.
=item $l3->serial()
Trys to cull a serial number from ENTITY-MIB, description, and OLD-CISCO-... mib
Tries to cull a serial number from F<ENTITY-MIB>, description, and
F<OLD-CISCO->... MIB.
=item $l3->vendor()
Trys to cull a Vendor name from B<sysDescr>
Tries to cull a Vendor name from C<sysDescr>
=item $l3->root_ip()
Returns the primary IP used to communicate with the device. Returns the first
found: OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address
(C<ospfHostIpAddress>).
=back
=head2 Globals imported from SNMP::Info
See documentation in SNMP::Info for details.
See L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
=head2 Global Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::Bridge/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EtherLike
=head2 Global Methods imported from SNMP::Info::EtherLike
See documentation in SNMP::Info::EtherLike for details.
See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
=head2 Global Methods imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See L<SNMP::Info::Entity/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -433,7 +526,8 @@ to a hash.
=item $l3->interfaces()
Returns the map between SNMP Interface Identifier (iid) and physical port name.
Returns the map between SNMP Interface Identifier (iid) and physical port
name.
Only returns those iids that have a description listed in $l3->i_description()
@@ -447,7 +541,7 @@ Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
Returns reference to hash of iid to human set name.
Defaults to B<ifName>, but checks for an B<ifAlias>
Defaults to C<ifName>, but checks for an C<ifAlias>
=item $l3->i_duplex()
@@ -456,11 +550,11 @@ Returns reference to hash of iid to current link duplex setting.
Maps $l3->el_index() to $l3->el_duplex, then culls out
full,half, or auto and sets the map to that value.
see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods.
=back
=head2 IP-MIB Arp Cache Table (B<ipNetToMediaTable>)
=head2 F<IP-MIB> Arp Cache Table (C<ipNetToMediaTable>)
=over
@@ -468,35 +562,35 @@ see SNMP::Info::Etherlike for the el_index() and el_duplex() methods.
Returns reference to hash. Maps ARP table entries to Interface IIDs
(B<ipNetToMediaIfIndex>)
(C<ipNetToMediaIfIndex>)
If the device doesn't support B<ipNetToMediaIfIndex>, this will try
the deprecated B<atIfIndex>.
If the device doesn't support C<ipNetToMediaIfIndex>, this will try
the deprecated C<atIfIndex>.
=item $l3->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
(B<ipNetToMediaPhysAddress>)
(C<ipNetToMediaPhysAddress>)
If the device doesn't support B<ipNetToMediaPhysAddress>, this will try
the deprecated B<atPhysAddress>.
If the device doesn't support C<ipNetToMediaPhysAddress>, this will try
the deprecated C<atPhysAddress>.
=item $l3->at_netaddr()
Returns reference to hash. Maps ARP table entries to IPs
Returns reference to hash. Maps ARP table entries to IP addresses.
(B<ipNetToMediaNetAddress>)
(C<ipNetToMediaNetAddress>)
If the device doesn't support B<ipNetToMediaNetAddress>, this will try
the deprecated B<atNetAddress>.
If the device doesn't support C<ipNetToMediaNetAddress>, this will try
the deprecated C<atNetAddress>.
=back
=head2 ARP Cache Entries
The B<atTable> has been deprecated since 1991. You should never need
to use these methods. See B<ipNetToMediaTable> above.
The C<atTable> has been deprecated since 1991. You should never need
to use these methods. See C<ipNetToMediaTable> above.
=over
@@ -504,23 +598,23 @@ to use these methods. See B<ipNetToMediaTable> above.
Returns reference to map of IID to Arp Cache Entry
(B<atIfIndex>)
(C<atIfIndex>)
=item $l3->old_at_paddr()
Returns reference to hash of Arp Cache Entries to MAC address
(B<atPhysAddress>)
(C<atPhysAddress>)
=item $l3->old_at_netaddr()
Returns reference to hash of Arp Cache Entries to IP Address
(B<atNetAddress>)
(C<atNetAddress>)
=back
=head2 BGP Peer Table
=head2 BGP Peer Table (C<bgpPeerTable>)
=over
@@ -528,90 +622,172 @@ Returns reference to hash of Arp Cache Entries to IP Address
Returns reference to hash of BGP peer to local IP address
(B<bgpPeerLocalAddr>)
(C<bgpPeerLocalAddr>)
=item $l3->bgp_peer_id()
Returns reference to hash of BGP peer to BGP peer identifier
(B<bgpPeerIdentifier>)
(C<bgpPeerIdentifier>)
=item $l3->bgp_peer_state()
Returns reference to hash of BGP peer to BGP peer state
(B<bgpPeerState>)
(C<bgpPeerState>)
=item $l3->bgp_peer_as()
Returns reference to hash of BGP peer to BGP peer autonomous system number
(B<bgpPeerRemoteAs>)
(C<bgpPeerRemoteAs>)
=item $l3->bgp_peer_addr()
Returns reference to hash of BGP peer to BGP peer IP address
(B<bgpPeerRemoteAddr>)
(C<bgpPeerRemoteAddr>)
=item $l3->bgp_peer_fsm_est_trans()
Returns reference to hash of BGP peer to the total number of times the BGP FSM
transitioned into the established state
(B<bgpPeerFsmEstablishedTransitions>)
(C<bgpPeerFsmEstablishedTransitions>)
=item $l3->bgp_peer_in_tot_msgs()
Returns reference to hash of BGP peer to the total number of messages received
from the remote peer on this connection
(B<bgpPeerInTotalMessages>)
(C<bgpPeerInTotalMessages>)
=item $l3->bgp_peer_in_upd_el_time()
Returns reference to hash of BGP peer to the elapsed time in seconds since
the last BGP UPDATE message was received from the peer.
(B<bgpPeerInUpdateElapsedTime>)
(C<bgpPeerInUpdateElapsedTime>)
=item $l3->bgp_peer_in_upd()
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
received on this connection
(B<bgpPeerInUpdates>)
(C<bgpPeerInUpdates>)
=item $l3->bgp_peer_out_tot_msgs()
Returns reference to hash of BGP peer to the total number of messages transmitted
to the remote peer on this connection
Returns reference to hash of BGP peer to the total number of messages
transmitted to the remote peer on this connection
(B<bgpPeerOutTotalMessages>)
(C<bgpPeerOutTotalMessages>)
=item $l3->bgp_peer_out_upd()
Returns reference to hash of BGP peer to the number of BGP UPDATE messages
transmitted on this connection
(B<bgpPeerOutUpdates>)
(C<bgpPeerOutUpdates>)
=back
=head2 OSPF Interface Table (C<ospfIfTable>)
=over
=item $l3->ospf_if_ip()
Returns reference to hash of OSPF interface IP addresses
(C<ospfIfIpAddress>)
=item $l3->ospf_if_area()
Returns reference to hash of the OSPF area to which the interfaces connect
(C<ospfIfAreaId>)
=item $l3->ospf_if_type()
Returns reference to hash of the OSPF interfaces' type
(C<ospfIfType>)
=item $l3->ospf_if_hello()
Returns reference to hash of the OSPF interfaces' hello interval
(C<ospfIfHelloInterval>)
=item $l3->ospf_if_dead()
Returns reference to hash of the OSPF interfaces' dead interval
(C<ospfIfRtrDeadInterval>)
=item $l3->ospf_if_admin()
Returns reference to hash of the OSPF interfaces' administrative status
(C<ospfIfAdminStat>)
=item $l3->ospf_if_state()
Returns reference to hash of the OSPF interfaces' state
(C<ospfIfState>)
=back
=head2 OSPF Neighbor Table (C<ospfNbrTable>)
=over
=item $l3->ospf_peers()
Returns reference to hash of IP addresses the neighbor is using in its
IP Source Addresses
(C<ospfNbrIpAddr>)
=item $l3->ospf_peer_id()
Returns reference to hash of neighbor Router IDs
(C<ospfNbrRtrId>)
=item $l3->ospf_peer_state()
Returns reference to hash of state of the relationship with the neighbor
routers
(C<ospfNbrState>)
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::EtherLike
See documentation in SNMP::Info::EtherLike for details.
See L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::PowerEthernet
See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::IPv6
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
=cut

View File

@@ -1,84 +1,89 @@
# SNMP::Info::Layer3::Aironet
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Aironet;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Aironet::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Aironet::EXPORT_OK = qw//;
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'AWCVX-MIB' => 'awcIfTable',
'IEEE802dot11-MIB' => 'dot11StationID',
);
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'AWCVX-MIB' => 'awcIfTable',
'IEEE802dot11-MIB' => 'dot11StationID',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'mac' => 'dot11StationID.2',
# AWC Ethernet Table
'awc_duplex' => 'awcEtherDuplex.0',
);
%SNMP::Info::Layer3::GLOBALS,
'mac' => 'dot11StationID.2',
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
'i_mac2' => 'ifPhysAddress',
'i_mtu2' => 'ifMtu',
'i_ssid' => 'dot11DesiredSSID',
# Bridge-mib overrides
'fw_mac2' => 'dot1dTpFdbAddress',
'fw_port2' => 'dot1dTpFdbPort',
'bp_index2' => 'dot1dBasePortIfIndex',
# AWC Interface Table (awcIfTable)
'awc_default_mac' => 'awcIfDefaultPhyAddress',
'awc_mac' => 'awcIfPhyAddress',
'awc_ip' => 'awcIfIpAddress',
'awc_netmask' => 'awcIfIpNetMask',
'awc_msdu' => 'awcIfMSDUMaxLength',
);
# AWC Ethernet Table
'awc_duplex' => 'awcEtherDuplex.0',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
'i_mac2' => 'ifPhysAddress',
'i_mtu2' => 'ifMtu',
'i_ssid' => 'dot11DesiredSSID',
# Bridge-mib overrides
'fw_mac2' => 'dot1dTpFdbAddress',
'fw_port2' => 'dot1dTpFdbPort',
'bp_index2' => 'dot1dBasePortIfIndex',
# AWC Interface Table (awcIfTable)
'awc_default_mac' => 'awcIfDefaultPhyAddress',
'awc_mac' => 'awcIfPhyAddress',
'awc_ip' => 'awcIfIpAddress',
'awc_netmask' => 'awcIfIpNetMask',
'awc_msdu' => 'awcIfMSDUMaxLength',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
'i_mac2' => \&SNMP::Info::munge_mac,
'awc_mac' => \&SNMP::Info::munge_mac,
'fw_mac2' => \&SNMP::Info::munge_mac,
);
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
'i_mac2' => \&SNMP::Info::munge_mac,
'awc_mac' => \&SNMP::Info::munge_mac,
'fw_mac2' => \&SNMP::Info::munge_mac,
);
sub os {
return 'aironet';
@@ -89,32 +94,32 @@ sub os_ver {
my $descr = $aironet->description() || '';
# CAP340 11.21, AP4800-E 11.21
if ($descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/){
if ( $descr =~ /AP\d{3,4}(-\D+)?\s+(\d{2}\.\d{2})/ ) {
return $2;
}
if ($descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/){
if ( $descr =~ /Series\s*AP\s+(\d{2}\.\d{2})/ ) {
return $1;
}
return undef;
return;
}
# Override wireless port with static info
sub bp_index {
my $aironet = shift;
my $aironet = shift;
my $interfaces = $aironet->interfaces();
my $bp_index = $aironet->bp_index2();
foreach my $iid (keys %$interfaces){
my $bp_index = $aironet->bp_index2();
foreach my $iid ( keys %$interfaces ) {
my $port = $interfaces->{$iid};
# Hardwire the wireless port to the transparent bridge port
if ($port =~ /awc/){
$bp_index->{0}=$iid;
if ( $port =~ /awc/ ) {
$bp_index->{0} = $iid;
}
}
return $bp_index;
}
@@ -123,16 +128,16 @@ sub fw_mac {
my $aironet = shift;
my $fw_mac = $aironet->fw_mac2();
my $fw_port = $aironet->fw_port2();
my $bs_mac = $aironet->bs_mac();
my $bs_mac = $aironet->bs_mac();
# remove port 0 forwarding table entries, only port 0 static entries
foreach my $fw (keys %$fw_mac){
foreach my $fw ( keys %$fw_mac ) {
my $port = $fw_port->{$fw};
next unless defined $port;
delete $fw_mac->{$fw} if $port == 0;
}
foreach my $bs (keys %$bs_mac){
foreach my $bs ( keys %$bs_mac ) {
my $entry = $bs;
$entry =~ s/\.0$//;
$fw_mac->{$entry} = $bs_mac->{$bs};
@@ -145,10 +150,9 @@ sub fw_mac {
sub fw_port {
my $aironet = shift;
my $fw_port = $aironet->fw_port2();
my $bs_port = $aironet->bs_port();
my $bs_port = $aironet->bs_port();
foreach my $bs (keys %$bs_port){
foreach my $bs ( keys %$bs_port ) {
my $entry = $bs;
$entry =~ s/\.0$//;
$fw_port->{$entry} = $bs_port->{$bs};
@@ -157,18 +161,17 @@ sub fw_port {
return $fw_port;
}
sub i_duplex {
my $aironet = shift;
my $aironet = shift;
my $interfaces = $aironet->interfaces();
my $awc_duplex = $aironet->awc_duplex();
my %i_duplex;
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $name = $interfaces->{$iid};
if ($name =~ /fec/){
if ( $name =~ /fec/ ) {
$i_duplex{$iid} = $awc_duplex;
}
}
@@ -182,7 +185,7 @@ sub i_mac {
my $i_mac = $aironet->i_mac2();
my $awc_mac = $aironet->awc_mac();
foreach my $iid (keys %$awc_mac){
foreach my $iid ( keys %$awc_mac ) {
next unless defined $i_mac->{$iid};
$i_mac->{$iid} = $awc_mac->{$iid};
}
@@ -191,14 +194,14 @@ sub i_mac {
}
sub i_ignore {
my $aironet = shift;
my $aironet = shift;
my $interfaces = $aironet->interfaces();
my %i_ignore;
foreach my $if (keys %$interfaces){
$i_ignore{$if}++ if ($interfaces->{$if} =~ /(rptr|lo)/);
foreach my $if ( keys %$interfaces ) {
$i_ignore{$if}++ if ( $interfaces->{$if} =~ /(rptr|lo)/ );
}
return \%i_ignore;
}
@@ -212,7 +215,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless Devices running Aironet software, not IOS
SNMP::Info::Layer3::Aironet - Perl5 Interface to Cisco Aironet Wireless
Devices running Aironet software, not IOS
=head1 AUTHOR
@@ -224,7 +228,6 @@ Max Baker
my $aironet = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -236,8 +239,8 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info subclass to provide access to SNMP data for an Aironet device running Aironet software,
not cisco IOS.
SNMP::Info subclass to provide access to SNMP data for an Aironet device
running Aironet software, not cisco IOS.
Note there are two classes for Aironet devices :
@@ -253,8 +256,8 @@ This class is for devices running Cisco IOS software (newer)
=back
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $aironet = new SNMP::Info::Layer3::Aironet(...);
@@ -270,14 +273,14 @@ a more specific class using the method above.
=over
=item AWCVX-MIB
=item F<AWCVX-MIB>
=item IEEE802dot11-MIB
=item F<IEEE802dot11-MIB>
=back
These MIBs are now included in the v2.tar.gz archive available from ftp.cisco.com. Make sure you
have a current version.
These MIBs are now included in the v2.tar.gz archive available from
ftp.cisco.com. Make sure you have a current version.
=head1 GLOBALS
@@ -289,13 +292,13 @@ These are methods that return scalar value from SNMP
Gives the admin duplex setting for the Ethernet Port.
B<awcEtherDuplex.0>
C<awcEtherDuplex.0>
=item $aironet->mac()
Gives the MAC Address of the wireless side
B<dot11StationID.2>
C<dot11StationID.2>
=item $aironet->os()
@@ -313,9 +316,9 @@ Returns 'cisco'.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -326,18 +329,18 @@ to a hash.
=item $aironet->bp_index()
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless port
to be assigned to the transparent bridge port (port 0)
Takes the bp_index() value from SNMP::Info::Bridge and overrides the wireless
port to be assigned to the transparent bridge port (port 0)
=item $aironet->fw_mac()
Adds static table entries from bs_mac() to port 0 so that wireless MAC addresses will
be reported. Forwarding table entries for port 0 are removed.
Adds static table entries from bs_mac() to port 0 so that wireless MAC
addresses will be reported. Forwarding table entries for port 0 are removed.
=item $aironet->fw_port()
Adds the static table port mappings to the forwarding table port mappings by adding
bs_port() to fw_port()
Adds the static table port mappings to the forwarding table port mappings by
adding bs_port() to fw_port()
=item $aironet->i_duplex()
@@ -361,34 +364,34 @@ Ignores ports that are of type ``rptr'' and ``lo''.
Gives the default MAC address of each interface.
B<awcIfDefaultPhyAddress>
C<awcIfDefaultPhyAddress>
=item $aironet->awc_mac()
Gives the actual MAC address of each interface.
B<awcIfPhyAddress>
C<awcIfPhyAddress>
=item $aironet->awc_ip()
Gives the IP Address assigned to each interface.
B<awcIfIpAddress>
C<awcIfIpAddress>
=item $aironet->awc_netmask()
Gives the NetMask for each interface.
B<awcIfIpNetMask>
C<awcIfIpNetMask>
=item $aironet->awc_msdu()
B<awcIfMSDUMaxLength>
C<awcIfMSDUMaxLength>
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -0,0 +1,552 @@
# SNMP::Info::Layer3::AlcatelLucent
# $Id$
#
# Copyright (c) 2008 Bill Fenner
#
# 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::AlcatelLucent;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::AlcatelLucent::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::AlcatelLucent::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
'ALCATEL-IND1-DEVICES' => 'familyOmniSwitch7000',
'ALCATEL-IND1-CHASSIS-MIB' => 'chasEntPhysOperStatus',
'ALU-POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus',
);
# Alcatel provides their own version of the POWER-ETHERNET-MIB,
# off in vendor-space, without renaming any of the objects.
# This means we have to *not* load the POWER-ETHERNET-MIB
# but can then still use the standard PowerEthernet module,
# but cannot try both so we hope Alcatel doesn't stop supporting
# their private version even if they get around to supporting the
# standard.
delete $MIBS{'POWER-ETHERNET-MIB'};
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
# use MAU-MIB for admin. duplex and admin. speed
*SNMP::Info::Layer3::AlcatelLucent::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::AlcatelLucent::i_speed_admin
= \&SNMP::Info::MAU::mau_i_speed_admin;
sub model {
my $alu = shift;
my $id = $alu->id();
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^device//;
return $model;
}
sub os {
return 'AOS';
}
sub vendor {
return 'alcatel-lucent';
}
sub os_ver {
my $alu = shift;
my $descr = $alu->description();
if ( $descr =~ m/^(\S+)/ ) {
return $1;
}
# No clue what this will try but hey
return $alu->SUPER::os_ver();
}
# ps1_type, ps1_status, ps2_type, ps2_status:
# Find the list of power supplies in the ENTITY-MIB
# e_class = powerSupply
# e_descr = ps_type
# chasEntPhysOperStatus = ps_status
sub _power_supplies {
my $alu = shift;
my $e_class = $alu->e_class();
my @supplies = ();
foreach my $key ( sort { int($a) cmp int($b) } keys %$e_class ) {
if ( $e_class->{$key} eq 'powerSupply' ) {
push( @supplies, int($key) );
}
}
return @supplies;
}
sub _ps_type {
my $alu = shift;
my $psnum = shift;
my @ps = $alu->_power_supplies();
if ( $psnum > $#ps ) {
return "none";
}
my $supply = $ps[$psnum];
my $descr = $alu->e_descr($supply);
return $descr->{$supply};
}
sub _ps_status {
my $alu = shift;
my $psnum = shift;
my @ps = $alu->_power_supplies();
if ( $psnum > $#ps ) {
return "not present";
}
my $supply = $ps[$psnum];
my $status = $alu->chasEntPhysOperStatus($supply);
return $status->{$supply};
}
sub ps1_type {
my $alu = shift;
return $alu->_ps_type(0);
}
sub ps2_type {
my $alu = shift;
return $alu->_ps_type(1);
}
sub ps1_status {
my $alu = shift;
return $alu->_ps_status(0);
}
sub ps2_status {
my $alu = shift;
return $alu->_ps_status(1);
}
# The interface description contains the software version, so
# to avoid losing historical information through a software upgrade
# we use interface name instead.
sub interfaces {
my $alu = shift;
my $partial = shift;
return $alu->orig_i_name($partial);
}
# Use Q-BRIDGE-MIB
sub fw_mac {
my $alu = shift;
my $partial = shift;
return $alu->qb_fw_mac($partial);
}
sub fw_port {
my $alu = shift;
my $partial = shift;
return $alu->qb_fw_port($partial);
}
# Work around buggy bp_index in 6.3.1.871.R01 and 6.3.1.975.R01
sub bp_index {
my $alu = shift;
my $partial = shift;
my $bp_index = $alu->SUPER::bp_index($partial);
#
# This device sometimes reports an ifIndex and sometimes reports
# dot1dBasePort for the dot1d port values - e.g.,
# in 6.3.1.871.R01 both dot1dTpFdbPort and dot1qTpFdbPort report
# the ifIndex; in 6.3.1.975.R01 dot1dTpFdbPort has been updated
# to report the dot1dBasePort but dot1qTpFdbPort still returns an
# ifIndex. For this reason, we augment the dot1dBasePort
# mapping with ifIndex->ifIndex mappings -- we can do this because
# the ifIndex and dot1dBasePort spaces don't overlap, at least for
# the ports we care about.
my @keys = keys %$bp_index;
foreach my $idx (@keys) {
my $ifIndex = $bp_index->{$idx};
$bp_index->{$ifIndex} = $ifIndex;
}
#
# In addition, aggregates aren't reported at all in bp_index.
# We grab them from i_index.
my $i_index = $alu->i_index();
foreach my $idx ( keys %$i_index ) {
my $ifIndex = $i_index->{$idx};
if ( int($ifIndex) > 40000001 ) {
$bp_index->{$ifIndex} = $ifIndex;
# dot1dTpFdbPort seems to use 4098, 4099, 4100 for
# 40000001, 40000002, 40000003. I guess this is
# 4096 + 1 + aggregate number.
my $tmp = sprintf( "%d", int($ifIndex) - 39995903 );
$bp_index->{$tmp} = $ifIndex;
}
}
return $bp_index;
}
# Workaround for unimplemented Q-BRIDGE-MIB::dot1qPvid
# If there is only one VLAN on which a given port is output
# untagged, then call that one the PVID. This is a guess that
# works in obvious configurations but may be wrong in
# subtle cases (like there's one output VLAN but a different
# input one - the only way to know that is via the dot1qPvid
# object)
#
# Newer versions have implemented dot1qPvid (but wrong, but
# that's just life)
#sub i_vlan {
# my $alu = shift;
#
# my $qb_v_untagged = $alu->qb_v_untagged();
# my $bp_index = $alu->bp_index();
# my $vlan_list = {};
# foreach my $vlan (keys %$qb_v_untagged) {
# my $portlist = $qb_v_untagged->{$vlan};
# my $port;
# for ($port = 0; $port <= $#$portlist; $port++) {
# if ($portlist->[$port]) {
# my $ifindex = $bp_index->{$port + 1};
# if ($ifindex) {
# push(@{$vlan_list->{$ifindex}}, int($vlan));
# }
# }
# }
# }
#
# my $i_vlan = {};
# foreach my $ifindex (keys %$vlan_list) {
# if ($#{$vlan_list->{$ifindex}} == 0) {
# $i_vlan->{$ifindex} = ${$vlan_list->{$ifindex}}[0];
# }
# }
# return $i_vlan;
#}
# Use LLDP
# (or at least try. The versions I've seen have two problems:
# 1. they report ifIndex values as 'local'; we don't support ifIndex
# but *could*
# 2. They report 0.0.0.0 as the management address
# )
sub hasCDP {
my $alu = shift;
return $alu->hasLLDP();
}
sub c_ip {
my $alu = shift;
my $partial = shift;
return $alu->lldp_ip($partial);
}
sub c_if {
my $alu = shift;
my $partial = shift;
return $alu->lldp_if($partial);
}
sub c_port {
my $alu = shift;
my $partial = shift;
return $alu->lldp_port($partial);
}
sub c_id {
my $alu = shift;
my $partial = shift;
return $alu->lldp_id($partial);
}
sub c_platform {
my $alu = shift;
my $partial = shift;
return $alu->lldp_rem_sysdesc($partial);
}
# Power-Ethernet ifIndex mapping. I've only seen this from a
# fixed-config single-module system, so this is only a plausible
# guess as to the mapping on a stack or modular system.
sub peth_port_ifindex {
my $alu = shift;
my $partial = shift;
my $peth_port_status = $alu->peth_port_status($partial);
my $peth_port_ifindex = {};
foreach my $key ( keys %$peth_port_status ) {
my @oid = split( m/\./, $key );
$peth_port_ifindex->{$key} = int( $oid[0] ) * 1000 + int( $oid[1] );
}
return $peth_port_ifindex;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::AlcatelLucent - SNMP Interface to Alcatel-Lucent OmniSwitch
=head1 AUTHOR
Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $alu = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $alu->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Alcatel-Lucent OmniSwitch devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::MAU
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<ALCATEL-IND1-DEVICES>
=item F<ALCATEL-IND1-CHASSIS-MIB>
=item F<ALU-POWER-ETHERNET-MIB>
Note that Alcatel-Lucent distributes their own proprietary version of the
F<POWER-ETHERNET-MIB>, but the MIB module name that they distribute is
simply F<POWER-ETHERNET-MIB>. This module must be hand-edited to change the
module name to F<ALU-POWER-ETHERNET-MIB> so that it can be used simultaneously
with the standard F<POWER-ETHERNET-MIB>.
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $alu->vendor()
Returns 'alcatel-lucent'
=item $alu->hasCDP()
Returns whether LLDP is enabled.
=item $alu->model()
Tries to reference $alu->id() to one of the product MIBs listed above
Removes 'device' from the name for readability.
=item $alu->os()
Returns 'AOS'
=item $alu->os_ver()
Grabs the os version from C<sysDescr>
=item $alu->ps1_type()
Return the type of the first power supply from the F<ENTITY-MIB>
=item $alu->ps2_type()
Return the type of the second power supply from the F<ENTITY-MIB>
=item $alu->ps1_status()
Return the status of the first power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
=item $alu->ps2_status()
Return the status of the second power supply from the F<ALCATEL-IND1-CHASSIS-MIB>
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $alu->interfaces()
Returns interface name from C<ifName>, since the default return value
of C<ifDescr> includes the OS version.
=item $alu->fw_mac()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $alu->fw_port()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $alu->bp_index()
Work around various bugs in the F<BRIDGE-MIB> and
F<Q-BRIDGE-MIB> implementations, by returning both
C<ifIndex> and C<dot1dBasePort> mappings to C<ifIndex> values.
=item $alu->c_id()
Returns LLDP information.
=item $alu->c_if()
Returns LLDP information.
=item $alu->c_ip()
Returns LLDP information.
=item $alu->c_platform()
Returns LLDP information.
=item $alu->c_port()
Returns LLDP information.
=item $alu->i_duplex_admin()
Returns info from F<MAU-MIB>
=item $alu->i_speed_admin()
Returns info from F<MAU-MIB>
=item $alu->peth_port_ifindex()
Returns the C<ifIndex> value for power-ethernet ports
using the OmniSwitch algorithm.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

View File

@@ -1,108 +1,142 @@
# SNMP::Info::Layer3::AlteonAD
# Eric Miller
# $Id$
#
# Copyright (c) 2004 Eric Miller
# Copyright (c) 2008 Eric Miller
# All Rights Reserved
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::AlteonAD;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE /;
@SNMP::Info::Layer3::AlteonAD::ISA = qw/SNMP::Info SNMP::Info::Bridge Exporter/;
@SNMP::Info::Layer3::AlteonAD::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::AlteonAD::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Bridge::MIBS,
'ALTEON-TIGON-SWITCH-MIB' => 'agSoftwareVersion',
'ALTEON-TS-PHYSICAL-MIB' => 'agPortTableMaxEnt',
'ALTEON-TS-NETWORK-MIB' => 'agPortTableMaxEnt',
);
%SNMP::Info::Layer3::MIBS,
'ALTEON-ROOT-MIB' => 'aceswitch184',
'ALTEON-TIGON-SWITCH-MIB' => 'hwPowerSupplyStatus',
'ALTEON-CHEETAH-SWITCH-MIB' => 'hwFanStatus',
'ALTEON-TS-PHYSICAL-MIB' => 'agPortTableMaxEnt',
'ALTEON-CS-PHYSICAL-MIB' => 'vlanCurCfgLearn',
'ALTEON-TS-NETWORK-MIB' => 'ripCurCfgSupply',
'ALTEON-CHEETAH-NETWORK-MIB' => 'ripCurCfgIntfSupply',
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
'sw_ver' => 'agSoftwareVersion',
'tftp_action' => 'agTftpAction',
'tftp_host' => 'agTftpServer',
'tftp_file' => 'agTftpCfgFileName',
'tftp_result' => 'agTftpLastActionStatus',
);
%SNMP::Info::Layer3::GLOBALS,
'old_sw_ver' => 'ALTEON_TIGON_SWITCH_MIB__agSoftwareVersion',
'new_sw_ver' => 'ALTEON_CHEETAH_SWITCH_MIB__agSoftwareVersion',
'old_tftp_action' => 'ALTEON_TIGON_SWITCH_MIB__agTftpAction',
'new_tftp_action' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpAction',
'old_tftp_host' => 'ALTEON_TIGON_SWITCH_MIB__agTftpServer',
'new_tftp_host' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpServer',
'old_tftp_file' => 'ALTEON_TIGON_SWITCH_MIB__agTftpCfgFileName',
'new_tftp_file' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpCfgFileName',
'old_tftp_result' => 'ALTEON_TIGON_SWITCH_MIB__agTftpLastActionStatus',
'new_tftp_result' => 'ALTEON_CHEETAH_SWITCH_MIB__agTftpLastActionStatus',
'old_ip_max' => 'ALTEON_TS_NETWORK_MIB__ipInterfaceTableMax',
'new_ip_max' => 'ALTEON_CHEETAH_NETWORK_MIB__ipInterfaceTableMax',
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Bridge::FUNCS,
'bp_index_2' => 'dot1dBasePortIfIndex',
'i_name2' => 'ifName',
# From RFC1213-MIB
'at_index' => 'ipNetToMediaIfIndex',
'at_paddr' => 'ipNetToMediaPhysAddress',
'at_netaddr' => 'ipNetToMediaNetAddress',
# From agPortCurCfgTable
'ag_p_cfg_idx' => 'agPortCurCfgIndx',
'ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
'ag_p_cfg_pvid' => 'agPortCurCfgPVID',
'ag_p_cfg_fe_auto' => 'agPortCurCfgFastEthAutoNeg',
'ag_p_cfg_fe_mode' => 'agPortCurCfgFastEthMode',
'ag_p_cfg_ge_auto' => 'agPortCurCfgGigEthAutoNeg',
'ag_p_cfg_name' => 'agPortCurCfgPortName',
# From portInfoTable
'p_info_idx' => 'portInfoIndx',
'p_info_mode' => 'portInfoMode',
# From portInfoTable
'ip_cfg_vlan' => 'ipCurCfgIntfVlan',
);
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
'at_paddr' => \&SNMP::Info::munge_mac,
);
%SNMP::Info::Layer3::FUNCS,
# From agPortCurCfgTable
'old_ag_p_cfg_idx' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgIndx',
'new_ag_p_cfg_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgIndx',
'old_ag_p_cfg_pref' => 'agPortCurCfgPrefLink',
'new_ag_p_cfg_pref' => 'agPortCurCfgPreferred',
'old_ag_p_cfg_pvid' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPVID',
'new_ag_p_cfg_pvid' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPVID',
'old_ag_p_cfg_fe_auto' =>
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthAutoNeg',
'new_ag_p_cfg_fe_auto' =>
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthAutoNeg',
'old_ag_p_cfg_fe_mode' =>
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgFastEthMode',
'new_ag_p_cfg_fe_mode' =>
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgFastEthMode',
'old_ag_p_cfg_ge_auto' =>
'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgGigEthAutoNeg',
'new_ag_p_cfg_ge_auto' =>
'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgGigEthAutoNeg',
'old_ag_p_cfg_name' => 'ALTEON_TS_PHYSICAL_MIB__agPortCurCfgPortName',
'new_ag_p_cfg_name' => 'ALTEON_CHEETAH_SWITCH_MIB__agPortCurCfgPortName',
# From portInfoTable
'old_p_info_idx' => 'ALTEON_TS_PHYSICAL_MIB__portInfoIndx',
'new_p_info_idx' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoIndx',
'old_p_info_mode' => 'ALTEON_TS_PHYSICAL_MIB__portInfoMode',
'new_p_info_mode' => 'ALTEON_CHEETAH_SWITCH_MIB__portInfoMode',
# From ipCurCfgIntfTable
'old_ip_cfg_vlan' => 'ALTEON_TS_NETWORK_MIB__ipCurCfgIntfVlan',
'new_ip_cfg_vlan' => 'ALTEON_CHEETAH_NETWORK_MIB__ipCurCfgIntfVlan',
# From vlanCurCfgTable
'old_vlan_id' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanId',
'new_vlan_id' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanId',
'old_vlan_state' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgState',
'new_vlan_state' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgState',
'old_vlan_name' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgVlanName',
'new_vlan_name' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgVlanName',
'old_vlan_ports' => 'ALTEON_TS_PHYSICAL_MIB__vlanCurCfgPorts',
'new_vlan_ports' => 'ALTEON_CS_PHYSICAL_MIB__vlanCurCfgPorts',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub model {
my $alteon = shift;
my $desc = $alteon->description();
return undef unless defined $desc;
return 'AD2' if ($desc =~ /AD2/);
return 'AD3' if ($desc =~ /AD3/);
return 'AD4' if ($desc =~ /AD4/);
return '180' if ($desc =~ /180/);
return '183' if ($desc =~ /183/);
return '184' if ($desc =~ /184/);
return $desc;
my $id = $alteon->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::AlteonAD::model() - Device does not support sysObjectID\n"
if $alteon->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^aceswitch//;
$model =~ s/^acedirector/AD/;
$model =~ s/^(copper|fiber)Module/BladeCenter GbESM/;
return $model;
}
sub vendor {
@@ -110,32 +144,36 @@ sub vendor {
}
sub os {
return 'webos';
return 'alteon';
}
sub os_ver {
my $alteon = shift;
my $version = $alteon->sw_ver();
return undef unless defined $version;
my $version = $alteon->new_sw_ver() || $alteon->old_sw_ver();
return unless defined $version;
return $version;
}
sub interfaces {
my $alteon = shift;
my $interfaces = $alteon->i_index();
my $alteon = shift;
my $interfaces = $alteon->i_index();
my $descriptions = $alteon->i_description();
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %interfaces = ();
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
if ($desc =~ /(^net\d+)/) {
$desc = $1;
if ( $desc =~ /(^net\d+)/ ) {
$desc = $1;
}
elsif (($iid > 256) and ($iid < 266)) {
$desc = ($iid % 256);
# IP interfaces are first followed by physical, number possible
# varies by switch model
elsif ( defined $ip_max and $iid > $ip_max ) {
$desc = ( $iid % $ip_max );
}
$interfaces{$iid} = $desc;
}
@@ -144,20 +182,24 @@ sub interfaces {
sub i_duplex {
my $alteon = shift;
my $p_mode = $alteon->p_info_mode();
my $p_mode = $alteon->new_p_info_mode()
|| $alteon->old_p_info_mode()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %i_duplex;
foreach my $if (keys %$p_mode){
foreach my $if ( keys %$p_mode ) {
my $duplex = $p_mode->{$if};
next unless defined $duplex;
next unless defined $duplex;
$duplex = 'half' if $duplex =~ /half/i;
$duplex = 'full' if $duplex =~ /full/i;
my $idx = $if + 256;
$i_duplex{$idx}=$duplex;
my $idx;
$idx = $if + $ip_max if ( defined $ip_max );
$i_duplex{$idx} = $duplex;
}
return \%i_duplex;
}
@@ -165,84 +207,153 @@ sub i_duplex {
sub i_duplex_admin {
my $alteon = shift;
my $ag_pref = $alteon->ag_p_cfg_pref();
my $ag_fe_auto = $alteon->ag_p_cfg_fe_auto();
my $ag_fe_mode = $alteon->ag_p_cfg_fe_mode();
my $ag_ge_auto = $alteon->ag_p_cfg_ge_auto();
my $ag_pref = $alteon->new_ag_p_cfg_pref()
|| $alteon->old_ag_p_cfg_pref()
|| {};
my $ag_fe_auto = $alteon->new_ag_p_cfg_fe_auto()
|| $alteon->old_ag_p_cfg_fe_auto()
|| {};
my $ag_fe_mode = $alteon->new_ag_p_cfg_fe_mode()
|| $alteon->old_ag_p_cfg_fe_mode()
|| {};
my $ag_ge_auto = $alteon->new_ag_p_cfg_ge_auto()
|| $alteon->old_ag_p_cfg_ge_auto()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %i_duplex_admin;
foreach my $if (keys %$ag_pref){
foreach my $if ( keys %$ag_pref ) {
my $pref = $ag_pref->{$if};
next unless defined $pref;
my $string = 'other';
if ($pref =~ /gigabit/i) {
my $string = 'other';
if ( $pref =~ /gigabit/i ) {
my $ge_auto = $ag_ge_auto->{$if};
$string = 'full' if ($ge_auto =~ /off/i);
$string = 'auto' if ($ge_auto =~ /on/i);
$string = 'full' if ( $ge_auto =~ /off/i );
$string = 'auto' if ( $ge_auto =~ /on/i );
}
elsif ($pref =~ /fast/i) {
elsif ( $pref =~ /fast/i ) {
my $fe_auto = $ag_fe_auto->{$if};
my $fe_mode = $ag_fe_mode->{$if};
$string = 'half' if ($fe_mode =~ /half/i and $fe_auto =~ /off/i);
$string = 'full' if ($fe_mode =~ /full/i and $fe_auto =~ /off/i);
$string = 'half'
if ( $fe_mode =~ /half/i and $fe_auto =~ /off/i );
$string = 'full'
if ( $fe_mode =~ /full/i and $fe_auto =~ /off/i );
$string = 'auto' if $fe_auto =~ /on/i;
}
my $idx = $if + 256;
$i_duplex_admin{$idx}=$string;
my $idx;
$idx = $if + $ip_max if ( defined $ip_max );
$i_duplex_admin{$idx} = $string;
}
return \%i_duplex_admin;
}
sub i_vlan {
my $alteon = shift;
my $ag_vlans = $alteon->ag_p_cfg_pvid();
my $ip_vlans = $alteon->ip_cfg_vlan();
my %i_vlan;
foreach my $if (keys %$ip_vlans){
my $ip_vlanid = $ip_vlans->{$if};
next unless defined $ip_vlanid;
$i_vlan{$if}=$ip_vlanid;
}
foreach my $if (keys %$ag_vlans){
my $ag_vlanid = $ag_vlans->{$if};
next unless defined $ag_vlanid;
my $idx = $if + 256;
$i_vlan{$idx}=$ag_vlanid;
}
return \%i_vlan;
}
sub i_name {
my $alteon = shift;
my $p_name = $alteon->ag_p_cfg_name();
my $p_name = $alteon->new_ag_p_cfg_name()
|| $alteon->old_ag_p_cfg_name()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %i_name;
foreach my $iid (keys %$p_name){
foreach my $iid ( keys %$p_name ) {
my $name = $p_name->{$iid};
next unless defined $name;
my $idx = $iid + 256;
my $idx;
$idx = $iid + $ip_max if ( defined $ip_max );
$i_name{$idx} = $name;
}
return \%i_name;
}
# Bridge MIB does not map Bridge Port to ifIndex correctly
sub v_index {
my $alteon = shift;
my $partial = shift;
return $alteon->new_vlan_id($partial) || $alteon->old_vlan_id($partial);
}
sub v_name {
my $alteon = shift;
my $partial = shift;
return $alteon->new_vlan_name($partial)
|| $alteon->old_vlan_name($partial);
}
sub i_vlan {
my $alteon = shift;
my $ag_vlans = $alteon->new_ag_p_cfg_pvid()
|| $alteon->old_ag_p_cfg_pvid()
|| {};
my $ip_vlans = $alteon->new_ip_cfg_vlan()
|| $alteon->old_ip_cfg_vlan()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %i_vlan;
foreach my $if ( keys %$ip_vlans ) {
my $ip_vlanid = $ip_vlans->{$if};
next unless defined $ip_vlanid;
$i_vlan{$if} = $ip_vlanid;
}
foreach my $if ( keys %$ag_vlans ) {
my $ag_vlanid = $ag_vlans->{$if};
next unless defined $ag_vlanid;
my $idx;
$idx = $if + $ip_max if ( defined $ip_max );
$i_vlan{$idx} = $ag_vlanid;
}
return \%i_vlan;
}
sub i_vlan_membership {
my $alteon = shift;
my $v_ports = $alteon->old_vlan_ports()
|| $alteon->new_vlan_ports()
|| {};
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my $i_vlan_membership = {};
foreach my $vlan ( keys %$v_ports ) {
my $portlist = [ split( //, unpack( "B*", $v_ports->{$vlan} ) ) ];
my $ret = [];
# Convert portlist bit array to ifIndex array
for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
my $idx;
$idx = $i + $ip_max if ( defined $ip_max );
push( @{$ret}, $idx ) if ( @$portlist[$i] );
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
}
return $i_vlan_membership;
}
# Bridge MIB does not map Bridge Port to ifIndex correctly on some code
# versions
sub bp_index {
my $alteon = shift;
my $b_index = $alteon->bp_index_2();
my $b_index = $alteon->orig_bp_index();
my $ip_max = $alteon->new_ip_max() || $alteon->old_ip_max();
my %bp_index;
foreach my $iid (keys %$b_index){
foreach my $iid ( keys %$b_index ) {
my $port = $b_index->{$iid};
next unless defined $port;
$port = $port + 256;
$port = $port + $ip_max if ( defined $ip_max and $iid == $ip_max );
$bp_index{$iid} = $port;
}
@@ -254,8 +365,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::AlteonAD - Perl5 Interface to Nortel Networks' Alteon Ace
Director Series Layer 2-7 Switches.
SNMP::Info::Layer3::AlteonAD - SNMP Interface to Nortel Alteon Layer 2-7
Switches.
=head1 AUTHOR
@@ -267,7 +378,6 @@ Eric Miller
my $alteon = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
@@ -279,11 +389,11 @@ Eric Miller
=head1 DESCRIPTION
Abstraction subclass for Layer 2-7 load balancing switches running Nortel Networks'
Alteon Web OS Traffic Control Software.
Abstraction subclass for Nortel Alteon Series Layer 2-7 load balancing
switches and Nortel BladeCenter Layer2-3 GbE Switch Modules.
For speed or debugging purposes you can call the subclass directly, but not after
determining a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $alteon = new SNMP::Info::Layer3::AlteonAD(...);
@@ -291,9 +401,7 @@ determining a more specific class using the method above.
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::Layer3
=back
@@ -301,25 +409,23 @@ determining a more specific class using the method above.
=over
=item ALTEON-TIGON-SWITCH-MIB
=item F<ALTEON-ROOT-MIB>
=item ALTEON-TS-PHYSICAL-MIB
=item F<ALTEON-TIGON-SWITCH-MIB>
=item ALTEON-TS-NETWORK-MIB
=item F<ALTEON-TS-PHYSICAL-MIB>
MIBs can be found on the CD that came with your product.
=item F<ALTEON-TS-NETWORK-MIB>
Or, they can be downloaded directly from Nortel Networks regardless of support
contract status. Go to http://www.nortelnetworks.com Techninal Support,
Browse Technical Support, Select by Product Families, Alteon,
Alteon Web OS Traffic Control Software, Software. Filter on mibs and download
the latest version's archive.
=item F<ALTEON-CS-PHYSICAL-MIB>
=item F<ALTEON-CHEETAH-SWITCH-MIB>
=item F<ALTEON-CHEETAH-NETWORK-MIB>
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See SNMP::Info::Bridge for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
@@ -331,7 +437,9 @@ These are methods that return scalar value from SNMP
=item $alteon->model()
Returns the model extracted from B<sysDescr>
Returns model type. Checks $alteon->id() against the F<ALTEON-ROOT-MIB> and
then parses out C<aceswitch>, replaces C<acedirector> with AD, and replaces
copperModule/fiberModule with BladeCenter GbESM.
=item $alteon->vendor()
@@ -339,39 +447,35 @@ Returns 'nortel'
=item $alteon->os()
Returns 'webos'
Returns 'alteon'
=item $alteon->os_ver()
Returns the software version reported by B<agSoftwareVersion>
Returns the software version reported by C<agSoftwareVersion>
=item $alteon->tftp_action()
(B<agTftpAction>)
(C<agTftpAction>)
=item $alteon->tftp_host()
(B<agTftpServer>)
(C<agTftpServer>)
=item $alteon->tftp_file()
(B<agTftpCfgFileName>)
(C<agTftpCfgFileName>)
=item $alteon->tftp_result()
(B<agTftpLastActionStatus>)
(C<agTftpLastActionStatus>)
=back
=head2 Globals imported from SNMP::Info
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -385,7 +489,7 @@ to a hash.
Returns reference to the map between IID and physical port.
Utilizes description for network interfaces. Ports are determined by
formula (ifIndex mod 256).
formula (C<ifIndex mod 256>).
=item $alteon->i_duplex()
@@ -397,48 +501,44 @@ Returns reference to hash. Maps port admin duplexes to IIDs.
=item $alteon->i_vlan()
Returns reference to hash. Maps port VLAN ID to IIDs.
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $alteon->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the egress list for the port.
Example:
my $interfaces = $alteon->interfaces();
my $vlans = $alteon->i_vlan_membership();
foreach my $iid (sort keys %$interfaces) {
my $port = $interfaces->{$iid};
my $vlan = join(',', sort(@{$vlans->{$iid}}));
print "Port: $port VLAN: $vlan\n";
}
=item $alteon->v_index()
Returns VLAN IDs
=item $alteon->v_name()
Human-entered name for vlans.
=item $alteon->i_name()
Maps (B<agPortCurCfgPortName>) to port and returns the human set port name if exists.
Maps (C<agPortCurCfgPortName>) to port and returns the human set port name if
exists.
=item $alteon->bp_index()
Returns a mapping between ifIndex and the Bridge Table.
Returns a mapping between C<ifIndex> and the Bridge Table.
=back
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
=head2 Table Methods imported from SNMP::Info::Layer3
=over
=item $alteon->at_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
(B<ipNetToMediaIfIndex>)
=item $alteon->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
(B<ipNetToMediaPhysAddress>)
=item $alteon->at_netaddr()
Returns reference to hash. Maps ARP table entries to IPs
(B<ipNetToMediaNetAddress>)
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in SNMP::Info::Bridge for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

400
Info/Layer3/Altiga.pm Normal file
View File

@@ -0,0 +1,400 @@
# SNMP::Info::Layer3::Altiga
# $Id$
#
# Copyright (c) 2008 Jeroen van Ingen Schenau
# 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::Layer3::Altiga;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Altiga::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Altiga::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE
$int_include_vpn $fake_idx $type_class/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'ALTIGA-VERSION-STATS-MIB' => 'alVersionString',
'ALTIGA-SESSION-STATS-MIB' => 'alActiveSessionCount',
'ALTIGA-HARDWARE-STATS-MIB' => 'alHardwarePs1Type',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
# From ALTIGA-VERSION-STATS-MIB
'os_ver' => 'alVersionString',
# From ALTIGA-SESSION-STATS-MIB
'vpn_act_sess' => 'alActiveSessionCount',
'vpn_total_sess' => 'alTotalSessionCount',
'vpn_max_sess' => 'alMaxSessionCount',
'vpn_l2l_sess' => 'alActiveLanToLanSessionCount',
'vpn_mgmt_sess' => 'alActiveManagementSessionCount',
'vpn_ras_sess' => 'alActiveRemoteAccessSessionCount',
# From ALTIGA-HARDWARE-STATS-MIB
'ps1_type' => 'alHardwarePs1Type',
'ps1_3v_alarm' => 'alHardwarePs1Voltage3vAlarm',
'ps1_5v_alarm' => 'alHardwarePs1Voltage5vAlarm',
'ps2_type' => 'alHardwarePs2Type',
'ps2_3v_alarm' => 'alHardwarePs2Voltage3vAlarm',
'ps2_5v_alarm' => 'alHardwarePs2Voltage5vAlarm',
'fan1_alarm' => 'alHardwareFan1RpmAlarm',
'fan2_alarm' => 'alHardwareFan2RpmAlarm',
'fan3_alarm' => 'alHardwareFan3RpmAlarm',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
'i_type2' => 'ifType',
'i_lastchange2' => 'ifLastChange',
'vpn_sess_status' => 'alActiveSessionRowStatus',
'vpn_sess_user' => 'alActiveSessionUserName',
'vpn_sess_peer_ip' => 'alActiveSessionIpAddress',
'vpn_sess_protocol' => 'alActiveSessionProtocol',
'vpn_sess_encr' => 'alActiveSessionEncrType',
'vpn_sess_start' => 'alActiveSessionStartTime',
'vpn_sess_conntime' => 'alActiveSessionConnectTime',
'vpn_sess_out_oct' => 'alActiveSessionOctetsSent',
'vpn_sess_in_oct' => 'alActiveSessionOctetsRcvd',
'vpn_sess_group' => 'alActiveSessionGroupName',
'vpn_sess_gid' => 'alActiveSessionGroupId',
'vpn_sess_rem_ip' => 'alActiveSessionPublicIpAddress',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
'ps1_3v_alarm' => \&munge_alarm,
'ps1_5v_alarm' => \&munge_alarm,
'ps2_3v_alarm' => \&munge_alarm,
'ps2_5v_alarm' => \&munge_alarm,
'fan1_alarm' => \&munge_alarm,
'fan2_alarm' => \&munge_alarm,
'fan3_alarm' => \&munge_alarm,
);
# Variable to modify behaviour of "interfaces" subroutine.
# * When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
# * When set to 1, "interfaces" returns fixed interfaces from IF-MIB and LAN-to-LAN tunnels from ALTIGA-SESSION-MIB
# TODO: This should be an instance method, not a class global
$int_include_vpn = 1;
# Variable to prepended to each tunnel index when tunnel is added to %interfaces, to avoid overwriting "real" ifIndex entries
$fake_idx = 3076;
# Variable to classify session types into categories: 0 - unclassified, 1 - LAN-to-LAN or fixed, 2 - RAS or dynamic, 3 - administrative
$type_class = {
'pptp' => 2,
'l2tp' => 2,
'ipsec' => 2,
'http' => 3,
'ftp' => 3,
'telnet' => 3,
'snmp' => 3,
'tftp' => 3,
'console' => 3,
'debugTelnet' => 3,
'debugConsole' => 3,
'other' => 3,
'ike' => 0,
'l2tpOverIpSec' => 2,
'ipsecLanToLan' => 1,
'ipsecOverUdp' => 2,
'ssh' => 3,
'vcaLanToLan' => 1,
'ipsecOverTcp' => 2,
'pppoe' => 2,
'ipsecOverNatT' => 2,
'ipsecLan2LanOverNatT' => 1,
'l2tpOverIpsecOverNatT' => 2,
'userHttps' => 2,
'pop3s' => 2,
'imap4s' => 2,
'smtps' => 2,
'httpsTunnel' => 2,
};
sub vendor {
return 'altiga';
}
sub os {
return 'altiga';
}
sub hasCDP {
return 0;
}
# $altiga->interfaces() - Map the Interfaces to their physical names
# Add interface number to interface name to prevent duplicate ifDescr
# Included statically configured VPN tunnels if ($int_include_vpn)
sub interfaces {
my $altiga = shift;
my $partial = shift;
my $interfaces = $altiga->i_index($partial);
my $descriptions = $altiga->i_description($partial);
my %int_rev = ();
my %interfaces = ();
foreach my $iid (sort {$a cmp $b} keys %$interfaces) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
if (!exists $int_rev{$desc}) {
$interfaces{$iid} = $desc;
$int_rev{$desc} = $iid;
} else {
my $done = 0;
my $unique_desc;
my $cnt = 1;
until ($done) {
$cnt++;
$unique_desc = sprintf("%s (%d)", $desc, $cnt);
if (!exists $int_rev{$unique_desc}) {
$done++;
}
}
$int_rev{$unique_desc} = $iid;
$interfaces{$iid} = $unique_desc;
$interfaces{ $int_rev{$desc} } = sprintf("%s (%d)", $desc, 1);
}
}
if ($int_include_vpn) {
my $tun_type = $altiga->vpn_sess_protocol();
my $peer = $altiga->vpn_sess_peer_ip();
my $remote = $altiga->vpn_sess_rem_ip();
my $group = $altiga->vpn_sess_gid();
foreach my $tunnel (keys %$tun_type) {
if ($type_class->{$tun_type->{$tunnel}} eq 1) {
$interfaces{"$fake_idx.$tunnel"} = sprintf("%s VPN to %s", uc($tun_type->{$tunnel}), $remote->{$tunnel});
}
}
}
return \%interfaces;
}
sub i_type {
my $altiga = shift;
my $partial = shift;
my $types = $altiga->i_type2();
if ($int_include_vpn) {
my $tun_type = $altiga->vpn_sess_protocol();
foreach my $tunnel (keys %$tun_type) {
$types->{"$fake_idx.$tunnel"} = $tun_type->{$tunnel};
}
}
return $types;
}
sub i_lastchange {
my $altiga = shift;
my $partial = shift;
# TODO: This is what munges are for.
my $lastchange = $altiga->i_lastchange2();
if ($int_include_vpn) {
my $tun_start = $altiga->vpn_sess_start();
foreach my $tunnel (keys %$tun_start) {
$lastchange->{"$fake_idx.$tunnel"} = $tun_start->{$tunnel};
}
}
return $lastchange;
}
sub ps1_status {
my $altiga = shift;
my $alarm_3v = $altiga->ps1_3v_alarm() || "";
my $alarm_5v = $altiga->ps1_5v_alarm() || "";
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
}
sub ps2_status {
my $altiga = shift;
my $alarm_3v = $altiga->ps2_3v_alarm() || "";
my $alarm_5v = $altiga->ps2_5v_alarm() || "";
return sprintf("3V: %s, 5V: %s", $alarm_3v, $alarm_5v);
}
sub fan {
my $altiga = shift;
my $alarm_fan1 = $altiga->fan1_alarm() || "";
my $alarm_fan2 = $altiga->fan2_alarm() || "";
my $alarm_fan3 = $altiga->fan3_alarm() || "";
return sprintf("Fan 1: %s, Fan 2: %s, Fan 3: %s", $alarm_fan1, $alarm_fan2, $alarm_fan3);
}
sub munge_alarm {
my $alarm = shift;
if ($alarm eq 'false') {
return 'OK';
} elsif ($alarm eq 'true') {
return 'FAIL';
} else {
return "(n/a)";
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Altiga - SNMP Interface to Cisco (formerly Altiga) VPN concentrators
=head1 AUTHOR
Jeroen van Ingen Schenau
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $altiga = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'my_vpn_host',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $altiga->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Cisco (formerly Altiga) VPN concentrators
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 Class Variables (options)
=over
=item $SNMP::Info::Layer3::Altiga::int_include_vpn
Variable to modify behavior of "interfaces" subroutine.
* When set to 0, "interfaces" returns only fixed interfaces from the IF-MIB,
* When set to 1, "interfaces" returns fixed interfaces from IF-MIB and
LAN-to-LAN tunnels from ALTIGA-SESSION-MIB (default)
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $altiga->vendor()
Returns 'altiga'
=item $altiga->os()
Returns 'altiga'
=item $altiga->os_ver()
Tries to determine OS version from the C<sysDescr.0> field. Returns version or C<sysDescr.0>
=item $altiga->fan()
Combines results from C<fan1_alarm>, C<fan2_alarm>, and C<fam3_alarm> methods.
=item $altiga->hasCDP()
No.
=item $altiga->ps1_status()
Combines C<ps1_3v_alarm> and C<ps1_5v_alarm> methods.
=item $altiga->ps2_status()
Combines C<ps2_3v_alarm> and C<ps2_5v_alarm> methods.
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $altiga->interfaces()
This method overrides the interfaces() method inherited from SNMP::Info.
It provides a mapping between the Interface Table Index (iid) and the physical
port name, adding a port number to the port name to prevent duplicate names.
=item $altiga->i_lastchange()
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
=item $altiga->i_type()
Filters out the results depending on the value of $SNMP::Info::Layer3::Altiga::int_include_vpn
=back
=head1 MUNGES
=over
=item munge_alarm()
Changes C<true> and C<false> to C<FAIL>, C<OK>, and C<(n/a)>.
=back
=cut

324
Info/Layer3/Arista.pm Normal file
View File

@@ -0,0 +1,324 @@
# SNMP::Info::Layer3::Arista
# $Id$
#
# Copyright (c) 2008 Arista Networks, Inc.
# 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 Arista Networks, Inc. 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::Arista;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Arista::ISA = qw/SNMP::Info::LLDP SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Arista::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
'ARISTA-PRODUCTS-MIB' => 'aristaProducts',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
# use MAU-MIB for admin. duplex and admin. speed
*SNMP::Info::Layer3::Arista::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::Arista::i_speed_admin
= \&SNMP::Info::MAU::mau_i_speed_admin;
sub vendor {
return 'arista';
}
sub os {
return 'EOS';
}
sub os_ver {
my $arista = shift;
my $descr = $arista->description();
my $os_ver = undef;
$os_ver = $1 if ( $descr =~ /\s+EOS\s+version\s+(\S+)\s+/ );
return $os_ver;
}
sub model {
my $arista = shift;
my $id = $arista->id();
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^arista//;
return $model;
}
# Use Q-BRIDGE-MIB
sub fw_mac {
my $arista = shift;
my $partial = shift;
return $arista->qb_fw_mac($partial);
}
sub fw_port {
my $arista = shift;
my $partial = shift;
return $arista->qb_fw_port($partial);
}
# Use LLDP
sub hasCDP {
my $arista = shift;
return $arista->hasLLDP();
}
sub c_ip {
my $arista = shift;
my $partial = shift;
return $arista->lldp_ip($partial);
}
sub c_if {
my $arista = shift;
my $partial = shift;
return $arista->lldp_if($partial);
}
sub c_port {
my $arista = shift;
my $partial = shift;
return $arista->lldp_port($partial);
}
sub c_id {
my $arista = shift;
my $partial = shift;
return $arista->lldp_id($partial);
}
sub c_platform {
my $arista = shift;
my $partial = shift;
return $arista->lldp_rem_sysdesc($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Arista - SNMP Interface to Arista Networks EOS
=head1 AUTHOR
Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $arista = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $arista->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Arista Networks EOS-based devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::MAU
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<ARISTA-PRODUCTS-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=item $arista->vendor()
Returns 'Arista Networks, Inc.'
=item $arista->hasCDP()
Returns whether LLDP is enabled.
=item $arista->model()
Tries to reference $arista->id() to one of the product MIBs listed above
Removes 'arista' from the name for readability.
=item $arista->os()
Returns 'EOS'
=item $arista->os_ver()
Grabs the os version from C<sysDescr>
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $arista->fw_mac()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $arista->fw_port()
Use the F<Q-BRIDGE-MIB> instead of F<BRIDGE-MIB>
=item $arista->c_id()
Returns LLDP information.
=item $arista->c_if()
Returns LLDP information.
=item $arista->c_ip()
Returns LLDP information.
=item $arista->c_platform()
Returns LLDP information.
=item $arista->c_port()
Returns LLDP information.
=item $arista->i_duplex_admin()
Returns info from F<MAU-MIB>
=item $arista->i_speed_admin()
Returns info from F<MAU-MIB>
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

648
Info/Layer3/Aruba.pm Normal file
View File

@@ -0,0 +1,648 @@
# SNMP::Info::Layer3::Aruba
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Aruba;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Aruba::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Aruba::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'WLSX-SWITCH-MIB' => 'wlsxHostname',
'WLSX-WLAN-MIB' => 'wlanAPFQLN',
'WLSR-AP-MIB' => 'wlsrHideSSID',
#'ALCATEL-IND1-TP-DEVICES' => 'familyOmniAccessWireless',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
# WLSX-SWITCH-MIB::wlsxSwitchAccessPointTable
# Table index leafs do not return information
# therefore unable to use apBSSID. We extract
# the information from the IID instead.
'aruba_ap_name' => 'apLocation',
'aruba_ap_ip' => 'apIpAddress',
'aruba_ap_essid' => 'apESSID',
'aruba_ap_ssidbcast' => 'wlsrHideSSID',
# WLSX-WLAN-MIB::wlsxWlanAPTable
'aruba_perap_fqln' => 'wlanAPFQLN',
# WLSR-AP-MIB::wlsrConfigTable
'aruba_ap_channel' => 'apCurrentChannel',
# WLSX-SWITCH-MIB::wlsxSwitchStationMgmtTable
# Table index leafs do not return information
# therefore unable to use staAccessPointBSSID
# or staPhyAddress. We extract the information from
# the IID instead.
#'fw_port' => 'staAccessPointBSSID',
#'fw_mac' => 'staPhyAddress',
'fw_user' => 'staUserName',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub layers {
return '00000111';
}
sub os {
my $aruba = shift;
my %osmap = (
'alcatel-lucent' => 'aos-w',
);
return $osmap{$aruba->vendor()} || 'airos';
}
sub vendor {
my $aruba = shift;
my $id = $aruba->id() || 'undef';
my %oidmap = (
6486 => 'alcatel-lucent',
);
$id = $1 if (defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/);
if (defined($id) and exists($oidmap{$id})) {
return $oidmap{$id};
}
else {
return 'aruba';
}
}
sub os_ver {
my $aruba = shift;
my $descr = $aruba->description();
return unless defined $descr;
if ( $descr =~ m/Version\s+(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub model {
my $aruba = shift;
my $id = $aruba->id();
return unless defined $id;
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
return $model;
}
# Thin APs do not support ifMIB requirement
#
# We return all BSSIDs as pseudo-ports on the controller.
sub i_index {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->orig_i_index($partial) || {};
my $ap_index = $aruba->aruba_ap_name($partial) || {};
my %if_index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
$if_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id ( keys %$ap_index ) {
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
$if_index{$ap_id} = $mac;
}
return \%if_index;
}
sub interfaces {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $i_descr = $aruba->i_description($partial) || {};
my %if;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /^\d+$/ ) {
# Replace the Index with the ifDescr field.
my $port = $i_descr->{$iid};
next unless defined $port;
$if{$iid} = $port;
}
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
$if{$index} = $index;
}
else {
next;
}
}
return \%if;
}
# Most items are indexed by BSSID.
# aruba_perap_fqln is indexed by AP, so we use the
# [haven't decided yet] index to figure out all of the
# BSSIDs served by a given radio.
sub aruba_ap_fqln {
my $aruba = shift;
# I don't think $partial is meaningful in this context
my $perap_fqln = $aruba->aruba_perap_fqln();
my $channel = $aruba->wlanAPBssidChannel();
my $aruba_ap_fqln = {};
# Channel index is: AP, radio, BSSID
foreach my $idx (keys %$channel) {
my @oid = split(/\./, $idx );
my $ap = join(".", @oid[0..5]);
my $bssid = join(".", @oid[7..12]);
$aruba_ap_fqln->{$bssid} = $perap_fqln->{$ap};
}
return $aruba_ap_fqln;
}
sub i_name {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $i_name2 = $aruba->orig_i_name($partial) || {};
my $ap_name = $aruba->aruba_ap_name($partial) || {};
my $ap_fqln = $aruba->aruba_ap_fqln($partial) || {};
my %i_name;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /^\d+$/ ) {
my $name = $i_name2->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
elsif ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $name = $ap_fqln->{$iid} || $ap_name->{$iid};
next unless defined $name;
$i_name{$index} = $name;
}
else {
next;
}
}
return \%i_name;
}
sub i_ssidlist {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_ssid = $aruba->aruba_ap_essid($partial) || {};
my %i_ssid;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $ssid = $ap_ssid->{$iid};
next unless defined $ssid;
$i_ssid{$index} = $ssid;
}
else {
next;
}
}
return \%i_ssid;
}
sub i_80211channel {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_ch = $aruba->aruba_ap_channel($partial) || {};
my %i_ch;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $ch = $ap_ch->{$iid};
next unless defined $ch;
$i_ch{$index} = $ch;
}
else {
next;
}
}
return \%i_ch;
}
sub i_ssidbcast {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->i_index($partial) || {};
my $ap_bc = $aruba->aruba_ap_ssidbcast($partial) || {};
my %i_bc;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
if ( $index =~ /(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}/ ) {
my $bc = $ap_bc->{$iid};
next unless defined $bc;
$bc = ( $bc ? 0 : 1 );
$i_bc{$index} = $bc;
}
else {
next;
}
}
return \%i_bc;
}
# Wireless switches do not support the standard Bridge MIB
sub bp_index {
my $aruba = shift;
my $partial = shift;
my $i_index = $aruba->orig_i_index($partial) || {};
my $ap_index = $aruba->aruba_ap_name($partial) || {};
my %bp_index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
$bp_index{$iid} = $index;
}
# Get Attached APs as Interfaces
foreach my $ap_id ( keys %$ap_index ) {
# Convert the 0.254.123.456 index entry to a MAC address.
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $ap_id ) );
$bp_index{$mac} = $mac;
}
return \%bp_index;
}
sub fw_port {
my $aruba = shift;
my $partial = shift;
my $fw_idx = $aruba->fw_user($partial) || {};
my %fw_port;
foreach my $iid ( keys %$fw_idx ) {
if ( $iid
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
)
{
my $port = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $2 ) );
$fw_port{$iid} = $port;
}
else {
next;
}
}
return \%fw_port;
}
sub fw_mac {
my $aruba = shift;
my $partial = shift;
my $fw_idx = $aruba->fw_user($partial) || {};
my %fw_mac;
foreach my $iid ( keys %$fw_idx ) {
if ( $iid
=~ /(\d+\.\d+\.\d+\.\d+\.\d+\.\d+).(\d+\.\d+\.\d+\.\d+\.\d+\.\d+)/
)
{
my $mac = join( ':',
map { sprintf( "%02x", $_ ) } split( /\./, $1 ) );
$fw_mac{$iid} = $mac;
}
else {
next;
}
}
return \%fw_mac;
}
# Return the BSSID in i_mac.
sub i_mac {
my $aruba = shift;
my $partial = shift;
# Start with the i_mac entries for the physical ports.
my $i_mac = $aruba->orig_i_mac($partial) || {};
# Add in all the BSSID entries.
my $i_index = $aruba->i_index($partial) || {};
foreach my $iid (keys %$i_index) {
my $index = $i_index->{$iid};
if ($index =~ /:/) {
$i_mac->{$index} = $index;
}
}
return $i_mac;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Aruba - SNMP Interface to Aruba wireless switches
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $aruba = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $aruba->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::Layer3::Aruba is a subclass of SNMP::Info that provides an
interface to Aruba wireless switches. The Aruba platform utilizes
intelligent wireless switches which control thin access points. The thin
access points themselves are unable to be polled for end station information.
This class emulates bridge functionality for the wireless switch. This enables
end station MAC addresses collection and correlation to the thin access point
the end station is using for communication.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $aruba = new SNMP::Info::Layer3::Aruba(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<WLSX-SWITCH-MIB>
=item F<WLSR-AP-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $aruba->model()
Returns model type. Cross references $aruba->id() with product IDs in the
Aruba MIB.
=item $aruba->vendor()
Returns 'aruba'
=item $aruba->os()
Returns 'airos'
=item $aruba->os_ver()
Returns the software version extracted from C<sysDescr>
=back
=head2 Overrides
=over
=item $aruba->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=back
=head2 Globals imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $aruba->i_index()
Returns reference to map of IIDs to Interface index.
Extends C<ifIndex> to support thin APs as device interfaces.
=item $aruba->interfaces()
Returns reference to map of IIDs to ports. Thin APs are implemented as device
interfaces. The thin AP BSSID is used as the port identifier.
=item $aruba->i_name()
Interface name. Returns (C<ifName>) for Ethernet interfaces and
(C<wlanAPFQLN> or C<apLocation>) for thin AP interfaces.
=item $aruba->i_mac()
Interface MAC address. Returns interface MAC address for Ethernet
interfaces and BSSID for thin AP interfaces.
=item $aruba->bp_index()
Simulates bridge MIB by returning reference to a hash containing the index for
both the keys and values.
=item $aruba->fw_port()
(C<staAccessPointBSSID>) as extracted from the IID.
=item $aruba->fw_mac()
(C<staPhyAddress>) as extracted from the IID.
=item $aruba->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
(C<apESSID>)
=item $aruba->i_ssidbcast()
Returns reference to hash. Indicates whether the SSID is broadcast, true or
false.
(C<wlsrHideSSID>)
=item $aruba->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
(C<apCurrentChannel>)
=item $aruba->aruba_ap_fqln()
Returns F<aruba_perap_fqln> indexed by BSSID instead of by AP.
=back
=head2 Aruba Switch AP Table (C<wlsxSwitchAccessPointTable>)
=over
=item $aruba->aruba_ap_name()
(C<apLocation>)
=item $aruba->aruba_ap_ip()
(C<apIpAddress>)
=item $aruba->aruba_ap_essid()
(C<apESSID>)
=item $aruba->aruba_ap_ssidbcast()
(C<wlsrHideSSID>)
=back
=head2 Aruba AP Table (C<wlsxWlanAPTable>)
=over
=item $aruba->aruba_perap_fqln()
(C<wlanAPFQLN>)
=back
=head2 Aruba Switch Station Management Table (C<wlsxSwitchStationMgmtTable>)
=over
=item $aruba->fw_user()
(C<staUserName>)
=back
=head2 Aruba Wireless AP Configuration Table (C<wlsrConfigTable>)
=over
=item $aruba->aruba_ap_channel()
(C<apCurrentChannel>)
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

File diff suppressed because it is too large Load Diff

168
Info/Layer3/BlueCoatSG.pm Normal file
View File

@@ -0,0 +1,168 @@
package SNMP::Info::Layer3::BlueCoatSG;
# Copyright (c) 2011 Netdisco Project
# 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.
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::BlueCoatSG::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::BlueCoatSG::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
'BLUECOAT-SG-PROXY-MIB' => 'sgProxyAdmin',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
#From BLUECOAT-SG-PROXY-MIB
'serial1'=> 'sgProxySerialNumber',
'sw_ver' => 'sgProxyVersion',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'Blue Coat';
}
sub os {
return 'sgos';
}
sub os_ver {
my $sg = shift;
my $os_string = $sg->sw_ver();
if ($os_string =~ /^Version:\s(\w+)\s([\d\.]+)/) {
return $2;
} else {
return ''; # perhaps we can try sysDescr or some other object...
}
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::BlueCoatSG - SNMP Interface to Blue Coat SG Series proxy devices
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $router = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $router->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Blue Coat SG Series proxy devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
BLUECOAT-SG-PROXY-MIB
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
Returns C<'Blue Coat'>
=item $router->os()
Returns C<'sgos'>
=item $router->os_ver()
Tries to resolve version string from "sgProxyVersion"
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -1,99 +1,118 @@
# SNMP::Info::Layer3::C3550
# Max Baker
# $Id$
#
# Copyright (c) 2004 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2003, Regents of the University of California
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2004 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::C3550;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CiscoStack;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoPortSecurity;
use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoStpExtensions;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
# NOTE : Top-most items gets precedence for @ISA
@SNMP::Info::Layer3::C3550::ISA = qw/
SNMP::Info::CiscoVTP
SNMP::Info::CiscoStpExtensions
SNMP::Info::CiscoStack
SNMP::Info::LLDP
SNMP::Info::CDP
SNMP::Info::CiscoStats
SNMP::Info::CiscoImage
SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoConfig
SNMP::Info::CiscoPower
SNMP::Info::Layer3
Exporter/;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
@SNMP::Info::Layer3::C3550::ISA = qw/SNMP::Info::Layer3 SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
SNMP::Info::CiscoStats SNMP::Info::CDP Exporter
SNMP::Info::CiscoImage/;
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoStack::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoImage::MIBS,
);
$VERSION = '2.08';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
# Bridge is called from Layer3 and CiscoStpExtensions
# So we want CiscoVTP to come last to get the right one.
# The @ISA order should match these orders.
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::LLDP::MIBS, %SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
'ports2' => 'ifNumber',
);
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
);
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
);
# Pick and choose
*SNMP::Info::Layer3::C3550::serial = \&SNMP::Info::CiscoStack::serial;
*SNMP::Info::Layer3::C3550::interfaces = \&SNMP::Info::Layer3::interfaces;
*SNMP::Info::Layer3::C3550::i_duplex = \&SNMP::Info::CiscoStack::i_duplex;
*SNMP::Info::Layer3::C3550::i_duplex_admin = \&SNMP::Info::CiscoStack::i_duplex_admin;
*SNMP::Info::Layer3::C3550::i_name = \&SNMP::Info::Layer3::i_name;
*SNMP::Info::Layer3::C3550::i_type = \&SNMP::Info::CiscoStack::i_type;
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
sub vendor {
return 'cisco';
@@ -101,12 +120,12 @@ sub vendor {
sub model {
my $c3550 = shift;
my $id = $c3550->id();
my $id = $c3550->id();
my $model = &SNMP::translateObj($id) || $id;
$model =~ s/^catalyst//;
# turn 355048 into 3550-48
if ($model =~ /^(35\d\d)(\d\d(T|G)?)$/) {
if ( $model =~ /^(35\d\d)(\d\d(T|G)?)$/ ) {
$model = "$1-$2";
}
return $model;
@@ -116,18 +135,239 @@ sub model {
sub ports {
my $c3550 = shift;
my $ports2 = $c3550->ports2();
my $id = $c3550->id();
my $id = $c3550->id();
my $model = &SNMP::translateObj($id);
if ($model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/) {
if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
return $1;
}
return $ports2;
my $ports = $c3550->orig_ports();
return $ports;
}
# Verions prior to 12.1(22)EA1a use the older CiscoStack method
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
# See http://www.ciscosystems.com/en/US/products/hw/switches/ps646/prod_release_note09186a00802a08ee.html
sub i_duplex {
my $c3550 = shift;
my $partial = shift;
my $el_duplex = $c3550->el_duplex($partial);
# Newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my %i_duplex;
foreach my $el_port ( keys %$el_duplex ) {
my $duplex = $el_duplex->{$el_port};
next unless defined $duplex;
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
}
return \%i_duplex;
}
# Fall back to CiscoStack method
else {
return $c3550->SUPER::i_duplex($partial);
}
}
# Software >= 12.1(22)EA1a uses portDuplex as admin setting
sub i_duplex_admin {
my $c3550 = shift;
my $partial = shift;
my $el_duplex = $c3550->el_duplex($partial);
# Newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my $p_port = $c3550->p_port() || {};
my $p_duplex = $c3550->p_duplex() || {};
my $i_duplex_admin = {};
foreach my $port ( keys %$p_duplex ) {
my $iid = $p_port->{$port};
next unless defined $iid;
next if ( defined $partial and $iid !~ /^$partial$/ );
$i_duplex_admin->{$iid} = $p_duplex->{$port};
}
return $i_duplex_admin;
}
# Fall back to CiscoStack method
else {
return $c3550->SUPER::i_duplex_admin($partial);
}
}
sub set_i_duplex_admin {
# map a textual duplex to an integer one the switch understands
my %duplexes = qw/half 1 full 2 auto 4/;
my $c3550 = shift;
my ( $duplex, $iid ) = @_;
my $el_duplex = $c3550->el_duplex($iid);
# Auto duplex only supported on newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my $p_port = $c3550->p_port() || {};
my %reverse_p_port = reverse %$p_port;
$duplex = lc($duplex);
return 0 unless defined $duplexes{$duplex};
$iid = $reverse_p_port{$iid};
return $c3550->set_p_duplex( $duplexes{$duplex}, $iid );
}
else {
return $c3550->SUPER::set_i_duplex_admin;
}
}
sub cisco_comm_indexing {
1;
return 1;
}
# Use CDP and/or LLDP
sub hasCDP {
my $c3550 = shift;
return $c3550->hasLLDP() || $c3550->SUPER::hasCDP();
}
sub c_ip {
my $c3550 = shift;
my $partial = shift;
my $cdp = $c3550->SUPER::c_ip($partial) || {};
my $lldp = $c3550->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $c3550 = shift;
my $partial = shift;
my $cdp = $c3550->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
# We need to match the lldp key with the ifIndex
# via lldpLocPortId and ifName
my $i_name = $c3550->ifName($partial) || {};
my $i_name_rev = {};
while ( my($key,$val) = each %$i_name ){
$i_name_rev->{$val} = $key;
}
my $loc_port_id = $c3550->lldpLocPortId($partial) || {};
my $lldp = $c3550->lldp_if($partial) || {};
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid} || next;
my $name = $loc_port_id->{$if} || next;
my $i_index = $i_name_rev->{$name} || next;
$c_if{$iid} = $i_index;
}
return \%c_if;
}
sub c_port {
my $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_port($partial) || {};
my $cdp = $c3550->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_id($partial) || {};
my $cdp = $c3550->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $c3550 = shift;
my $partial = shift;
my $lldp = $c3550->lldp_rem_sysdesc($partial) || {};
my $cdp = $c3550->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
@@ -136,7 +376,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::C3550 - Perl5 Interface to Cisco Catalyst 3550 Layer 2/3 Switches running IOS
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
Switches running IOS
=head1 AUTHOR
@@ -146,12 +387,12 @@ Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $c3550 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -162,12 +403,12 @@ Max Baker
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx,6xxx).
For example, forwarding tables are held in VLANs, and extened interface information
is gleened from CISCO-SWITCH-MIB.
These devices run IOS but have some of the same characteristics as the
Catalyst WS-C family (5xxx,6xxx). For example, forwarding tables are held in
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $c3550 = new SNMP::Info::Layer3::C3550(...);
@@ -177,12 +418,20 @@ a more specific class using the method above.
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoSTPExtensions
=item SNMP::Info::CiscoPower
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStack
=item SNMP::Info::CDP
=item SNMP::Info::LLDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoImage
@@ -195,17 +444,26 @@ a more specific class using the method above.
=item Inherited Classes' MIBs
See SNMP::Info::Layer3 for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStack for its own MIB requirements.
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStats for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See SNMP::Info::CiscoImage for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CDP for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
@@ -217,7 +475,7 @@ These are methods that return scalar value from SNMP
=item $c3550->vendor()
Returns 'cisco'
Returns 'cisco'
=item $c3550->model()
@@ -228,61 +486,189 @@ Will take the translated model number and try to format it better.
=item $c3550->ports()
Trys to cull the number of ports from the model number.
Tries to cull the number of ports from the model number.
=item $c3550->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Topology information
Based upon the firmware version Cisco devices may support Link Layer Discovery
Protocol (LLDP) in addition to Cisco Discovery Protocol (CDP). These methods
will query both and return the combination of all information. As a result,
there may be identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
=over
=item $c3550->hasCDP()
Returns true if the device is running either CDP or LLDP.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in SNMP::Info::CiscoStack for details.
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $c3550->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $c3550->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
or more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $c3550->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $c3550->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $c3550->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Overrides
=over
=item $c3550->i_duplex()
Returns reference to hash of iid to current link duplex setting.
Software version 12.1(22)EA1a or greater returns duplex based upon the
result of $c3550->el_duplex(). Otherwise it uses the result of
the call to CiscoStack::i_duplex().
See L<SNMP::Info::Etherlike> for el_duplex() method and
L<SNMP::Info::CiscoStack> for its i_duplex() method.
=item $c3550->i_duplex_admin()
Returns reference to hash of iid to administrative duplex setting.
Software version 12.1(22)EA1a or greater returns duplex based upon the
result of $c3550->p_duplex(). Otherwise it uses the result of
the call to CiscoStack::i_duplex().
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
=item $c3550->set_i_duplex_admin(duplex, ifIndex)
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
Speed choices are 'auto', 'half', 'full'.
Crosses $c3550->p_port() with $c3550->p_duplex() to utilize port C<ifIndex>.
Example:
my %if_map = reverse %{$c3550->interfaces()};
$c3550->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port duplex. ",$c3550->error(1);
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStack
See documentation in SNMP::Info::CiscoStack for details.
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=cut

View File

@@ -1,121 +1,134 @@
# SNMP::Info::Layer3::C4000
# Bill Fenner
# $Id$
#
# Copyright (c) 2006 Bill Fenner
# Copyright (c) 2008 Bill Fenner
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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 Author, nor
# names of its contributors may be used to endorse or promote products
# * 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.
#
# 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::C4000;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoPortSecurity;
use SNMP::Info::CiscoConfig;
use SNMP::Info::MAU;
use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
$VERSION = '1.04';
@SNMP::Info::Layer3::C4000::ISA = qw/ SNMP::Info::Layer3 SNMP::Info::CiscoVTP
SNMP::Info::CiscoStats SNMP::Info::CDP
SNMP::Info::CiscoImage SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer3::C4000::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoConfig SNMP::Info::MAU
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::C4000::EXPORT_OK = qw//;
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::MAU::MIBS,
'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
);
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
'CISCO-ENVMON-MIB' => 'ciscoEnvMonMIB',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
'ps1_status' => 'ciscoEnvMonSupplyState.1',
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
'ps2_status' => 'ciscoEnvMonSupplyState.2',
);
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
'ps1_type' => 'ciscoEnvMonSupplyStatusDescr.1',
'ps1_status' => 'ciscoEnvMonSupplyState.1',
'ps2_type' => 'ciscoEnvMonSupplyStatusDescr.2',
'ps2_status' => 'ciscoEnvMonSupplyState.2',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::MAU::FUNCS,
'fan_state' => 'ciscoEnvMonFanState',
'fan_descr' => 'ciscoEnvMonFanStatusDescr',
);
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
'fan_state' => 'ciscoEnvMonFanState',
'fan_descr' => 'ciscoEnvMonFanStatusDescr',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::MAU::MUNGE,
);
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::MAU::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::CiscoVTP::MUNGE,
);
# Override Inheritance for these specific methods
# use MAU-MIB for admin. duplex and admin. speed
*SNMP::Info::Layer3::C4000::i_duplex_admin = \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::C4000::i_speed_admin = \&SNMP::Info::MAU::mau_i_speed_admin;
*SNMP::Info::Layer3::C4000::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::C4000::i_speed_admin
= \&SNMP::Info::MAU::mau_i_speed_admin;
sub fan {
my $c4000 = shift;
my $c4000 = shift;
my $fan_state = $c4000->fan_state();
my $fan_descr = $c4000->fan_descr();
my $ret = "";
my $s = "";
foreach my $i (sort {$a <=> $b} keys %$fan_state) {
$ret .= $s . $fan_descr->{$i} . ": " . $fan_state->{$i};
$s = ", ";
my $ret = "";
my $s = "";
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
$ret .= $s . $fan_descr->{$i} . ": " . $fan_state->{$i};
$s = ", ";
}
return undef if ($s eq "");
$ret;
return if ( $s eq "" );
return $ret;
}
sub cisco_comm_indexing { 1; }
sub cisco_comm_indexing { return 1; }
1;
__END__
=head1 NAME
SNMP::Info::Layer3::C4000 - Perl5 Interface to Cisco Catalyst 4000 Layer 2/3 Switches running IOS
SNMP::Info::Layer3::C4000 - SNMP Interface to Cisco Catalyst 4000 Layer 2/3
Switches running IOS
=head1 AUTHOR
@@ -125,12 +138,12 @@ Bill Fenner
# Let SNMP::Info determine the correct subclass for you.
my $c4000 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -141,8 +154,8 @@ Bill Fenner
Abstraction subclass for Cisco Catalyst 4000 Layer 2/3 Switches.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $c4000 = new SNMP::Info::Layer3::C4000(...);
@@ -150,18 +163,22 @@ a more specific class using the method above.
=over
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoConfig
=item SNMP::Info::MAU
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
@@ -170,17 +187,22 @@ a more specific class using the method above.
=item Inherited Classes' MIBs
See SNMP::Info::Layer3 for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStats for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CDP for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoImage for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See SNMP::Info::MAU for its own MIB requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::MAU/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
@@ -188,58 +210,110 @@ See SNMP::Info::MAU for its own MIB requirements.
These are methods that return scalar value from SNMP
=head2 Globals imported from SNMP::Info::Layer3
=head2 Overrides
See documentation in SNMP::Info::Layer3 for details.
=over
=item $c4000->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=item $c4000->fan()
Returns fan status
=back
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::MAU
See documentation in SNMP::Info::MAU for details.
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer3
=head2 Overrides
See documentation in SNMP::Info::Layer3 for details.
=over
=item $c4000->i_duplex()
Parses mau_index and mau_link to return the duplex information for
interfaces.
=item $c4000->i_duplex_admin()
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
order to find the admin duplex setting for all the interfaces.
Returns either (auto,full,half).
=item $c4000->i_speed_admin()
Returns administrative speed for interfaces.
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in SNMP::Info::MAU for details.
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -1,111 +1,346 @@
# SNMP::Info::Layer3::C6500
# Max Baker
# $Id$
#
# Copyright (c) 2003,2004,2005 Max Baker
# Copyright (c) 2008-2009 Max Baker
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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 Author, nor
# names of its contributors may be used to endorse or promote products
# * 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.
#
# 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::C6500;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CiscoStack;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoPortSecurity;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoStpExtensions;
use SNMP::Info::CiscoVTP;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
# NOTE : Top-most items gets precedence for @ISA
@SNMP::Info::Layer3::C6500::ISA = qw/
SNMP::Info::CiscoVTP
SNMP::Info::CiscoStpExtensions
SNMP::Info::CiscoStack
SNMP::Info::LLDP
SNMP::Info::CDP
SNMP::Info::CiscoImage
SNMP::Info::CiscoStats
SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoConfig
SNMP::Info::CiscoPower
SNMP::Info::Layer3
Exporter
/;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
$VERSION = '1.04';
@SNMP::Info::Layer3::C6500::ISA = qw/ SNMP::Info::Layer3 SNMP::Info::CiscoStack SNMP::Info::CiscoVTP
SNMP::Info::CiscoStats SNMP::Info::CDP Exporter
SNMP::Info::CiscoImage/;
@SNMP::Info::Layer3::C6500::EXPORT_OK = qw//;
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CiscoStack::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoImage::MIBS,
);
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
# NOTE: Order creates precedence
# Example: v_name exists in Bridge.pm and CiscoVTP.pm
# Bridge is called from Layer3 and CiscoStpExtensions
# So we want CiscoVTP to come last to get the right one.
# The @ISA order should match these orders.
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS, %SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoImage::MIBS, %SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS, %SNMP::Info::LLDP::MIBS,
%SNMP::Info::CiscoStack::MIBS, %SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
);
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
);
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS, %SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS, %SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS, %SNMP::Info::LLDP::FUNCS,
%SNMP::Info::CiscoStack::FUNCS, %SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CiscoStack::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
);
# Pick and choose
*SNMP::Info::Layer3::C6500::serial = \&SNMP::Info::CiscoStack::serial;
*SNMP::Info::Layer3::C6500::interfaces = \&SNMP::Info::Layer3::interfaces;
*SNMP::Info::Layer3::C6500::i_duplex = \&SNMP::Info::CiscoStack::i_duplex;
#*SNMP::Info::Layer3::C6500::i_duplex_admin = \&SNMP::Info::Layer3::i_duplex_admin;
*SNMP::Info::Layer3::C6500::i_name = \&SNMP::Info::Layer3::i_name;
*SNMP::Info::Layer3::C6500::i_type = \&SNMP::Info::CiscoStack::i_type;
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE, %SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE, %SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::CiscoStack::MUNGE, %SNMP::Info::CiscoStpExtensions::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
sub vendor {
return 'cisco';
}
# There are some buggy 6509's out there.
sub bulkwalk_no { 1; }
sub cisco_comm_indexing { 1; }
sub cisco_comm_indexing { return 1; }
# Newer versions use the ETHERLIKE-MIB to report operational duplex.
sub i_duplex {
my $c6500 = shift;
my $partial = shift;
my $el_duplex = $c6500->el_duplex($partial);
# Newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my %i_duplex;
foreach my $el_port ( keys %$el_duplex ) {
my $duplex = $el_duplex->{$el_port};
next unless defined $duplex;
$i_duplex{$el_port} = 'half' if $duplex =~ /half/i;
$i_duplex{$el_port} = 'full' if $duplex =~ /full/i;
}
return \%i_duplex;
}
# Fall back to CiscoStack method
else {
return $c6500->SUPER::i_duplex($partial);
}
}
# Newer software uses portDuplex as admin setting
sub i_duplex_admin {
my $c6500 = shift;
my $partial = shift;
my $el_duplex = $c6500->el_duplex($partial);
# Newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my $p_port = $c6500->p_port() || {};
my $p_duplex = $c6500->p_duplex() || {};
my $i_duplex_admin = {};
foreach my $port ( keys %$p_duplex ) {
my $iid = $p_port->{$port};
next unless defined $iid;
next if ( defined $partial and $iid !~ /^$partial$/ );
$i_duplex_admin->{$iid} = $p_duplex->{$port};
}
return $i_duplex_admin;
}
# Fall back to CiscoStack method
else {
return $c6500->SUPER::i_duplex_admin($partial);
}
}
sub set_i_duplex_admin {
# map a textual duplex to an integer one the switch understands
my %duplexes = qw/half 1 full 2 auto 4/;
my $c6500 = shift;
my ( $duplex, $iid ) = @_;
my $el_duplex = $c6500->el_duplex($iid);
# Auto duplex only supported on newer software
if ( defined $el_duplex and scalar( keys %$el_duplex ) ) {
my $p_port = $c6500->p_port() || {};
my %reverse_p_port = reverse %$p_port;
$duplex = lc($duplex);
return 0 unless defined $duplexes{$duplex};
$iid = $reverse_p_port{$iid};
return $c6500->set_p_duplex( $duplexes{$duplex}, $iid );
}
else {
return $c6500->SUPER::set_i_duplex_admin;
}
}
# Use CDP and/or LLDP
sub hasCDP {
my $c6500 = shift;
return $c6500->hasLLDP() || $c6500->SUPER::hasCDP();
}
sub c_ip {
my $c6500 = shift;
my $partial = shift;
my $cdp = $c6500->SUPER::c_ip($partial) || {};
my $lldp = $c6500->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $c6500 = shift;
my $partial = shift;
my $lldp = $c6500->lldp_if($partial) || {};
my $cdp = $c6500->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $c6500 = shift;
my $partial = shift;
my $lldp = $c6500->lldp_port($partial) || {};
my $cdp = $c6500->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $c6500 = shift;
my $partial = shift;
my $lldp = $c6500->lldp_id($partial) || {};
my $cdp = $c6500->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $c6500 = shift;
my $partial = shift;
my $lldp = $c6500->lldp_rem_sysdesc($partial) || {};
my $cdp = $c6500->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::C6500 - Perl5 Interface to Cisco Catalyst 6500 Layer 2/3 Switches running IOS and/or CatOS
SNMP::Info::Layer3::C6500 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3
Switches running IOS and/or CatOS
=head1 AUTHOR
@@ -115,12 +350,12 @@ Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $c6500 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -131,12 +366,12 @@ Max Baker
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.
These devices run IOS but have some of the same charactersitics as the Catalyst WS-C family (5xxx).
For example, forwarding tables are held in VLANs, and extened interface information
is gleened from CISCO-SWITCH-MIB.
These devices run IOS but have some of the same characteristics as the
Catalyst WS-C family (5xxx). For example, forwarding tables are held in
VLANs, and extended interface information is gleaned from F<CISCO-SWITCH-MIB>.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $c6500 = new SNMP::Info::Layer3::C6500(...);
@@ -144,18 +379,26 @@ a more specific class using the method above.
=over
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStack
=item SNMP::Info::CiscoStats
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoPower
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoStpExtensions
=back
=head2 Required MIBs
@@ -164,17 +407,26 @@ a more specific class using the method above.
=item Inherited Classes' MIBs
See SNMP::Info::Layer3 for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStack for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStats for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CDP for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoImage for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
=back
@@ -184,69 +436,188 @@ These are methods that return scalar value from SNMP
=over
=item $c6500->bulkwalk_no
Return C<1>. There are some buggy 6509's out there, so bulkwalk
is turned off for this class.
=item $c6500->vendor()
Returns 'cisco'
=item $c6500->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in SNMP::Info::CiscoStack for details.
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
See documentation in L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer3
=head2 Overrides
See documentation in SNMP::Info::Layer3 for details.
=over
=item $c6500->i_duplex()
Returns reference to hash of iid to current link duplex setting.
Newer software versions return duplex based upon the result of
$c6500->el_duplex(). Otherwise it uses the result of the call to
CiscoStack::i_duplex().
See L<SNMP::Info::Etherlike> for el_duplex() method and
L<SNMP::Info::CiscoStack> for its i_duplex() method.
=item $c6500->i_duplex_admin()
Returns reference to hash of iid to administrative duplex setting.
Newer software versions return duplex based upon the result of
$c6500->p_duplex(). Otherwise it uses the result of the call to
CiscoStack::i_duplex().
See L<SNMP::Info::CiscoStack> for its i_duplex() and p_duplex() methods.
=item $c6500->set_i_duplex_admin(duplex, ifIndex)
Sets port duplex, must be supplied with duplex and port C<ifIndex>.
Speed choices are 'auto', 'half', 'full'.
Crosses $c6500->p_port() with $c6500->p_duplex() to utilize port C<ifIndex>.
Example:
my %if_map = reverse %{$c6500->interfaces()};
$c6500->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port duplex. ",$c6500->error(1);
=back
=head2 Topology information
Based upon the firmware version Cisco devices may support Link Layer Discover
Protocol (LLDP) in addition to the Cisco-proprietary CDP. These methods
will query both and return the combination of all information. As a result,
there may be identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
=over
=item $c6500->hasCDP()
Returns true if the device is running either CDP or LLDP.
=item $c6500->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $c6500->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
or more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $c6500->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $c6500->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $c6500->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStack
See documentation in SNMP::Info::CiscoStack for details.
See documentation in L<SNMP::Info::CiscoStack/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"TABLE METHODS"> for
details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
=cut

View File

@@ -1,99 +1,132 @@
# SNMP::Info::Layer3::Cisco
# Max Baker
# $Id$
#
# Copyright (c) 2004-6 Max Baker
#
# Redistribution and use in source and binary forms, with or without
# Copyright (c) 2008 Max Baker
# 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
# * 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.
#
# 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::Cisco;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoImage;
use SNMP::Info::CiscoRTT;
use SNMP::Info::CiscoQOS;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoPower;
use SNMP::Info::Layer3;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
$VERSION = '1.04';
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::Layer3 SNMP::Info::CiscoVTP
SNMP::Info::CDP SNMP::Info::CiscoStats
SNMP::Info::CiscoImage SNMP::Info::CiscoRTT
SNMP::Info::CiscoQOS Exporter/;
@SNMP::Info::Layer3::Cisco::ISA = qw/SNMP::Info::CiscoVTP SNMP::Info::CDP
SNMP::Info::CiscoStats SNMP::Info::CiscoImage
SNMP::Info::CiscoRTT SNMP::Info::CiscoQOS
SNMP::Info::CiscoConfig SNMP::Info::CiscoPower
SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::Cisco::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CiscoRTT::MIBS,
%SNMP::Info::CiscoQOS::MIBS,
);
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::CiscoPower::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoQOS::MIBS,
%SNMP::Info::CiscoRTT::MIBS,
%SNMP::Info::CiscoImage::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
'CISCO-EIGRP-MIB' => 'cEigrpAsRouterId',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoRTT::GLOBALS,
%SNMP::Info::CiscoQOS::GLOBALS,
);
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS, %SNMP::Info::CiscoQOS::GLOBALS,
%SNMP::Info::CiscoRTT::GLOBALS, %SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS, 'eigrp_id' => 'cEigrpAsRouterId',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CiscoRTT::FUNCS,
%SNMP::Info::CiscoQOS::FUNCS,
);
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoQOS::FUNCS,
%SNMP::Info::CiscoRTT::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
# EIGRP
'eigrp_peers' => 'cEigrpPeerAddr',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CiscoRTT::MUNGE,
%SNMP::Info::CiscoQOS::MUNGE,
);
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoQOS::MUNGE,
%SNMP::Info::CiscoRTT::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
'eigrp_peers' => \&SNMP::Info::munge_ip,
);
sub i_vlan {
my ($cisco) = shift;
my ($partial) = shift;
my ($i_type) = $cisco->i_type($partial);
my ($i_descr) = $cisco->i_description($partial);
my %i_vlan;
foreach my $idx ( keys %$i_descr ) {
if ( $i_type->{$idx} eq 'l2vlan' || $i_type->{$idx} eq 135 ) {
if ( $i_descr->{$idx} =~ /\.(\d+)$/ ) {
$i_vlan{$idx} = $1;
}
}
}
return \%i_vlan;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Cisco - Perl5 Interface to L3 and L2+L3 IOS Cisco Device
SNMP::Info::Layer3::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
that are not covered in other classes.
=head1 AUTHOR
@@ -104,12 +137,12 @@ Max Baker
# Let SNMP::Info determine the correct subclass for you.
my $cisco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -124,8 +157,6 @@ Subclass for Generic Cisco Routers running IOS
=over
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
@@ -134,23 +165,43 @@ Subclass for Generic Cisco Routers running IOS
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoRTT
=item SNMP::Info::CiscoQOS
=item SNMP::Info::CiscoConfig
=item SNMP::Info::Power
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<CISCO-EIGRP-MIB>
=item Inherited Classes' MIBs
See SNMP::Info::Layer3 for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoVTP for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoStats for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CDP for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::CiscoImage for its own MIB requirements.
See L<SNMP::Info::CiscoRTT/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoQOS/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoConfig/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
@@ -164,51 +215,101 @@ These are methods that return scalar value from SNMP
Returns 'cisco'
=item $cisco->eigrp_id()
(C<cEigrpAsRouterId>)
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Globals imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer3
=over
See documentation in SNMP::Info::Layer3 for details.
=item $cisco->eigrp_peers()
Returns EIGRP peer IP addresses
(C<cEigrpPeerAddr>)
=item $cisco->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
See documentation in SNMP::Info::CiscoVTP for details.
See documentation in L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in SNMP::Info::CDP for details.
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStats
See documentation in SNMP::Info::CiscoStats for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in SNMP::Info::CiscoImage for details.
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoRTT
See documentation in L<SNMP::Info::CiscoRTT/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoQOS
See documentation in L<SNMP::Info::CiscoQOS/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoConfig
See documentation in L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

223
Info/Layer3/CiscoFWSM.pm Normal file
View File

@@ -0,0 +1,223 @@
# SNMP::Info::Layer3::CiscoFWSM
# $Id$
#
# Copyright (c) 2010 Brian De Wolf
# 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::Layer3::CiscoFWSM;
use strict;
use Exporter;
use SNMP::Info::Layer3::Cisco;
@SNMP::Info::Layer3::CiscoFWSM::ISA = qw/SNMP::Info::Layer3::Cisco
Exporter/;
@SNMP::Info::Layer3::CiscoFWSM::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::Cisco::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer3::Cisco::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::Cisco::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::Cisco::MUNGE,
);
# For FWSMs, the ipNetToPhysicalPhysAddress table appears to be of the form:
# $ifindex.$inetaddresstype.$proto.$ip_address -> $mac_address
#
# Using the output of ipNetToPhysicalPhysAddress, we can emulate the other
# functions.
#
# This doesn't really line up to what at_* return, so we munge it
sub at_paddr {
my ($fwsm) = shift;
my ($partial) = shift;
my $paddrs = $fwsm->n2p_paddr($partial);
my $n_paddrs = {};
foreach my $key (keys %$paddrs) {
my $paddr = $paddrs->{$key};
my @parts = split /\./, $key;
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
my $ip = join ".", @parts;
next if($proto != 4); # at_paddr doesn't support non-IPv4
$n_paddrs->{"$ifindex.$ip"} = $paddr;
}
return $n_paddrs;
}
sub at_netaddr {
my ($fwsm) = shift;
my ($partial) = shift;
my $paddrs = $fwsm->n2p_paddr($partial);
my $netaddrs = {};
foreach my $key (keys %$paddrs) {
my $paddr = $paddrs->{$key};
my @parts = split /\./, $key;
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
my $ip = join ".", @parts;
next if($proto != 4); # at_netaddr doesn't support non-IPv4
$netaddrs->{"$ifindex.$ip"} = $ip;
}
return $netaddrs;
}
sub at_ifaddr {
my ($fwsm) = shift;
my ($partial) = shift;
my $paddrs = $fwsm->n2p_paddr($partial);
my $ifaddrs = {};
foreach my $key (keys %$paddrs) {
my $paddr = $paddrs->{$key};
my @parts = split /\./, $key;
my ($ifindex, $addrtype, $proto) = splice @parts, 0, 3;
my $ip = join ".", @parts;
next if($proto != 4); # at_ifaddr doesn't support non-IPv4
$ifaddrs->{"$ifindex.$ip"} = $ip;
}
return $ifaddrs;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::CiscoFWSM - SNMP Interface to Firewall Services Modules for
features not covered elsewhere.
=head1 AUTHOR
Brian De Wolf
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $fwsm = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $fwsm->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Cisco Firewall Services Modules
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3::Cisco
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3::Cisco/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
=head2 Global Methods imported from SNMP::Info::Layer3::Cisco
See documentation in L<SNMP::Info::Layer3::Cisco/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=back
=head2 Overrides
=over
=item $fwsm->at_paddr()
This function derives the at_paddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
=item $fwsm->at_netaddr()
This function derives the at_netaddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
=item $fwsm->at_ifaddr()
This function derives the at_ifaddr information from the n2p_paddr() table as
the MIB to provide that information isn't supported on FWSMs.
=back
=head2 Table Methods imported from SNMP::Info::Layer3::Cisco
See documentation in L<SNMP::Info::Layer3::Cisco/"TABLE METHODS"> for details.
=cut

View File

@@ -1,72 +1,67 @@
# SNMP::Info::Layer3::Contivity
# Eric Miller
# $Id$
#
# Copyright (c) 2004 Eric Miller, Max Baker
# Copyright (c) 2010 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Contivity;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use SNMP::Info::Layer3;
use SNMP::Info::Entity;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
@SNMP::Info::Layer3::Contivity::ISA = qw/SNMP::Info SNMP::Info::Entity Exporter/;
@SNMP::Info::Layer3::Contivity::ISA
= qw/SNMP::Info SNMP::Info::Layer3 SNMP::Info::Entity Exporter/;
@SNMP::Info::Layer3::Contivity::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::Entity::MIBS,
);
%SNMP::Info::MIBS, %SNMP::Info::Layer3::MIBS, %SNMP::Info::Entity::MIBS,
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
);
%SNMP::Info::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
%SNMP::Info::Entity::FUNCS,
'i_name2' => 'ifName',
# From RFC1213-MIB
'at_index' => 'ipNetToMediaIfIndex',
'at_paddr' => 'ipNetToMediaPhysAddress',
'at_netaddr' => 'ipNetToMediaNetAddress',
);
%SNMP::Info::FUNCS, %SNMP::Info::Layer3::FUNCS,
%SNMP::Info::Entity::FUNCS,
);
%MUNGE = (
%SNMP::Info::MUNGE,
%SNMP::Info::Entity::MUNGE,
'at_paddr' => \&SNMP::Info::munge_mac,
);
%SNMP::Info::MUNGE, %SNMP::Info::Layer3::MUNGE,
%SNMP::Info::Entity::MUNGE,
);
sub layers {
return '00000100';
@@ -81,9 +76,9 @@ sub model {
my $e_model = $contivity->e_model() || {};
my $model = $e_model->{1} || undef;
return $1 if (defined $model and $model =~ /(CES\d+)/i);
return undef;
return $1 if ( defined $model and $model =~ /(CES\d+|NVR\d+)/i );
return;
}
sub os {
@@ -92,26 +87,26 @@ sub os {
sub os_ver {
my $contivity = shift;
my $descr = $contivity->description();
return undef unless defined $descr;
my $descr = $contivity->description();
return unless defined $descr;
if ($descr =~ m/V(\d+_\d+\.\d+)/i){
if ( $descr =~ m/V(\d+_\d+\.\d+)/i ) {
return $1;
}
return undef;
return;
}
sub mac {
my $contivity = shift;
my $i_mac = $contivity->i_mac();
my $i_mac = $contivity->i_mac();
# Return Interface MAC
foreach my $entry (keys %$i_mac){
# Return Interface MAC
foreach my $entry ( keys %$i_mac ) {
my $sn = $i_mac->{$entry};
next unless $sn;
return $sn;
}
return undef;
return;
}
sub serial {
@@ -119,21 +114,23 @@ sub serial {
my $e_serial = $contivity->e_serial() || {};
my $serial = $e_serial->{1} || undef;
return $1 if (defined $serial and $serial =~ /(\d+)/);
return undef;
}
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
return;
}
sub interfaces {
my $contivity = shift;
my $description = $contivity->i_description();
my $partial = shift;
my $description = $contivity->i_description($partial) || {};
my %interfaces = ();
foreach my $iid (keys %$description){
foreach my $iid ( keys %$description ) {
my $desc = $description->{$iid};
# Skip everything except Ethernet interfaces
next unless (defined $desc and $desc =~ /fe/i);
next unless ( defined $desc and $desc =~ /fe/i );
$interfaces{$iid} = $desc;
}
@@ -142,19 +139,22 @@ sub interfaces {
sub i_name {
my $contivity = shift;
my $i_name2 = $contivity->i_name2();
my $partial = shift;
my $i_name2 = $contivity->orig_i_name($partial) || {};
my %i_name;
foreach my $iid (keys %$i_name2){
foreach my $iid ( keys %$i_name2 ) {
my $name = $i_name2->{$iid};
#Skip everything except Ethernet interfaces
next unless (defined $name and $name =~ /fe/i);
next unless ( defined $name and $name =~ /fe/i );
$name = $1 if $name =~ /(fei\.\d+\.\d+)/;
$i_name{$iid} = $name;
}
return \%i_name;
}
return \%i_name;
}
1;
@@ -162,8 +162,8 @@ __END__
=head1 NAME
SNMP::Info::Layer3::Contivity - Perl5 Interface to Nortel Networks' Contivity
Extranet Switches (CES).
SNMP::Info::Layer3::Contivity - SNMP Interface to Nortel VPN Routers
(Contivity Extranet Switches).
=head1 AUTHOR
@@ -175,22 +175,21 @@ Eric Miller
my $contivity = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $contivity->class();
my $class = $contivity->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Nortel Networks' Contivity Extranet Switch (CES).
Abstraction subclass for Nortel VPN Routers (Contivity Extranet Switch).
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $contivity = new SNMP::Info::Layer3::Contivity(...);
@@ -200,6 +199,8 @@ a more specific class using the method above.
=item SNMP::Info
=item SNMP::Info::Layer3
=item SNMP::Info::Entity
=back
@@ -210,9 +211,11 @@ a more specific class using the method above.
=item Inherited Classes' MIBs
See SNMP::Info for its own MIB requirements.
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
See SNMP::Info::Entity for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Entity/"Required MIBs"> for its own MIB requirements.
=back
@@ -230,21 +233,21 @@ Returns 'Nortel'
Returns the chassis name.
(B<entPhysicalModelName.1>)
(C<entPhysicalModelName.1>)
=item $contivity->os()
Returns 'CES'
Returns C<'CES'>
=item $contivity->os_ver()
Returns the software version extracted from (B<sysDescr>).
Returns the software version extracted from (C<sysDescr>).
=item $contivity->serial()
Returns the chassis serial number.
(B<entPhysicalSerialNum.1>)
(C<entPhysicalSerialNum.1>)
=item $contivity->mac()
@@ -265,13 +268,17 @@ layers.
=head2 Globals imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -282,41 +289,25 @@ to a hash.
=item $contivity->interfaces()
Returns reference to the map between IID and physical Port. Skips loopback and
tunnel interfaces.
Returns reference to the map between IID and physical Port. Skips loopback
and tunnel interfaces.
=back
=item $contivity->i_name()
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
=over
=item $contivity->at_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
(B<ipNetToMediaIfIndex>)
=item $contivity->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
(B<ipNetToMediaPhysAddress>)
=item $contivity->at_netaddr()
Returns reference to hash. Maps ARP table entries to IPs
(B<ipNetToMediaNetAddress>)
Interface Name field. Skips loopback and tunnel interfaces.
=back
=head2 Table Methods imported from SNMP::Info
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in SNMP::Info::Entity for details.
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=cut

493
Info/Layer3/Dell.pm Normal file
View File

@@ -0,0 +1,493 @@
# SNMP::Info::Layer3::Dell - SNMP Interface to Dell devices
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Dell;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Dell::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Dell::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'RADLAN-Physicaldescription-MIB' => 'rlPhdStackReorder',
'RADLAN-rlInterfaces' => 'rlIfNumOfLoopbackPorts',
'RADLAN-HWENVIROMENT' => 'rlEnvPhysicalDescription',
'Dell-Vendor-MIB' => 'productIdentificationVersion',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'os_ver' => 'productIdentificationVersion',
'dell_id_name' => 'productIdentificationDisplayName',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::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',
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE, );
# Method OverRides
sub model {
my $dell = shift;
my $name = $dell->dell_id_name();
my $descr = $dell->description();
if ( defined $name and $name =~ m/(\d+)/ ) {
return $1;
}
# Don't have a vendor MIB for D-Link
else {
return $descr;
}
}
sub vendor {
my $dell = shift;
return $dell->_vendor();
}
sub os {
my $dell = shift;
return $dell->_vendor();
}
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;
}
# Last resort
return $dell->SUPER::serial();
}
sub interfaces {
my $dell = shift;
my $partial = shift;
my $i_descr = $dell->i_description($partial) || {};
my $i_name = $dell->orig_i_name($partial) || {};
# Descriptions are all the same on some Dells, so use name instead if
# available
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name;
}
return $i_descr;
}
sub i_duplex_admin {
my $dell = shift;
my $partial = shift;
my $interfaces = $dell->interfaces($partial) || {};
my $dell_duplex = $dell->dell_duplex_admin($partial) || {};
my $dell_auto = $dell->dell_auto($partial) || {};
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;
}
# Use same methods as netgear. Some device didn't implement the bridge MIB
# forwarding table and some don't return MACs for VLANs other than default yet
# don't support community indexing, so we use the Q-BRIDGE-MIB forwarding
# table. Fall back to the orig functions if the qb versions don't
# return anything.
sub fw_mac {
my $dell = shift;
my $ret = $dell->qb_fw_mac();
$ret = $dell->orig_fw_mac() if ( !defined($ret) );
return $ret;
}
sub fw_port {
my $dell = shift;
my $ret = $dell->qb_fw_port();
$ret = $dell->orig_fw_port() if ( !defined($ret) );
return $ret;
}
sub _vendor {
my $dell = shift;
my $id = $dell->id() || 'undef';
my %oidmap = (
2 => 'ibm',
171 => 'dlink',
674 => 'dell',
3955 => 'linksys',
);
$id = $1 if ( defined($id) && $id =~ /^\.1\.3\.6\.1\.4\.1\.(\d+)/ );
if ( defined($id) and exists( $oidmap{$id} ) ) {
return $oidmap{$id};
}
else {
return 'dlink';
}
}
# lldp support
sub hasCDP {
my $dell = shift;
return $dell->hasLLDP();
}
sub c_ip {
my $dell = shift;
my $partial = shift;
return $dell->lldp_ip($partial);
}
sub c_if {
my $dell = shift;
my $partial = shift;
return $dell->lldp_if($partial);
}
sub c_port {
my $dell = shift;
my $partial = shift;
return $dell->lldp_port($partial);
}
sub c_id {
my $dell = shift;
my $partial = shift;
return $dell->lldp_id($partial);
}
sub c_platform {
my $dell = shift;
my $partial = shift;
return $dell->lldp_rem_sysdesc($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Dell - SNMP 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,
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. D-Link and the IBM BladeCenter
Gigabit Ethernet Switch Module also use this module based upon MIB support.
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 F<Dell-Vendor-MIB>
=item F<RADLAN-Physicaldescription-MIB>
=item F<RADLAN-rlInterfaces>
=item F<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()
(C<productIdentificationVersion>)
=item $dell->dell_id_name()
(C<productIdentificationDisplayName>)
=item $dell->model()
Returns model type. Returns numeric from
(C<productIdentificationDisplayName>) if available, otherwise if returns
description().
=item $dell->vendor()
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
id(). Defaults to 'dlink'.
=item $dell->os()
Returns 'dell', 'dlink', or 'ibm' based upon the IANA enterprise number in
id(). Defaults to 'dlink'.
=item $dell->hasCDP()
Returns whether LLDP is enabled.
=back
=head2 Overrides
=over
=item $dell->serial()
Returns serial number. Returns (C<rlPhdUnitGenParamSerialNum>) if available,
otherwise uses the Layer3 serial method.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 RADLAN Interface Table (C<swIfTable>)
=over
=item $dell->dell_duplex_admin()
(C<swIfDuplexAdminMode>)
=item $dell->dell_duplex()
(C<swIfDuplexOperMode>)
=item $dell->dell_tag_mode()
(C<swIfTaggedMode>)
=item $dell->dell_i_type()
(C<swIfType>)
=item $dell->dell_fc_admin()
(C<swIfFlowControlMode>)
=item $dell->dell_speed_admin()
(C<swIfSpeedAdminMode>)
=item $dell->dell_auto()
(C<swIfSpeedDuplexAutoNegotiation>)
=item $dell->dell_fc()
(C<swIfOperFlowControlMode>)
=back
=head2 Overrides
=over
=item $dell->interfaces()
Returns the map between SNMP Interface Identifier (iid) and physical port
name. Uses name if available instead of description since descriptions are
sometimes not unique.
=item $dell->i_duplex_admin()
Returns reference to hash of iid to current link administrative duplex
setting.
=item $dell->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=item $dell->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
Some devices don't implement the C<BRIDGE-MIB> forwarding table, so we use
the C<Q-BRIDGE-MIB> forwarding table. Fall back to the C<BRIDGE-MIB> if
C<Q-BRIDGE-MIB> doesn't return anything.
=item $dell->c_id()
Returns LLDP information.
=item $dell->c_if()
Returns LLDP information.
=item $dell->c_ip()
Returns LLDP information.
=item $dell->c_platform()
Returns LLDP information.
=item $dell->c_port()
Returns LLDP information.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

525
Info/Layer3/Enterasys.pm Normal file
View File

@@ -0,0 +1,525 @@
# SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys devices
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Enterasys;
use strict;
use Exporter;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Enterasys::ISA = qw/SNMP::Info::MAU SNMP::Info::LLDP
SNMP::Info::CDP SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::Enterasys::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::CDP::MIBS,
%SNMP::Info::LLDP::MIBS, %SNMP::Info::MAU::MIBS,
'ENTERASYS-OIDS-MIB' => 'etsysOidDevice',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::CDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS, %SNMP::Info::MAU::GLOBALS,
'mac' => 'dot1dBaseBridgeAddress',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::CDP::FUNCS,
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::MAU::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::LLDP::MUNGE, %SNMP::Info::MAU::MUNGE,
);
sub model {
my $enterasys = shift;
my $id = $enterasys->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::Enterasys::model() - Device does not support sysObjectID\n"
if $enterasys->debug();
return;
}
my $model = &SNMP::translateObj($id);
$model =~ s/^etsysOidDev//i;
$model =~ s/^etsysOidPhy//i;
return $id unless defined $model;
return $model;
}
sub vendor {
return 'enterasys';
}
sub os {
return 'enterasys';
}
sub os_ver {
my $enterasys = shift;
my $descr = $enterasys->description();
return unless defined $descr;
if ( $descr =~ m/\bRev ([\d.]*)/ ) {
return $1;
}
return;
}
# Use ifName as it is used for CDP and LLDP.
sub interfaces {
my $enterasys = shift;
my $partial = shift;
# We need the original ifName, SUPER:: would give us a method definition
# in a higher class, we could use orig_ but just call the MIB leaf since
# that's what we really want anyway.
return $enterasys->ifName($partial)
|| $enterasys->i_description($partial);
}
sub i_ignore {
my $enterasys = shift;
my $partial = shift;
my $interfaces = $enterasys->i_type($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
if ( $interfaces->{$if} =~ /(rs232|tunnel|loopback|\blo\b|null)/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
sub i_duplex {
my $enterasys = shift;
my $partial = shift;
return $enterasys->mau_i_duplex($partial);
}
sub i_duplex_admin {
my $enterasys = shift;
my $partial = shift;
return $enterasys->mau_i_duplex_admin($partial);
}
# Normal BRIDGE-MIB has issues on some devices, duplicates and
# non-increasing oids, Use Q-BRIDGE-MIB for macsuck
sub fw_mac {
my $enterasys = shift;
my $partial = shift;
return $enterasys->qb_fw_mac($partial);
}
sub fw_port {
my $enterasys = shift;
my $partial = shift;
return $enterasys->qb_fw_port($partial);
}
# Use CDP and/or LLDP
sub hasCDP {
my $enterasys = shift;
return $enterasys->hasLLDP() || $enterasys->SUPER::hasCDP();
}
sub c_ip {
my $enterasys = shift;
my $partial = shift;
my $cdp = $enterasys->SUPER::c_ip($partial) || {};
my $lldp = $enterasys->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $enterasys = shift;
my $partial = shift;
my $lldp = $enterasys->lldp_if($partial) || {};
my $cdp = $enterasys->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $enterasys = shift;
my $partial = shift;
my $lldp = $enterasys->lldp_port($partial) || {};
my $cdp = $enterasys->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $enterasys = shift;
my $partial = shift;
my $lldp = $enterasys->lldp_id($partial) || {};
my $cdp = $enterasys->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $enterasys = shift;
my $partial = shift;
my $lldp = $enterasys->lldp_rem_sysdesc($partial) || {};
my $cdp = $enterasys->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Enterasys - SNMP Interface to Enterasys Network Devices
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $enterasys = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $enterasys->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from an
Enterasys 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 $enterasys = new SNMP::Info::Layer3::Enterasys(...);
=head2 Inherited Classes
=over
=item SNMP::Info::MAU
=item SNMP::Info::LLDP
=item SNMP::Info::CDP
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<ENTERASYS-OIDS-MIB>
=back
=head2 Inherited MIBs
See L<SNMP::Info::MAU/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $enterasys->model()
Returns model type. Checks $enterasys->id() against the
F<ENTERASYS-OIDS-MIB>.
=item $enterasys->vendor()
Returns enterasys
=item $enterasys->os()
Returns enterasys
=item $enterasys->os_ver()
Returns os version extracted from C<sysDescr>
=item $enterasys->mac()
Returns base mac
(C<dot1dBaseBridgeAddress>)
=back
=head2 Overrides
=over
=back
=head2 Globals imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $enterasys->interfaces()
Mapping between the Interface Table Index (iid) and the physical port name.
=item $enterasys->i_ignore()
Returns reference to hash. Creates a key for each IID that should be ignored.
Currently looks for rs232, tunnel,loopback,lo,null from
$enterasys->interfaces()
=item $enterasys->i_duplex()
See documentation for mau_i_duplex() in L<SNMP::Info::MAU/"TABLE METHODS">.
=item $enterasys->i_duplex_admin()
See documentation for mau_i_duplex_admin() in
L<SNMP::Info::MAU/"TABLE METHODS">.
=item $enterasys->fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
=item $enterasys->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid).
(C<dot1qTpFdbPort>)
=back
=head2 Topology information
Based upon the firmware version Enterasys devices may support Cabletron
Discovery Protocol (CTRON CDP), Cisco Discovery Protocol (CDP), Link Layer
Discovery Protocol (LLDP), or all. This module currently supports CDP and
LLDP, but not CTRON CDP. These methods will query both CDP and LLDP and
return the combination of all information. As a result, there may be
identical topology information returned from the two protocols
causing duplicate entries. It is the calling program's responsibility to
identify any duplicate entries and remove duplicates if necessary.
=over
=item $enterasys->hasCDP()
Returns true if the device is running either CDP or LLDP.
=item $enterasys->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $enterasys->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-CDP/LLDP device in between two
or more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $enterasys->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $enterasys->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $enterasys->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CDP
See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -1,98 +1,122 @@
# SNMP::Info::Layer3::Extreme - SNMP Interface to Extreme devices
# Eric Miller
# $Id$
#
# Copyright (c) 2005 Eric Miller
# Copyright (c) 2008 Eric Miller
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Extreme;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '1.04';
@SNMP::Info::Layer3::Extreme::ISA = qw/SNMP::Info::Layer3 SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer3::Extreme::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::MAU Exporter/;
@SNMP::Info::Layer3::Extreme::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
'EXTREME-BASE-MIB' => 'extremeAgent',
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
'EXTREME-FDB-MIB' => 'extremeSystem',
);
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
'EXTREME-BASE-MIB' => 'extremeAgent',
'EXTREME-SYSTEM-MIB' => 'extremeSystem',
'EXTREME-FDB-MIB' => 'extremeSystem',
'EXTREME-VLAN-MIB' => 'extremeVlan',
'EXTREME-POE-MIB' => 'extremePethSystemAdminEnable',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
'serial' => 'extremeSystemID',
'temp' => 'extremeCurrentTemperature',
'ps1_status' => 'extremePowerSupplyStatus.1',
'fan' => 'extremeFanOperational.1',
'mac' => 'dot1dBaseBridgeAddress',
);
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
'serial1' => 'extremeSystemID.0',
'temp' => 'extremeCurrentTemperature',
'ps1_status_old' => 'extremePrimaryPowerOperational.0',
'ps1_status_new' => 'extremePowerSupplyStatus.1',
'ps2_status_old' => 'extremeRedundantPowerStatus.0',
'ps2_status_new' => 'extremePowerSupplyStatus.2',
'mac' => 'dot1dBaseBridgeAddress',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
# EXTREME-FDB-MIB:extremeFdbMacFdbTable
'fw_mac' => 'extremeFdbMacFdbMacAddress',
'fw_port' => 'extremeFdbMacFdbPortIfIndex',
'fw_status' => 'extremeFdbMacFdbStatus',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
'fan_state' => 'extremeFanOperational',
# EXTREME-FDB-MIB:extremeFdbMacFdbTable
'ex_fw_mac' => 'extremeFdbMacFdbMacAddress',
'ex_fw_port' => 'extremeFdbMacFdbPortIfIndex',
'ex_fw_status' => 'extremeFdbMacFdbStatus',
# EXTREME-VLAN-MIB:extremeVlanIfTable
'ex_vlan_descr' => 'extremeVlanIfDescr',
'ex_vlan_global_id' => 'extremeVlanIfGlobalIdentifier',
# EXTREME-VLAN-MIB:extremeVlanEncapsIfTable
'ex_vlan_encap_tag' => 'extremeVlanEncapsIfTag',
'peth_port_power' => 'extremePethPortMeasuredPower',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
);
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
'ex_fw_mac' => \&SNMP::Info::munge_mac,
'ps1_status_old' => \&munge_true_ok,
'ps1_status_new' => \&munge_power_stat,
'ps2_status_old' => \&munge_power_stat,
'ps2_status_new' => \&munge_power_stat,
'fan_state' => \&munge_true_ok,
);
# Method OverRides
sub bulkwalk_no { 1; }
*SNMP::Info::Layer3::Extreme::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
*SNMP::Info::Layer3::Extreme::i_duplex_admin = \&SNMP::Info::MAU::mau_i_duplex_admin;
*SNMP::Info::Layer3::Extreme::i_duplex = \&SNMP::Info::MAU::mau_i_duplex;
*SNMP::Info::Layer3::Extreme::i_duplex_admin
= \&SNMP::Info::MAU::mau_i_duplex_admin;
sub model {
my $extreme = shift;
my $id = $extreme->id();
unless (defined $id){
print " SNMP::Info::Layer3::Extreme::model() - Device does not support sysObjectID\n" if $extreme->debug();
return undef;
my $id = $extreme->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::Extreme::model() - Device does not support sysObjectID\n"
if $extreme->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
@@ -110,51 +134,404 @@ sub os {
sub os_ver {
my $extreme = shift;
my $descr = $extreme->description();
return undef unless defined $descr;
my $descr = $extreme->description();
return unless defined $descr;
if ($descr =~ m/Version ([\d.]*)/){
if ( $descr =~ m/Version\s+([^ ]+)/ ) {
return $1;
}
return undef;
return;
}
# We're not using BRIDGE-MIB
sub bp_index {
#
# ifName is a nice concise port name on Extreme devices.
# Layer3.pm defaults to i_description, which is verbose
# and has spaces. However, ifName has the IP address
# assigned for router interfaces, so we use ifDescr
# for those.
sub interfaces {
my $extreme = shift;
my $partial = shift;
my $i_name = $extreme->orig_i_name($partial);
my $i_description = $extreme->orig_i_description($partial);
my $interfaces = {};
foreach my $idx ( keys %$i_name ) {
if ( $i_name->{$idx} =~ /\([0-9.]+\)/ ) {
$interfaces->{$idx} = $i_description->{$idx};
}
else {
$interfaces->{$idx} = $i_name->{$idx};
}
}
return $interfaces;
}
#
# Ignore VLAN meta-interfaces and loopback
sub i_ignore {
my $extreme = shift;
my $partial = shift;
my $i_description = $extreme->i_description($partial) || {};
my %i_ignore;
foreach my $if ( keys %$i_description ) {
if ( $i_description->{$if}
=~ /^(802.1Q Encapsulation Tag \d+|VLAN \d+|lo\d+)/i )
{
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
# When we use the extreme_fw_* objects, we're not using BRIDGE-MIB.
# Either way, Extreme uses a 1:1 mapping of bridge interface ID to
# ifIndex.
sub bp_index {
my $extreme = shift;
my $if_index = $extreme->i_index();
my %bp_index;
foreach my $iid (keys %$if_index){
foreach my $iid ( keys %$if_index ) {
$bp_index{$iid} = $iid;
}
return \%bp_index;
}
# Index values in the Q-BRIDGE-MIB are the same
# as in the BRIDGE-MIB and do not match ifIndex.
sub i_vlan {
sub munge_true_ok {
my $val = shift;
return unless defined($val);
return "OK" if ( $val eq 'true' );
return "Not OK" if ( $val eq 'false' );
return $val;
}
sub munge_power_stat {
my $val = shift;
return unless defined($val);
$val =~ s/^present//;
$val =~ s/^not/Not /i;
return $val;
}
sub ps1_status {
my $extreme = shift;
my $ps1_status = $extreme->ps1_status_new();
return $ps1_status || $extreme->ps1_status_old();
}
sub ps2_status {
my $extreme = shift;
my $ps2_status = $extreme->ps2_status_new();
return $ps2_status || $extreme->ps2_status_old();
}
sub fan {
my $extreme = shift;
my $fan_state = $extreme->fan_state();
my $ret = "";
my $s = "";
foreach my $i ( sort { $a <=> $b } keys %$fan_state ) {
$ret .= $s . $i . ": " . $fan_state->{$i};
$s = ", ";
}
return if ( $s eq "" );
return $ret;
}
# Newer versions of the Extreme firmware have vendor-specific tables
# for this; those are ex_fw_*(). Older firmware versions don't have
# these tables, so we use the BRIDGE-MIB tables.
sub fw_mac {
my $extreme = shift;
my $qb_i_vlan = $extreme->qb_i_vlan();
my $bp_index = $extreme->bp_index();
my $fw_mac = $extreme->ex_fw_mac;
return $fw_mac if defined($fw_mac);
return $extreme->orig_fw_mac();
}
my %i_vlan;
foreach my $v_index (keys %$qb_i_vlan){
my $vlan = $qb_i_vlan->{$v_index};
my $iid = $bp_index->{$v_index};
sub fw_port {
my $extreme = shift;
my $fw_port = $extreme->ex_fw_port;
return $fw_port if defined($fw_port);
return $extreme->orig_fw_port();
}
unless (defined $iid) {
print " Port $v_index has no bp_index mapping. Skipping\n"
if $DEBUG;
next;
sub fw_status {
my $extreme = shift;
my $fw_status = $extreme->ex_fw_status;
return $fw_status if defined($fw_status);
return $extreme->orig_fw_status();
}
# Mapping the virtual VLAN interfaces:
# The virtual VLAN interfaces in extremeVlanIfTable
# are the higher layer above the interfaces that are
# untagged, and also above an interface in
# extremeVlanEncapsIfTable that does the encapsulation.
# Note that it's possible to have a VLAN defined that
# does not have a tag, if it has all native interfaces.
# To represent this, we use a negative version of the
# internal VLAN ID (the deprecated extremeVlanIfGlobalIdentifier)
sub _if2tag {
my $extreme = shift;
my $partial = shift;
my $stack = shift || $extreme->ifStackStatus($partial);
my $encap_tag = $extreme->ex_vlan_encap_tag();
my $vlan_descr = $extreme->ex_vlan_descr();
my $stackmap = {};
foreach my $idx ( keys %$stack ) {
my ( $higher, $lower ) = split( /\./, $idx );
$stackmap->{$higher}->{$lower} = $stack->{$idx};
}
my %if2tag = ();
my $missed = 0;
foreach my $if ( keys %$vlan_descr ) {
$if2tag{$if} = -1;
foreach my $tagif ( keys %$encap_tag ) {
if ( defined( $stackmap->{$if}->{$tagif} )
&& $stackmap->{$if}->{$tagif} eq 'active' )
{
$if2tag{$if} = $encap_tag->{$tagif};
}
}
if ( $if2tag{$if} == -1 ) {
$missed++;
}
}
if ($missed) {
my $global_id = $extreme->ex_vlan_global_id();
foreach my $if ( keys %if2tag ) {
$if2tag{$if} = -$global_id->{$if}
if ( $if2tag{$if} == -1 && defined( $global_id->{$if} ) );
}
}
return \%if2tag;
}
# No partial support in v_name or v_index, because the obivous partial
# is the VLAN ID and the index here is the ifIndex of
# the VLAN interface.
sub v_name {
my $extreme = shift;
return $extreme->ex_vlan_descr();
}
sub v_index {
my $extreme = shift;
return $extreme->_if2tag();
}
sub i_vlan {
my $extreme = shift;
my $partial = shift;
my $stack = $extreme->ifStackStatus($partial);
my $encap_tag = $extreme->ex_vlan_encap_tag();
my $vlan_descr = $extreme->ex_vlan_descr();
my $stackmap = {};
foreach my $idx ( keys %$stack ) {
my ( $higher, $lower ) = split( /\./, $idx );
$stackmap->{$higher}->{$lower} = $stack->{$idx};
}
my $if2tag = $extreme->_if2tag( $partial, $stack );
#
# Now that we've done all that mapping work, we can map the
# ifStack indexes.
my %i_vlan = ();
foreach my $if ( keys %$if2tag ) {
foreach my $lowif ( keys %{ $stackmap->{$if} } ) {
$i_vlan{$lowif} = $if2tag->{$if};
}
$i_vlan{$iid}=$vlan;
}
return \%i_vlan;
}
sub i_vlan_membership {
my $extreme = shift;
my $partial = shift;
my $stack = $extreme->ifStackStatus($partial);
my $encap_tag = $extreme->ex_vlan_encap_tag();
my $vlan_descr = $extreme->ex_vlan_descr();
my $stackmap = {};
foreach my $idx ( keys %$stack ) {
my ( $higher, $lower ) = split( /\./, $idx );
$stackmap->{$higher}->{$lower} = $stack->{$idx};
}
my $if2tag = $extreme->_if2tag( $partial, $stack );
#
# Now that we've done all that mapping work, we can map the
# ifStack indexes.
my %i_vlan_membership = ();
foreach my $if ( keys %$if2tag ) {
foreach my $lowif ( keys %{ $stackmap->{$if} } ) {
push( @{ $i_vlan_membership{$lowif} }, $if2tag->{$if} );
}
}
#
# Now add all the tagged ports.
foreach my $if ( keys %$encap_tag ) {
foreach my $lowif ( keys %{ $stackmap->{$if} } ) {
push( @{ $i_vlan_membership{$lowif} }, $encap_tag->{$if} );
}
}
return \%i_vlan_membership;
}
# VLAN management.
# See extreme-vlan.mib for a detailed description of
# Extreme's use of ifStackTable and EXTREME-VLAN-MIB.
sub set_i_vlan {
my $extreme = shift;
return $extreme->_extreme_set_i_vlan( 0, @_ );
}
sub set_i_pvid {
my $extreme = shift;
return $extreme->_extreme_set_i_vlan( 1, @_ );
}
# set_i_vlan implicitly turns off any encapsulation
# set_i_pvid retains any encapsulation
# otherwise they do the same: set the unencapsulated
# vlan ID.
# First arg to _set_i_vlan is whether or not to turn
# off any encapsulation.
sub _extreme_set_i_vlan {
my $extreme = shift;
my ( $is_pvid, $vlan_id, $ifindex ) = @_;
my $encap_tag = $extreme->ex_vlan_encap_tag();
# The inverted stack MIB would make this easier, since
# we need to find the vlan interface
# that's stacked above $ifindex.
my $cur_stack = $extreme->ifStackStatus();
#
# create inverted stack
my $invstack;
foreach my $idx ( keys %$cur_stack ) {
my ( $higher, $lower ) = split( /\./, $idx );
$invstack->{$lower}->{$higher} = $cur_stack->{$idx};
}
# create vlan tag -> encap interface map
my %encapif = reverse %$encap_tag;
# now find encap interface from tag
my $encapidx = $encapif{$vlan_id};
if ( !defined($encapidx) ) {
$extreme->error_throw(
"can't map $vlan_id to encapsulation interface");
return;
}
# now find vlan interface stacked above encap
my @abovevlan = keys %{ $invstack->{$encapidx} };
if ( @abovevlan != 1 ) {
$extreme->error_throw(
"can't map encap interface $encapidx for $vlan_id to encapsulation interface"
);
return;
}
my $vlanidx = $abovevlan[0];
my $rv;
# Delete old VLAN mapping
foreach my $oldidx ( keys %{ $invstack->{$ifindex} } ) {
if ( $is_pvid && defined( $encap_tag->{$oldidx} ) ) {
next; # Don't delete tagged mappings
}
$rv = $extreme->set_ifStackStatus( "destroy",
$oldidx . "." . $ifindex );
unless ($rv) {
$extreme->error_throw(
"Unable to remove $ifindex from old VLAN index $oldidx");
return;
}
}
# Add new VLAN mapping
$rv = $extreme->set_ifStackStatus( "createAndGo",
$vlanidx . "." . $ifindex );
unless ($rv) {
$extreme->error_throw(
"Unable to add new VLAN index $vlanidx to ifIndex $ifindex");
return;
}
# XXX invalidate cache of ifstack?
# XXX Info.pm library function for this?
# XXX set_ should do invalidation?
# $store = $extreme->store(); delete $store->{ifStackStatus}; $extreme->store($store);
# $extreme->{_ifStackStatus} = 0;
return $rv;
}
sub set_remove_i_vlan_tagged {
my $extreme = shift;
my ( $vlan_id, $ifindex ) = @_;
my $encap_tag = $extreme->ex_vlan_encap_tag();
# create vlan tag -> encap interface map
my %encapif = reverse %$encap_tag;
# now find encap interface from tag
my $encapidx = $encapif{$vlan_id};
if ( !defined($encapidx) ) {
$extreme->error_throw(
"can't map $vlan_id to encapsulation interface");
return;
}
my $rv = $extreme->set_ifStackStatus( "destroy",
$encapidx . "." . $ifindex );
unless ($rv) {
$extreme->error_throw(
"Unable to delete VLAN encap ifIndex $encapidx for VLAN $vlan_id from ifIndex $ifindex"
);
return;
}
# invalidate cache of ifstack?
return $rv;
}
sub set_add_i_vlan_tagged {
my $extreme = shift;
my ( $vlan_id, $ifindex ) = @_;
my $encap_tag = $extreme->ex_vlan_encap_tag();
# create vlan tag -> encap interface map
my %encapif = reverse %$encap_tag;
# now find encap interface from tag
my $encapidx = $encapif{$vlan_id};
if ( !defined($encapidx) ) {
$extreme->error_throw(
"can't map $vlan_id to encapsulation interface");
return;
}
my $rv = $extreme->set_ifStackStatus( "createAndGo",
$encapidx . "." . $ifindex );
unless ($rv) {
$extreme->error_throw(
"Unable to add VLAN encap ifIndex $encapidx for VLAN $vlan_id to ifIndex $ifindex"
);
return;
}
# invalidate cache of ifstack?
return $rv;
}
1;
__END__
=head1 NAME
@@ -163,7 +540,7 @@ SNMP::Info::Layer3::Extreme - Perl5 Interface to Extreme Network Devices
=head1 AUTHOR
Eric Miller
Eric Miller, Bill Fenner
=head1 SYNOPSIS
@@ -171,7 +548,6 @@ Eric Miller
my $extreme = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 1
@@ -187,8 +563,8 @@ Eric Miller
Provides abstraction to the configuration information obtainable from an
Extreme 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $extreme = new SNMP::Info::Layer3::Extreme(...);
@@ -206,11 +582,15 @@ my $extreme = new SNMP::Info::Layer3::Extreme(...);
=over
=item EXTREME-BASE-MIB
=item F<EXTREME-BASE-MIB>
=item EXTREME-SYSTEM-MIB
=item F<EXTREME-SYSTEM-MIB>
=item EXTREME-FDB-MIB
=item F<EXTREME-FDB-MIB>
=item F<EXTREME-VLAN-MIB>
=item F<EXTREME-POE-MIB>
=item Inherited Classes' MIBs
@@ -224,13 +604,9 @@ These are methods that return scalar value from SNMP
=over
=item $extreme->bulkwalk_no
Return C<1>. Bulkwalk is currently turned off for this class.
=item $extreme->model()
Returns model type. Checks $extreme->id() against the EXTREME-BASE-MIB.
Returns model type. Checks $extreme->id() against the F<EXTREME-BASE-MIB>.
=item $extreme->vendor()
@@ -240,35 +616,45 @@ Returns extreme
Returns extreme
=item $extreme->os_ver()
Parses device operating system version from description()
=item $extreme->serial()
Returns serial number
(B<extremeSystemID>)
(C<extremeSystemID>)
=item $extreme->temp()
Returns system temperature
(B<extremeCurrentTemperature>)
(C<extremeCurrentTemperature>)
=item $extreme->ps1_status()
Returns status of power supply 1
(B<extremePowerSupplyStatus.1>)
(C<extremePowerSupplyStatus.1>)
=item $extreme->ps2_status()
Returns status of power supply 2
(C<extremePowerSupplyStatus.2>)
=item $extreme->fan()
Returns fan status
(B<extremeFanOperational.1>)
(C<extremeFanOperational.1>)
=item $extreme->mac()
Returns base mac
(B<dot1dBaseBridgeAddress>)
(C<dot1dBaseBridgeAddress>)
=back
@@ -280,13 +666,13 @@ Returns base mac
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::MAU
See documentation in SNMP::Info::MAU for details.
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -295,37 +681,158 @@ to a hash.
=over
=item $extreme->interfaces()
Returns a mapping between the Interface Table Index (iid) and the physical
port name.
=item $extreme->i_duplex()
Parses mau_index and mau_link to return the duplex information for
interfaces.
=item $extreme->i_duplex_admin()
Parses C<mac_index>,C<mau_autostat>,C<mau_type_admin> in
order to find the admin duplex setting for all the interfaces.
Returns either (auto,full,half).
=item $extreme->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores VLAN meta interfaces and loopback
=item $extreme->fw_mac()
(B<extremeFdbMacFdbMacAddress>)
(C<extremeFdbMacFdbMacAddress>)
=item $extreme->fw_port()
(B<extremeFdbMacFdbPortIfIndex>)
(C<extremeFdbMacFdbPortIfIndex>)
=item $extreme->fw_status()
(B<extremeFdbMacFdbStatus>)
(C<extremeFdbMacFdbStatus>)
=item $extreme->i_vlan()
Returns a mapping between ifIndex and the VLAN.
Returns a mapping between C<ifIndex> and the VLAN.
=item $stack->bp_index()
=item $extreme->i_vlan_membership()
Returns reference to hash of bridge port table entries map back to interface identifier (iid)
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the egress list for the port.
Returns (B<ifIndex>) for both key and value since we're using EXTREME-FDB-MIB
rather than BRIDGE-MIB.
Example:
my $interfaces = $extreme->interfaces();
my $vlans = $extreme->i_vlan_membership();
foreach my $iid (sort keys %$interfaces) {
my $port = $interfaces->{$iid};
my $vlan = join(',', sort(@{$vlans->{$iid}}));
print "Port: $port VLAN: $vlan\n";
}
=item $extreme->v_index()
Returns VLAN IDs
=item $extreme->v_name()
Returns VLAN names
(C<extremeVlanIfDescr>)
=item $extreme->bp_index()
Returns reference to hash of bridge port table entries map back to interface
identifier (iid)
Returns (C<ifIndex>) for both key and value since we're using
F<EXTREME-FDB-MIB> rather than F<BRIDGE-MIB>.
=item $extreme->peth_port_power()
Power supplied by PoE ports, in milliwatts
("extremePethPortMeasuredPower")
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::MAU
See documentation in SNMP::Info::MAU for details.
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=over
=item $extreme->set_i_vlan ( vlan, ifIndex )
Changes an access (untagged) port VLAN, must be supplied with the numeric
VLAN ID and port C<ifIndex>. This method should only be used on end station
(non-trunk) ports.
Example:
my %if_map = reverse %{$extreme->interfaces()};
$extreme->set_i_vlan('2', $if_map{'FastEthernet0/1'})
or die "Couldn't change port VLAN. ",$extreme->error(1);
=item $extreme->set_i_pvid ( pvid, ifIndex )
Sets port default VLAN, must be supplied with the numeric VLAN ID and
port C<ifIndex>. This method should only be used on trunk ports.
Example:
my %if_map = reverse %{$extreme->interfaces()};
$extreme->set_i_pvid('2', $if_map{'FastEthernet0/1'})
or die "Couldn't change port default VLAN. ",$extreme->error(1);
=item $extreme->set_add_i_vlan_tagged ( vlan, ifIndex )
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
numeric VLAN ID and port C<ifIndex>.
Example:
my %if_map = reverse %{$extreme->interfaces()};
$extreme->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
or die "Couldn't add port to egress list. ",$extreme->error(1);
=item $extreme->set_remove_i_vlan_tagged ( vlan, ifIndex )
Removes the VLAN from the enabled VLANs list of the port, must be supplied
with the numeric VLAN ID and port C<ifIndex>.
Example:
my %if_map = reverse %{$extreme->interfaces()};
$extreme->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
or die "Couldn't add port to egress list. ",$extreme->error(1);
=back
=head1 Data Munging Callback Subroutines
=over
=item $extreme->munge_power_stat()
Removes 'present' and changes 'not' to 'Not' in the front of a string.
=item $extreme->munge_true_ok()
Replaces 'true' with "OK" and 'false' with "Not OK".
=back
=cut

View File

@@ -1,129 +1,100 @@
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
# Max Baker
# $Id$
#
# Copyright (c) 2004,2005 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::Foundry;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::FDP;
use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '1.04';
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::Layer3 SNMP::Info::FDP Exporter/;
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::Layer3::MIBS,
%SNMP::Info::FDP::MIBS,
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
'FOUNDRY-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
# IP-FORWARD-MIB
# ETHERLIKE-MIB
# RFC1398-MIB
# RMON-MIB
# IF-MIB
);
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::FDP::MIBS,
'FOUNDRY-SN-ROOT-MIB' => 'foundry',
'FOUNDRY-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
'FOUNDRY-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::FDP::GLOBALS,
'mac' => 'ifPhysAddress.1',
'chassis' => 'entPhysicalDescr.1',
'serial' => 'snChasSerNum',
'temp' => 'snChasActualTemperature',
'ps1_type' => 'snChasPwrSupplyDescription.1',
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
'fan' => 'snChasFanOperStatus.1',
#'serial' => 'enterprises.1991.1.1.1.1.2.0',
#'temp' => 'enterprises.1991.1.1.1.1.18.0',
#'ps1_type' => 'enterprises.1991.1.1.1.2.1.1.2.1',
#'ps1_status' => 'enterprises.1991.1.1.1.2.1.1.3.1',
#'fan' => 'enterprises.1991.1.1.1.3.1.1.3.1'
);
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::FDP::GLOBALS,
'mac' => 'ifPhysAddress.1',
'chassis' => 'entPhysicalDescr.1',
'temp' => 'snChasActualTemperature',
'ps1_type' => 'snChasPwrSupplyDescription.1',
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
'fan' => 'snChasFanOperStatus.1',
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::FDP::FUNCS,
'i_name2' => 'ifName',
# FOUNDRY-MIB
# snSwPortInfoTable - Switch Port Information Group
'sw_index' => 'snSwPortIfIndex',
'sw_duplex' => 'snSwPortInfoChnMode',
'sw_type' => 'snSwPortInfoMediaType',
'sw_speed' => 'snSwPortInfoSpeed',
);
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::FDP::FUNCS,
# FOUNDRY-SN-SWITCH-GROUP-MIB
# snSwPortInfoTable - Switch Port Information Group
'sw_index' => 'snSwPortIfIndex',
'sw_duplex' => 'snSwPortInfoChnMode',
'sw_type' => 'snSwPortInfoMediaType',
'sw_speed' => 'snSwPortInfoSpeed',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::FDP::MUNGE,
'at_paddr' => \&SNMP::Info::munge_mac,
);
# Method OverRides
sub bulkwalk_no { 1; }
# Add our i_aliases if they are set (manually)
sub i_name {
my $foundry = shift;
my $i_name = $foundry->i_name2();
my $i_alias = $foundry->i_alias();
foreach my $iid (keys %$i_name){
my $alias = $i_alias->{$iid};
next unless defined $alias;
next unless length($alias);
$i_name->{$iid} = $i_alias->{$iid};
}
return $i_name;
}
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::FDP::MUNGE,
);
sub i_ignore {
my $foundry = shift;
my $interfaces = $foundry->interfaces();
my $i_descr = $foundry->i_descr();
my $partial = shift;
my $interfaces = $foundry->interfaces($partial) || {};
my %i_ignore;
foreach my $if (keys %$interfaces) {
# lo -> cisco aironet 350 loopback
if ($interfaces->{$if} =~ /(tunnel|loopback|lo|lb|null)/i){
foreach my $if ( keys %$interfaces ) {
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
$i_ignore{$if}++;
}
}
@@ -132,16 +103,18 @@ sub i_ignore {
sub i_duplex {
my $foundry = shift;
my $sw_index = $foundry->sw_index();
my $sw_duplex= $foundry->sw_duplex();
my $partial = shift;
unless (defined $sw_index and defined $sw_duplex){
return $foundry->SUPER::i_duplex();
my $sw_index = $foundry->sw_index($partial);
my $sw_duplex = $foundry->sw_duplex($partial);
unless ( defined $sw_index and defined $sw_duplex ) {
return $foundry->SUPER::i_duplex();
}
my %i_duplex;
foreach my $sw_port (keys %$sw_duplex){
my $iid = $sw_index->{$sw_port};
foreach my $sw_port ( keys %$sw_duplex ) {
my $iid = $sw_index->{$sw_port};
my $duplex = $sw_duplex->{$sw_port};
next if $duplex =~ /none/i;
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
@@ -150,59 +123,31 @@ sub i_duplex {
return \%i_duplex;
}
sub i_type {
my $foundry = shift;
my $sw_index = $foundry->sw_index();
my $sw_type= $foundry->sw_type();
unless (defined $sw_index and defined $sw_type){
return $foundry->SUPER::i_type();
}
my %i_type;
foreach my $sw_port (keys %$sw_type){
my $iid = $sw_index->{$sw_port};
my $type = $sw_type->{$sw_port};
next unless defined $type;
$i_type{$iid} = $type;
}
return \%i_type;
}
sub i_speed {
my $foundry = shift;
my $sw_index = $foundry->sw_index();
my $sw_speed= $foundry->sw_speed();
unless (defined $sw_index and defined $sw_speed){
return $foundry->SUPER::i_speed();
}
my %i_speed;
foreach my $sw_port (keys %$sw_speed){
my $iid = $sw_index->{$sw_port};
my $speed = $sw_speed->{$sw_port};
next unless defined $speed;
$speed = 'auto' if $speed =~ /auto/i;
$speed = '10 Mbps' if $speed =~ /s10m/i;
$speed = '100 Mbps' if $speed =~ /s100m/i;
$speed = '1.0 Gbps' if $speed =~ /s1g/i;
$speed = '45 Mbps' if $speed =~ /s45M/i;
$speed = '155 Mbps' if $speed =~ /s155M/i;
$i_speed{$iid} = $speed;
}
return \%i_speed;
}
# $foundry->model() - looks for xxnnnn in the description
sub model {
my $foundry = shift;
my $id = $foundry->id();
my $desc = $foundry->description();
my $model = &SNMP::translateObj($id);
my $id = $foundry->id();
my $model = &SNMP::translateObj($id);
$model = $1 if $desc =~ /\s+([a-z]{2}\d{4})\D/i;
$model = $1 if $desc =~ /\b(FW[A-Z\d]+)/;
# EdgeIron
if ( $id =~ /\.1991\.1\.[45]\./ ) {
my $e_name = $foundry->e_name();
# Find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
# Find Model Name
my $e_model = $foundry->e_model();
if ( defined $e_model->{$unit_iid} ) {
return $e_model->{$unit_iid};
}
}
return $id unless defined $model;
$model =~ s/^sn//;
@@ -210,52 +155,253 @@ sub model {
}
sub os {
my $foundry = shift;
my $descr = $foundry->description();
if ($descr =~ m/IronWare/i) {
return 'IronWare';
}
return 'foundry';
}
sub os_ver {
my $foundry = shift;
my $os_version = $foundry->os_version();
return $os_version if defined $os_version;
# Some older ones don't have this value,so we cull it from the description
my $descr = $foundry->description();
if ($descr =~ m/Version (\d\S*)/) {
return $1;
}
return undef;
}
# $foundry->interfaces() - Map the Interfaces to their physical names
sub interfaces {
my $foundry = shift;
my $interfaces = $foundry->i_index();
my $descriptions = $foundry->i_description();
my %ifs = ();
foreach my $iid (keys %$interfaces){
$ifs{$iid} = $descriptions->{$iid};
}
return \%ifs;
}
sub vendor {
return 'foundry';
}
sub os_ver {
my $foundry = shift;
return $foundry->snAgImgVer() if ( defined $foundry->snAgImgVer() );
# Some older ones don't have this value,so we cull it from the description
my $descr = $foundry->description();
if ( $descr =~ m/Version (\d\S*)/ ) {
return $1;
}
# EdgeIron
my $e_name = $foundry->e_name();
# find entity table entry for "stackmanaget.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'stackmanaget.1';
}
if ( defined $unit_iid ) {
# Find Model Name
my $e_fwver = $foundry->e_fwver();
if ( defined $e_fwver->{$unit_iid} ) {
return $e_fwver->{$unit_iid};
}
}
# See if we report from Flash if wouldn't report from running above
return $foundry->snAgFlashImgVer() if ( defined $foundry->snAgFlashImgVer() );
# Last resort
return $foundry->SUPER::os_ver();
}
sub serial {
my $foundry = shift;
# Return chassis serial number if available
return $foundry->snChasSerNum() if ( $foundry->snChasSerNum() );
# If no chassis serial use first module serial
my $mod_serials = $foundry->snAgentConfigModuleSerialNumber();
foreach my $mod ( sort keys %$mod_serials ) {
my $serial = $mod_serials->{$mod} || '';
next unless defined $serial;
return $serial;
}
# EdgeIron
my $e_name = $foundry->e_name();
# find entity table entry for "unit.1"
my $unit_iid = undef;
foreach my $e ( keys %$e_name ) {
my $name = $e_name->{$e} || '';
$unit_iid = $e if $name eq 'unit.1';
}
if ( defined $unit_iid ) {
# Look up serial of found entry.
my $e_serial = $foundry->e_serial();
return $e_serial->{$unit_iid} if defined $e_serial->{$unit_iid};
}
# Last resort
return $foundry->SUPER::serial();
}
sub interfaces {
my $foundry = shift;
my $partial = shift;
my $i_descr = $foundry->i_description($partial) || {};
my $i_name = $foundry->i_name($partial) || {};
# Use ifName for EdgeIrons else use ifDescr
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name
if $name =~ /^port\d+/i;
}
return $i_descr;
}
# Reported hangs on a EdgeIron 24G
sub stp_p_state {
my $foundry = shift;
my $partial = shift;
my $descr = $foundry->description();
if ( $descr =~ m/\bEdgeIron 24G\b/ ) {
return;
}
return $foundry->SUPER::stp_p_state($partial) || {};
}
# Use FDP and/or LLDP
sub hasCDP {
my $foundry = shift;
return $foundry->hasLLDP() || $foundry->SUPER::hasCDP();
}
sub c_ip {
my $foundry = shift;
my $partial = shift;
my $cdp = $foundry->SUPER::c_ip($partial) || {};
my $lldp = $foundry->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $foundry = shift;
my $partial = shift;
my $lldp = $foundry->lldp_if($partial) || {};
my $cdp = $foundry->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $foundry = shift;
my $partial = shift;
my $lldp = $foundry->lldp_port($partial) || {};
my $cdp = $foundry->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $foundry = shift;
my $partial = shift;
my $lldp = $foundry->lldp_id($partial) || {};
my $cdp = $foundry->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $foundry = shift;
my $partial = shift;
my $lldp = $foundry->lldp_rem_sysdesc($partial) || {};
my $cdp = $foundry->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Foundry - Perl5 Interface to Foundry FastIron Network Devices
SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry Network Devices
=head1 AUTHOR
@@ -267,25 +413,22 @@ Max Baker
my $foundry = 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 = $foundry->class();
my $class = $foundry->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
This module provides limited functionality from some L2+L3 and L3 Foundry devices.
Abstraction subclass for Foundry Networks devices.
Specifically designed for a FI4802. Works on a FWSX424.
For speed or debugging purposes you can call the subclass directly, but not after determining
a more specific class using the method above. Turn off the AutoSpecify flag.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $foundry = new SNMP::Info::Layer3::Foundry(...);
@@ -293,8 +436,11 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
=over
=item SNMP::Info
=item SNMP::Info::Layer3;
=item SNMP::Info::FDP;
=item SNMP::Info::LLDP;
=back
@@ -302,16 +448,22 @@ a more specific class using the method above. Turn off the AutoSpecify flag.
=over
=item FOUNDRY-SN-ROOT-MIB
=item F<FOUNDRY-SN-ROOT-MIB>
=item F<FOUNDRY-SN-AGENT-MIB>
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
=item Inherited Classes' MIBs
See classes listed above for their required MIBs.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
The Foundry MIBS can be downloaded from www.mibdepot.com and ??
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -320,62 +472,76 @@ These are methods that return scalar value from SNMP
=item $foundry->model()
Returns model type. Checks $foundry->id() against the
FOUNDRY-SN-ROOT-MIB and then parses out xxNNNN
Returns model type. Checks $foundry->id() against the F<FOUNDRY-SN-ROOT-MIB>
and removes 'C<sn>'. EdgeIron models determined through F<ENTITY-MIB>.
=item $foundry->vendor()
Returns 'foundry' :)
Returns 'foundry'
=item $foundry->os()
Returns 'foundry'
=item $foundry->os_ver()
Returns the software version
=item $foundry->mac()
Returns MAC Address of root port.
(B<ifPhysAddress.1>)
(C<ifPhysAddress.1>)
=item $foundry->chassis()
Returns Chassis type.
(B<entPhysicalDescr.1>)
(C<entPhysicalDescr.1>)
=item $foundry->serial()
Returns serial number of device.
(B<snChasSerNum>)
=item $foundry->temp()
Returns the chassis temperature
(B<snChasActualTemperature>)
(C<snChasActualTemperature>)
=item $foundry->ps1_type()
Returns the Description for the power supply
(B<snChasPwrSupplyDescription.1>)
(C<snChasPwrSupplyDescription.1>)
=item $foundry->ps1_status()
Returns the status of the power supply.
(B<snChasPwrSupplyOperStatus.1>)
(C<snChasPwrSupplyOperStatus.1>)
=item $foundry->fan()
Returns the status of the chassis fan.
(B<snChasFanOperStatus.1>)
(C<snChasFanOperStatus.1>)
=back
=head2 Globals imported from SNMP::Info
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in SNMP::Info for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Global Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -388,13 +554,6 @@ to a hash.
Returns reference to hash of interface names to iids.
Uses B<ifDescr>.
=item $foundry->i_name()
Returns reference to hash of interface names.
Trys for B<ifAlias> and Defaults to B<ifName>
=item $foundry->i_ignore()
Returns reference to hash of interfaces to be ignored.
@@ -407,46 +566,18 @@ Returns reference to hash of interface link duplex status.
Crosses $foundry->sw_duplex() with $foundry->sw_index()
=item $foundry->i_type()
=item $foundry->stp_p_state()
Returns reference to hash of interface types.
"The port's current state as defined by application of the Spanning Tree
Protocol.
Crosses $foundry->sw_type() with $foundry->sw_index()
Skipped if device is an EdgeIron 24G due to reports of hangs.
=item $foundry->i_speed()
Returns reference to hash of interface speeds .
Crosses $foundry->sw_speeD() with $foundry->sw_index() and
does a little munging.
(C<dot1dStpPortState>)
=back
=head2 RFC1213 Arp Cache Table (B<ipNetToMediaTable>)
=over
=item $foundry->at_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
(B<ipNetToMediaIfIndex>)
=item $foundry->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
(B<ipNetToMediaPhysAddress>)
=item $foundry->at_netaddr()
Returns reference to hash. Maps ARP table entries to IPs
(B<ipNetToMediaNetAddress>)
=back
=head2 Foundry Switch Port Information Table (B<snSwPortIfTable>)
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
=over
@@ -454,30 +585,86 @@ Returns reference to hash. Maps ARP table entries to IPs
Returns reference to hash. Maps Table to Interface IID.
(B<snSwPortIfIndex>)
(C<snSwPortIfIndex>)
=item $foundry->sw_duplex()
Returns reference to hash. Current duplex status for switch ports.
(B<snSwPortInfoChnMode>)
(C<snSwPortInfoChnMode>)
=item $foundry->sw_type()
Returns reference to hash. Current Port Type .
(B<snSwPortInfoMediaType>)
(C<snSwPortInfoMediaType>)
=item $foundry->sw_speed()
Returns reference to hash. Current Port Speed.
(B<snSwPortInfoSpeed>)
(C<snSwPortInfoSpeed>)
=back
=head2 Table Methods imported from SNMP::Info
=head2 Topology information
See documentation in SNMP::Info for details.
Based upon the software version devices may support Foundry Discovery
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
methods will query both and return the combination of all information. As a
result, there may be identical topology information returned from the two
protocols causing duplicate entries. It is the calling program's
responsibility to identify any duplicate entries and remove duplicates if
necessary.
=over
=item $foundry->hasCDP()
Returns true if the device is running either FDP or LLDP.
=item $foundry->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $foundry->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two
or more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $foundry->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $foundry->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $foundry->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

590
Info/Layer3/HP9300.pm Normal file
View File

@@ -0,0 +1,590 @@
# SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM devices
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::HP9300;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::FDP;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::HP9300::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::HP9300::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::FDP::MIBS,
'HP-SN-ROOT-MIB' => 'hp',
'HP-SN-AGENT-MIB' => 'snChasPwrSupplyDescription',
'HP-SN-SWITCH-GROUP-MIB' => 'snSwGroupOperMode',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::FDP::GLOBALS,
'mac' => 'ifPhysAddress.1',
'chassis' => 'entPhysicalDescr.1',
'temp' => 'snChasActualTemperature',
'ps1_type' => 'snChasPwrSupplyDescription.1',
'ps1_status' => 'snChasPwrSupplyOperStatus.1',
'fan' => 'snChasFanOperStatus.1',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::FDP::FUNCS,
# HP-SN-SWITCH-GROUP-MIB
# snSwPortInfoTable - Switch Port Information Group
# Fully qualify these since FDP class will load
# FOUNDRY-SN-SWITCH-GROUP-MIB which contains the same leaf names
'sw_index' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortIfIndex',
'sw_duplex' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoChnMode',
'sw_type' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoMediaType',
'sw_speed' => 'HP_SN_SWITCH_GROUP_MIB__snSwPortInfoSpeed',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::FDP::MUNGE,
);
sub i_ignore {
my $hp9300 = shift;
my $partial = shift;
my $interfaces = $hp9300->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|lb|null)/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
sub i_duplex {
my $hp9300 = shift;
my $partial = shift;
my $sw_index = $hp9300->sw_index($partial);
my $sw_duplex = $hp9300->sw_duplex($partial);
unless ( defined $sw_index and defined $sw_duplex ) {
return $hp9300->SUPER::i_duplex();
}
my %i_duplex;
foreach my $sw_port ( keys %$sw_duplex ) {
my $iid = $sw_index->{$sw_port};
my $duplex = $sw_duplex->{$sw_port};
next if $duplex =~ /none/i;
$i_duplex{$iid} = 'half' if $duplex =~ /half/i;
$i_duplex{$iid} = 'full' if $duplex =~ /full/i;
}
return \%i_duplex;
}
sub model {
my $hp9300 = shift;
my $id = $hp9300->id();
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^hpSwitch//;
return $model;
}
sub os {
return 'hp';
}
sub vendor {
return 'hp';
}
sub os_ver {
my $hp9300 = shift;
return $hp9300->snAgImgVer() if ( defined $hp9300->snAgImgVer() );
# Some older ones don't have this value,so we cull it from the description
my $descr = $hp9300->description();
if ( $descr =~ m/Version (\d\S*)/ ) {
return $1;
}
# Last resort
return $hp9300->SUPER::os_ver();
}
sub serial {
my $hp9300 = shift;
# Return chassis serial number if available
return $hp9300->snChasSerNum() if ( $hp9300->snChasSerNum() );
# If no chassis serial use first module serial
my $mod_serials = $hp9300->snAgentConfigModuleSerialNumber();
foreach my $mod ( sort keys %$mod_serials ) {
my $serial = $mod_serials->{$mod} || '';
next unless defined $serial;
return $serial;
}
# Last resort
return $hp9300->SUPER::serial();
}
sub interfaces {
my $hp9300 = shift;
my $partial = shift;
my $i_descr = $hp9300->i_description($partial) || {};
my $i_name = $hp9300->i_name($partial) || {};
# Use ifName for EdgeIrons else use ifDescr
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
$i_descr->{$iid} = $name
if $name =~ /^port\d+/i;
}
return $i_descr;
}
# Use FDP and/or LLDP
sub hasCDP {
my $hp9300 = shift;
return $hp9300->hasLLDP() || $hp9300->SUPER::hasCDP();
}
sub c_ip {
my $hp9300 = shift;
my $partial = shift;
my $cdp = $hp9300->SUPER::c_ip($partial) || {};
my $lldp = $hp9300->lldp_ip($partial) || {};
my %c_ip;
foreach my $iid ( keys %$cdp ) {
my $ip = $cdp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
foreach my $iid ( keys %$lldp ) {
my $ip = $lldp->{$iid};
next unless defined $ip;
$c_ip{$iid} = $ip;
}
return \%c_ip;
}
sub c_if {
my $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_if($partial) || {};
my $cdp = $hp9300->SUPER::c_if($partial) || {};
my %c_if;
foreach my $iid ( keys %$cdp ) {
my $if = $cdp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
foreach my $iid ( keys %$lldp ) {
my $if = $lldp->{$iid};
next unless defined $if;
$c_if{$iid} = $if;
}
return \%c_if;
}
sub c_port {
my $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_port($partial) || {};
my $cdp = $hp9300->SUPER::c_port($partial) || {};
my %c_port;
foreach my $iid ( keys %$cdp ) {
my $port = $cdp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
foreach my $iid ( keys %$lldp ) {
my $port = $lldp->{$iid};
next unless defined $port;
$c_port{$iid} = $port;
}
return \%c_port;
}
sub c_id {
my $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_id($partial) || {};
my $cdp = $hp9300->SUPER::c_id($partial) || {};
my %c_id;
foreach my $iid ( keys %$cdp ) {
my $id = $cdp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
foreach my $iid ( keys %$lldp ) {
my $id = $lldp->{$iid};
next unless defined $id;
$c_id{$iid} = $id;
}
return \%c_id;
}
sub c_platform {
my $hp9300 = shift;
my $partial = shift;
my $lldp = $hp9300->lldp_rem_sysdesc($partial) || {};
my $cdp = $hp9300->SUPER::c_platform($partial) || {};
my %c_platform;
foreach my $iid ( keys %$cdp ) {
my $platform = $cdp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
foreach my $iid ( keys %$lldp ) {
my $platform = $lldp->{$iid};
next unless defined $platform;
$c_platform{$iid} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::HP9300 - SNMP Interface to HP Foundry OEM Network Devices
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $hp9300 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $hp9300->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for HP network devices which Foundry Networks was the
Original Equipment Manufacturer (OEM) such as the HP ProCurve 9300 series.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $hp9300 = new SNMP::Info::Layer3::HP9300(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3;
=item SNMP::Info::FDP;
=item SNMP::Info::LLDP;
=back
=head2 Required MIBs
=over
=item F<HP-SN-ROOT-MIB>
=item F<HP-SN-AGENT-MIB>
=item F<HP-SN-SWITCH-GROUP-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::FDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $hp9300->model()
Returns model type. Checks $hp9300->id() against the F<HP-SN-ROOT-MIB>
and removes C<hpSwitch>.
=item $hp9300->vendor()
Returns 'hp'
=item $hp9300->os()
Returns 'hp'
=item $hp9300->os_ver()
Returns the software version
=item $hp9300->mac()
Returns MAC Address of root port.
(C<ifPhysAddress.1>)
=item $hp9300->chassis()
Returns Chassis type.
(C<entPhysicalDescr.1>)
=item $hp9300->serial()
Returns serial number of device.
=item $hp9300->temp()
Returns the chassis temperature
(C<snChasActualTemperature>)
=item $hp9300->ps1_type()
Returns the Description for the power supply
(C<snChasPwrSupplyDescription.1>)
=item $hp9300->ps1_status()
Returns the status of the power supply.
(C<snChasPwrSupplyOperStatus.1>)
=item $hp9300->fan()
Returns the status of the chassis fan.
(C<snChasFanOperStatus.1>)
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $hp9300->interfaces()
Returns reference to hash of interface names to iids.
=item $hp9300->i_ignore()
Returns reference to hash of interfaces to be ignored.
Ignores interfaces with descriptions of tunnel,loopback,null
=item $hp9300->i_duplex()
Returns reference to hash of interface link duplex status.
Crosses $hp9300->sw_duplex() with $hp9300->sw_index()
=back
=head2 Switch Port Information Table (C<snSwPortIfTable>)
=over
=item $hp9300->sw_index()
Returns reference to hash. Maps Table to Interface IID.
(C<snSwPortIfIndex>)
=item $hp9300->sw_duplex()
Returns reference to hash. Current duplex status for switch ports.
(C<snSwPortInfoChnMode>)
=item $hp9300->sw_type()
Returns reference to hash. Current Port Type .
(C<snSwPortInfoMediaType>)
=item $hp9300->sw_speed()
Returns reference to hash. Current Port Speed.
(C<snSwPortInfoSpeed>)
=back
=head2 Topology information
Based upon the software version devices may support Foundry Discovery
Protocol (FDP) and Link Layer Discovery Protocol (LLDP). These
methods will query both and return the combination of all information. As a
result, there may be identical topology information returned from the two
protocols causing duplicate entries. It is the calling program's
responsibility to identify any duplicate entries and remove duplicates
if necessary.
=over
=item $hp9300->hasCDP()
Returns true if the device is running either FDP or LLDP.
=item $hp9300->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $hp9300->c_ip()
Returns reference to hash. Key: iid Value: remote IPv4 address
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non-FDP/LLDP device in between two
or more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $hp9300->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $hp9300->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $hp9300->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

View File

@@ -1,88 +1,119 @@
# SNMP::Info::Layer3::Juniper
# Bill Fenner
# $Id$
#
#
# Redistribution and use in source and binary forms, with or without
# Copyright (c) 2008 Bill Fenner
# 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
# * 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.
#
# 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::Juniper;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE $INIT/ ;
$VERSION = '1.04';
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Juniper::ISA = qw/SNMP::Info::Layer3 SNMP::Info::LLDP Exporter/;
@SNMP::Info::Layer3::Juniper::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
'JUNIPER-MIB' => 'jnxBoxAnatomy',
);
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
'JUNIPER-CHASSIS-DEFINES-MIB' => 'jnxChassisDefines',
'JUNIPER-MIB' => 'jnxBoxAnatomy',
'JUNIPER-VIRTUALCHASSIS-MIB' => 'jnxVirtualChassisMemberTable',
'JUNIPER-VLAN-MIB' => 'jnxVlanMIBObjects',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'serial' => 'jnxBoxSerialNo.0',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'serial' => 'jnxBoxSerialNo.0',
'mac' => 'dot1dBaseBridgeAddress',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
# JUNIPER-VLAN-MIB::jnxExVlanTable
'v_index' => 'jnxExVlanTag',
'v_type' => 'jnxExVlanType',
'v_name' => 'jnxExVlanName',
# JUNIPER-VLAN-MIB::jnxExVlanPortGroupTable
'i_trunk' => 'jnxExVlanPortAccessMode',
# JUNPIER-MIB
'e_contents_type' => 'jnxContentsType',
'e_containers_type' => 'jnxContainersType',
'e_hwver' => 'jnxContentsRevision',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
);
%MUNGE = ( %SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
'e_containers_type' => \&SNMP::Info::munge_e_type,
'e_contents_type' => \&SNMP::Info::munge_e_type,
);
sub vendor {
return 'juniper';
return 'juniper';
}
sub os {
return 'junos';
return 'junos';
}
sub os_ver {
my $juniper = shift;
my $descr = $juniper->description();
return undef unless defined $descr;
if ($descr =~ m/kernel JUNOS (\S+)/) {
my $descr = $juniper->description() || '';
my $lldp_descr = $juniper->lldp_sysdesc() || '';
if ( $descr =~ m/kernel JUNOS (\S+)/ ) {
return $1;
}
elsif ( $lldp_descr =~ m/version\s(\S+)\s/ ) {
return $1;
}
return undef;
return;
}
sub model {
my $l3 = shift;
my $id = $l3->id();
unless (defined $id){
print " SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n" if $l3->debug();
return undef;
unless ( defined $id ) {
print
" SNMP::Info::Layer3::Juniper::model() - Device does not support sysObjectID\n"
if $l3->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
@@ -91,12 +122,463 @@ sub model {
return $model;
}
# Override the fancy Layer3.pm serial function
sub serial {
my $juniper = shift;
return $juniper->orig_serial();
}
# 'i_trunk' => 'jnxExVlanPortAccessMode',
sub i_trunk {
my $juniper = shift;
my $partial = shift;
my $access = $juniper->jnxExVlanPortAccessMode($partial);
my %i_trunk;
foreach (keys %$access)
{
my $old_key = $_;
m/^\d+\.(\d+)$/o;
my $new_key = $1;
$i_trunk{$new_key} = $access->{$old_key};
}
return \%i_trunk;
}
# 'v_type' => 'jnxExVlanType',
sub v_type {
my $juniper = shift;
my $partial = shift;
my $v_type = $juniper->jnxExVlanType($partial);
return $v_type;
}
# 'v_index' => 'jnxExVlanTag',
sub v_index {
my ($juniper) = shift;
my ($partial) = shift;
my ($v_index) = $juniper->jnxExVlanTag($partial);
return $v_index;
}
sub i_vlan {
my $juniper = shift;
my $partial = shift;
my $index = $juniper->bp_index();
# If given a partial it will be an ifIndex, we need to use dot1dBasePort
if ($partial) {
my %r_index = reverse %$index;
$partial = $r_index{$partial};
}
my $v_index = $juniper->jnxExVlanTag();
my $i_pvid = $juniper->qb_i_vlan($partial) || {};
my $i_vlan = {};
foreach my $bport ( keys %$i_pvid ) {
my $q_vlan = $i_pvid->{$bport};
my $vlan = $v_index->{$q_vlan};
my $ifindex = $index->{$bport};
unless ( defined $ifindex ) {
print " Port $bport has no bp_index mapping. Skipping.\n"
if $DEBUG;
next;
}
$i_vlan->{$ifindex} = $vlan;
}
return $i_vlan;
}
sub i_vlan_membership {
my $juniper = shift;
my $partial = shift;
my $index = $juniper->bp_index();
my ($v_index) = $juniper->jnxExVlanTag($partial);
my $v_ports = $juniper->qb_v_egress() || {};
my $i_vlan_membership = {};
foreach my $idx ( sort keys %$v_ports ) {
next unless ( defined $v_ports->{$idx} );
my $portlist = $v_ports->{$idx}; # is an array reference
my $ret = [];
my $vlan_ndx = $idx;
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
push( @{$ret}, $i + 1 ) if ( @$portlist[$i] );
}
#Create HoA ifIndex -> VLAN array
foreach my $port ( @{$ret} ) {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
push ( @{ $i_vlan_membership->{$ifindex} }, $v_index->{$vlan_ndx} );
}
}
return $i_vlan_membership;
}
# Use Q-BRIDGE-MIB for bridge forwarding tables
sub fw_mac {
my $juniper = shift;
my $partial = shift;
return $juniper->qb_fw_mac($partial);
}
sub fw_port {
my $juniper = shift;
my $partial = shift;
return $juniper->qb_fw_port($partial);
}
# Use LLDP
sub hasCDP {
my $juniper = shift;
return $juniper->hasLLDP();
}
sub c_ip {
my $juniper = shift;
my $partial = shift;
return $juniper->lldp_ip($partial);
}
sub c_if {
my $juniper = shift;
my $partial = shift;
return $juniper->lldp_if($partial);
}
sub c_port {
my $juniper = shift;
my $partial = shift;
return $juniper->lldp_port($partial);
}
sub c_id {
my $juniper = shift;
my $partial = shift;
return $juniper->lldp_id($partial);
}
sub c_platform {
my $juniper = shift;
my $partial = shift;
return $juniper->lldp_rem_sysdesc($partial);
}
# Pseudo ENTITY-MIB methods
# This class supports both virtual chassis (stackable) and physical chassis
# based devices, identify if we have a virtual chassis so that we return
# appropriate entPhysicalClass and correct ordering
sub _e_is_virtual {
my $juniper = shift;
my $v_test = $juniper->jnxVirtualChassisMemberRole() || {};
#If we are functioning as a stack someone should be master
foreach my $iid ( keys %$v_test ) {
my $role = $v_test->{$iid};
return 1 if ($role =~ /master/i);
}
return 0;
}
sub _e_virtual_index {
my $juniper = shift;
my $containers = $juniper->jnxContainersWithin() || {};
my $members = $juniper->jnxVirtualChassisMemberRole() || {};
my %v_index;
foreach my $key (keys %$containers) {
foreach my $member ( keys %$members ) {
# Virtual chassis members start at zero
$member++;
# We will be duplicating and eliminating some keys,
# but this is for the benefit of e_parent()
my $index = sprintf ("%02d", $key) . sprintf ("%02d", $member) . "0000";
my $iid = "$key\.$member\.0\.0";
$v_index{$iid} = $index;
}
unless ($containers->{$key}) {
my $index = sprintf ("%02d", $key) . "000000";
$v_index{$key} = $index;
}
}
return \%v_index;
}
sub e_index {
my $juniper = shift;
my $contents = $juniper->jnxContentsDescr() || {};
my $containers = $juniper->jnxContainersDescr() || {};
my $virtuals = $juniper->_e_virtual_index() || {};
my $is_virtual = $juniper->_e_is_virtual();
# Format into consistent integer format so that numeric sorting works
my %e_index;
if ($is_virtual) {
foreach my $key ( keys %$virtuals ) {
$e_index{$key} = $virtuals->{$key};
}
}
else {
foreach my $key ( keys %$containers ) {
$e_index{$key} = sprintf ("%02d", $key) . "000000";
}
}
foreach my $key ( keys %$contents ) {
$e_index{$key} = join( '', map { sprintf "%02d", $_ } split /\./, $key );
}
return \%e_index;
}
sub e_class {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $fru_type = $juniper->jnxFruType() || {};
my $c_type = $juniper->jnxContainersDescr() || {};
my $is_virtual = $juniper->_e_is_virtual();
my %e_class;
foreach my $iid ( keys %$e_index ) {
my $type = $fru_type->{$iid} || 0;
my $container = $c_type->{$iid} || 0;
if ( $type =~ /power/i ) {
$e_class{$iid} = 'powerSupply';
}
elsif ( $type =~ /fan/i ) {
$e_class{$iid} = 'fan';
}
elsif ( $type ) {
$e_class{$iid} = 'module';
}
# Shouldn't get here if we have type which means
# we only have container, chassis, and stack left
elsif (($container =~ /chassis/i) and (!$is_virtual) ) {
$e_class{$iid} = 'chassis';
}
elsif (($container =~ /chassis/i) and ($is_virtual)) {
$e_class{$iid} = 'stack';
}
# Were calling the second level chassis a container in the case
# of a virtual chassis but not sure that it really matters
else {
$e_class{$iid} = 'container';
}
}
return \%e_class;
}
sub e_descr {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $box_descr = $juniper->jnxBoxDescr || 0;
my $contents = $juniper->jnxContentsDescr() || {};
my $containers = $juniper->jnxContainersDescr() || {};
my %e_descr;
foreach my $iid ( keys %$e_index ) {
my $content_descr = $contents->{$iid} || 0;
my $container_descr = $containers->{$iid} || 0;
if ($content_descr) {
$e_descr{$iid} = $content_descr;
}
elsif ($container_descr and $container_descr !~ /chassis/) {
$e_descr{$iid} = $container_descr;
}
elsif ($container_descr and $container_descr =~ /chassis/) {
$e_descr{$iid} = $box_descr;
}
# We should only be left with virtual entries created in
# _e_virtual_index()
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
my $descr = $containers->{$1};
$e_descr{$iid} = $descr;
}
# Anything past here undef
}
return \%e_descr;
}
sub e_serial {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $serials = $juniper->jnxContentsSerialNo() || {};
my $e_class = $juniper->e_class() || {};
my $is_virtual = $juniper->_e_is_virtual();
my $box_serial = $juniper->serial();
my %e_serial;
foreach my $iid ( keys %$e_index ) {
my $serial = $serials->{$iid} || '';
my $class = $e_class->{$iid} || '';
# Chassis serial number is seperate on true chassis
# Virtual chassis (stack) report master switch serial
if (!$is_virtual and ($class =~ /chassis/i)){
$e_serial{$iid} = $box_serial;
}
elsif (($serial !~ /^\w/) or ($serial =~ /builtin/i)) {
next;
}
else {
$e_serial{$iid} = $serial;
}
}
return \%e_serial;
}
sub e_fru {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $frus = $juniper->jnxContentsPartNo() || {};
my %e_fru;
foreach my $iid ( keys %$e_index ) {
my $fru = $frus->{$iid} || '';
if ( ($fru !~ /^\w/) or ($fru =~ /builtin/i)) {
$e_fru{$iid} = "false";
}
else {
$e_fru{$iid} = "true";
}
}
return \%e_fru;
}
sub e_type {
my $juniper = shift;
my $e_index = $juniper->e_index() || {};
my $contents = $juniper->e_contents_type() || {};
my $containers = $juniper->e_containers_type() || {};
my %e_type;
foreach my $iid ( keys %$e_index ) {
my $content_type = $contents->{$iid} || 0;
my $container_type = $containers->{$iid} || 0;
if ($content_type) {
$content_type =~ s/\.0//;
$e_type{$iid} = $content_type;
}
elsif ($container_type) {
$container_type =~ s/\.0//;
$e_type{$iid} = $container_type;
}
# We should only be left with virtual entries created in
# _e_virtual_index()
elsif ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) {
my $descr = $containers->{$1};
$descr =~ s/\.0//;
$e_type{$iid} = $descr;
}
# Anything past here undef
}
return \%e_type;
}
sub e_vendor {
my $juniper = shift;
my $e_idx = $juniper->e_index() || {};
my %e_vendor;
foreach my $iid ( keys %$e_idx ) {
$e_vendor{$iid} = 'juniper';
}
return \%e_vendor;
}
sub e_pos {
my $juniper = shift;
# We could look at index levels, but his will work as well
return $juniper->e_index();
}
sub e_parent {
my $juniper = shift;
my $e_idx = $juniper->e_index() || {};
my $c_within = $juniper->jnxContainersWithin() || {};
my $e_descr = $juniper->e_descr() || {};
my $is_virtual = $juniper->_e_is_virtual();
my %e_parent;
foreach my $iid ( keys %$e_idx ) {
next unless $iid;
my ($idx, $l1,$l2, $l3) = split /\./, $iid;
my $within = $c_within->{$idx};
my $descr = $e_descr->{$iid};
if ( !$is_virtual and ($iid =~ /^(\d+)\.\d+/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
}
elsif ( $is_virtual and ($descr =~ /chassis/i) and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . "000000";
}
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)(\.0)+?/) ) {
$e_parent{$iid} = sprintf ("%02d", $within) . sprintf ("%02d", $2) . "0000";
}
elsif ( $is_virtual and ($iid =~ /^(\d+)\.(\d+)\.[1-9]+/) ) {
$e_parent{$iid} = sprintf ("%02d", $1) . sprintf ("%02d", $2) . "0000";
}
elsif ( defined $within and $iid =~ /\d+/ ) {
$e_parent{$iid} = sprintf ("%02d", $within) . "000000";
}
else {
next;
}
}
return \%e_parent;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Juniper - Perl5 Interface to L3 Juniper Devices
SNMP::Info::Layer3::Juniper - SNMP Interface to L3 Juniper Devices
=head1 AUTHOR
@@ -108,7 +590,6 @@ Bill Fenner
my $juniper = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myrouter',
Community => 'public',
Version => 2
@@ -120,7 +601,7 @@ Bill Fenner
=head1 DESCRIPTION
Subclass for Generic Juniper Routers running JUNOS
Subclass for Juniper Devices running JUNOS
=head2 Inherited Classes
@@ -128,18 +609,30 @@ Subclass for Generic Juniper Routers running JUNOS
=item SNMP::Info::Layer3
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
=item F<JUNIPER-VLAN-MIB> dated "200901090000Z" -- Fri Jan 09 00:00:00 2009 UTC or later.
See L<SNMP::Info::Layer3> for its own MIB requirements.
=item F<JUNIPER-CHASSIS-DEFINES-MIB>
=item F<JUNIPER-MIB>
=item F<JUNIPER-VIRTUALCHASSIS-MIB>
=back
=head2 Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -148,34 +641,194 @@ These are methods that return scalar value from SNMP
=item $juniper->vendor()
Returns 'juniper'
Returns 'juniper'
=item $juniper->os()
Returns 'junos'
Returns 'junos'
=item $juniper->os_ver()
Returns the software version extracted from sysDescr.
Returns the software version extracted first from C<sysDescr> or
C<lldpLocSysDesc> if not available in C<sysDescr>.
=item $juniper->model()
Returns the model from sysObjectID, with jnxProductName
removed from the beginning.
Returns the model from C<sysObjectID>, with C<jnxProductName> removed from the
beginning.
=item $juniper->serial()
Returns serial number
(C<jnxBoxSerialNo.0>)
=item $juniper->serial()
Returns the MAC address used by this bridge when it must be referred
to in a unique fashion.
(C<dot1dBaseBridgeAddress>)
=item $juniper->hasCDP()
Returns whether LLDP is enabled.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE ENTRIES
=head2 Global Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $juniper->v_index()
(C<jnxExVlanTag>)
=item $juniper->v_name()
(C<jnxExVlanName>)
=item $juniper->v_type()
(C<jnxExVlanType>)
=item $juniper->i_trunk()
(C<jnxExVlanPortAccessMode>)
=item $juniper->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $juniper->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the egress list for the port.
=back
=head2 Topology information
These methods return Link Layer Discovery Protocol (LLDP) information. See
documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=over
=item $juniper->c_id()
Returns C<lldp_id>
=item $juniper->c_if()
Returns C<lldp_if>
=item $juniper->c_ip()
Returns C<lldp_ip>
=item $juniper->c_platform()
Returns C<lldp_rem_sysdesc>
=item $juniper->c_port()
Returns C<lldp_port>
=back
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
=over
=item $juniper->fw_mac()
Returns reference to hash of forwarding table MAC Addresses
(C<dot1dTpFdbAddress>)
=item $juniper->fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid)
(C<dot1dTpFdbPort>)
=back
=head2 Pseudo F<ENTITY-MIB> information
These methods emulate F<ENTITY-MIB> Physical Table methods using
F<JUNIPER-MIB> and F<JUNIPER-VIRTUALCHASSIS-MIB>.
=over
=item $juniper->e_index()
Returns reference to hash. Key: IID, Value: Integer, Indices are combined
into a eight digit integer, each index is two digits padded with leading zero
if required.
=item $juniper->e_class()
Returns reference to hash. Key: IID, Value: General hardware type.
=item $juniper->e_descr()
Returns reference to hash. Key: IID, Value: Human friendly name
=item $juniper->e_hwver()
Returns reference to hash. Key: IID, Value: Hardware version
=item $juniper->e_vendor()
Returns reference to hash. Key: IID, Value: juniper
=item $juniper->e_serial()
Returns reference to hash. Key: IID, Value: Serial number
=item $juniper->e_pos()
Returns reference to hash. Key: IID, Value: The relative position among all
entities sharing the same parent.
=item $juniper->e_type()
Returns reference to hash. Key: IID, Value: Type of component/sub-component
as defined in F<JUNIPER-CHASSIS-DEFINES-MIB>.
=item $juniper->e_parent()
Returns reference to hash. Key: IID, Value: The value of e_index() for the
entity which 'contains' this entity. A value of zero indicates this entity
is not contained in any other entity.
=item $entity->e_fru()
BOOLEAN. Is a Field Replaceable unit?
(C<entPhysicalFRU>)
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

196
Info/Layer3/Microsoft.pm Normal file
View File

@@ -0,0 +1,196 @@
# SNMP::Info::Layer3::Microsoft
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Microsoft;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Microsoft::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Microsoft::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'microsoft';
}
sub os {
return 'windows';
}
sub os_ver {
return '';
}
sub model {
return 'Windows Router';
}
sub serial {
return '';
}
# $l3->interfaces() - Map the Interfaces to their physical names
# Add interface number to interface name because if MS Win
# have identical interface cards ("HP NC7782 Gigabit Server Adapter"
# for example), than MS Win return identical ifDescr
sub interfaces {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->i_index($partial);
my $descriptions = $l3->i_description($partial);
my %interfaces = ();
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
$interfaces{$iid} = sprintf( "(%U) %s", $iid, $desc );
}
return \%interfaces;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Microsoft - SNMP Interface to L3 Microsoft Windows router
=head1 AUTHOR
begemot
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $router = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $router->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Generic Microsoft Routers running Microsoft Windows OS
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
Returns C<'microsoft'>
=item $router->os()
Returns C<'windows'>
=item $router->os_ver()
Returns ''
=item $router->model()
Returns C<'Windows Router'>
=item $router->serial()
Returns ''
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $router->interfaces()
Map the Interfaces to their physical names. Adds interface number to
interface name because identical interface cards return identical C<ifDescr>.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

175
Info/Layer3/Mikrotik.pm Normal file
View File

@@ -0,0 +1,175 @@
# SNMP::Info::Layer3::Mikrotik
# $Id$
#
# Copyright (c) 2011 Jeroen van Ingen
# 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::Layer3::Mikrotik;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Mikrotik::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Mikrotik::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'HOST-RESOURCES-MIB' => 'hrSystem',
'MIKROTIK-MIB' => 'mtxrLicVersion',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'hrSystemUptime' => 'hrSystemUptime',
'os_ver' => 'mtxrLicVersion',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'mikrotik';
}
sub model {
my $mikrotik = shift;
my $descr = $mikrotik->description() || '';
my $model = undef;
$model = $1 if ( $descr =~ /^RouterOS\s+(\S+)$/i );
return $model;
}
sub os {
return 'routeros';
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Mikrotik - SNMP Interface to Mikrotik devices
=head1 AUTHORS
Jeroen van Ingen
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $mikrotik = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $mikrotik->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Mikrotik devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<HOST-RESOURCES-MIB>
=item F<MIKROTIK-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $mikrotik->vendor()
Returns 'mikrotik'.
=item $mikrotik->os()
Returns 'routeros'.
=item $mikrotik->model()
Tries to extract the device model from C<sysDescr>.
=item $mikrotik->os_ver()
Returns the value of C<mtxrLicVersion>.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<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 Overrides
None.
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=cut

View File

@@ -1,90 +1,89 @@
# SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel N16XX devices
# Eric Miller
# $Id$
#
# Copyright (c) 2004,2005 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::N1600;
# $Id$
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::SONMP;
use vars qw/$VERSION $DEBUG %GLOBALS %FUNCS $INIT %MIBS %MUNGE/;
$VERSION = '1.04';
@SNMP::Info::Layer3::N1600::ISA = qw/SNMP::Info::Layer3 SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer3::N1600::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::SONMP Exporter/;
@SNMP::Info::Layer3::N1600::EXPORT_OK = qw//;
%MIBS = ( %SNMP::Info::Layer3::MIBS,
%SNMP::Info::SONMP::MIBS,
'SWL2MGMT-MIB' => 'swL2MgmtMIB',
'RAPID-CITY' => 'rapidCity',
);
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
);
$VERSION = '2.08';
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::SONMP::FUNCS,
# SWL2MGMT-MIB
# swL2PortInfoTable
'n1600_nway_status' => 'swL2PortInfoNwayStatus',
# swL2PortCtrlTable
'n1600_nway_state' => 'swL2PortCtrlNwayState',
);
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::SONMP::MIBS,
'SWL2MGMT-MIB' => 'swL2MgmtMIB',
'RAPID-CITY' => 'rapidCity',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, %SNMP::Info::SONMP::GLOBALS, );
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::SONMP::FUNCS,
# SWL2MGMT-MIB
# swL2PortInfoTable
'n1600_nway_status' => 'swL2PortInfoNwayStatus',
# swL2PortCtrlTable
'n1600_nway_state' => 'swL2PortCtrlNwayState',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::SONMP::MUNGE,
);
# Method OverRides
sub bulkwalk_no { 1; }
sub model {
my $n1600 = shift;
my $id = $n1600->id();
unless (defined $id){
print " SNMP::Info::Layer3::N1600::model() - Device does not support sysObjectID\n" if $n1600->debug();
return undef;
my $id = $n1600->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::N1600::model() - Device does not support sysObjectID\n"
if $n1600->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
@@ -104,21 +103,23 @@ sub os {
sub os_ver {
my $n1600 = shift;
my $descr = $n1600->description();
return undef unless defined $descr;
return unless defined $descr;
if ($descr =~ m/(\d+\.\d+\.\d+\.\d+)/){
if ( $descr =~ m/(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return undef;
return;
}
sub interfaces {
my $n1600 = shift;
my $i_index = $n1600->i_index();
my $n1600 = shift;
my $partial = shift;
my $i_index = $n1600->i_index($partial) || {};
my %if;
foreach my $iid (keys %$i_index){
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
@@ -129,11 +130,13 @@ sub interfaces {
}
sub i_duplex {
my $n1600 = shift;
my $nway_status = $n1600->n1600_nway_status();
my $n1600 = shift;
my $partial = shift;
my $nway_status = $n1600->n1600_nway_status($partial) || {};
my %i_duplex;
foreach my $iid (keys %$nway_status){
foreach my $iid ( keys %$nway_status ) {
my $duplex = $nway_status->{$iid};
next unless defined $duplex;
next if $duplex =~ /other/i;
@@ -144,11 +147,13 @@ sub i_duplex {
}
sub i_duplex_admin {
my $n1600 = shift;
my $nway_state = $n1600->n1600_nway_state();
my $n1600 = shift;
my $partial = shift;
my $nway_state = $n1600->n1600_nway_state($partial) || {};
my %i_duplex;
foreach my $iid (keys %$nway_state){
foreach my $iid ( keys %$nway_state ) {
my $duplex = $nway_state->{$iid};
next unless defined $duplex;
next if $duplex =~ /other/i;
@@ -169,7 +174,7 @@ __END__
=head1 NAME
SNMP::Info::Layer3::N1600 - Perl5 Interface to Nortel 16XX Network Devices
SNMP::Info::Layer3::N1600 - SNMP Interface to Nortel 16XX Network Devices
=head1 AUTHOR
@@ -181,7 +186,6 @@ Eric Miller
my $n1600 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly on to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 1
@@ -197,8 +201,8 @@ Eric Miller
Provides abstraction to the configuration information obtainable from a Nortel
N16XX 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.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $n1600 = new SNMP::Info::Layer3::N1600(...);
@@ -216,9 +220,9 @@ my $n1600 = new SNMP::Info::Layer3::N1600(...);
=over
=item SWL2MGMT-MIB
=item F<SWL2MGMT-MIB>
=item RAPID-CITY
=item F<RAPID-CITY>
=item Inherited Classes' MIBs
@@ -226,16 +230,6 @@ See classes listed above for their required MIBs.
=back
MIBs can be found on the CD that came with your product.
Or, they can be downloaded directly from Nortel regardless of support
contract status.
Go to http://www.nortel.com Techninal Support, Browse Technical Support,
Select by product, Java Device Manager, Software. Download the latest version.
After installation, all mibs are located under the install directory under mibs
and the repspective product line.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -249,7 +243,7 @@ Return C<1>. Bulkwalk is currently turned off for this class.
=item $n1600->model()
Returns model type. Checks $n1600->id() against the
RAPID-CITY-MIB and then parses out rcA.
F<RAPID-CITY-MIB> and then parses out C<rcA>.
=item $n1600->vendor()
@@ -259,6 +253,10 @@ Returns 'nortel'
Returns 'passport'
=item $n1600->os_ver()
Returns os version extracted from C<sysDescr>.
=back
=head2 Overrides
@@ -271,19 +269,19 @@ Required by SNMP::Info::SONMP. Number representing the number of ports
reserved per slot within the device MIB.
Returns 64 since largest switch has 48 ports. Since these switches can
not stack, the only requirment to reserve more than the max number of ports.
not stack, the only requirement to reserve more than the max number of ports.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::SONMP
See documentation in SNMP::SONMP::Layer3 for details.
=head1 TABLE ENTRIES
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
@@ -296,7 +294,7 @@ to a hash.
Returns reference to hash of interface names to iids.
Places a 1 in front of index number. This is required for compatibilty with
Places a 1 in front of index number. This is required for compatibility with
SNMP::Info::SONMP.
=item $n1600->i_duplex()
@@ -311,10 +309,10 @@ Returns reference to hash of interface administrative link duplex status.
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in SNMP::Info::Layer3 for details.
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::SONMP
See documentation in SNMP::Info::SONMP for details.
See documentation in L<SNMP::Info::SONMP/"TABLE METHODS"> for details.
=cut

253
Info/Layer3/NetSNMP.pm Normal file
View File

@@ -0,0 +1,253 @@
# SNMP::Info::Layer3::NetSNMP
# $Id$
#
# Copyright (c) 2008 Bill Fenner
# 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::Layer3::NetSNMP;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::NetSNMP::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::NetSNMP::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'UCD-SNMP-MIB' => 'versionTag',
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
'HOST-RESOURCES-MIB' => 'hrSystem',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'netsnmp_vers' => 'versionTag',
'hrSystemUptime' => 'hrSystemUptime',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'Net-SNMP';
}
sub os {
my $netsnmp = shift;
my $descr = $netsnmp->description();
return $1 if ( $descr =~ /^(\S+)\s+/ );
return;
}
sub os_ver {
my $netsnmp = shift;
my $descr = $netsnmp->description();
my $vers = $netsnmp->netsnmp_vers();
my $os_ver = undef;
$os_ver = $1 if ( $descr =~ /^\S+\s+\S+\s+(\S+)\s+/ );
if ($vers) {
$os_ver = "???" unless defined($os_ver);
$os_ver .= " / Net-SNMP " . $vers;
}
return $os_ver;
}
sub serial {
return '';
}
# sysUptime gives us the time since the SNMP daemon has restarted,
# so return the system uptime since that's probably what the user
# wants. (Caution: this could cause trouble if using
# sysUptime-based discontinuity timers or other TimeStamp
# objects.
sub uptime {
my $netsnmp = shift;
my $uptime;
$uptime = $netsnmp->hrSystemUptime();
return $uptime if defined $uptime;
return $netsnmp->SUPER::uptime();
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo0 etc
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::NetSNMP - SNMP Interface to L3 Net-SNMP Devices
=head1 AUTHORS
Bradley Baetz and Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $netsnmp = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $netsnmp->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Generic Net-SNMP devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<UCD-SNMP-MIB>
=item F<NET-SNMP-TC>
=item F<HOST-RESOURCES-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $netsnmp->vendor()
Returns 'Net-SNMP'.
=item $netsnmp->os()
Returns the OS extracted from C<sysDescr>.
=item $netsnmp->os_ver()
Returns the software version extracted from C<sysDescr>, along
with the Net-SNMP version.
=item $netsnmp->uptime()
Returns the system uptime instead of the agent uptime.
NOTE: discontinuity timers and other Time Stamp based objects
are based on agent uptime, so use orig_uptime().
=item $netsnmp->serial()
Returns ''.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<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 Overrides
=over
=item $netsnmp->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores loopback
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=head1 NOTES
In order to cause SNMP::Info to classify your device into this class, it
may be necessary to put a configuration line into your F<snmpd.conf>
similar to
sysobjectid .1.3.6.1.4.1.8072.3.2.N
where N is the object ID for your OS from the C<NET-SNMP-TC> MIB (or
255 if not listed). Some Net-SNMP installations default to an
incorrect return value for C<system.sysObjectId>.
In order to recognize a Net-SNMP device as Layer3, it may be necessary
to put a configuration line similar to
sysservices 76
in your F<snmpd.conf>.
=cut

207
Info/Layer3/Netscreen.pm Normal file
View File

@@ -0,0 +1,207 @@
# SNMP::Info::Layer3::Netscreen
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Netscreen;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Netscreen::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Netscreen::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'NETSCREEN-SMI' => 'netscreenSetting',
'NETSCREEN-PRODUCTS-MIB' => 'netscreenGeneric',
'NETSCREEN-INTERFACE-MIB' => 'nsIfIndex',
'NETSCREEN-SET-GEN-MIB' => 'nsSetGenSwVer',
);
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, 'os_version' => 'nsSetGenSwVer', );
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub layers {
return '01001100';
}
sub vendor {
return 'netscreen';
}
sub os {
return 'screenos';
}
sub os_ver {
my $netscreen = shift;
my $descr = $netscreen->description();
if ( $descr =~ m/version (\d\S*) \(SN: / ) {
return $1;
}
return;
}
sub serial {
my $netscreen = shift;
my $e_serial = $netscreen->e_serial() || {};
my $serial = $e_serial->{1} || undef;
return $1 if ( defined $serial and $serial =~ /(\d+)/ );
my $descr = $netscreen->description();
if ( $descr =~ m/version .*\(SN: (\d\S*),/ ) {
return $1;
}
return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Netscreen - SNMP Interface to Juniper Netscreen Devices
=head1 AUTHOR
Kent Hamilton
=head1 SYNOPSIS
#Let SNMP::Info determine the correct subclass for you.
my $netscreen = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $netscreen->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Netscreen device through SNMP. See inherited classes' documentation for
inherited methods.
my $netscreen = new SNMP::Info::Layer3::Netscreen(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<NETSCREEN-SMI>
=item F<NETSCREEN-PRODUCTS-MIB>
=item F<NETSCREEN-INTERFACE-MIB>
=item F<NETSCREEN-SET-GEN-MIB>
=item Inherited Classes
See L<SNMP::Info::Layer3/"Required MIBs"> and its inherited classes.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $netscreen->vendor()
Returns 'netscreen'
=item $netscreen->os()
Returns C<'screenos'>
=item $netscreen->os_ver()
Extracts the OS version from the description string.
=item $netscreen->serial()
Returns serial number..
=back
=head2 Overrides
=over
=item $netscreen->layers()
Returns 01001100. Device doesn't report layers properly, modified to reflect
Layer3 functionality.
=back
=head2 Globals imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Table Methods imported from SNMP::Info::Layer3
See L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

220
Info/Layer3/PacketFront.pm Normal file
View File

@@ -0,0 +1,220 @@
# SNMP::Info::Layer3::PacketFront
# $Id$
#
# Copyright (c) 2011 Jeroen van Ingen
# 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::Layer3::PacketFront;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::PacketFront::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::PacketFront::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
'UCD-SNMP-MIB' => 'versionTag',
'NET-SNMP-TC' => 'netSnmpAgentOIDs',
'HOST-RESOURCES-MIB' => 'hrSystem',
'PACKETFRONT-PRODUCTS-MIB' => 'drg100',
'PACKETFRONT-DRG-MIB' => 'productName',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'snmpd_vers' => 'versionTag',
'hrSystemUptime' => 'hrSystemUptime',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'packetfront';
}
sub os {
# Only DRGOS for now (not tested with other product lines than DRG series)
my $pfront = shift;
my $descr = $pfront->description();
if ( $descr =~ /drgos/i ) {
return 'drgos';
} else {
return;
}
}
sub os_ver {
my $pfront = shift;
my $descr = $pfront->description();
my $os_ver = undef;
if ( $descr =~ /Version:\sdrgos-(\w+)-([\w\-\.]+)/ ) {
$os_ver = $2;
}
return $os_ver;
}
sub serial {
my $pfront = shift;
return $pfront->productSerialNo();
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo0 etc
if ( $interfaces->{$if} =~ /\blo\d*\b/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::PacketFront - SNMP Interface to PacketFront devices
=head1 AUTHORS
Jeroen van Ingen
initial version based on SNMP::Info::Layer3::NetSNMP by Bradley Baetz and Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $pfront = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $pfront->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for PacketFront devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<UCD-SNMP-MIB>
=item F<NET-SNMP-TC>
=item F<HOST-RESOURCES-MIB>
=item F<PACKETFRONT-PRODUCTS-MIB>
=item F<PACKETFRONT-DRG-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $pfront->vendor()
Returns 'packetfront'.
=item $pfront->os()
Returns the OS extracted from C<sysDescr>.
=item $pfront->os_ver()
Returns the software version extracted from C<sysDescr>.
=item $pfront->serial()
Returns the value of productSerialNo.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<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 Overrides
=over
=item $pfront->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores loopback
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3> for details.
=cut

File diff suppressed because it is too large Load Diff

294
Info/Layer3/Pf.pm Normal file
View File

@@ -0,0 +1,294 @@
# SNMP::Info::Layer3::Pf
# $Id$
#
# Copyright (c) 2010 Max Baker
# 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 Pf Networks, Inc. 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::Pf;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Pf::ISA = qw/SNMP::Info::LLDP SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Pf::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::LLDP::MIBS,
# Enterprise container where BEGEMOT-* lives
'FOKUS-MIB' => 'fokus',
# MIBs used included in Layer3 and above:
# UDP-MIB
# TCP-MIB
# IF-MIB
#
# Stuff in these MIBs but not used for Netdisco yet for my test device:
#
#'BEGEMOT-SNMPD-MIB',
#'BEGEMOT-PF-MIB',
#'BEGEMOT-NETGRAPH-MIB',
#'BEGEMOT-MIB2-MIB',
#'BEGEMOT-HOSTRES-MIB',
# HOST-RESOURCES-MIB
# IP-FORWARD-MIB
#
# Nothing in these MIBs for my test device:
#
#'BEGEMOT-IP-MIB',
#'BEGEMOT-MIB',
#'BEGEMOT-BRIDGE-MIB',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::LLDP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::LLDP::MUNGE,
);
sub vendor {
return 'FreeBSD';
}
sub model {
my $pf = shift;
my $descr = $pf->description() || '';
my $model = undef;
$model = $1 if ( $descr =~ /FreeBSD\s+(\S+)/ );
return $model if defined $model;
return $pf->os_ver();
}
sub os {
return 'Pf';
}
sub os_ver {
my $pf = shift;
my $id = $pf->id();
my $os_ver = &SNMP::translateObj($id);
return $id unless defined $os_ver;
# From /usr/share/snmp/defs/tree.def on a Pf Machine
# (2 begemotSnmpdDefs
# (1 begemotSnmpdAgent
# (1 begemotSnmpdAgentFreeBSD OID op_dummy)
# We're leaving the 1.1 and trimming off up to the 2
$os_ver =~ s/fokus.1.1.2.//;
return $os_ver;
}
# Use LLDP
sub hasCDP {
my $pf = shift;
return $pf->hasLLDP();
}
sub c_ip {
my $pf = shift;
my $partial = shift;
return $pf->lldp_ip($partial);
}
sub c_if {
my $pf = shift;
my $partial = shift;
return $pf->lldp_if($partial);
}
sub c_port {
my $pf = shift;
my $partial = shift;
return $pf->lldp_port($partial);
}
sub c_id {
my $pf = shift;
my $partial = shift;
return $pf->lldp_id($partial);
}
sub c_platform {
my $pf = shift;
my $partial = shift;
return $pf->lldp_rem_sysdesc($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Pf - SNMP Interface to FreeBSD-Based Firewalls using Pf /Pf Sense
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $pf = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $pf->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Free-BSD PF-Based devices
=head1 LLDP Support
LLDP Support is included but untested in this Device Class. It is reported
that the available CDP/LLDP modules for net-snmp don't work on FreeBSD (on
which pfSense is based) as they assume certain Linux specific Ethernet
structures. This problem is apparently solved on PF based firewall appliances
by using the ladvd package, for which a port may be found here:
L<http://www.freshports.org/net/ladvd/>. I'm not sure if this module ties into
Net-SNMP or not.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<FOKUS-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=item $pf->vendor()
Returns 'FreeBSD'
=item $pf->hasCDP()
Returns whether LLDP is enabled.
=item $pf->model()
Grabs the os version from C<sysDescr>
=item $pf->os()
Returns 'Pf'
=item $pf->os_ver()
Tries to reference $pf->id() to one of the product MIBs listed above.
Will probably return a truncation of the default OID for pf-based systems
C<enterprises.12325.1.1.2.1.1>.
=back
=head2 Global Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $pf->c_id()
Returns LLDP information.
=item $pf->c_if()
Returns LLDP information.
=item $pf->c_ip()
Returns LLDP information.
=item $pf->c_platform()
Returns LLDP information.
=item $pf->c_port()
Returns LLDP information.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See documentation in L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=cut

189
Info/Layer3/SonicWALL.pm Normal file
View File

@@ -0,0 +1,189 @@
package SNMP::Info::Layer3::SonicWALL;
# Copyright (c) 2011 Netdisco Project
# 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.
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::SonicWALL::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::SonicWALL::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::Layer3::MIBS,
'SNWL-COMMON-MIB' => 'snwlCommonModule',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::Layer3::GLOBALS,
#From SNWL-COMMON-MIB
'sw_model' => 'snwlSysModel',
'sw_serial' => 'snwlSysSerialNumber',
'sw_firmware' => 'snwlSysFirmwareVersion',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'SonicWALL';
}
sub os {
my $sonicos = shift;
my $swos = $sonicos->sw_firmware();
if ($swos =~ /Enhanced/) {
return 'SonicOS Enhanced';
}
return 'SonicOS Standard';
}
sub os_ver {
my $sonicosver = shift;
my $osver = $sonicosver->sw_firmware();
if ( $osver =~ /\S+\s\S+\s(\S+)/) {
return $1
}
}
sub serial {
my $sw = shift;
my $serial = $sw->sw_serial();
return $serial;
}
sub model {
my $swmodel = shift;
my $model = $swmodel->sw_model();
return $model;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::SonicWALL - SNMP Interface to L3 SonicWALL Firewall
=head1 AUTHOR
phishphreek@gmail.com
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $router = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $router->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Generic SonicWALL Firewalls
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=head2 Overrides
=over
=item $router->vendor()
Returns C<'SonicWALL'>
=item $router->os()
Returns C<'SonicOS'>
=item $router->os_ver()
Returns '4.2.0.0-10e'
=item $router->model()
Returns C<'PRO 3060 Enhanced'>
=item $router->serial()
Returns the MAC address of the first X0/LAN interface.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

204
Info/Layer3/Sun.pm Normal file
View File

@@ -0,0 +1,204 @@
# SNMP::Info::Layer3::Sun
# $Id$
#
# Copyright (c) 2008 Eric Miller
# 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::Layer3::Sun;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Sun::ISA = qw/SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Sun::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( %SNMP::Info::Layer3::MIBS, );
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
'sun_hostid' => '.1.3.6.1.4.1.42.3.1.2.0',
'motd' => '.1.3.6.1.4.1.42.3.1.3.0',
);
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub vendor {
return 'sun';
}
sub os {
return 'sun';
}
sub os_ver {
my $sun = shift;
my $descr = $sun->motd();
return unless defined $descr;
if ( $descr =~ m/SunOS (\S+)/ ) {
return $1;
}
return;
}
sub model {
return 'Solaris Router';
}
sub serial {
my $sun = shift;
my $serial = unpack( "H*", $sun->sun_hostid() );
return $serial;
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo0
if ( $interfaces->{$if} =~ /\blo0\b/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Sun - SNMP Interface to L3 Sun Solaris
=head1 AUTHOR
begemot
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $sun = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'mysunrouter',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $sun->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Generic Sun Routers running SunOS
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $sun->vendor()
Returns 'sun'
=item $sun->os()
Returns 'sun'
=item $sun->os_ver()
Returns the software version extracted from message of the day.
=item $sun->model()
Returns 'Solaris Router'
=item $sun->serial()
Returns serial number
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $sun->i_ignore()
Returns reference to hash. Increments value of IID if port is to be ignored.
Ignores loopback
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

194
Info/Layer3/Timetra.pm Normal file
View File

@@ -0,0 +1,194 @@
# SNMP::Info::Layer3::Timetra
# $Id$
#
# Copyright (c) 2008 Bill Fenner
#
# 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::Timetra;
use strict;
use Exporter;
use SNMP::Info::Layer3;
@SNMP::Info::Layer3::Timetra::ISA = qw/SNMP::Info::Layer3
Exporter/;
@SNMP::Info::Layer3::Timetra::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( %SNMP::Info::Layer3::MIBS, 'TIMETRA-GLOBAL-MIB' => 'timetraReg', );
%GLOBALS = ( %SNMP::Info::Layer3::GLOBALS, );
%FUNCS = ( %SNMP::Info::Layer3::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer3::MUNGE, );
sub model {
my $timetra = shift;
my $id = $timetra->id();
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^tmnxModel//;
return $model;
}
sub os {
return 'TiMOS';
}
sub vendor {
return 'alcatel-lucent';
}
sub os_ver {
my $timetra = shift;
my $descr = $timetra->description();
if ( $descr =~ m/^TiMOS-(\S+)/ ) {
return $1;
}
# No clue what this will try but hey
return $timetra->SUPER::os_ver();
}
# The interface description contains the SFP type, so
# to avoid losing historical information through a configuration change
# we use interface name instead.
sub interfaces {
my $alu = shift;
my $partial = shift;
return $alu->orig_i_name($partial);
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::Timetra - SNMP Interface to Alcatel-Lucent SR
=head1 AUTHOR
Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $alu = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
# These arguments are passed directly to SNMP::Session
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $alu->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for Alcatel-Lucent Service Routers
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=back
=head2 Required MIBs
=over
=item F<TIMETRA-GLOBAL-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $alu->vendor()
Returns 'alcatel-lucent'
=item $alu->os()
Returns 'TiMOS'
=item $alu->os_ver()
Grabs the version string from C<sysDescr>.
=item $alu->model()
Tries to reference $alu->id() to one of the product MIBs listed above
Removes 'tmnxModel' from the name for readability.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $alu->interfaces()
Returns C<ifName>, since the default Layer3 C<ifDescr> varies based
upon the transceiver inserted.
=back
=head2 Table Methods imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

215
Info/Layer7.pm Normal file
View File

@@ -0,0 +1,215 @@
# SNMP::Info::Layer7 - SNMP Interface to Layer7 Devices
#
# Copyright (c) 2011 Jeroen van Ingen
#
# 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::Layer7;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::Layer7::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Layer7::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::MIBS,
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
);
%FUNCS = (
%SNMP::Info::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
);
# $l7->model() - Looks at sysObjectID which gives the oid of the system
# name, contained in a propriatry MIB.
sub model {
my $l7 = shift;
my $id = $l7->id();
my $model = &SNMP::translateObj($id);
return $model;
}
sub vendor {
my $l7 = shift;
my $id = $l7->id();
my $vendor = 'unknown';
if ( defined($id) && $id =~ /^(\.1\.3\.6\.1\.4\.1\.\d+)/ ) {
my $enterprise = &SNMP::translateObj($1);
$vendor = $enterprise if defined $enterprise;
}
return $vendor;
}
# By Default we'll use the description field
sub interfaces {
my $l7 = shift;
my $partial = shift;
my $interfaces = $l7->i_index($partial) || {};
my $rptr_port = $l7->rptr_port($partial) || {};
foreach my $port ( keys %$rptr_port ) {
$interfaces->{$port} = $port;
}
return $interfaces;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer7 - SNMP Interface to network devices serving Layer7 only.
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $l7 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $l7->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
# Let's get some basic Port information
my $interfaces = $l7->interfaces();
my $i_up = $l7->i_up();
my $i_speed = $l7->i_speed();
foreach my $iid (keys %$interfaces) {
my $port = $interfaces->{$iid};
my $up = $i_up->{$iid};
my $speed = $i_speed->{$iid}
print "Port $port is $up. Port runs at $speed.\n";
}
=head1 DESCRIPTION
This class is usually used as a superclass for more specific device classes
listed under SNMP::Info::Layer7::* Please read all docs under SNMP::Info
first.
Provides abstraction to the configuration information obtainable from a
Layer7 device through SNMP. Information is stored in a number of MIBs.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $l7 = new SNMP::Info::Layer7(...);
=head2 Inherited Classes
=over
=item SNMP::Info
=back
=head2 Required MIBs
=over
=item None
=back
MIBs required for L<SNMP::Info/"Required MIBs">
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=back
=head2 Overrides
=over
=item $l7->model()
Cross references $l7->id() with product IDs.
=item $l7->vendor()
Tries to discover the vendor by looking up the enterprise number in
C<sysObjectID>.
=back
=head2 Global Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=item $l7->interfaces()
Returns reference to the map between IID and physical Port.
=back
=head2 Table Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=cut

237
Info/Layer7/APC.pm Normal file
View File

@@ -0,0 +1,237 @@
# SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
#
# Copyright (c) 2011 Jeroen van Ingen
#
# 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::Layer7::APC;
use strict;
use Exporter;
use SNMP::Info::Layer7;
@SNMP::Info::Layer7::APC::ISA
= qw/SNMP::Info::Layer7 Exporter/;
@SNMP::Info::Layer7::APC::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.08';
%MIBS = (
%SNMP::Info::Layer7::MIBS,
'PowerNet-MIB' => 'upsBasicIdentModel',
);
%GLOBALS = (
%SNMP::Info::Layer7::GLOBALS,
'ups_serial' => 'upsAdvIdentSerialNumber.0',
'mgmt_serial' => 'experimental.2.4.1.2.1',
'os_ver' => 'experimental.2.4.1.4.1',
'os_bin' => 'experimental.2.4.1.4.2',
'ups_model' => 'upsBasicIdentModel.0',
'ps1_status' => 'upsBasicOutputStatus.0',
'ps2_status' => 'upsBasicBatteryStatus.0',
);
%FUNCS = (
%SNMP::Info::Layer7::FUNCS,
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::Layer7::MUNGE,
);
# Method Overrides
sub os {
return 'aos';
}
sub vendor {
return 'apc';
}
sub model {
my $apc = shift;
return $apc->ups_model();
}
sub serial {
my $apc = shift;
my $ups = $apc->ups_serial() || 'unknown';
my $mgmt = $apc->mgmt_serial() || 'unknown';
return sprintf("UPS: %s, management card: %s", $ups, $mgmt);
}
sub ps1_type {
return 'UPS status';
}
sub ps2_type {
return 'Battery status';
}
1;
__END__
=head1 NAME
SNMP::Info::Layer7::APC - SNMP Interface to APC UPS devices
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $apc = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $apc->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
APC UPS via 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 $apc = new SNMP::Info::Layer7::APC(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer7
=back
=head2 Required MIBs
=over
=item F<POWERNET-MIB>
=back
All required MIBs can be found in the netdisco-mibs package.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $apc->os()
Returns 'aos'
=item $apc->os_bin()
C<POWERNET-MIB::experimental.2.4.1.4.2>
=item $apc->os_ver()
C<POWERNET-MIB::experimental.2.4.1.4.1>
=item $apc->serial()
Combines the UPS serial C<upsAdvIdentSerialNumber.0> with the managment
card serial C<POWERNET-MIB::experimental.2.4.1.2.1> into a pretty string.
=item $apc->vendor()
apc
=item $apc->model()
C<upsBasicIdentModel.0>
=item $apc->ps1_type()
Returns 'UPS status'
=item $apc->ps1_status()
Returns the main UPS status from C<upsBasicOutputStatus.0>
=item $apc->ps2_type()
Returns 'Battery status'
=item $apc->ps2_status()
Returns the battery status from C<upsBasicBatteryStatus.0>
=back
=head2 Globals imported from SNMP::Info::Layer7
See documentation in L<SNMP::Info::Layer7/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Overrides
=over
=back
=head2 Table Methods imported from SNMP::Info::Layer7
See documentation in L<SNMP::Info::Layer7/"TABLE METHODS"> for details.
=head1 MUNGES
=over
=back
=head1 SET METHODS
These are methods that provide SNMP set functionality for overridden methods
or provide a simpler interface to complex set operations. See
L<SNMP::Info/"SETTING DATA VIA SNMP"> for general information on set
operations.
=cut

View File

@@ -1,132 +1,138 @@
# SNMP::Info::MAU - Media Access Unit - RFC 2668
# Max Baker
# $Id$
#
# Copyright (c) 2004,2005 Max Baker changes from version 0.8 and beyond.
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
# Copyright (c) 2002,2003 Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
#
# 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
# * 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.
#
# 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::MAU;
$VERSION = '1.04';
# $Id$
use strict;
use Exporter;
use SNMP::Info;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::MAU::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::MAU::EXPORT_OK = qw//;
%MIBS = ('MAU-MIB' => 'mauMod');
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
%GLOBALS = (
);
$VERSION = '2.08';
%MIBS = ( 'MAU-MIB' => 'mauMod' );
%GLOBALS = ();
%FUNCS = (
# Interface MAU Table
'mau_index' => 'ifMauIfIndex',
'mau_link' => 'ifMauType',
'mau_status' => 'ifMauStatus',
'mau_up' => 'ifMauMediaAvailable',
'mau_type' => 'ifMauTypeList',
'mau_type_admin' => 'ifMauDefaultType',
# Interface Auto-Negotiation Table
'mau_auto' => 'ifMauAutoNegSupported',
'mau_autostat' => 'ifMauAutoNegAdminStatus',
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
'mau_autorec' => 'ifMauAutoNegCapReceived',
);
# Interface MAU Table
'mau_index' => 'ifMauIfIndex',
'mau_link' => 'ifMauType',
'mau_status' => 'ifMauStatus',
'mau_up' => 'ifMauMediaAvailable',
'mau_type' => 'ifMauTypeList',
'mau_type_admin' => 'ifMauDefaultType',
# Interface Auto-Negotiation Table
'mau_auto' => 'ifMauAutoNegSupported',
'mau_autostat' => 'ifMauAutoNegAdminStatus',
'mau_autosent' => 'ifMauAutoNegCapAdvertised',
'mau_autorec' => 'ifMauAutoNegCapReceived',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
# Add ones for our class
'mau_type' => \&munge_int2bin,
'mau_autosent' => \&munge_int2bin,
'mau_autorec' => \&munge_int2bin,
);
# Inherit all the built in munging
%SNMP::Info::MUNGE,
# Add ones for our class
'mau_type' => \&munge_int2bin,
'mau_autosent' => \&munge_int2bin,
'mau_autorec' => \&munge_int2bin,
);
sub munge_int2bin {
my $int = shift;
return undef unless defined $int;
return unpack("B32", pack("N", $int));
return unless defined $int;
return unpack( "B32", pack( "N", $int ) );
}
sub _isfullduplex{
my $mau = shift;
sub _isfullduplex {
my $mau = shift;
my $mautype = shift;
my @full_types = qw/11 13 16 18 20/;
foreach my $type ( @full_types ) {
return 1 if (substr($mautype,32-$type,1) eq '1')
foreach my $type (@full_types) {
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
}
return 0;
}
sub _ishalfduplex{
my $mau = shift;
sub _ishalfduplex {
my $mau = shift;
my $mautype = shift;
my @half_types = qw/10 12 15 17 19/;
foreach my $type ( @half_types ) {
return 1 if (substr($mautype,32-$type,1) eq '1')
foreach my $type (@half_types) {
return 1 if ( substr( $mautype, 32 - $type, 1 ) eq '1' );
}
return 0;
}
my %_mau_i_speed_map = (
'10' => '10 Mbps',
'100' => '100 Mbps',
'1000' => '1.0 Gbps',
'10Gig' => '10 Gbps',
'10' => '10 Mbps',
'100' => '100 Mbps',
'1000' => '1.0 Gbps',
'10Gig' => '10 Gbps',
);
sub mau_i_speed_admin {
my $mau = shift;
my $mau_index = $mau->mau_index();
my $mau_index = $mau->mau_index();
my $mau_type_admin = $mau->mau_type_admin();
my %i_speed_admin;
foreach my $mau_port (keys %$mau_type_admin){
foreach my $mau_port ( keys %$mau_type_admin ) {
my $iid = $mau_index->{$mau_port};
next unless defined $iid;
my $type_adminoid = $mau_type_admin->{$mau_port};
my $type_admin = &SNMP::translateObj($type_adminoid);
my $type_admin = &SNMP::translateObj($type_adminoid);
next unless defined $type_admin;
if ($type_adminoid eq '.0.0') {
$i_speed_admin{$iid} = 'auto';
} elsif ($type_admin =~ /^dot3MauType(.*)Base/ && $_mau_i_speed_map{$1}) {
$i_speed_admin{$iid} = $_mau_i_speed_map{$1};
}
if ( $type_adminoid eq '.0.0' ) {
$i_speed_admin{$iid} = 'auto';
}
elsif ($type_admin =~ /^dot3MauType(.*)Base/
&& $_mau_i_speed_map{$1} )
{
$i_speed_admin{$iid} = $_mau_i_speed_map{$1};
}
}
return \%i_speed_admin;
}
@@ -135,22 +141,23 @@ sub mau_i_duplex {
my $mau = shift;
my $mau_index = $mau->mau_index();
my $mau_link = $mau->mau_link();
my $mau_link = $mau->mau_link();
my %i_duplex;
foreach my $mau_port (keys %$mau_link){
foreach my $mau_port ( keys %$mau_link ) {
my $iid = $mau_index->{$mau_port};
next unless defined $iid;
my $linkoid = $mau_link->{$mau_port};
my $link = &SNMP::translateObj($linkoid);
my $link = &SNMP::translateObj($linkoid);
next unless defined $link;
my $duplex = undef;
if ($link =~ /fd$/i) {
if ( $link =~ /fd$/i ) {
$duplex = 'full';
} elsif ($link =~ /hd$/i){
}
elsif ( $link =~ /hd$/i ) {
$duplex = 'half';
}
@@ -160,44 +167,56 @@ sub mau_i_duplex {
}
sub mau_i_duplex_admin {
my $mau = shift;
my $mau = shift;
my $partial = shift;
my $mau_index = $mau->mau_index();
my $mau_autostat = $mau->mau_autostat();
my $mau_type_admin = $mau->mau_type_admin();
my $mau_index = $mau->mau_index() || {};
if ($partial) {
my %rev_mau_index = reverse %$mau_index;
$partial = $rev_mau_index{$partial};
}
my $mau_autostat = $mau->mau_autostat($partial) || {};
my $mau_type_admin = $mau->mau_type_admin($partial) || {};
# Older HP4000's don't implement ifMauDefaultType, but we can
# figure out from ifMauAutoNegCapAdvertised what we'd like.
if (!defined($mau_type_admin)) {
if (defined($mau_index)) {
return mau_i_duplex_admin_old($mau,$mau_index,$mau_autostat);
} else {
return undef;
if ( !defined($mau_type_admin) ) {
if ( defined($mau_index) ) {
return mau_i_duplex_admin_old( $mau, $mau_index, $mau_autostat );
}
else {
return;
}
}
my %i_duplex_admin;
foreach my $mau_port (keys %$mau_type_admin){
foreach my $mau_port ( keys %$mau_type_admin ) {
my $iid = $mau_index->{$mau_port};
next unless defined $iid;
my $autostat = $mau_autostat->{$mau_port};
if (defined $autostat and $autostat =~ /enabled/i){
if ( defined $autostat and $autostat =~ /enabled/i ) {
$i_duplex_admin{$iid} = 'auto';
next;
}
}
my $type_adminoid = $mau_type_admin->{$mau_port};
my $type_admin = &SNMP::translateObj($type_adminoid);
my $type_admin = &SNMP::translateObj($type_adminoid);
next unless defined $type_admin;
my $duplex = undef;
if ($type_admin =~ /fd$/i) {
if ( $type_admin =~ /fd$/i ) {
$duplex = 'full';
} elsif ($type_admin =~ /hd$/i){
}
elsif ( $type_admin =~ /hd$/i ) {
$duplex = 'half';
}
elsif ( $type_admin eq 'zeroDotZero' ) {
$duplex = 'auto';
}
$i_duplex_admin{$iid} = $duplex if defined $duplex;
}
@@ -205,8 +224,8 @@ sub mau_i_duplex_admin {
}
sub mau_i_duplex_admin_old {
my $mau = shift;
my $mau_index = shift;
my $mau = shift;
my $mau_index = shift;
my $mau_autostat = shift;
my $interfaces = $mau->interfaces();
@@ -215,23 +234,23 @@ sub mau_i_duplex_admin_old {
my %mau_reverse = reverse %$mau_index;
my %i_duplex_admin;
foreach my $iid (keys %$interfaces){
foreach my $iid ( keys %$interfaces ) {
my $mau_index = $mau_reverse{$iid};
next unless defined $mau_index;
my $autostat = $mau_autostat->{$mau_index};
# HP25xx has this value
if (defined $autostat and $autostat =~ /enabled/i){
if ( defined $autostat and $autostat =~ /enabled/i ) {
$i_duplex_admin{$iid} = 'auto';
next;
}
}
my $type = $mau_autosent->{$mau_index};
next unless defined $type;
if ($type == 0) {
if ( $type == 0 ) {
$i_duplex_admin{$iid} = 'none';
next;
}
@@ -239,13 +258,14 @@ sub mau_i_duplex_admin_old {
my $full = $mau->_isfullduplex($type);
my $half = $mau->_ishalfduplex($type);
if ($full and !$half){
if ( $full and !$half ) {
$i_duplex_admin{$iid} = 'full';
} elsif ($half) {
}
elsif ($half) {
$i_duplex_admin{$iid} = 'half';
}
}
}
}
return \%i_duplex_admin;
}
@@ -255,7 +275,8 @@ __END__
=head1 NAME
SNMP::Info::MAU - Perl5 Interface to Medium Access Unit (MAU) MIB (RFC 2668) via SNMP
SNMP::Info::MAU - SNMP Interface to Medium Access Unit (MAU) MIB (RFC 2668)
via SNMP
=head1 AUTHOR
@@ -276,14 +297,15 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info::MAU is a sublcass of SNMP::Info that supplies access to the
MAU-MIB (RFC 2668). This MIB is sometimes implemented on Layer 2 network devices like HP Switches.
MAU = Media Access Unit.
SNMP::Info::MAU is a subclass of SNMP::Info that supplies access to the
F<MAU-MIB> (RFC 2668). This MIB is sometimes implemented on Layer 2 network
devices like HP Switches. MAU = Media Access Unit.
The MAU table contains link and duplex info for the port itself and the device
connected to that port.
Normally you use or create a subclass of SNMP::Info that inherits this one. Do not use directly.
Normally you use or create a subclass of SNMP::Info that inherits this one.
Do not use directly.
For debugging purposes call the class directly as you would SNMP::Info
@@ -297,7 +319,7 @@ None.
=over
=item MAU-MIB
=item F<MAU-MIB>
=back
@@ -339,23 +361,27 @@ order to find the admin duplex setting for all the interfaces.
Returns either (auto,none,full,half).
=item $mau->mau_i_speed_admin()
Returns admin speed setting for all the interfaces.
=back
=head2 MAU INTERFACE TABLE ENTRIES
=head2 MAU INTERFACE TABLE METHODS
=over
=item $mau->mau_index() - Returns a list of interfaces
and their index in the MAU IF Table.
(B<ifMauIfIndex>)
(C<ifMauIfIndex>)
=item $mau->mau_link() - Returns the type of Media Access used.
This is essentially the type of link in use.
eg. dot3MauType100BaseTXFD - 100BaseT at Full Duplex
(B<ifMauType>)
(C<ifMauType>)
=item $mau->mau_status() - Returns the admin link condition as
@@ -368,16 +394,16 @@ and their index in the MAU IF Table.
Use 5 and !5 to see if the link is up or down on the admin side.
(B<ifMauStatus>)
(C<ifMauStatus>)
=item $mau->mau_up() - Returns the current link condition
(B<ifMauMediaAvailable>)
(C<ifMauMediaAvailable>)
=item $mau->mau_type() - Returns a 32bit string reporting the capabilities
of the port from a MAU POV.
Directly from the MAU-MIB :
Directly from F<MAU-MIB> :
Bit Capability
0 other or unknown
1 AUI
@@ -401,7 +427,7 @@ of the port from a MAU POV.
19 100BASE-T2 half duplex mode
20 100BASE-T2 full duplex mode
(B<ifMauTypeList>)
(C<ifMauTypeList>)
=item $mau->mau_type_admin()
@@ -409,7 +435,7 @@ of the port from a MAU POV.
=item $mau->mau_auto() - Returns status of auto-negotiation mode for ports.
(B<ifMauAutoNegAdminStatus>)
(C<ifMauAutoNegAdminStatus>)
=item $mau->mau_autostat()
@@ -420,15 +446,14 @@ capabilities we are broadcasting on that port
Uses the same decoder as $mau->mau_type().
(B<ifMauAutoNegCapAdvertised>)
(C<ifMauAutoNegCapAdvertised>)
=item $mau->mau_autorec() - Returns a 32 bit bit-string representing the
capabilities of the device on the other end.
Uses the same decoder as $mau->mau_type().
(B<ifMauAutoNegCapReceived>)
(C<ifMauAutoNegCapReceived>)
=back
@@ -440,13 +465,13 @@ capabilities of the device on the other end.
=item $mau->_isfullduplex(bitstring)
Boolean. Checks to see if any of the full_duplex types from mau_type() are
high. Currently bits 11,13,16,18,20.
Boolean. Checks to see if any of the full_duplex types from mau_type()
are high. Currently bits 11,13,16,18,20.
=item $mau->_ishalfduplex(bitstring)
Boolean. Checks to see if any of the half_duplex types from mau_type() are
high. Currently bits 10,12,15,17,19.
Boolean. Checks to see if any of the half_duplex types from mau_type()
are high. Currently bits 10,12,15,17,19.
=back

File diff suppressed because it is too large Load Diff

255
Info/PowerEthernet.pm Normal file
View File

@@ -0,0 +1,255 @@
# SNMP::Info::PowerEthernet
# $Id$
#
# Copyright (c) 2008 Bill Fenner
# 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::PowerEthernet;
use strict;
use Exporter;
use SNMP::Info;
@SNMP::Info::PowerEthernet::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::PowerEthernet::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
$VERSION = '2.08';
%MIBS = ( 'POWER-ETHERNET-MIB' => 'pethPsePortDetectionStatus' );
%GLOBALS = ();
%FUNCS = (
# parts of pethPsePortTable
'peth_port_admin' => 'pethPsePortAdminEnable',
'peth_port_status' => 'pethPsePortDetectionStatus',
'peth_port_class' => 'pethPsePortPowerClassifications',
# pethMainPseTable
'peth_power_watts' => 'pethMainPsePower',
'peth_power_status' => 'pethMainPseOperStatus',
'peth_power_consumption' => 'pethMainPseConsumptionPower',
'peth_power_threshold' => 'pethMainPseUsageThreshold',
);
%MUNGE = ();
# POWER-ETHERNET-MIB doesn't define a mapping of its
# "module"/"port" index to ifIndex. Different vendors
# do this in different ways. This is a poor fallback:
# if all of the module values = 1, return the port number
# on the assumption that port number = ifindex.
# If there is a module != 1, this heuristic doesn't work
# so returns undef.
sub peth_port_ifindex {
my $peth = shift;
my $partial = shift;
my $peth_port_status = $peth->peth_port_status($partial);
my $peth_port_ifindex;
foreach my $i ( keys %$peth_port_status ) {
my ( $module, $port ) = split( /\./, $i );
if ( $module != 1 ) {
# This heuristic won't work, so say that we got nothing.
# If you have this case, you have to write a device-specific
# version of this function.
return;
}
$peth_port_ifindex->{$i} = $port;
}
return $peth_port_ifindex;
}
# Subclasses are encouraged to override this method to report
# what has actually been negotiated with the device, if a
# protocol with more values (e.g., CDP) has been used.
sub peth_port_neg_power {
my $peth = shift;
my $partial = shift;
my $peth_port_status = $peth->peth_port_status($partial);
my $peth_port_class = $peth->peth_port_class($partial);
my $poemax = { 'class0' => 12950, 'class1' => 3840, 'class2' => 6490, 'class3' => 12950,
'class4' => 25500 };
my $peth_port_neg_power = {};
foreach my $i ( keys %$peth_port_status ) {
if ($peth_port_status->{$i} eq 'deliveringPower') {
$peth_port_neg_power->{$i} = $poemax->{ $peth_port_class->{$i} };
}
}
return $peth_port_neg_power;
}
1;
__END__
=head1 NAME
SNMP::Info::PowerEthernet - SNMP Interface to data stored in
F<POWER-ETHERNET-MIB>.
=head1 AUTHOR
Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $poe = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $poe->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
F<POWER-ETHERNET-MIB> is used to describe PoE (IEEE 802.3af)
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 $poe = new SNMP::Info::PowerEthernet (...);
=head2 Inherited Classes
none.
=head2 Required MIBs
=over
=item F<POWER-ETHERNET-MIB>
=back
=head1 GLOBALS
none.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Power Port Table
Selected values from the C<pethPsePortTable>
=over
=item $poe->peth_port_admin()
Administrative status: is this port permitted to deliver power?
C<pethPsePortAdminEnable>
=item $poe->peth_port_status()
Current status: is this port delivering power, searching, disabled, etc?
C<pethPsePortDetectionStatus>
=item $poe->peth_port_class()
Device class: if status is delivering power, this represents the 802.3af
class of the device being powered.
C<pethPsePortPowerClassifications>
=item $poe->peth_port_ifindex()
A mapping function from the C<pethPsePortTable> INDEX of
module.port to an C<ifIndex>. The default mapping ignores the
module (returning undef if there are any module values greater
than 1) and returns the port number, assuming that there is a
1:1 mapping.
This mapping is more or less left up to the device vendor to
implement; the MIB gives only very weak guidance.
A given device class may implement its own version
of this function (e.g., see Info::CiscoPower).
=item $poe->peth_port_neg_power()
The power, in milliwatts, that has been committed to this port.
This value is derived from the 802.3af class of the device being
powered, but may be overridden by a subclass that has information
from another source (e.g., if a different protocol, such as CDP,
was used to negotiate the power level.)
=back
=head2 Power Supply Table
=over
=item $poe->peth_power_watts()
The power supply's capacity, in watts.
C<pethMainPsePower>
=item $poe->peth_power_status()
The power supply's operational status.
C<pethMainPseOperStatus>
=item $poe->peth_power_consumption()
How much power, in watts, this power supply has been committed to
deliver. (Note: certain devices seem to supply this value in milliwatts,
so be cautious interpreting it.)
C<pethMainPseConsumptionPower>
=item $poe->peth_power_threshold()
The threshold (in percent) of consumption required to raise an
alarm.
C<pethMainPseUsageThreshold>
=back
=cut

File diff suppressed because it is too large Load Diff

View File

@@ -1,70 +1,69 @@
# SNMP::Info::SONMP
# Eric Miller
# $Id$
#
# Copyright (c) 2004 Eric Miller, Max Baker
# Copyright (c) 2008 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# 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
# * 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.
#
# 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::SONMP;
$VERSION = '1.04';
use strict;
use Exporter;
use SNMP::Info;
use Carp;
@SNMP::Info::SONMP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::SONMP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::SONMP::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %FUNCS %GLOBALS %MIBS %MUNGE $INIT/;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
%MIBS = (
'SYNOPTICS-ROOT-MIB' => 'synoptics',
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop',
);
$VERSION = '2.08';
%MIBS = (
'SYNOPTICS-ROOT-MIB' => 'synoptics',
'S5-ETH-MULTISEG-TOPOLOGY-MIB' => 's5EnMsTop',
);
%GLOBALS = (
'cdp_id' => 's5EnMsTopIpAddr',
'cdp_run' => 's5EnMsTopStatus',
);
'cdp_id' => 's5EnMsTopIpAddr',
'cdp_run' => 's5EnMsTopStatus',
);
%FUNCS = (
# From S5-ETH-MULTISEG-TOPOLOGY-MIB::TopNmmTable
'sonmp_topo_slot' => 's5EnMsTopNmmSlot',
'sonmp_topo_port' => 's5EnMsTopNmmPort',
'sonmp_topo_ip' => 's5EnMsTopNmmIpAddr',
'sonmp_topo_seg' => 's5EnMsTopNmmSegId',
'sonmp_topo_mac' => 's5EnMsTopNmmMacAddr',
'sonmp_topo_platform' => 's5EnMsTopNmmChassisType',
'sonmp_topo_localseg' => 's5EnMsTopNmmLocalSeg',
);
%FUNCS = (
%MUNGE = (
'sonmp_topo_mac' => \&SNMP::Info::munge_mac
);
# From S5-ETH-MULTISEG-TOPOLOGY-MIB::TopNmmTable
'sonmp_topo_slot' => 's5EnMsTopNmmSlot',
'sonmp_topo_port' => 's5EnMsTopNmmPort',
'sonmp_topo_ip' => 's5EnMsTopNmmIpAddr',
'sonmp_topo_seg' => 's5EnMsTopNmmSegId',
'sonmp_topo_mac' => 's5EnMsTopNmmMacAddr',
'sonmp_topo_platform' => 's5EnMsTopNmmChassisType',
'sonmp_topo_localseg' => 's5EnMsTopNmmLocalSeg',
);
%MUNGE = ( 'sonmp_topo_mac' => \&SNMP::Info::munge_mac );
sub index_factor {
return 32;
@@ -83,209 +82,139 @@ sub hasCDP {
return $sonmp->cdp_run();
}
sub c_if {
my $sonmp = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port();
my $sonmp_topo_slot = $sonmp->sonmp_topo_slot();
my $index_factor = $sonmp->index_factor();
my $slot_offset = $sonmp->slot_offset();
my $port_offset = $sonmp->port_offset();
my $model = $sonmp->model();
my $sonmp = shift;
my $partial = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {};
my $sonmp_topo_slot = $sonmp->sonmp_topo_slot($partial) || {};
my $index_factor = $sonmp->index_factor();
my $slot_offset = $sonmp->slot_offset();
my $port_offset = $sonmp->port_offset();
my $model = $sonmp->model();
my %c_if;
foreach my $entry (keys %$sonmp_topo_port){
foreach my $entry ( keys %$sonmp_topo_port ) {
my $port = $sonmp_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
my $slot = $sonmp_topo_slot->{$entry}||0;
my $slot = $sonmp_topo_slot->{$entry} || 0;
if ($model eq 'Baystack Hub') {
my $comidx = $slot;
if (! ($comidx % 5)) {
$slot = ($slot / 5);
} elsif ($comidx =~ /[16]$/) {
$slot = int($slot/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$slot = int($slot/5);
$port = 26;
if ( $model eq 'Baystack Hub' ) {
my $comidx = $slot;
if ( !( $comidx % 5 ) ) {
$slot = ( $slot / 5 );
}
elsif ( $comidx =~ /[16]$/ ) {
$slot = int( $slot / 5 );
$port = 25;
}
elsif ( $comidx =~ /[27]$/ ) {
$slot = int( $slot / 5 );
$port = 26;
}
}
my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset);
$c_if{"$index.1"} = $index;
my $index = ( ( $slot - $slot_offset ) * $index_factor )
+ ( $port - $port_offset );
$c_if{$entry} = $index;
}
return \%c_if;
}
sub c_ip {
my $sonmp = shift;
my $sonmp_topo_ip = $sonmp->sonmp_topo_ip();
my $sonmp_topo_port = $sonmp->sonmp_topo_port();
my $sonmp_topo_slot = $sonmp->sonmp_topo_slot();
my $ip = $sonmp->cdp_id();
my $index_factor = $sonmp->index_factor();
my $slot_offset = $sonmp->slot_offset();
my $port_offset = $sonmp->port_offset();
my $model = $sonmp->model();
my $sonmp = shift;
my $partial = shift;
# Count the number of devices seen on each port.
# more than one device seen means connected to a non-sonmp
# device, but other sonmp devices are squawking further away.
my %ip_port;
foreach my $entry (keys %$sonmp_topo_ip){
my $port = $sonmp_topo_port->{$entry};
next unless defined $port;
next if ($port =~ /^[\d\.]+$/ and $port == 0);
my $slot = $sonmp_topo_slot->{$entry}||0;
if ($model eq 'Baystack Hub') {
my $comidx = $slot;
if (! ($comidx % 5)) {
$slot = ($slot / 5);
} elsif ($comidx =~ /[16]$/) {
$slot = int($slot/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$slot = int($slot/5);
$port = 26;
}
}
my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset);
my $ip = $sonmp_topo_ip->{$entry};
push(@{$ip_port{$index}},$ip);
}
my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {};
my $sonmp_topo_ip = $sonmp->sonmp_topo_ip($partial) || {};
my %c_ip;
foreach my $port (keys %ip_port){
my $ips = $ip_port{$port};
if (scalar @$ips == 1) {
$c_ip{"$port.1"} = $ips->[0];
} else {
$c_ip{"$port.1"} = $ips;
}
foreach my $entry ( keys %$sonmp_topo_ip ) {
my $port = $sonmp_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
my $ip = $sonmp_topo_ip->{$entry};
$c_ip{$entry} = $ip;
}
return \%c_ip;
}
sub c_port {
my $sonmp = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port();
my $sonmp_topo_seg = $sonmp->sonmp_topo_seg();
my $sonmp_topo_slot = $sonmp->sonmp_topo_slot();
my $index_factor = $sonmp->index_factor();
my $slot_offset = $sonmp->slot_offset();
my $port_offset = $sonmp->port_offset();
my $model = $sonmp->model();
my $sonmp_topo_platform = $sonmp->sonmp_topo_platform();
my $sonmp = shift;
my $partial = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {};
my $sonmp_topo_seg = $sonmp->sonmp_topo_seg($partial) || {};
my $sonmp_topo_platform = $sonmp->sonmp_topo_platform($partial) || {};
my %c_port;
foreach my $entry (keys %$sonmp_topo_seg){
foreach my $entry ( keys %$sonmp_topo_seg ) {
my $port = $sonmp_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
my $slot = $sonmp_topo_slot->{$entry};
$slot = 0 unless defined $slot;
if ($model eq 'Baystack Hub') {
my $comidx = $slot;
if (! ($comidx % 5)) {
$slot = ($slot / 5);
} elsif ($comidx =~ /[16]$/) {
$slot = int($slot/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$slot = int($slot/5);
$port = 26;
}
}
my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset);
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_port{"$index.1"};
my $seg = $sonmp_topo_seg->{$entry};
my $seg = $sonmp_topo_seg->{$entry};
my $platform = $sonmp_topo_platform->{$entry};
# AP-222x Series does not adhere to port numbering
if ($platform =~ /AccessPoint/i) {
$c_port{"$index.1"} = 'dp0';
if ( $platform =~ /AccessPoint/i ) {
$c_port{$entry} = 'dp0';
}
# BayHubs send the lower three bytes of the MAC not the slot/port
elsif ($seg > 4000) {
$c_port{"$index.1"} = 'unknown';
# BayHubs send the lower three bytes of the MAC not the slot/port
elsif ( $seg > 4000 ) {
$c_port{$entry} = 'unknown';
}
else {
# Segment id is (256 * remote slot_num) + (remote_port)
my $remote_port = $seg % 256;
my $remote_slot = int($seg / 256);
$c_port{"$index.1"} = "$remote_slot.$remote_port";
my $remote_slot = int( $seg / 256 );
$c_port{$entry} = "$remote_slot.$remote_port";
}
}
return \%c_port;
}
sub c_platform {
my $sonmp = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port();
my $sonmp_topo_slot = $sonmp->sonmp_topo_slot();
my $sonmp_topo_platform = $sonmp->sonmp_topo_platform();
my $index_factor = $sonmp->index_factor();
my $slot_offset = $sonmp->slot_offset();
my $port_offset = $sonmp->port_offset();
my $model = $sonmp->model();
my $sonmp = shift;
my $partial = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port($partial) || {};
my $sonmp_topo_platform = $sonmp->sonmp_topo_platform($partial) || {};
my %c_platform;
foreach my $entry (keys %$sonmp_topo_platform){
my $port = $sonmp_topo_port->{$entry}||0;
foreach my $entry ( keys %$sonmp_topo_platform ) {
my $port = $sonmp_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
my $slot = $sonmp_topo_slot->{$entry};
$slot = 0 unless defined $slot;
if ($model eq 'Baystack Hub') {
my $comidx = $slot;
if (! ($comidx % 5)) {
$slot = ($slot / 5);
} elsif ($comidx =~ /[16]$/) {
$slot = int($slot/5);
$port = 25;
} elsif ($comidx =~ /[27]$/) {
$slot = int($slot/5);
$port = 26;
}
}
my $platform = $sonmp_topo_platform->{$entry};
my $index = (($slot-$slot_offset)*$index_factor) + ($port-$port_offset);
# For fake remotes (multiple IPs for a c_ip), use first found
next if defined $c_platform{"$index.1"};
my $platform = $sonmp_topo_platform->{$entry};
$c_platform{"$index.1"} = $platform;
$c_platform{$entry} = $platform;
}
return \%c_platform;
}
sub mac {
my $sonmp = shift;
my $sonmp_topo_port = $sonmp->sonmp_topo_port();
my $sonmp_topo_mac = $sonmp->sonmp_topo_mac();
foreach my $entry (keys %$sonmp_topo_port){
my $sonmp_topo_mac = $sonmp->sonmp_topo_mac();
foreach my $entry ( keys %$sonmp_topo_port ) {
my $port = $sonmp_topo_port->{$entry};
next unless $port == 0;
my $mac = $sonmp_topo_mac->{$entry};
return $mac;
}
# Topology turned off, not supported.
return undef;
return;
}
1;
@@ -293,7 +222,8 @@ __END__
=head1 NAME
SNMP::Info::SONMP - Perl5 Interface to SynOptics Network Management Protocol (SONMP) using SNMP
SNMP::Info::SONMP - SNMP Interface to SynOptics Network Management Protocol
(SONMP)
=head1 AUTHOR
@@ -334,12 +264,14 @@ SNMP::Info::SONMP is a subclass of SNMP::Info that provides an object oriented
interface to the SynOptics Network Management Protocol (SONMP) information
through SNMP.
SONMP is a Layer 2 protocol that supplies topology information of devices that also speak SONMP,
mostly switches and hubs. SONMP is implemented in SynOptics, Bay, and Nortel Networks devices.
SONMP has been rebranded by Bay then Nortel Networks and is know by several different
names.
SONMP is a Layer 2 protocol that supplies topology information of devices that
also speak SONMP, mostly switches and hubs. SONMP is implemented in
SynOptics, Bay, and Nortel devices. SONMP has been rebranded by Bay then
Nortel and is know by several different names, most recently Nortel
Discovery Protocol (NDP).
Create or use a device subclass that inherits this class. Do not use directly.
Create or use a device subclass that inherits this class. Do not use
directly.
Each device implements a subset of the global and cache entries.
Check the return value to see if that data is held by the device.
@@ -352,25 +284,12 @@ None.
=over
=item SYNOPTICS-ROOT-MIB
=item F<SYNOPTICS-ROOT-MIB>
=item S5-ETH-MULTISEG-TOPOLOGY-MIB
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
=back
MIBs can be found on the CD that came with your product.
Or, they can be downloaded directly from Nortel Networks regardless of support
contract status.
Go to http://www.nortelnetworks.com Techninal Support, Browse Technical Support,
Select by product, Java Device Manager, Software. Download the latest version.
After installation, all mibs are located under the install directory under mibs
and the repspective product line.
Note: Required version of SYNOPTICS-ROOT-MIB, must be version 199 or higher,
for example synro199.mib.
=head1 GLOBAL METHODS
These are methods that return scalar values from SNMP
@@ -392,19 +311,19 @@ Returns the offset if port numbering does not start at 0. Defaults to 0.
=item $cdp->hasCDP()
Is CDP is active in this device?
Is SONMP is active in this device?
=item $sonmp->cdp_id()
Returns the IP that the device is sending out for its Nmm topology info.
(B<s5EnMsTopIpAddr>)
(C<s5EnMsTopIpAddr>)
=item $sonmp->cdp_run()
Returns if the S5-ETH-MULTISEG-TOPOLOGY info is on for this device.
Returns true if SONMP is on for this device.
(B<s5EnMsTopStatus>)
(C<s5EnMsTopStatus>)
=item $sonmp->mac()
@@ -417,7 +336,7 @@ Returns MAC of the advertised IP address of the device.
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Layer2 Topology info (s5EnMsTopNmmTable)
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
=over
@@ -425,29 +344,30 @@ to a hash.
Returns reference to hash. Key: Table entry, Value:slot number
(B<s5EnMsTopNmmSlot>)
(C<s5EnMsTopNmmSlot>)
=item $sonmp->sonmp_topo_port()
Returns reference to hash. Key: Table entry, Value:Port Number (interface iid)
Returns reference to hash. Key: Table entry, Value:Port Number
(interface iid)
(B<s5EnMsTopNmmPort>)
(C<s5EnMsTopNmmPort>)
=item $sonmp->sonmp_topo_ip()
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
(B<s5EnMsTopNmmIpAddr>)
(C<s5EnMsTopNmmIpAddr>)
=item $sonmp->sonmp_topo_seg()
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
(B<s5EnMsTopNmmSegId>)
(C<s5EnMsTopNmmSegId>)
=item $sonmp->sonmp_topo_mac
=item $sonmp->sonmp_topo_mac()
(B<s5EnMsTopNmmMacAddr>)
(C<s5EnMsTopNmmMacAddr>)
Returns reference to hash. Key: Table entry, Value:Remote MAC address
@@ -455,17 +375,18 @@ Returns reference to hash. Key: Table entry, Value:Remote MAC address
Returns reference to hash. Key: Table entry, Value:Remote Device Type
(B<s5EnMsTopNmmChassisType>)
(C<s5EnMsTopNmmChassisType>)
=item $sonmp->sonmp_topo_localseg
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg() is local
Returns reference to hash. Key: Table entry, Value: Boolean, if
bay_topo_seg() is local.
(B<s5EnMsTopNmmLocalSeg>)
(C<s5EnMsTopNmmLocalSeg>)
=back
=head2 Psuedo CDP information
=head2 Pseudo CDP information
All entries with port=0 are local and ignored.
@@ -473,28 +394,25 @@ All entries with port=0 are local and ignored.
=item $sonmp->c_if()
Returns reference to hash. Key: ifIndex.1 Value: port (iid)
Returns reference to hash. Key: IID, Value: Local port (interfaces)
=item $sonmp->c_ip()
Returns referenece to hash. Key: ifIndex.1
Returns reference to hash. Key: IID, Value: Remote IP address
The value of each hash entry can either be a scalar or an array.
A scalar value is most likely a direct neighbor to that port.
It is possible that there is a non-SONMP device in between this device and the remote device.
An array value represents a list of seen devices. The only time you will get an array
of neighbors, is if there is a non-SONMP device in between two or more devices.
If multiple entries exist with the same local port, c_if(), with different
IPv4 addresses, c_ip(), there is either a non SONMP device in between two or
more devices or multiple devices which are not directly connected.
Use the data from the Layer2 Topology Table below to dig deeper.
=item $sonmp->c_port()
Returns reference to hash. Key: ifIndex.1 Value: remote port
Returns reference to hash. Key: IID, Value: Remote port (interfaces)
=item $sonmp->c_platform()
Returns reference to hash. Key: ifIndex.1 Value: Remote Device Type
Returns reference to hash. Key: IID, Value: Remote device type
=back

View File

@@ -1,28 +1,37 @@
ChangeLog
COPYRIGHT
DEVELOP
DeviceMatrix.txt
Info.pm
Info/AdslLine.pm
Info/Airespace.pm
Info/Bridge.pm
Info/CDP.pm
Info/CiscoConfig.pm
Info/CiscoImage.pm
Info/CiscoPortSecurity.pm
Info/CiscoPower.pm
Info/CiscoQOS.pm
Info/CiscoRTT.pm
Info/CiscoStack.pm
Info/CiscoStats.pm
Info/CiscoStpExtensions.pm
Info/CiscoVTP.pm
Info/Entity.pm
Info/EtherLike.pm
Info/FDP.pm
Info/IEEE802dot11.pm
Info/IPv6.pm
Info/Layer1.pm
Info/Layer1/Allied.pm
Info/Layer1/Asante.pm
Info/Layer1/Bayhub.pm
Info/Layer1/Cyclades.pm
Info/Layer1/S3000.pm
Info/Layer2.pm
Info/Layer2/Airespace.pm
Info/Layer2/Aironet.pm
Info/Layer2/Allied.pm
Info/Layer2/Aruba.pm
Info/Layer2/Bay.pm
Info/Layer2/Baystack.pm
Info/Layer2/C1900.pm
@@ -32,31 +41,63 @@ Info/Layer2/Centillion.pm
Info/Layer2/Cisco.pm
Info/Layer2/Foundry.pm
Info/Layer2/HP.pm
Info/Layer2/HP4000.pm
Info/Layer2/HPVC.pm
Info/Layer2/Kentrox.pm
Info/Layer2/N2270.pm
Info/Layer2/NAP222x.pm
Info/Layer2/Netgear.pm
Info/Layer2/Orinoco.pm
Info/Layer2/ZyXEL_DSLAM.pm
Info/Layer3.pm
Info/Layer3/Aironet.pm
Info/Layer3/AlcatelLucent.pm
Info/Layer3/AlteonAD.pm
Info/Layer3/Altiga.pm
Info/Layer3/Arista.pm
Info/Layer3/Aruba.pm
Info/Layer3/BayRS.pm
Info/Layer3/BlueCoatSG.pm
Info/Layer3/C3550.pm
Info/Layer3/C4000.pm
Info/Layer3/C6500.pm
Info/Layer3/Cisco.pm
Info/Layer3/CiscoFWSM.pm
Info/Layer3/Contivity.pm
Info/Layer3/Dell.pm
Info/Layer3/Enterasys.pm
Info/Layer3/Extreme.pm
Info/Layer3/Foundry.pm
Info/Layer3/HP9300.pm
Info/Layer3/Juniper.pm
Info/Layer3/Microsoft.pm
Info/Layer3/Mikrotik.pm
Info/Layer3/N1600.pm
Info/Layer3/Netscreen.pm
Info/Layer3/NetSNMP.pm
Info/Layer3/PacketFront.pm
Info/Layer3/Passport.pm
Info/Layer3/Pf.pm
Info/Layer3/SonicWALL.pm
Info/Layer3/Sun.pm
Info/Layer3/Timetra.pm
Info/Layer7.pm
Info/Layer7/APC.pm
Info/LLDP.pm
Info/MAU.pm
Info/NortelStack.pm
Info/PowerEthernet.pm
Info/RapidCity.pm
Info/SONMP.pm
Makefile.PL
MANIFEST This list of files
README
t/00-load.t
t/docmunge
t/make_dev_matrix.pl
t/pod-coverage.t
t/pod.t
t/prereq.t
t/push_ver
t/run_test
t/test_class.pl

25
MANIFEST.SKIP Normal file
View File

@@ -0,0 +1,25 @@
# Version control files and dirs.
\bRCS\b
\bCVS\b
,v$
\B\.svn\b
\B\.git\b
# Makemaker generated files and dirs.
^MANIFEST\.
^Makefile$
^blib/
^MakeMaker-\d
# Temp, old and emacs backup files.
~$
\.old$
^#.*#$
^\.#
# Private Regression Tests
\d+_local_
\.?perl\w+\.?rc$
# Komodo project file
\.kpf$

View File

@@ -1,26 +1,39 @@
# SNMP::Info - Makefile.PL
# Module makefile for SNMP::Info (using ExtUtils::MakeMaker)
# $Id$
use ExtUtils::MakeMaker;
WriteMakefile(
'NAME' => 'SNMP::Info',
'VERSION_FROM' => 'Info.pm',
'PREREQ_PM' => {
'Math::BigInt' => 0
# SNMP not available on CPAN .
# Install with net-snmp.sourceforge.net
# 'SNMP' => '4'
},
($] >= 5.005 ?
(ABSTRACT_FROM => 'Info.pm',
AUTHOR => 'Max Baker <max@warped.org>')
: ()
),
'PMLIBDIRS' => ['Info','$(BASEEXT)'],
);
require 5.006;
sub MY::postamble { "
use strict;
use warnings;
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'SNMP::Info',
AUTHOR => 'Eric A. Miller <emiller@cpan.org>',
VERSION_FROM => 'Info.pm',
ABSTRACT_FROM => 'Info.pm',
PREREQ_PM => {
'Test::More' => 0,
'Math::BigInt' => 0,
'SNMP' => 0,
},
PMLIBDIRS => [ 'Info', '$(BASEEXT)' ],
dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
clean => { FILES => 'SNMP-Info-*' },
realclean => { FILES => 'Makefile.old' },
( ( ExtUtils::MakeMaker->VERSION() lt '6.25' ) ? ( 'PL_FILES' => {} )
: ()
),
( ( ExtUtils::MakeMaker->VERSION() gt '6.30' ) ? ( 'LICENSE' => 'bsd' )
: ()
),
);
sub MY::postamble {
"
.PHONY: readme
readme: README
README: Info.pm
pod2text -l Info.pm > README" }
pod2text -l Info.pm > README";
}

787
README

File diff suppressed because it is too large Load Diff

18
t/.perltidyrc Normal file
View File

@@ -0,0 +1,18 @@
# .perltidyrc - PBP perltidy configuration file for SNMP::Info
# $Id$
-l=78 # Max line width is 78 cols
-i=4 # Indent level is 4 cols
-ci=4 # Continuation indent is 4 cols
-nst # Output to STDOUT
-se # Errors to STDERR
-vt=2 # Maximal vertical tightness
-cti=0 # No extra indentation for closing brackets
-pt=1 # Medium parenthesis tightness
-bt=1 # Medium brace tightness
-sbt=1 # Medium square bracket tightness
-bbt=1 # Medium block brace tightness
-nsfs # No space before semicolons
-nolq # Don't outdent long quoted strings
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= && += -= /= |= >>= ||= .= %= ^= x=" # Break before all operators

13
t/00-load.t Normal file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/perl
# 00-load.t - Test loading of SNMP::Info
# $Id$
use strict;
use warnings;
use Test::More tests => 1;
BEGIN {
use_ok( 'SNMP::Info' );
}
diag( "Testing SNMP::Info $SNMP::Info::VERSION, Perl $], $^X" );

14
t/00_local_distribution.t Normal file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/perl
# 00_local_distribution.t - Private test to check distribution
# $Id$
use strict;
use warnings;
use Test::More;
eval { require Test::Distribution; };
plan skip_all => 'Optional Test::Distribution not installed' if ($@);
# Skip POD tests as we will test separately
import Test::Distribution not => [ qw/pod podcover/ ];

46
t/00_local_docininfo.t Normal file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/perl
# 00_local_versionsync.t - Private test to check that all modules are listed in Info.pm
# $Id$
use warnings;
use strict;
use File::Find;
use Test::More;
eval "use File::Slurp";
plan skip_all => "File::Slurp required for testing version sync"
if $@;
plan qw(no_plan);
my %Items;
# Grab all the =item's from Info.pm
open (I,"blib/lib/SNMP/Info.pm") or fail("Can't open Info.pm");
while (<I>) {
next unless /^\s*=item\s*(\S+)/;
$Items{$1}++;
}
close I;
#warn "items : ",join(', ',keys %Items),"\n";
# Check that each package is represented in Info.pm docs
find({wanted => \&check_version, no_chdir => 1}, 'blib');
sub check_version {
# $_ is the full path to the file
return unless (m{blib/lib/}xms and m{\.pm \z}xms);
my $content = read_file($_);
# Make sure that this package is listed in Info.pm
fail($_) unless $content =~ m/^\s*package\s+(\S+)\s*;/m;
my $package = $1;
return if $package eq 'SNMP::Info';
fail($_) unless defined $Items{$package};
pass($_);
}

Some files were not shown because too many files have changed in this diff Show More