Compare commits

...

855 Commits

Author SHA1 Message Date
Oliver Gorwits
5a895a09ca release 3.74 2021-08-24 12:29:56 +01:00
Christoph Handel
2773594274 CH: patch H3C broken node-vlan mapping (#416)
* CH: patch H3C broken node-vlan mapping

see https://github.com/netdisco/snmp-info/issues/218

--+ qb_fw_vlan

qb_fw_vlan is called to figure out in which vlan a mac is located.

fetch qb_fw_port. This is a hash

  fdb_id.mac => fdb_port

for each key split of fdb_id

try to look it up in qb_fdb_ids to translate it to vlan
otherwise use it directly as vlan.

--+ qb_fw_port

qb_fw_port fetchs snmp dot1qTpFdbPort, oid 1.3.6.1.2.1.17.7.1.2.2.1.2

This snmp table returns

  fdb_id.mac => fdb_port

as an example data fetched from a HP switch (Layer2::HP)

  SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.3.52.20.95.80.231.59 = INTEGER: 9

fdb_id: 3
mac: 34:14:5f:50:e7:3b
fdb_port: 9
and an expample for a H3C (Layer3::H3C)

  SNMPv2-SMI::mib-2.17.7.1.2.2.1.2.1.0.17.17.117.83.217 = INTEGER: 891

fdb_id: 1
mac: 0:11:11:75:53:d9
fdb_port: 891

snmp looks got. Verified with netdisco

/opt/netdisco/bin/netdisco-do show -d <SWITCH> -e Layer3::H3C::qb_fw_port
/opt/netdisco/bin/netdisco-do show -d <SWITCH> -e Layer2::HP::qb_fw_port

result looks good.

--+ qb_fdb_index

qb_fdb_index fetches snmp dot1qVlanFdbId which is oid 1.3.6.1.2.1.17.7.1.4.2.1.3

This snmp table returns

  timestamp.vlan => fdb_id

netdisco will strip the timestamp and build a hash

  fdb_id => vlan

for a HP switch i get snmp data

  SNMPv2-SMI::mib-2.17.7.1.4.2.1.3.0.64 = Gauge32: 6

vlan: 64
fdb_id: 6
for a H3C i get

  SNMPv2-SMI::mib-2.17.7.1.4.2.1.3.3330.64 = Gauge32: 1

vlan: 64
fdb_id: 1

and there are the issues.

not all vlans are listed
every line has fdb_id 1
as in all H3C switches i checked, the fdb_id is equal to the vlan i patched out
qb_fdb_index to return an empty hash.

* CH: H3C fix pod caverage test

Co-authored-by: Christoph Handel <c.handel@gsi.de>
2021-08-23 22:27:42 +01:00
Oliver Gorwits
846bb46e33 fix version 2021-08-23 16:22:45 +01:00
Oliver Gorwits
33d69e8dea Merge branch 'master' of github.com:netdisco/snmp-info 2021-08-23 16:20:44 +01:00
Oliver Gorwits
bbf5a5a570 also test on PR 2021-08-23 16:20:33 +01:00
Christoph Handel
651169f726 Whiterabbit (#417)
* CH: add white rabbit

* CH: .

* CH: better version field

* CH: whiterabbit fix version and pod documentation

* fix mib links

and a few wihtespace cleanups

* map enterprises.96

map enterprises.96 to whiterabbit.

this is the id of cern, only layer3::whiterabbit uses it

* removed inherited modules

remove modules that get pulled in via snmp::info::layer3
use SNMP::Info::LLDP;
use SNMP::Info::Bridge;

remove module that doesn't seems to be used
use Socket;

Co-authored-by: Christoph Handel <c.handel@gsi.de>
Co-authored-by: nick n <39005454+inphobia@users.noreply.github.com>
2021-08-23 16:13:28 +01:00
Jeroen van Ingen Schenau
9b8dc0916c Support PVID (vlan) change on Arista (#432) 2021-08-23 16:08:17 +01:00
Oliver Gorwits
f7ca5dfde2 github action: fix version format 2021-08-23 16:02:42 +01:00
Oliver Gorwits
80b88fbbb4 github action: update for latest ways from netdisco 2021-08-23 15:58:40 +01:00
Oliver Gorwits
98281e7df6 Update runtests.yml 2021-08-19 10:45:04 +01:00
Oliver Gorwits
470aca5c68 annoying typo 2021-08-18 20:35:13 +01:00
Oliver Gorwits
8f0183eeb8 add cpan upload to release 2021-08-18 20:30:23 +01:00
Oliver Gorwits
b5d88076a8 add release for SNMP::Info why not 2021-08-18 08:33:45 +01:00
Oliver Gorwits
56ceb86f97 Delete .travis.yml.disabled 2021-08-17 13:42:24 +01:00
Oliver Gorwits
abbc3d4a63 Update runtests.yml 2021-08-17 12:23:18 +01:00
Oliver Gorwits
d0609781e8 Update runtests.yml 2021-08-17 12:20:11 +01:00
Oliver Gorwits
2ff3021eae Update runtests.yml 2021-08-17 12:03:17 +01:00
Oliver Gorwits
31c286ca57 add github action to replace travis testing 2021-08-17 11:59:42 +01:00
nick n
dd982373a7 fix tests (#428)
* add arubacx, replace unicode backtick

* fix pod

* remove undef, is implicit in scalar context. fixes tests

* mention IEEE802_Bridge
2021-07-06 21:49:50 +02:00
Oliver Gorwits
42d3df0e9c release 3.73 2021-06-28 15:13:17 +01:00
Oliver Gorwits
774339e98f release 3.72 2021-06-28 08:38:06 +01:00
nick n
b0c1c7e2a7 CiscoPower, not Power 2021-06-27 07:08:49 +02:00
nick n
36f882d916 add bridge again
should fix netdisco#708
2021-06-18 04:36:41 +02:00
Jeroen van Ingen Schenau
b1225583cd Merge pull request #422 from netdisco/jvi-aoscx
Aruba CX support
2021-06-17 10:14:45 +02:00
nick n
b491a6921c remove non breaking space (#424)
only changed in comments.
2021-06-17 02:57:15 +02:00
nick n
63fedc6a41 mention ieee802_bridge in info.pm (#425)
* add ieee802_bridge to info.pm, fixes tests

* aerohive comes before airespace
2021-06-17 02:56:29 +02:00
nick n
aefd0364fb move to libera chat 2021-06-15 07:57:19 +02:00
Jeroen van Ingen
3ae7073198 Small Bridge.pm fix
This change will make sure that the internal _vlan_hoa() function will strip
any additional index levels that may be present in input data. Not only applies
to Q-BRIDGE-MIB tables with a TimeFilter index, but also to tables where part
of the data comes from IEEE8021-Q-BRIDGE-MIB with both TimeFilter and PBB ID.
2021-06-11 15:15:01 +02:00
Jeroen van Ingen
9c306812f9 Add support for Aruba CX switches 2021-06-11 15:15:01 +02:00
Jeroen van Ingen
3790a2fcb2 Add IEEE802_Bridge module
Initial version of module to fetch data from IEEE8021-Q-BRIDGE-MIB
2021-06-11 13:21:39 +02:00
nick n
0b86645a63 aerohive version support higher as 9 (#421)
* allow aerohive hiveos version numbers above 9
* aerohive is now owned by extreme
2021-06-04 18:38:13 +02:00
nick n
fa206be639 libera irc 2021-05-28 02:21:31 +02:00
nick n
350ee49293 libera irc 2021-05-28 02:21:05 +02:00
nick n
210d4d48a7 libera irc 2021-05-28 02:16:08 +02:00
nick n
ad8224bcec aerohive, not aironet
typos
2021-05-12 05:51:02 +02:00
nick n
9943dff277 mention #403 2021-04-29 09:20:51 +02:00
nick n
bf0b7d989f dont flip between dell and aruba
should fix #403
2021-04-29 09:18:27 +02:00
nick n
6ec90b3b9b sort a few things 2021-04-29 07:57:20 +02:00
nick n
2a2214a0ac ignore .vscode directory (#418) 2021-03-13 17:36:12 +01:00
Oliver Gorwits
31b231804f release 3.71 2020-11-27 09:46:24 +00:00
Jeroen van Ingen Schenau
a4c66663c1 Don't add AUTOLOAD generated methods in symbol table (#409) (#410)
When a method is resolved via AUTOLOAD (eg for objects defined in %FUNCS),
adding the method to the symbol table leads to skipping AUTOLOAD on subsequent
calls to the method. The method table however is global to the interpreter,
so even when a new SNMP::Info instance is created for a different device, all
methods created by a previous device are just "carried over" to the new one
if they are put into the symbol table. This breaks a method like "v_name",
which may resolve differently in different device classes, in the use case
where devices from different classes are polled one after another (even if
new SNMP::Info object instances are used every time).
2020-11-18 11:36:13 +00:00
nick n
b9e054093a a few things that got imported or fixed 2020-11-15 21:19:24 +01:00
nick n
1c7320ce1e some doc cleanup in ubiquiti (#411) 2020-11-15 20:04:41 +01:00
LBegnaud
50841b5109 UBNT adjustments - Add ER-12 (#398)
merging this for now so we don't forget about this, but ubiquiti seems to have expanded into switches & routers as well.
so in the future this class will either needs to be expanded or split into different ones (wifi/switch/router).


* Clean up EdgeOS and EdgeSwitch verion reporting

* Fixes EdgeOS hotfix versioning

* Also clean up AirOS firmware

* Support ER-12

* lowercase vendorname
2020-11-15 18:35:49 +01:00
nick n
babbbb4e57 clean scalance
a few typos
info::bridge & info::lldp get pulled in via info::layer3
use Socket could be dropped in favor of resolve_desthost(), but needs testing.

(not tested waiting for what travis says)
2020-11-14 20:13:47 +01:00
nick n
e2544129bc nxos6 lldp fixes 2020-10-28 11:56:03 +01:00
nick n
39b5b3af9f lldp fix for nxos6 #372 (#375)
* first part of fix for #372

makes lldp stop using lldpLocPortDesc directly but maps it to a function

start framework to allow nexus.pm to overwrite that function for nx-os6

* second part of fix for #372

make nx-os 6 return lldpLocPortId for lldp_lport_desc

* munge_null and whitespace nits
2020-10-28 11:54:25 +01:00
Jeroen van Ingen Schenau
a263f54744 Add initial support for Teltonika RUT9xx routers (#386)
Note that Teltonika routers run the net-snmp agent and can present the net-snmp enterprise ID; if so, configure the following through the router CLI to be identified as Teltonika and to be picked up by this device class:

uci set snmpd.@system[0].sysObjectID=.1.3.6.1.4.1.48690
uci commit
ubus call uci commit '{"config":"snmpd"}'
2020-10-28 09:00:18 +01:00
nick n
543072ca25 update manpage
after reading netdisco/netdisco#693 and checking the code it seems layers() does not return l2 support.

while here add required mibs and move layers() manpage to globals, not table entries
2020-01-27 22:36:16 +01:00
nick n
39356d72b4 typo 2019-11-04 02:04:59 +01:00
nick n
e013ac3a20 whitespace nitpicking
ocd kickin in...
2019-11-03 19:06:35 +01:00
nick n
a85c7a0404 typos 2019-10-17 05:27:58 +02:00
Oliver Gorwits
4852ed4668 release 3.70 2019-10-15 18:43:39 +01:00
Oliver Gorwits
d36fce44d0 release 3.69 2019-10-15 18:36:59 +01:00
Christian Ramseyer
60e63ac9cc Proposal to fix #370 (#371) 2019-10-15 18:29:16 +01:00
pyro3d
a97c48546c Support for DOCSIS Cable Modems (#368) 2019-10-15 18:28:32 +01:00
nick n
dd96147712 use latest mibs release instead of hardcoding version tag (#367) 2019-10-15 18:27:37 +01:00
nick n
912bf62e9b can't reach these returns (#363) 2019-10-15 18:27:06 +01:00
Christoph Handel
0791b7cccb Support Siemens Scalance Switch (#361) 2019-10-15 18:26:49 +01:00
pyro3d
78c194faee Layer3::Ciena class (#365)
Implement Ciena class
2019-10-02 13:24:36 -07:00
nick n
9d00126c83 use mibs 4.018 2019-10-02 21:03:01 +02:00
nick n
6fa54dd4db checkpoint cosmetic and doc changes (#366)
return lowercase vendor

update test

document changes in the manual

snmp.conf is most likely specific to ipso based devices?
2019-10-02 20:54:28 +02:00
nick n
eb6420125e prefer checkpoint mibs (#358) 2019-10-02 20:02:52 +02:00
Ambroise
51be2d5dc5 Retrieve Serial Number and device type for CheckPoint (#358)
* Retrieve Serial Number and device type for CheckPoint devices at right place in MIB

* Retrieve Serial Number and device type for CheckPoint

* Retrieve Serial Number and device type for CheckPoint

* Test not correct with cache data
2019-10-02 19:48:56 +02:00
nick n
762a01e619 ios- xe codename detection 2019-10-02 18:41:52 +02:00
Christoph Neuhaus
f0fb351137 detect ios-xe versions which use codenames (#359)
* Cisco is using codenames for ios-xe > 16.x
Example description:
Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.6.6, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport  Copyright (c) 1986-2019 by Cisco Systems, Inc.  Compiled Thu 11-Apr-19 02:24

* Gibraltar Codename added
2019-10-02 18:40:38 +02:00
nick n
6d39026616 netdisco-mibs has been updated to 4.017 2019-09-26 01:17:04 +02:00
nick n
723f8ea744 pulse secure os_ver fix 2019-09-26 01:16:08 +02:00
nick n
f941f432e9 remove trailing newline from os_ver, fixes netdisco #647 (#364)
* remove trailing newline from os_ver, fixes netdisco #647

* note why the newline is in the test

* also update tests

* typo
2019-09-26 00:58:16 +02:00
nick n
631f99f97b typo 2019-09-04 01:11:28 +02:00
nick n
1840089789 poe power usage & mac address for ciscosb (#357) 2019-08-31 10:52:16 +02:00
nick n
36029e38a7 we want info
draw more attention to the fact that we really like you to fill out everything we ask for if possible
2019-08-28 22:44:49 +02:00
nick n
3abffc4d59 fix cdp_port when returned value is exactly 6 chars (#355)
* revert fix 2 of commit 78119d6, breaks devices that report a port name
6 chars long
* and remove test case for the "packed mac" special case
* and mention cdp fix in changelog

ran this for over 2 months and did not have any regressions on my gear.
2019-08-27 22:44:26 +02:00
nick n
0f01c6c07c i don't think layer2 is needed, layer3 alrdy has all the same includes (#354)
and no layer2 specific functions that are not overwritten are used.

also, os name -> lowercase
mention 1 more used mib
2019-08-26 14:37:15 +02:00
nick n
68b001105d ubiquiti version cleanup 2019-08-26 13:53:14 +02:00
nick n
d459dd7f8c fix engrish
aka: typos
2019-08-26 13:50:36 +02:00
nick n
75a00fabe9 also added use warnings and strict
also fixed all reported errors by these, but work is still needed.

stuff like

sub thingy {
        my $thing = shift;
        my $stuff = $thing->os_ver();
        if ($stuff =~ /check/) {

-> newer perls (or perhaps just my config somehow) seems to prefer

        if ((defined $stuff) && ($stuff =~ /check/)) {

instead.

or perhaps i just don't understand autoloader magic & return type nuances.
2019-08-26 13:48:50 +02:00
nick n
091a3692e3 mentioned doc cleanup 2019-08-26 13:26:52 +02:00
nick n
3bcc522590 documentation overhaul (#353)
* ident
* remove $Id$ tags from rcs software which has been retired
* make an effort to sync required mib docs with actual code
* sync even more docs with what code actually does
* some whitespace nits
* fixup example to use snmpv2 for all but the most ancient devices
* remove blurb to find more specific snmp::info classes for classes
  which alrdy are as specific as they can get (eg snmp::info::layer3::vmware
  doesn't need info on to find a specific module since there ain't none)
* rename all sub {vendor} strings to lowercase vendor, if cisco, juniper
  and arista can be lowercase, so can be all the rest.
* fix tests
* spread some use warnings around
* use $ instead of @
* remove defines that are included via parent classes
* use strict + warnings
* remove alrdy included modules
* add comma after last list item
* typos
* mibs are found in our mib repo, not on the cisco site
* documentation fixes
2019-08-25 06:47:10 +02:00
LBegnaud
6c8d39d746 UBNT EdgeMax version reporting (#350)
* Clean up EdgeOS and EdgeSwitch verion reporting

* Fixes EdgeOS hotfix versioning

* Also clean up AirOS firmware
2019-08-25 06:35:23 +02:00
nick n
b6720a2b43 duplex support for ciscosb (#352) 2019-08-18 01:50:34 +02:00
nick n
6753b795b9 use older container for perl 5.10 2019-08-17 22:39:18 +02:00
nick n
cefbcce8e3 also uses IEEE802dot3ad mibs 2019-06-19 18:01:01 +02:00
nick n
910c5420e3 yaml withspace matters
mention markdown syntax on how to best represent withespace.
2019-06-16 05:24:25 +02:00
nick n
02c8ed0764 update mib doc
code says we want these 6 mibs. i trust the code.
2019-06-07 22:47:33 +02:00
nick n
fda13addf0 fix travis (#341)
add hook::lexwrap to testdeps (#341)
also use #!/usr/bin/env perl instead of #!/usr/bin/perl


can't see a related change to perl5.30 that could cause this however
2019-05-30 04:54:27 +02:00
nick n
211a06dbf1 perl 5.30
update travis
2019-05-30 04:07:32 +02:00
nick n
e886190e8e mib update
remove double defined FOUNDRY-SN-SWITCH-GROUP-MIB in code & docs
add BROCADE-PRODUCTS-MIB to docs as referenced in code
2019-05-22 02:41:51 +02:00
nick n
8b3a1fd357 typo 2019-05-04 04:41:30 +02:00
nick n
e7adf92b59 intellij exclusion support (#336)
having a go at intellij + perl support & cygwin. working surprisingly well.

exclude it's project configuration files. also fix 3 typos found when getting this to work.
2019-05-02 05:07:53 +02:00
nick n
7de14a2bd9 move testing targets to perl 5.10 and 5.28 2019-05-01 04:19:30 +02:00
nick n
f37225ee9a using my $b is not best practice
also update some manual statements while here
2019-05-01 04:17:58 +02:00
nick n
52f9042ef0 test a few more perl versions
test a few common perl version, namely 5.14, 5.20 & 5.26
2019-04-30 17:10:02 +02:00
Oliver Gorwits
d38ef69120 release 3.68 2019-04-28 20:01:52 +01:00
Oliver Gorwits
6341ad15f8 #330 fix redefine of port variable 2019-04-28 19:56:39 +01:00
Oliver Gorwits
f3f01d5f15 Merge branch 'master' of github.com:netdisco/snmp-info 2019-04-28 19:54:58 +01:00
Oliver Gorwits
23d11551c6 #332 fix undef error when debug on $info 2019-04-28 19:54:51 +01:00
nick n
73b63c8379 redlion cellular router (sn / ram series) support (#333) 2019-04-28 19:53:17 +01:00
Oliver Gorwits
2652998aba make the snmplabs test only run when AUTHOR_TESTING is set 2019-04-28 19:52:59 +01:00
nick n
254bfd11a3 typo in link
seems you need to prepend a slash to reference in the current pod.
2019-04-26 20:09:38 +02:00
nick n
2c61248016 mention CISCO-CONTEXT-MAPPING-MIB 2019-04-26 17:24:41 +02:00
nick n
45e56b332e lowercase vendor
just like all other snmp::info modules

use "vmware" instead of "VMware"
2019-04-26 17:21:19 +02:00
nick n
8003691e64 vendor is arista
not arista networks, inc. as it was way back in 3.06
2019-04-26 17:09:30 +02:00
nick n
25b1801fe4 update docs for serial() 2019-04-24 19:22:48 +02:00
nick n
737bb252a7 layer7::neoteris update for netdisco-mibs#80 (#328)
* use PULSESECURE-PSG-MIB in layer7::neoteris, also add model() function & remove neoteris fixup from layer7. tests updated.

* will need new mibs release
2019-04-24 13:21:33 +01:00
Ambroise
14e0aa0952 Netscaler serial number (#329)
Recover Netscaler serial number from the MIB.
2019-04-23 14:47:29 +01:00
nick n
e7d83a5918 typos 2019-04-22 00:32:35 +02:00
Oliver Gorwits
bfbb2fb2ab release 3.67 2019-04-20 12:01:59 +01:00
Oliver Gorwits
c8f686b7aa #294 snmp::info should show full class used 2019-04-20 11:28:48 +01:00
Oliver Gorwits
77fa064db5 #297 perl 5.28 removal of "use vars"
also adds pod for Layer3::DLink::interfaces
2019-04-20 10:32:24 +01:00
Oliver Gorwits
6b70ccfd79 #297 perl 5.28 removal of "use vars" 2019-04-20 10:20:10 +01:00
Oliver Gorwits
9b1995e90f #306 fix incorrect interfaces for d-link 2019-04-20 09:42:43 +01:00
Oliver Gorwits
75785f70c7 #321 clean interface descriptions of null and trailing space 2019-04-20 09:28:06 +01:00
Oliver Gorwits
ea9ad92cc4 #320 improve duplicate interfaces() fixup
1. sorts the interfaces as they are processed to make A/B testing easier
2. adds the interface index to the original when a duplicate is seen
3. there may be other de-duplication code in vendor modules, untouched
2019-04-20 09:07:14 +01:00
Oliver Gorwits
ad8762a7c4 Merge branch 'master' of github.com:netdisco/snmp-info 2019-04-20 07:47:50 +01:00
Oliver Gorwits
c73bc0ca2c #325 lazy load legacy RFC1213-MIB only if needed 2019-04-20 07:46:18 +01:00
nick n
07de5e53e3 make podchecker happy 2019-04-20 08:38:14 +02:00
Oliver Gorwits
141812bf4d add v3 Context update() tests for net-snmp 5.8+ 2019-04-20 07:36:17 +01:00
nick n
2308826147 full fix for aerohive tests (#327)
* full fix for aerohive tests
2019-04-20 08:35:18 +02:00
Oliver Gorwits
01fa098078 support debug via env vars (same as netdisco) 2019-04-20 07:14:12 +01:00
nick n
167cc2f3fa docsis (#326)
update meta
2019-04-20 08:02:02 +02:00
nick n
ea53f79bb8 3.66 2019-04-20 07:54:45 +02:00
pyro3d
4b75ef1889 Add DOCSIS head end support (#317)
* Add DOCSIS CMTS support for cable modem discovery

* Remove whitespace and update pod
2019-04-20 06:46:33 +01:00
nick n
c4ce6a2062 clean up exinda and add regression test (#324)
* simplify and clean up exinda code. perhaps mac handling should be done in a munge routine

* added exinda regression tests
2019-04-16 03:10:10 +02:00
nick n
9e4e0e3510 alphabetize
::ipv6 after ::ieee802dot3ad, not before
2019-04-15 23:08:00 +02:00
nick n
c0228965f4 explain why we overwrite layers
noticed when writing some tests
2019-04-15 23:05:09 +02:00
nick n
0896bd881c lenovo / cnos os support (#323)
while it's not yet complete is already is quite functional.
things like vlan, lldp, connected nodes, etc all work
test coverage also included.

features to be added:
link aggregation master/slave (some strange difference with standard 802.3ad i think)
spanning tree will most likely work too
fan/psu status
modules / entity-mib seems to be strangly formatted
2019-04-15 22:47:03 +02:00
nick n
42395d49fd fix regression test for aerohive (#322) 2019-04-14 22:27:40 +02:00
nick n
e08d22d51c flush cache in bp_index
netdisco/netdisco#496 has more background on the issue.

somewhere incorrect data is returned for bp_index mappings when running macsuck, but i cannot reproduce this when using snmp::info directly.

forcing i_index to reload works around the issue, performance impact is minimal.
2019-04-14 21:10:26 +02:00
nick n
f0b429039e make fortinet return a useful interface name. (#319)
* make fortinet return a useful interface name.

also fixes missing interface issue due to being unable to map the port
'interfaces - ignoring 54 (no port mapping)'
2019-04-01 19:32:40 +02:00
Oliver Gorwits
d63baa2473 Update .travis.yml 2019-03-28 22:15:18 +00:00
Oliver Gorwits
e8b4acbee6 release 3.66 2019-03-24 09:43:31 +00:00
nick n
b4734ea607 some files were missing eol at the end 2019-03-24 04:16:24 +01:00
nick n
6698b049a4 whitespace
githubs online editor autoidents, remove unneeded whitespace
2019-03-24 03:07:36 +01:00
nick n
68861fabfb get started for 3.66 2019-03-24 01:59:25 +01:00
pyro3d
d93e3ab1b6 Add IS-IS support (#316)
* Add ISIS support
* some doc fixups
mention isis-mib, use level so to not be confused with layer.
2019-03-19 06:55:38 +01:00
Oliver Gorwits
bfd71b5add use Alien::SNMP 2019-03-12 12:24:39 +00:00
nick n
9c8e8fa4e0 update MRO usage
at least with my perl 5.26.1 and Data::Printer 0.40 you can't pass subroutines to p().

seems useful info for the wiki, will draft up a page nxt week.
2019-03-03 02:38:11 +01:00
Oliver Gorwits
2e2c6958d6 release 3.65 2019-02-24 15:02:38 +00:00
nick n
4ba91f9df8 update oneaccess (#310)
* update oneaccess, regretfully it seems oneos version6 is a step back when it comes to snmp support.
changes:
 * start using oneaccess mibs, not much useable data there yet however
 * return the device model
 * show os version for version 6 too. not many elegeant ways to handle all the version syntaxes used,
     so just dump what resembles a version string & be done with it
 * updated documentation

tested on:
 one420 - os V5.2R1C12
 one521 - os 6.1.rc1patch06
 one521 - os 6.1.3

some comments in the code as what works & what doesn't.

* typo

* bump required netdisco-mibs version to 4.014 (not released yet) but needed for oneaccess mibs. might as well fail at the start of the build instead of the end

* 2 tests fixed for oneaccess, 1 more to go

* last test fixed

* a few more changes

but mostly need to have a file change so i can trigger a travis build :)
2019-02-24 14:57:21 +00:00
nick n
3b604723bd typo & 2 variables that were not defined with my (#309) 2019-02-23 22:30:04 +01:00
LBegnaud
a2877729ff Update VyOS Official enterprise OID (#308)
VyOS project has their own OID as of the release of 1.2.0: https://wiki.vyos.net/wiki/1.2.0/release_notes#SNMP_sysDescr_and_OID
2019-02-22 09:17:54 +01:00
nick n
605ae68f6b mention info::snmp::cdp req
req mibs would also be nice.
2019-02-10 06:58:36 +01:00
nick n
ef8afd8b65 mau means Medium Attachment Unit
mau means "Medium Attachment Unit"
2019-02-09 21:21:19 +01:00
nick n
9365c67a6b mau means something else
it means "Medium Attachment Unit", not "Media Access Unit" according to rfc 2668
2019-02-09 21:13:02 +01:00
nick n
8e3f10673e fix cisco aggregated port slave interface mapping
netdisco/snmp-info#295 for issue

tested on c3750x (stacked & single) & nexus 9332.

c3750x didn't show any slave interfaces for it's port channels.
nexus reported data all over the place, even making port channels slave interfaces of other port channels.

with these changes both devices report correct and complete slave interfaces:
tested on c3750x with lacp channels
tested on nexus 9332pq with lacp channels (vpc),  static aggregation, vpc peer link, fex uplink.

no regressions detected after a month of testing (we also have a bunch of ciscosb & other ios devices running , but none of those have port channels).

updated documentation, hope it makes sense.

things that didn't work before and still don't:
* mapping vpc portchannels members on both vpc cluster switches (sounds like fun)
* cisco ucs fabric interconnects (nexus 6248 on 3.2.3d) don't show port channel members, but didn't do so before either.

munge_port_ifindex() can most likely be written more elegant, but that's something for a real perl monk.
2019-02-02 00:59:57 +01:00
nick n
cc95604bd9 now lenovo devices
blade networks -> ibm -> lenovo
2019-02-01 18:50:44 +01:00
nick n
6799312ad0 move Kentrox a few lines lower
since it's sorted alphabetically.

since i was here also mention ibmgbtor is now owned by lenovo.

and then made the layout a bit more consistent
2019-02-01 18:46:07 +01:00
nick n
8dee0fcd12 Merge pull request #299 from inphobia/nn_ws_cleanup
massive amount of trailing whitespace cleanup

i ran this for 2 weeks, did not notice any regressions.

during those 2 weeks i went over all the diffs on 3 different occasions to make sure i did not delete a comma, quote or whatever.

ran the complete test set as well, no errors there either.

now it's finally commit time then i guess, so when the next module gets based on an existing one we have a clean layout.
2019-01-31 17:42:25 +01:00
nick n
dca78048c7 clarify what the oid references 2019-01-31 02:20:29 +01:00
nick n
014d32cec1 device info would be handy too
for snmp::info device information always comes in handy. add it to the issue template.

basic info which helps: vendor, model & os plus an snmpwalk of the system leaf of snmpv2-mib.
2019-01-31 02:14:37 +01:00
nick n
477d845c39 guess should add that name here too
or perhaps it will get regenerated with the nxt release process and be added then.
2019-01-31 00:55:31 +01:00
nick n
6e5155ffbf just adding 1 more name in here
that name being mine.
2019-01-31 00:51:12 +01:00
nick n
39679992f0 this ain't vyatta
readme & info.pm refers to this as
"Subclass for DLink devices."

so do the same here.
2019-01-31 00:32:44 +01:00
inphobia
4dee43a863 Merge branch 'master' of https://github.com/netdisco/snmp-info into nn_ws_cleanup 2019-01-19 18:42:12 +01:00
inphobia
5c599bd3d2 mention required mibs 2019-01-19 14:43:25 +01:00
nick n
be0dbf6953 typo
_load_attr, not _load_atrr
2019-01-19 13:41:49 +01:00
inphobia
a59572b392 pod cleanup 2019-01-19 05:55:28 +01:00
inphobia
19cdb388e5 Changes whitespace cleanup 2019-01-19 05:38:14 +01:00
inphobia
e68fa13289 contrib whitespace cleanup 2019-01-19 05:37:23 +01:00
inphobia
d938a2c0d6 almost done whitespace cleanup 2019-01-19 05:33:09 +01:00
inphobia
16285ce2eb almost done whitespace cleanup 2019-01-19 05:30:20 +01:00
inphobia
e356189010 almost done whitespace cleanup 2019-01-19 05:24:32 +01:00
inphobia
4230a07c94 final whitespace cleanup 2019-01-19 05:19:41 +01:00
inphobia
f2b0f67b5f l7 whitespace cleanup 2019-01-19 05:18:41 +01:00
inphobia
a8766a0b0b even more whitespace cleanup 2019-01-19 05:17:04 +01:00
inphobia
b78b1b4860 even more whitespace cleanup 2019-01-19 05:13:01 +01:00
inphobia
6118b0d012 and more whitespace cleanup 2019-01-19 05:07:12 +01:00
inphobia
ca48defd24 and more whitespace cleanup 2019-01-19 05:02:41 +01:00
inphobia
93787c4c45 more whitespace cleanup 2019-01-19 04:55:14 +01:00
inphobia
5562144209 whitespace cleanup 2019-01-19 04:43:18 +01:00
nick n
b28f81adbb Small improvements in consistency for code and manual (#298)
usage of munge_prio_mac/port was mixed up.
make manual a bit more consistent while here.
2019-01-15 10:43:47 +01:00
Jeroen van Ingen
64846ed2de Add model mappings for HP JL557A and JL558A 2019-01-02 15:13:31 +01:00
Oliver Gorwits
d7d747af67 release 3.64 2018-12-30 10:24:59 +00:00
Oliver Gorwits
41e9332420 update MANIFEST 2018-12-30 09:56:30 +00:00
Oliver Gorwits
23613800b2 add Module::Find to test_requires 2018-12-30 09:55:32 +00:00
Oliver Gorwits
8100461520 #289 add BSD licence to files where missing 2018-12-30 09:46:50 +00:00
Oliver Gorwits
07afff6ef0 new Class test wrapper 2018-12-29 20:41:10 +00:00
Oliver Gorwits
400c26a1d7 add NetSNMP::default_store test req 2018-12-29 14:46:04 +00:00
nick n
b6f7df332b no space in manpage link to ciscoips (#290) 2018-12-29 11:03:14 +00:00
nick n
e5eee009b3 and even more sourceforge -> github references (#288) 2018-12-29 11:02:58 +00:00
nick n
bb731c6368 sourceforge links replacing (#287)
more sourceforge -> github changes
2018-12-29 11:02:41 +00:00
nick n
a418ba0a1e replace sourceforge references with working links (#286)
the FAQ: section discusses cvs, i guess that is no longer relevant either.
2018-12-29 11:02:23 +00:00
nick n
cea462662d mib link change + spelling (#285)
redirect to github for netdisco-mibs instead of sourceforge.

rest are some spelling fixes & setting things alphabetically.
2018-12-29 11:01:47 +00:00
nick n
f3a8b1171b aerohive test module, missing part for #282 (#284)
* aerohive test module

add mac() test
set serial inline with real serial
add mgt0,wifi0 & wifi1 interfaces
set mac address correctly as compared to real aerohive devices

* typo
2018-12-29 11:01:16 +00:00
nick n
bb773ccc0a add preliminary support for exinda / gfi traffic shapers (#283)
* exinda support

* exinda support

* add exinda hint

needed to identify exinda devices.

* mentin exinda in overview and link docs

* overwrite layers to l2/3/4/7

* get uptime from exinda mib

now matches uptime reported by cli & web interface.

* single quotes preferred

* to much copy/paste

* merge 3.63

* some more functions added. also general cleanup

* Update .travis.yml

* a few fixes

* Update .travis.yml

* Update .travis.yml

* revert

* revert
2018-12-29 11:00:08 +00:00
nick n
61dc499369 attribute change (#281)
pretty please?
alias or real name, both work for me. thx
2018-12-29 10:58:48 +00:00
Oliver Gorwits
d806795a86 Always notify from Travis to IRC and email on any code commit 2018-12-28 18:34:57 +00:00
nick n
91f92f0fb9 aerohive base mac lookup and some minor doc nitpicking (#282) 2018-12-17 09:24:30 +01:00
Oliver Gorwits
bde8da5e6b release 3.63 2018-11-25 23:27:42 +00:00
Oliver Gorwits
f134368e6d try different testing 2018-11-25 23:16:10 +00:00
Oliver Gorwits
a6ff166e4e attempt to fix test? 2018-11-21 11:37:44 +00:00
Oliver Gorwits
3ea6bd6217 fix docs 2018-11-21 10:52:45 +00:00
Oliver Gorwits
6405ebfc3e #271 update os_ver for Alcatel-Lucent (stromsoe) 2018-11-21 10:48:05 +00:00
Oliver Gorwits
94ab114cd3 #273 remove old ADTRAN modules not in netdisco-mibs 2018-11-21 10:45:46 +00:00
nick n
954f58fdbc return aerohive serial (#280)
no idea why this is needed, but without this change no serial is returned:

netdisco-do show -d hiveap207 -e serial
[25474] 2018-11-09 19:45:09  info App::Netdisco version 2.039031 loaded.
[25474] 2018-11-09 19:45:10  info show: [10.40.252.14]/serial started at Fri Nov  9 20:45:10 2018
undef
[25474] 2018-11-09 19:45:10  info show: finished at Fri Nov  9 20:45:10 2018
[25474] 2018-11-09 19:45:10  info show: status done: Showed serial response from 10.40.252.14

netdisco-do show -d hiveap207 -e Layer2::Aerohive::serial
[25491] 2018-11-09 19:45:15  info App::Netdisco version 2.039031 loaded.
[25491] 2018-11-09 19:45:15  info show: [10.40.252.14]/Layer2::Aerohive::serial started at Fri Nov  9 20:45:15 2018
undef
[25491] 2018-11-09 19:45:16  info show: finished at Fri Nov  9 20:45:16 2018
[25491] 2018-11-09 19:45:16  info show: status done: Showed serial response from 10.40.252.14



with the change:
netdisco-do show -d hiveap207 -e Layer2::Aerohive::serial
[23072] 2018-11-09 19:44:06  info App::Netdisco version 2.039031 loaded.
[23072] 2018-11-09 19:44:07  info show: [10.40.252.14]/Layer2::Aerohive::serial started at Fri Nov  9 20:44:07 2018
02501610110274
[23072] 2018-11-09 19:44:07  info show: finished at Fri Nov  9 20:44:07 2018
[23072] 2018-11-09 19:44:07  info show: status done: Showed serial response from 10.40.252.14

netdisco-do show -d hiveap207 -e serial
[23075] 2018-11-09 19:44:13  info App::Netdisco version 2.039031 loaded.
[23075] 2018-11-09 19:44:13  info show: [10.40.252.14]/serial started at Fri Nov  9 20:44:13 2018
02501610110274
[23075] 2018-11-09 19:44:14  info show: finished at Fri Nov  9 20:44:14 2018
[23075] 2018-11-09 19:44:14  info show: status done: Showed serial response from 10.40.252.14
2018-11-21 10:37:19 +00:00
nick n
8232e783fa use correct module (#279)
The test code for Layer2::Aerohive should reference the Layer2::Aerohive class, not Layer1::Allied.
2018-11-13 08:57:02 +01:00
Eric A. Miller
5aa21deb07 release 3.62 2018-10-29 19:09:26 -04:00
Alexander Hartmaier
b7ac11222a Support for Cisco Firepower Threat Defense (#278)
When sending SNMP requests to one of the data interfaces of an FTD you're
talking to a Cisco ASA running as a process called 'lina'.
2018-10-25 10:30:43 +02:00
Jeroen van Ingen
b24da8c380 Add tests for peth_port_ifindex in Juniper.pm 2018-10-08 12:37:23 +02:00
pyro3d
ab2be759af Document peth_port_ifindex for Junipers (#275)
Document peth_port_ifindex in Juniper.pm
2018-10-08 10:56:38 +02:00
Jeroen van Ingen Schenau
78e5528c0d Merge pull request #270 from avantops/mikrotik-model-fix
Add support for additional Mikrotik models
2018-10-08 09:45:27 +02:00
Jeroen van Ingen Schenau
01ce4238dd Merge pull request #274 from pyro3d/master
Add peth_port_ifindex override for Junipers.
2018-10-08 09:44:00 +02:00
Ryan Gasik
a82e8e32a0 Add peth_port_ifindex override for Junipers. 2018-10-06 20:53:06 -07:00
Jeroen van Ingen
770ab9c8ec Add 3810M, 2930M, 2930F and 2540 series switches 2018-09-10 10:28:42 +02:00
avantops
f63a71910c Add support for additional Mikrotik models
Add additional regex to catch additional valid Mikrotik hardware models.
2018-06-27 00:05:42 -07:00
Jeroen van Ingen Schenau
8fa27f8844 Merge pull request #265 from fschlich/patch-1
fix typos in Huawei.pm
2018-05-14 17:59:09 +02:00
Florian Schlichting
ea59fa2c2d fix typos in Huawei.pm
as found by Debian's lintian QA checker
2018-05-14 17:47:34 +02:00
Eric A. Miller
a1769aa905 release 3.61 2018-05-09 23:17:09 -04:00
Eric A. Miller
78119d6547 #252 Unpack binary MAC if present in cdp_port
Fix SNMPv1 cdp_run check
2018-05-09 22:49:53 -04:00
Eric A. Miller
f27d76fa9d Use munge_mac() to unpack MACs 2018-05-09 22:44:24 -04:00
Eric A. Miller
4f8534169a Use NetAddr::IP::Lite to determine if EIGRP peer is a valid IP 2018-05-09 22:42:59 -04:00
Eric A. Miller
f531c9d9a7 #261 EIGRP Peer Neighbor Formatting / Munge 2018-05-07 23:08:19 -04:00
Eric A. Miller
1a80138026 #195 IP address table - IPv4 Address Table will use the IP-MIB::ipAddressTable if the deprecated IP-MIB::ipAddrTable doesn't return results 2018-05-07 21:09:16 -04:00
Eric A. Miller
4ff904f3cd If we were given an IPv6 transport-specifier strip it before trying to resolve it
Since DestHost defaults to 'localhost' die instead of returning undef from resolve_desthost()
2018-05-06 20:26:51 -04:00
Eric A. Miller
721193ccb8 #255 IPv6 support 2018-05-06 14:02:35 -04:00
Eric A. Miller
b263fa4375 release 3.60 2018-05-06 11:01:00 -04:00
Eric A. Miller
4681004b52 Fix potential issue in enumeration of LLDP reported system capabilities supported by the remote system due to the 'lldpRemSysCapSupported' leaf name being defined in multiple MIBs 2018-05-06 10:51:19 -04:00
Eric A. Miller
0ab688964f Don't capture 'Hive' if it exists in aerohive AP model name 2018-05-06 09:32:35 -04:00
Oliver Gorwits
7e0ef60e24 update changelog 2018-05-05 16:27:09 +01:00
inphobia
41339c8df4 detect ap250 & ap230 models (#263)
it seems aerohive changed the their model names in snmp, so they no langer always begin with "hive". i have access to models 120, 121, 230 & 250. this is their sysdescr:

SNMPv2-MIB::sysDescr.0 = STRING: AP250, HiveOS 8.3r2 build-191018
SNMPv2-MIB::sysDescr.0 = STRING: AP230, HiveOS 6.5r8b build-179369
SNMPv2-MIB::sysDescr.0 = STRING: HiveAP121, HiveOS 6.5r8b build-179369
SNMPv2-MIB::sysDescr.0 = STRING: HiveAP120, HiveOS 6.5r3 Honolulu build2530

this fixes empty model names for the 230 & 250 ones while still supporting 120 & 121

Class SNMP::Info::Layer2::Aerohive (3.59) loaded from SNMP::Info 3.59.
Connected to hiveap211.
Detected Class: SNMP::Info::Layer2::Aerohive
Using    Class: SNMP::Info::Layer2::Aerohive (-c to change)

Fetching base info...

vendor               aerohive
model                AP250
os                   hiveos
os_ver               8.3r2
description          AP250, HiveOS 8.3r2 build-191018
contact              admin@aerohive.com



Class SNMP::Info::Layer2::Aerohive (3.59) loaded from SNMP::Info 3.59.
Connected to hiveap113.
Detected Class: SNMP::Info::Layer2::Aerohive
Using    Class: SNMP::Info::Layer2::Aerohive (-c to change)

Fetching base info...

vendor               aerohive
model                HiveAP121
os                   hiveos
os_ver               6.5r8b
description          HiveAP121, HiveOS 6.5r8b build-179369
contact              admin@aerohive.com
2018-05-05 16:19:39 +01:00
Eric A. Miller
119c077d25 Some devices use ifIndex when LLDP remote type is 'local', don't lldpRemPortId in these cases when it contains all digits
Cover LLDP class with tests
2018-05-04 17:23:44 -04:00
Eric A. Miller
9af3f7c579 #140 LLDP fixes - treat remote port type of 'local' as an interface name 2018-05-02 22:47:46 -04:00
Eric A. Miller
e7c93b7abd release 3.59 2018-05-01 23:18:16 -04:00
Eric A. Miller
20b655c7a2 POD 2018-05-01 23:13:00 -04:00
Eric A. Miller
9fca5b1e42 Change _lldp_addr_index to a method so it can be properly overridden in subclasses 2018-05-01 23:01:56 -04:00
Eric A. Miller
1c581f8e8f Capture base MAC in L3::Huawei
Capture fan and power supply status in L3::Huawei when description is not available
2018-05-01 22:19:39 -04:00
Eric A. Miller
8d35e15624 #214 SNMP::Info Device models Genua, ATMedia, Liebert 2018-04-30 23:36:47 -04:00
Eric A. Miller
cf42fe1496 release 3.58 2018-04-29 23:47:25 -04:00
Eric A. Miller
1af11bd088 #220 Alcatel-Lucent / Nokia SR 7750 missing port information. Add duplex, fan, and power supply status, as well as, module inventory to L3::Timetra 2018-04-29 23:35:09 -04:00
Eric A. Miller
073ec319e7 perltidy updates 2018-04-29 13:01:32 -04:00
Eric A. Miller
5852c3548b #202 Support for Aerohive access points 2018-04-29 12:20:43 -04:00
Eric A. Miller
2344a1eacf Add fan and power supply status to L3::Huawei
Override ifMTU with max frame size when applicable in L3::Huawei
Correct POE power module to port mapping in L3::Huawei
2018-04-29 12:03:05 -04:00
Eric A. Miller
d0887fbea7 release 3.57 2018-04-26 21:17:17 -04:00
Eric A. Miller
e5ebda1b1e Significant performance improvement validating AUTOLOAD methods 2018-04-26 20:53:04 -04:00
Eric A. Miller
8d1681dbfc Validate funcs and globals rather than using can() to avoid unintended side effects 2018-04-26 20:48:02 -04:00
Eric A. Miller
7221797826 Fix for macsuck in Cisco classes introduced in 3.55 caused by inheritance issue in CiscoStack 2018-04-26 20:44:31 -04:00
Eric A. Miller
f2fdbb077c #145 Patch for Huawei (robwwd)
#228 Huawei aggregate link support
POE and duplex admin support added to L3::Huawei
2018-04-25 22:44:13 -04:00
Eric A. Miller
a6fdb107b4 Return empty hash peth_port_ifindex() for consistency
Cover PowerEthernet methods with tests
2018-04-25 22:34:55 -04:00
Eric A. Miller
7f31038462 IEEE802dot3ad portlist is indexed with a dot1dBasePort, cross reference with dot1dBasePortIfIndex 2018-04-25 22:33:08 -04:00
Eric A. Miller
5fb7c78619 release 3.56 2018-04-22 01:00:30 -04:00
Eric A. Miller
603345205a Fix table methods when defined as an OID which will not completely translate to a fully qualified textual leaf 2018-04-22 00:30:31 -04:00
Eric A. Miller
bd85ebc8d6 release 3.55 2018-04-19 19:06:06 -04:00
Eric A. Miller
2aca6d9300 #67 Juniper EX4300 Missing/Wrong information
Modify Q-Bridge methods to work on both pre-Enhanced Layer 2 Software (ELS) such as EX4200 and newer Enhanced Layer 2 Software (ELS) based switches such as EX4300 and QFX series
2018-04-19 18:23:48 -04:00
Eric A. Miller
4919cb0f69 Documentation correction 2018-04-19 18:15:55 -04:00
Eric A. Miller
d134c342e8 #117 Recognition for HP Blade switches 2018-04-19 18:12:39 -04:00
Eric A. Miller
b1c7e78d12 Merge branch 'robwwd-oneaccess' 2018-04-17 00:09:29 -04:00
Eric A. Miller
0a0766afbd Simplify Layer3::OneAccess model method since it is returning a static string
Add Layer3::OneAccess test class and POD updates
2018-04-17 00:09:02 -04:00
Eric A. Miller
2d39911cba Merge branch 'oneaccess' of https://github.com/robwwd/snmp-info into robwwd-oneaccess 2018-04-16 23:50:59 -04:00
Eric A. Miller
3bf60002f4 Merge branch 'robwwd-erx' 2018-04-16 23:49:39 -04:00
Eric A. Miller
42db01335e Add Layer3::ERX test class and POD updates 2018-04-16 23:47:35 -04:00
Eric A. Miller
752e1c632c Merge branch 'erx' of https://github.com/robwwd/snmp-info into robwwd-erx 2018-04-16 23:32:32 -04:00
Eric A. Miller
892d2014ca Merge branch 'robwwd-arbor' 2018-04-16 23:30:26 -04:00
Eric A. Miller
1fdc486cd5 Add Layer7::Arbor test class
POD updates
2018-04-16 23:29:24 -04:00
Eric A. Miller
9e7f7f734e Merge branch 'arbor' of https://github.com/robwwd/snmp-info into robwwd-arbor 2018-04-16 23:06:33 -04:00
Rob Woodward
e311f8a5c6 Change vendor to Juniper 2018-04-16 13:15:26 +01:00
Eric A. Miller
82755ab8db #196 support for powerconnect 8164F
Refactor Layer3::Dell for better support of newer models - requires updated MIBs
2018-04-15 23:38:05 -04:00
Eric A. Miller
62823e3d83 Factor out logic to determine serial number from ENTITY-MIB in Layer2 and Layer3 to new method entity_derived_serial in Entity class
Create new method entity_derived_os_ver in Entity class to determine OS version in a similar manner
2018-04-15 23:30:19 -04:00
Rob Woodward
66077c9662 Fix documentation 2018-04-13 12:17:36 +01:00
Rob Woodward
74e129154b Add ERX (Old Juniper E-Series JunOSe) Support 2018-04-13 12:12:17 +01:00
Rob Woodward
75880d9134 Fix tab character 2018-04-13 12:05:37 +01:00
Rob Woodward
245fe93be4 Support for OneAccess Network Devices 2018-04-13 12:01:58 +01:00
Rob Woodward
54a0baa2fa Add support for Arbor devices 2018-04-13 11:26:46 +01:00
Eric A. Miller
4e18ccc9e2 #142 Sixnet Switch Support 2018-04-12 22:57:54 -04:00
Eric A. Miller
9ed5a187a9 Add missing documentation to Layer2::Nexans
Update Changes and Manifest
Add Layer2::Nexans test class
2018-04-12 14:44:53 -04:00
Eric Miller
a636ba6117 Merge pull request #253 from paecker/nexans_support
Nexans switch support
2018-04-12 14:26:44 -04:00
Eric A. Miller
facdf0aafe Restore check that the MIB leaf is accessible when validating AUTOLOAD method calls
Restore corresponding test
Move live snmp_connect_ip() test to 10_remote_snmplabs.t so that tests requiring Internet access are within one file
2018-04-11 21:09:57 -04:00
Eric A. Miller
75dcf74148 Add initial versions of test classes 2018-04-11 21:02:48 -04:00
Eric A. Miller
e252dac59c Correct typo in comments 2018-04-11 20:56:15 -04:00
Eric A. Miller
9d384f2bc2 Correct regex validator in mau_set_i_speed_admin() and mau_set_i_duplex_admin()
Correct IID/key used in mau_set_i_speed_admin() and mau_set_i_duplex_admin()
Add MAU test class
2018-04-11 20:55:11 -04:00
Eric A. Miller
cc9a1c9f47 Make sure MIB leaf is actually in the MIB we're loading, not the imports
Add Layer3::Foundry and Layer3::Force10 test classes
2018-04-11 20:50:16 -04:00
Eric A. Miller
b43eafd09a Use OIDs when we don't have the MIB
Add Layer3::DLink test class
2018-04-11 20:48:16 -04:00
Eric A. Miller
141470fdf4 Add missing MIB required for leafs used in %FUNCS
Add Layer3::Dell test class
2018-04-11 20:46:36 -04:00
Eric A. Miller
2e18464635 Make sure MIB leaf is actually in the MIB we're loading, not the imports
Capture the numeric OS version
Add Layer3::Cumulus test class
2018-04-11 20:43:54 -04:00
Eric A. Miller
87a287e0c9 Sort hash keys to make sure we returna consistent mac in L3::Contivity
Add Layer3::Contivity test class
2018-04-11 20:42:35 -04:00
Eric A. Miller
a38eafbf56 Increase capture of i_vlan on router interfaces in L3::Cisco
Make sure cisco_comm_indexing() has a return value of either 1 or 0 in L3::Cisco
Add Layer3::Cisco test class
2018-04-11 20:41:14 -04:00
Eric A. Miller
81c7203642 Make sure MIB leaf is actually in the MIB we're loading, not the imports
Add L3::CheckPoint, L3::NetSNMP, and L3::PacketFront test classes
2018-04-11 20:36:51 -04:00
Eric A. Miller
c515a5e4a1 Prevent potential undefined warning in ports() of Layer3::C3550
Add Layer3::C3550 test class
2018-04-11 20:30:46 -04:00
Eric A. Miller
02e6807e44 Prevent potential undefined warnings in i_speed_admin() of L2::C2900 2018-04-11 20:27:40 -04:00
Eric A. Miller
90bb0ef071 ISA Info
Add IEEE802dot11 test class
2018-04-11 20:25:55 -04:00
Eric A. Miller
209988cf9e Don't use MIB leafs that are not-accessible according to MIB
Add CiscoVTP test class
2018-04-11 20:24:50 -04:00
Eric A. Miller
da130926a9 Don't use MIB leafs that are not-accessible according to MIB
Add CiscoPortSecurity test class
2018-04-11 20:21:08 -04:00
Eric A. Miller
4c51c29428 Fix gigabit logic in i_duplex_admin()
ISA Info
Add CiscoStack test class
2018-04-11 20:19:58 -04:00
Eric A. Miller
2301d2e60a Remove not-accessible 'cdpCacheIfIndex' MIB leaf and don't try to access it in CDP class
Add CDP test class
2018-04-11 20:12:46 -04:00
Eric A. Miller
53a5b5aa0a Correct typo in store hash 2018-04-11 19:57:32 -04:00
Eric A. Miller
d13adfee80 Correct test descriptions 2018-04-11 19:56:36 -04:00
Christoph Neuhaus
9752bf2878 Merge branch 'master' of https://github.com/netdisco/snmp-info into nexans_support 2018-04-11 16:53:38 +02:00
Christoph Neuhaus
9949eeb389 Version 3.54 2018-04-11 09:14:49 +02:00
Eric A. Miller
aceed9cc52 Remove non-existant MIB leafs and add FDP cache type
Add FDP test class
2018-04-05 23:31:03 -04:00
Eric A. Miller
0371ca35d6 Use consistent return values and provide default initalizations
Add inital versions of Layer 2 test classes
2018-04-05 23:28:57 -04:00
Eric A. Miller
ce0a350ef2 Correct typo in MIB leaf names in Layer3::Aironet
Add Layer3::Aironet test class
2018-04-05 23:25:34 -04:00
Eric A. Miller
3b58ba8678 Remove commented out code
Add Layer2::Orinoco test class
2018-04-05 23:23:59 -04:00
Eric A. Miller
a69b45d849 Load MIB required for defined FUNCS
Add Layer2::Trapeze and Layer2::NWSS2300 test classes
2018-04-05 23:11:37 -04:00
Eric A. Miller
ad0a1044b9 Use SUPER:: rather than creating a new global
Add Layer2::Aironet test class
2018-04-05 23:09:19 -04:00
Eric A. Miller
5336ec2db2 Make sure MIB leaf is actually in the MIB we're loading, not the imports
Add CiscoStats and Layer3::Arista test classes
2018-04-05 23:07:49 -04:00
Eric A. Miller
e20cd6dd02 Fix ISA in AMAP and EDP classes
Add AMAP and EDP test classes
2018-04-05 23:03:33 -04:00
Eric A. Miller
66f16f6617 #61 ZyXEL (X)GS1900 family MIB
Fix loop in Layer2::ZyXEL_DSLAM layers method
Add  Layer2::ZyXEL_DSLAM test class
2018-04-05 23:01:48 -04:00
Eric A. Miller
0755487e02 release 3.54 2018-04-01 22:22:32 -04:00
Eric A. Miller
afeb37ae5e Additional test classes 2018-04-01 22:09:50 -04:00
Eric A. Miller
cc05fb927f Track down mysterious CARP_TRACE, don’t try to AUTOLOAD or create method through can()
Remove test for previous appearance in _global
2018-04-01 22:04:07 -04:00
Eric A. Miller
facdf5b7a7 Relax validation of MIB access checks until we have broader test coverage that this is a non-breaking change
Mark corresponding test TODO in Info test class
2018-04-01 21:50:26 -04:00
Eric A. Miller
66bedd4d54 Load MIB for leafs referenced within class so we can instantiate class
Aggregate test class
2018-04-01 21:03:40 -04:00
Eric A. Miller
3a3c1efe46 Explicit returns
Layer2::3Com test class
2018-04-01 21:01:06 -04:00
Eric A. Miller
1a069c2b52 Make sure MIB leaf is actually in the MIB we're loading, not the imports
Add initial Layer1::Bayhub and Layer2::Baystack test classes
2018-04-01 20:59:32 -04:00
Eric A. Miller
f7de9ffbc6 Explicit return 2018-04-01 20:49:23 -04:00
Eric A. Miller
3c6cfa8ecf Cover overridden layers in Layer1::Cyclades 2018-04-01 20:46:02 -04:00
Eric A. Miller
585d01895b Use cmp_deeply versus is_deeply for better diagnostics 2018-04-01 20:44:17 -04:00
Eric A. Miller
63cac2a3a8 Test harness only checks for existence of data structures in constructor test
Test harness skips globals, funcs, mibs, and munges tests if the hash is empty
Add test to check that subclass methods have coverage with ability to mark class as TODO
2018-04-01 20:28:58 -04:00
Eric A. Miller
0623fbfdf1 Update changes for last commit set 2018-04-01 20:27:11 -04:00
Eric A. Miller
0c711269ae #141 Avocent ACS files for correct discovery in Netdisco
Add support for ACS 5K/6K/8K terminal servers in Layer1::Cyclades requires new MIBs
Layer1::Cyclades test class
2018-03-31 23:25:10 -04:00
Eric A. Miller
f676d27a3b Updated Layer3::Timetra requires latest MIBs
Update Changes and MANIFEST for recent changes
2018-03-30 17:34:35 -04:00
Eric A. Miller
64167df588 #215 Nokia/Alcatel-Lucent 7705 LLDP
#220 Alcatel-Lucent / Nokia SR 7750 missing neighbors
Improve Layer3::Timetra model detection
Layer3::Timetra test class
2018-03-30 17:17:44 -04:00
Eric A. Miller
398f3ee74b Layer1::Asante test class
Fix logic in Layer1::Asante i_up() method
Don't end a subroutine with a conditional block
2018-03-30 17:11:22 -04:00
Eric A. Miller
125f02b8a2 Layer1::Allied test class
Don't end a subroutine with a conditional block
2018-03-30 17:08:39 -04:00
Eric A. Miller
eeeabeec94 Sort keys in globals, funcs, mibs, and munges tests so that reported order is consistent between test runs 2018-03-30 17:06:00 -04:00
Eric A. Miller
5fe0ebaeda Fix typo in MIB leaf
Don't use MIB leafs that are not-accessible according to MIB
2018-03-30 17:03:48 -04:00
Eric A. Miller
fda59f51f7 Correct comment on table containing ifName 2018-03-29 15:50:34 -04:00
Eric A. Miller
e8de74c6a5 Move common device_type() tests to base test class 2018-03-29 15:49:13 -04:00
Eric A. Miller
da6716b107 Make class names reflect new directory structure 2018-03-29 12:25:12 -04:00
Eric A. Miller
62267f4e8e Change Test class naming to minimize directories 2018-03-29 12:18:22 -04:00
Eric A. Miller
fd1c91edac Move common test methods to base class and mark them to be skipped in base class itself 2018-03-28 23:12:25 -04:00
Eric A. Miller
a0b2010994 Comment on todo_skip tests in update() 2018-03-28 22:47:07 -04:00
Eric A. Miller
bda796ae98 Mark failing v3 context update tests as todo_skip 2018-03-27 22:25:02 -04:00
Eric A. Miller
8b3b03b312 Create a new v3 based object for to test update() with Context 2018-03-27 21:53:05 -04:00
Eric A. Miller
cbc756a3f8 Test harness improvements and test coverage of all methods within SNMP::Info base class 2018-03-27 21:07:04 -04:00
Eric A. Miller
9af7a7661c Fix logic for determining if MIB leaf supports set operations 2018-03-27 21:05:26 -04:00
Eric A. Miller
eab89e4736 Just return rather than create anon sub 2018-03-26 23:52:31 -04:00
Eric A. Miller
8391cee4f3 Remove unused variables from _load_attr method 2018-03-26 23:32:48 -04:00
Eric A. Miller
fcd0e30d64 If we don't have valid arguments stop and return, we also won't be able to report attr or val. 2018-03-26 20:57:46 -04:00
Christoph Neuhaus
4a454c9431 Tag 3.53 2018-03-26 17:34:44 +02:00
Christoph Neuhaus
cd751071e1 Merge remote-tracking branch 'upstream/master' into nexans_support 2018-03-26 17:31:21 +02:00
Eric A. Miller
c921e8b35c Mark problematic update() tests as todo_skip 2018-03-22 23:19:12 -04:00
Eric A. Miller
60d5591401 More base class test coverage 2018-03-22 22:52:58 -04:00
Oliver Gorwits
98e8e57747 release 3.53 2018-03-22 21:36:10 +00:00
Christoph Neuhaus
f6a4f937ee Nexans switch support 2018-03-22 17:26:05 +01:00
Eric A. Miller
1e5eda927c Remove problematic update() tests 2018-03-22 01:01:09 -04:00
Eric A. Miller
c6eb73bc7b Update changes 2018-03-22 00:38:49 -04:00
Eric A. Miller
c49d8ab921 Test::Exception version recommended by test system 2018-03-22 00:38:04 -04:00
Eric A. Miller
27b310ee68 Merge branch 'test-coverage' 2018-03-22 00:20:03 -04:00
Eric A. Miller
f6d0fb1d7e Don't use indirect syntax for new() 2018-03-22 00:15:06 -04:00
Eric A. Miller
ddc5fd8c96 Add test harness and inital test coverage of the base class. 2018-03-21 23:45:00 -04:00
Eric A. Miller
26b13fbcd4 Ignore Devel::Cover files 2018-03-21 23:43:27 -04:00
Eric A. Miller
91b98085f6 Fix AUTOLOAD / can() bug that could result in DESTROY being redefined and dynamic methods not being added to the symbol table. 2018-03-21 23:41:16 -04:00
Eric A. Miller
1c948d6e45 Prevent warning in _get_topo_data() from undef arg 2018-03-21 23:33:10 -04:00
Eric A. Miller
76cbb05f19 Identify where base MIBs are from and include base MIBs for cases where Net-SNMP library doesn't have them complied in. 2018-03-21 23:30:13 -04:00
Oliver Gorwits
e7fcd98107 #12 add Cisco PortFast support via CiscoStpExtensions::i_faststart_enabled 2018-03-21 10:35:09 +00:00
Jeroen van Ingen
090d94191b Update README and Netgear
- Reflect Netgear FSM change by paecker in README
- Remove pipe from character class in Netgear GSM/FSM match
2018-03-20 11:47:57 +01:00
Jeroen van Ingen Schenau
2c3a6a3c6e Merge pull request #251 from paecker/netgear_fsm_fix
modified Netgear.pm for serial/version compatibility to FSM series
2018-03-20 11:42:51 +01:00
Christoph Neuhaus
814083e2fa modified Netgear.pm for serial/model compatibility to FSM73xx series 2018-03-20 10:34:12 +01:00
Oliver Gorwits
7621b30bc2 release 3.52 2018-03-19 18:07:51 +00:00
Oliver Gorwits
9e2e55dcb3 release 3.51 2018-03-17 15:42:41 +00:00
Oliver Gorwits
f8a1d5bc7a set fallback for nonmatching interfaces 2018-03-17 15:35:55 +00:00
Oliver Gorwits
1a65be101e update docs 2018-03-17 14:26:30 +00:00
Oliver Gorwits
4c5d0a5695 better interface naming for Ubiquiti 2018-03-17 14:18:09 +00:00
Eric A. Miller
f8b3381d16 Modify mock utility for new location and to work under a perlbrew environment 2018-03-15 23:59:04 -04:00
Eric A. Miller
8a41e5063a release 3.50 2018-03-14 16:35:08 -04:00
Eric A. Miller
24a84cdc25 #198 Add Support for Gigamon devices 2018-03-14 15:59:23 -04:00
Eric A. Miller
25354e1f3e Test agent name keeps changing 2018-03-13 22:28:34 -04:00
Eric A. Miller
2025044952 #226 Avaya VSP devices - no ifAlias 2018-03-13 22:16:43 -04:00
Eric A. Miller
d00dcdad85 #227 remove bogus can() check in _set() 2018-03-12 17:34:28 -04:00
Eric A. Miller
fc069c13f5 Test SNMP agent name change 2018-03-12 17:32:57 -04:00
Eric A. Miller
69430f4a21 Make Test::Perl::Critic pass 2018-03-12 17:31:18 -04:00
Eric A. Miller
a83855157b Fix SNMP::Info::IEEE802dot3ad when more than 1 LAG 2018-03-10 19:01:31 -05:00
Oliver Gorwits
5ce80ba4ee release 3.49 2018-03-03 18:25:08 +00:00
Oliver Gorwits
16e96d9fcf better interface names for Cumulus 2018-03-03 17:59:59 +00:00
Oliver Gorwits
ac753c5970 try github url instead of sourceforge 2018-03-03 17:37:57 +00:00
Oliver Gorwits
313e187399 Revert "remove downlaod of mibs from travis test"
This reverts commit f5aaee6c89.
2018-03-03 17:36:41 +00:00
Oliver Gorwits
f5aaee6c89 remove downlaod of mibs from travis test 2018-03-03 17:24:37 +00:00
Oliver Gorwits
c8b4f8f4fd release 3.48 2018-03-03 17:20:24 +00:00
Oliver Gorwits
6113dd3b98 fix pod for new Cumulus class 2018-03-03 17:18:29 +00:00
Oliver Gorwits
e21f22bb3b initial Cumulus Networks support 2018-03-02 23:42:46 +00:00
Oliver Gorwits
bb4578dea5 release 3.47 2018-02-27 22:51:38 +00:00
Oliver Gorwits
e83ca6fbe3 fix test 2018-02-27 22:49:44 +00:00
Oliver Gorwits
ae9963cf85 Add LLDP-MIB::lldpXMedRemInventoryTable methods 2018-02-27 22:48:26 +00:00
Oliver Gorwits
650aef9c2d release 3.46 2018-02-17 13:05:25 +00:00
Oliver Gorwits
397b14da22 Add method to show err-disable cause on Cisco (#248)
Method i_err_disable_cause implemented on CiscoPortSecurity.pm. Returns
sparse data: ifIndex -> textual err-disable cause, for interfaces that
are err-disabled.
2018-02-17 11:47:56 +00:00
Oliver Gorwits
0f00322e03 release 3.45 2018-02-14 22:16:26 +00:00
Oliver Gorwits
e2b688077e Enable Layer3::Foundry for Brocade VDX platform 2018-02-14 22:01:04 +00:00
Oliver Gorwits
4afbd37cbd fix #222 #238 #239 handle BayStack switches with port index 128 (zoeloe) 2018-02-12 22:15:38 +00:00
Oliver Gorwits
40d3340ac5 release 3.44 2018-02-12 19:32:53 +00:00
Oliver Gorwits
9bb71d3df7 Merge remote-tracking branch 'origin/ipv6-prefixlen' 2018-02-12 19:27:59 +00:00
Jeroen van Ingen Schenau
4860447b06 Merge pull request #247 from laelly/master
Improve F10 OS version detection
2018-02-12 09:10:05 +01:00
laelly
445b3f19a3 Improve F10 OS version detection 2018-02-10 01:50:27 +01:00
Jeroen van Ingen
32efd26999 Alternative ipv6_addr_prefixlength implementation 2018-02-05 20:23:06 +01:00
Oliver Gorwits
f2f95150bd release 3.43 2018-02-02 18:03:34 +00:00
Oliver Gorwits
f210bf8812 Fix identification of Brocade CES 2018-02-02 17:51:28 +00:00
Oliver Gorwits
c30e1a2446 release 3.42 2018-02-02 16:42:11 +00:00
Oliver Gorwits
10392fc08e IPv6 Prefix Length support via IPv6::ipv6_addr_prefixlength 2018-02-02 16:41:05 +00:00
Oliver Gorwits
df10473fb5 change in name of test host?! 2018-02-02 15:14:14 +00:00
Oliver Gorwits
6505e7e85f release 3.41 2018-02-01 22:55:12 +00:00
Oliver Gorwits
ffd80722b8 fix travis notifications 2018-02-01 20:59:14 +00:00
Oliver Gorwits
6bd5bb3dda change travis on success [skip ci] 2018-01-31 18:09:48 +00:00
Oliver Gorwits
83dec3c1d6 add irc notifications 2018-01-30 16:23:21 +00:00
Oliver Gorwits
82f2a83eec add adtran docs 2018-01-30 16:13:54 +00:00
Oliver Gorwits
5194af9d91 add dlink docs 2018-01-30 16:07:07 +00:00
Oliver Gorwits
a4c76d2fb9 add vyos docs 2018-01-30 16:02:06 +00:00
Oliver Gorwits
57a35075fa small bits of missing POD 2018-01-30 15:55:25 +00:00
Oliver Gorwits
fb69a60b45 add readme and update meta 2018-01-30 15:41:53 +00:00
Oliver Gorwits
2625381e5b fix Using a hash as a reference is deprecated warning 2018-01-30 15:38:43 +00:00
Oliver Gorwits
1c048320a6 \o/ working, quieten debug 2018-01-30 15:34:37 +00:00
Oliver Gorwits
c5c25cee7f try setting MIBS 2018-01-30 15:25:32 +00:00
Oliver Gorwits
dee8177a67 more debu 2018-01-30 14:25:44 +00:00
Oliver Gorwits
abbe040351 try snmpconf 2018-01-30 11:18:39 +00:00
Oliver Gorwits
29a0f849f1 fix typo 2018-01-30 10:58:33 +00:00
Oliver Gorwits
7e524f46c6 different command order 2018-01-30 10:50:22 +00:00
Oliver Gorwits
1146e99de2 different source for mibs 2018-01-30 10:47:24 +00:00
Oliver Gorwits
6740929d41 try to fix escaping 2018-01-30 10:22:27 +00:00
Oliver Gorwits
831788c1c9 try to fix escaping 2018-01-30 10:15:39 +00:00
Oliver Gorwits
7e9d4520af try to fix escaping 2018-01-30 10:08:11 +00:00
Oliver Gorwits
c4317e6e6b reorder build commands 2018-01-30 10:05:25 +00:00
Oliver Gorwits
e4e3debce0 reorder build commands 2018-01-30 09:54:08 +00:00
Oliver Gorwits
a5b7431070 try combining 2018-01-29 23:36:53 +00:00
Oliver Gorwits
054808f59d revert debug 2018-01-29 23:22:21 +00:00
Oliver Gorwits
0b313d627e more deps for MRO 2018-01-29 23:15:14 +00:00
Oliver Gorwits
9813b9db90 try more debug 2018-01-29 23:12:06 +00:00
Oliver Gorwits
9a4e024abb cd back to dist to build 2018-01-29 22:59:17 +00:00
Oliver Gorwits
04a669157f try building net-snmp 2018-01-29 22:48:39 +00:00
Oliver Gorwits
a364c1512d add libsnmp-perl dependency to travis 2018-01-29 22:35:00 +00:00
Oliver Gorwits
0451e6f0a6 add travis config file 2018-01-29 22:30:58 +00:00
Oliver Gorwits
b7f87d9e82 add real snmp test against demo.snmplabs.com 2018-01-28 21:28:21 +00:00
Oliver Gorwits
e2713fb57a fix versionsync test 2018-01-28 20:00:04 +00:00
Oliver Gorwits
c8eff78d34 change Checkpoint to CheckPoint 2018-01-28 19:57:29 +00:00
Oliver Gorwits
04ca5793fa fix for doc tests 2018-01-28 19:55:28 +00:00
Oliver Gorwits
83d00ee9c7 release 3.40 2018-01-28 18:53:50 +00:00
Oliver Gorwits
bf56ed2540 update changes 2018-01-28 18:50:44 +00:00
Oliver Gorwits
e75aba14b4 Merge pull request #240 from earendilfr/master
Improvement for Checkpoint, CiscoSB and H3C devices
2018-01-28 18:45:29 +00:00
Oliver Gorwits
5d2d2d416f Merge pull request #244 from pyro3d/master
Add Adtran Support, Some fixes for Juniper
2018-01-28 18:43:07 +00:00
LBegnaud
62799bfc9d Add support for Vyatta/VyOS (#241) 2018-01-28 18:39:43 +00:00
dtuecks
df8fbc3c03 Nexus.pm prints output even if $self->debug() is unset. (#243) 2018-01-28 18:36:06 +00:00
Ambroise
604de81ab8 Nexus vrf support (#246)
Initial commit to add the suport of the Interfaces in VRF for Nexus devices
To tune to correctly retrieve the context for the VRF

On Nexus device, you need to add the following command for each VRF:
snmp-server context <context> vrf <vrf>
2018-01-28 18:35:22 +00:00
Ryan Gasik
ed14b09567 Fix version number in Adtran 2018-01-12 19:28:30 -08:00
Ryan Gasik
800758815c Add Adtran, improve Juniper 2018-01-12 19:21:37 -08:00
Ambroise
058b74bd63 Fix some model error for 3Com and H3C devices 2017-12-21 16:54:22 +01:00
Ambroise
02a52a4e09 Some Cisco SB switches work as Layer3 devices + avoid a numbers of model type 2017-12-21 16:45:20 +01:00
Ambroise
74ddc93f7f Add a real support for Checkpoint devies through SNMP 2017-12-21 16:42:32 +01:00
Oliver Gorwits
eb8af0c81b release 3.39 2017-12-17 20:19:54 +00:00
LBegnaud
bd49274808 Enhanced Ubiquiti device support (#236)
* Include EdgeSwitch and update subs to support more UBNT devices

* Adjust EdgeRouter model logic to use only standard OIDs

* Comments and code cleanup

* cleanup

* Include ER Infinity
2017-12-02 20:59:34 +00:00
Frank Maas
8b1547c589 Correct location of make_snmpdata.pl (#234)
Changed 't/util' to 'contrib/util'
2017-12-02 20:54:11 +00:00
Hannu Teulahti
c093f83848 Update HP.pm (#233)
Add missing J9774A -model
2017-12-02 20:53:53 +00:00
Jeroen van Ingen Schenau
c0b28c38c5 Merge pull request #235 from laelly/master
fix typo in CiscoASA.pm
2017-11-20 08:35:33 +01:00
laelly
4621a0898f fix typo 2017-11-18 14:53:40 +01:00
Oliver Gorwits
6f02e1035f release 3.38 2017-10-23 20:02:45 +01:00
Jeroen van Ingen
d4ae9237a6 Improve generic Info::Layer3 serial number detection
Serial numbers weren't reported for stackable Layer3::H3C devices, even
when not actually stacked. Report serial number not only if the entity
has no parent, but also if it has a parent but is of type "chassis".

This fixes #232.
2017-10-23 15:45:04 +02:00
Nathan Neulinger
914eb05a60 fdp_id masked via GLOBALS, rename to fdp_gid to match CDP module (#231) 2017-10-11 22:02:44 +01:00
Jeroen van Ingen
4da17227c1 Add newer data rates (mcs 16-23) for Cisco WLAN
Data rates up to MCS 15 (two spatial streams) at 20 MHz and 40 MHz were
defined; added MCS 16 through 23.
Decoding MCS rates at SS1 and SS2 not implemented yet.
2017-07-27 17:26:27 +02:00
operatorofhell
20014cab29 remove more bogus MAC's from Cisco ASA (#225) 2017-07-20 14:16:47 +01:00
Oliver Gorwits
9d62361c8a release 3.37 2017-07-11 21:03:39 +01:00
Oliver Gorwits
260992b7bf fix push_ver for new file loc 2017-07-11 21:02:20 +01:00
Oliver Gorwits
b9cd429551 Layer3::Juniper fixed to return os_ver for JUNOS 14.x and higher 2017-07-11 21:01:33 +01:00
Oliver Gorwits
2d18a75ad7 release 3.36 2017-06-28 22:56:35 +01:00
Oliver Gorwits
0cfc501f83 add Module::Build distmeta 2017-06-28 22:50:32 +01:00
Oliver Gorwits
44b19153f1 migrate from EUMM to Module::Build 2017-06-28 22:45:33 +01:00
Oliver Gorwits
433b87b9df release 3.35 2017-06-28 20:23:44 +01:00
Oliver Gorwits
f9464bcd6c #211 f5 class should respect UseEnums when faking i_type 2017-06-28 17:36:23 +01:00
Jeroen van Ingen
f5c5ec202a Include loading of LLDP-EXT-MED-MIB in LLDP.pm 2017-06-01 18:45:52 +02:00
Kirill Petrov
4b64a70830 Create DLink.pm (K.Petrov) (#223)
* Create DLink.pm

Create DLink class

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update Info.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm

* Update DLink.pm
2017-05-23 08:16:31 +01:00
Endgame IT
4c8f7e298e fix error if debug is enabled (#213) 2017-02-27 14:19:05 +00:00
Oliver Gorwits
2d539be214 #50 remove interface specific part from vrf interfaces on IOS (#210)
* remove interface specific part from vrf interfaces in IOS

* Update ChangeLog

* Update ChangeLog
2017-02-04 18:35:50 +00:00
Oliver Gorwits
c35d5814b4 fix #180 support CiscoConfig on Nexus (#209)
* fix #180 support CiscoConfig on Nexus

* Update ChangeLog
2017-02-04 18:15:23 +00:00
Justin Hunter
7d19ad401b Merge branch 'master' of github.com:netdisco/snmp-info 2017-01-13 21:37:48 -07:00
Oliver Gorwits
985577ce79 Added issues template 2017-01-06 12:53:32 +00:00
Oliver Gorwits
24e20101d5 release 3.34 2016-11-20 17:45:49 +00:00
Jeroen van Ingen
76c884eb9f Document new L7::CiscoIPS support in ChangeLog 2016-10-19 10:36:42 +02:00
Jeroen van Ingen
7041dbab27 Merge remote-tracking branch 'operatorofhell/ciscoips' 2016-10-19 10:30:13 +02:00
Moritz Kraus
661051fde4 Documentation for Info::Layer7::CiscoIPS written 2016-10-12 10:52:58 +02:00
Justin Hunter
36cba5ce18 * better handling of i_vlan_membership()
* make funcs() for ALD related functions to ensure mib loaded
2016-09-19 14:46:27 -07:00
Justin Hunter
4753f30c53 return the original result unless we have the proper mapping tables 2016-09-09 16:44:04 -07:00
Justin Hunter
d719e240d2 return proper VLAN IDs for Juniper 2016-09-09 14:45:33 -07:00
Justin Hunter
e35faee278 add sensible fallback for native vlan 2016-09-09 14:31:22 -07:00
Moritz Kraus
fd3417a09a faked e_index with e_id 2016-09-09 15:59:52 +02:00
Moritz Kraus
1719709648 override e_index for IPS with e_id 2016-09-09 15:53:30 +02:00
Moritz Kraus
d37aa3378e Added sub productname 2016-09-08 17:41:11 +02:00
Moritz Kraus
f017d32860 added CiscoIPS Class 2016-09-08 16:59:53 +02:00
Justin Hunter
7b23edcb29 remove trailing comma from Juniper os_ver 2016-09-01 16:22:34 -07:00
Jeroen van Ingen
e48c4b4e84 Fix errors with serial number on Nexus and make Nexus.pm code style more consistent (#269) 2016-07-18 10:35:33 +02:00
Oliver Gorwits
aeca44c7aa Serial number on Nexus 9372 (genereic check for ID before using) (M. Caines) 2016-05-17 16:37:36 +01:00
Alexander Hartmaier
af6ae8e419 skip everything in the xt directory regardless of its name 2016-04-27 18:04:54 +02:00
Oliver Gorwits
5cf88ba3b7 release 3.33 2016-04-27 16:55:11 +01:00
Alexander Hartmaier
f901ba5591 Move author-only tests to xt directory
so they aren't run on installation by users
2016-04-27 17:49:26 +02:00
Alexander Hartmaier
7deea96bc3 Correct device serial number reporting for Cisco Nexus 5k switches with software version >= 7 2016-04-27 16:54:02 +02:00
Alexander Hartmaier
48dfb9bd08 fix Useless use of greediness modifier '?' in regex 2016-04-27 16:23:48 +02:00
Alexander Hartmaier
85372559fa fix t/00_local_pod-coverage.t 2016-04-27 16:18:49 +02:00
Alexander Hartmaier
98972b80ef fix t/00_local_docininfo.t 2016-04-27 15:54:04 +02:00
Alexander Hartmaier
d950244232 fix t/00_local_spelling.t 2016-04-27 15:39:17 +02:00
Oliver Gorwits
fd898829c3 release 3.32 2016-04-26 21:26:39 +01:00
Oliver Gorwits
b0158628bb update copyright year 2016-04-26 21:25:09 +01:00
Oliver Gorwits
0f69a7b391 Removed DeviceMatrix from the distribution 2016-04-26 21:24:27 +01:00
Oliver Gorwits
72773117e5 Respect version/comm/secname on passed Session obj 2016-04-26 21:17:35 +01:00
Oliver Gorwits
06806f5a6e AUTOLOAD typo-catcher search for SNMP::Info no longer anchored 2016-04-26 21:02:57 +01:00
Oliver Gorwits
a01c785ec8 add missing changelog entries GRRRRRR! 2016-04-26 21:01:08 +01:00
Brian De Wolf
502e206371 Improve VG350 detection
Cisco VG350s get detected as Aironet 350s, which breaks CDP collection.  This
overrides the behavior to mark VG350s as generic Cisco Layer3 devices.
2016-04-08 16:18:30 -07:00
Max Kosmach
8fba1bc6a9 Remove L2 from PaloAlto layers 2016-03-19 15:27:21 +03:00
Jeroen van Ingen
f43803d6d4 Merge /u/begemot/snmp-info/ branch support-for-paloalto-v2 into master
https://sourceforge.net/p/snmp-info/code/merge-requests/14/
2016-03-17 13:59:00 +00:00
Jeroen van Ingen
338cba6350 Merge /u/begemot/snmp-info/ branch support-for-vmware-v2 into master
https://sourceforge.net/p/snmp-info/code/merge-requests/15/
2016-03-11 08:16:12 +00:00
Jeroen van Ingen
2a15066062 APC: also report model for PDU products (#61) 2016-03-07 10:12:55 +01:00
Jeroen van Ingen
add86bc566 Add workaround in IPv6.pm to deal with possibly incorrect IPV6-MIB implementations 2016-03-01 08:37:26 +01:00
Jeroen van Ingen
e9b4eaaeb9 Merge /u/begemot/snmp-info/ branch fix-apc-mac into master
http://sourceforge.net/p/snmp-info/code/merge-requests/17/
2016-02-29 09:23:08 +00:00
Oliver Gorwits
07605051f5 Avoid deep recusion when AUTOLOAD and carp collide 2016-02-25 20:02:19 +00:00
Oliver Gorwits
998356484b Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code 2016-02-25 17:54:11 +00:00
Oliver Gorwits
e97617ad60 Do not init table cache if Cache provided by user 2016-02-25 08:04:20 +00:00
Oliver Gorwits
9685c3afa8 Support undefined (noSuchIntance) values in Offline mode 2016-02-25 07:49:55 +00:00
Bill Fenner
c209b9a72f Merge /u/begemot/snmp-info/ branch fix-aggregate into master
http://sourceforge.net/p/snmp-info/code/merge-requests/18/
2016-02-24 16:49:59 +00:00
Max Kosmach
4999b769ba fix for 'Use of inherited AUTOLOAD for non-method SNMP::Info::Layer2::HP::agg_ports_ifstack() is deprecated' 2016-02-24 18:50:45 +03:00
Max Kosmach
d8b5ba2161 Add device MAC to APC UPS 2016-02-23 19:20:52 +03:00
Max Kosmach
6f4a4a91cf Add support for propMultiplexor as ifType.
3Com/H3C switches use this type for Link Aggegation without LACP.
2016-02-19 18:46:49 +03:00
Max Kosmach
0049f0d72e Add VMware support 2016-02-17 01:59:24 +03:00
Max Kosmach
4ea66fc0fd Add Palo Alto support 2016-02-17 01:45:32 +03:00
Max Kosmach
8426620572 Add 200 Mbps and 2.0 Gbps aliases to SPEED_MAP (useful withport aggregation) 2016-02-11 21:50:44 +03:00
Oliver Gorwits
76aece0a3f release 3.31 2016-01-22 20:40:09 +00:00
Eric A. Miller
508e7f77a0 Add support for channelized interfaces in L3::Passport.
Channelized interfaces are 40G or 100G ports split into multiple 10G sub ports, reported as Slot.Port.Sub-Port.  Note: Currently ifDescr reports the interface correctly as Slot/Port/Sub-Port on channelized interfaces but ifName misreports as just Slot/Port.
2016-01-19 23:24:00 -05:00
Eric A. Miller
d250a829cb SONMP support for Enhanced Topology Table
The Enhanced Topology Table (s5EnMsTopNmmEnhancedTable) supports channelized interfaces as sub ports and is the only table populated on newer VOSS based devices.
2016-01-19 23:16:21 -05:00
Oliver Gorwits
2fada0c31c Support for CiscoSB OS and Version (D. Tuecks) 2015-11-28 20:19:33 +00:00
Oliver Gorwits
e6ad08733d release 3.30 2015-11-16 21:35:59 +00:00
Eric A. Miller
a8d83b5e1c Statistics in the sysIfxStatTable are 64-bit counters, so they should override the 64-bit methods. See documentation at https://metacpan.org/pod/SNMP::Info#Interface-Statistics for implications. The proprietary MIB does not have 32-bit counters, as a result 32-bit counter methods are not overridden. 2015-11-10 23:05:47 -05:00
Eric A. Miller
9392b74cbc Correct port indexing of newer VSP 4K and 8K in L3::Passport 2015-11-10 22:42:15 -05:00
Eric A. Miller
e09624efd0 RT #106254: Add new sysObjectID mapping for Ubiquiti 2015-11-10 22:21:21 -05:00
Alexander Hartmaier
d4d7429de4 Correct link to MIB tarball 2015-11-10 10:26:31 +01:00
Oliver Gorwits
b97cef86a3 release 3.29 2015-10-13 22:31:16 +01:00
Jeroen van Ingen
70615a172b IPv6 related updated to Info::LLDP
- LLDP::lldp_addr() may now also return neighbor IPv6 addresses
- Make more clear in POD that lldp_addr() will not return all management addresses reported by neighbor, it's a kind of roulette
- Add LLDP::lldp_ipv6() and LLDP::lldp_mac() methods for remote management addresses of types IPv6 and MAC, respectively
2015-09-04 16:15:08 +02:00
Jeroen van Ingen
d399ca90d3 Add IPv6::ipv6_addr() method for decoding table instances to actual addresses 2015-09-01 14:53:34 +02:00
Jeroen van Ingen
bbc9695075 Report L2 capability on PacketFront devices if they have bridge ports 2015-06-29 17:02:48 +02:00
Oliver Gorwits
c8fceeb75b release 3.28 2015-06-18 22:37:26 +01:00
Eric A. Miller
036cb4556e Correct port indexing of VSP 4K in L3::Passport 2015-06-11 18:23:23 -04:00
Jeroen van Ingen
e7b06a0b06 POD fixes in Layer2::Aironet 2015-06-09 17:17:46 +02:00
Jeroen van Ingen
c0067113e9 Add model translation to Layer3::Huawei by loading correct MIB 2015-06-09 17:17:01 +02:00
Jeroen van Ingen
ce4349a188 Try to determine whether a device in generic Layer3::Cisco class needs community based indexing
Layer3 capable Cisco device without a mapping to a more specific class fall
under the Layer3::Cisco class. These can be "real" routers that don't need
community based indexing, or Layer 3 switches that do need community based
indexing (to fetch L2 forwarding tables for different VLANs). Generally, if
community based indexing is needed on a platform, it also supports the
CISCO-VTP-MIB. Dynamically return cisco_comm_indexing based on vtpVersion.
2015-06-02 18:07:50 +02:00
Jeroen van Ingen
224085dfca Add Layer3::Huawei class 2015-06-02 17:17:13 +02:00
Oliver Gorwits
9b3262a5fe release 3.27 2015-05-05 20:32:40 +01:00
Oliver Gorwits
86856b6d54 Only log adding mibdirs at debug level 2 2015-05-05 20:24:44 +01:00
Oliver Gorwits
d5bf08329e [#221] Drop Cisco Voice VLAN 4096 2015-05-05 20:18:48 +01:00
Bill Fenner
60efce8404 Add power supply information
Use ps1_type and ps1_status to report power injector type
(e.g., cdp negotiated, inline power, etc.) and status
(e.g., full power, reduced power)
2015-03-18 19:05:40 +00:00
Oliver Gorwits
83164f456a release 3.26 2015-03-07 17:08:25 +00:00
Oliver Gorwits
c0141bcfee Include Voice VLANs in (tagged) VLAN Membership on Cisco devices 2015-03-07 17:07:17 +00:00
Oliver Gorwits
8dfe9ef1cf Fix typo in MRO::print_superclasses 2015-02-28 21:13:38 +00:00
Oliver Gorwits
73d713b670 Add fan and psu reporting to Layer3::Dell 2015-02-28 12:47:59 +00:00
Oliver Gorwits
db6c3573c1 release 3.25 2015-02-25 22:09:18 +00:00
Jeroen van Ingen
c8cbdaef8a Add more model name mappings to Layer2::HP (includes several 2530 models and 5400R series) 2015-02-23 15:52:07 +01:00
Oliver Gorwits
2c7243b87d release 3.24 2015-02-04 18:42:16 +00:00
Eric A. Miller
46515dd5d3 Support RSTP and ieee8021d STP operating modes in RapidCity 2015-01-22 22:16:34 -05:00
Eric A. Miller
7eb799adc6 Fix incorrect FDB ID to VLAN ID mapping in Bridge and L3:Enterasys 2015-01-22 21:57:06 -05:00
Eric A. Miller
c85b61bbd0 Fix single instance leafs defined in %FUNCS to behave like table leafs; return a reference to a hash and don't add zero instance identifier 2014-12-18 22:05:33 -05:00
Oliver Gorwits
045ff8b789 release 3.23 2014-12-09 07:26:25 +00:00
Eric A. Miller
7b7f197439 Fix Cisco VLAN membership issue introduced in 3.22 related to capturing port VLANs on Cisco interfaces which are configured for trunking but are not in operational trunking mode 2014-12-08 21:12:01 -05:00
Eric A. Miller
9e1c462836 Enhanced STP support for L3::Extreme. Document previous STP changes in ChangeLog. 2014-12-04 23:19:06 -05:00
Eric A. Miller
e97e8309cb Update MIB used in L1::Asante 2014-12-04 23:11:36 -05:00
Oliver Gorwits
8c5be1a47d release 3.22 2014-12-02 13:20:53 +00:00
Jeroen van Ingen
afef2e6732 Don't include LLDP in Layer2/HP.om directly, it's inherited via Layer3 class now 2014-12-02 13:45:53 +01:00
Jeroen van Ingen
7b2051b55c Add LLDP into base Layer2 class
...and update ChangeLog
2014-12-02 13:35:00 +01:00
Jeroen van Ingen
8e470a2d72 pod additions for Layer3.pm 2014-12-02 13:24:39 +01:00
Jeroen van Ingen
35213d5cb2 Add LLDP into base Layer3 class 2014-12-02 13:22:20 +01:00
Oliver Gorwits
b24f1a8ac4 release 3.21_001 2014-11-14 00:28:27 +00:00
Oliver Gorwits
5454ab577e In LLDP.pm don't create a variable in a conditional 2014-11-14 00:28:14 +00:00
Eric A. Miller
046c15a074 Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code 2014-11-11 23:13:45 -05:00
Eric A. Miller
ddb9dda894 Add stp_i_mac() to get per STP instance bridge address 2014-11-11 23:09:21 -05:00
Eric A. Miller
d7047bda13 Add methods to gather PVST information in L3::Foundry 2014-11-11 22:55:30 -05:00
Eric A. Miller
c7934f4d10 Enable determination of spanning tree version running on Avaya switches and add methods to gather information from multiple instances 2014-11-11 22:05:59 -05:00
Eric A. Miller
c97dc06177 Add stp_i_time(), stp_i_ntop(), stp_i_root(), stp_i_root_port(), stp_i_priority() methods which return a hash reference to ease API compatibility with MST and PVST implementations indexed by a spanning tree instance id. 2014-11-11 22:02:07 -05:00
Eric A. Miller
76b1faa159 POD syntax fix in L3::Extreme 2014-11-11 22:01:23 -05:00
Eric A. Miller
1e0438857e Document i_pvid() in L3::BayRS 2014-11-11 22:00:47 -05:00
Eric A. Miller
b6494effa6 POD updates, add version to MRO 2014-11-11 22:00:01 -05:00
Eric A. Miller
a359184b83 Ignore build files 2014-11-11 21:58:13 -05:00
Bill Fenner
ce50a3f627 Recognize C2700 and C3700 as Layer2::Aironet 2014-11-10 20:39:08 +00:00
Eric A. Miller
ee7d254329 Capture Aruba AP software version when available 2014-11-09 18:01:11 -05:00
Eric A. Miller
d674b22b39 Correct munging of stp_root() 2014-11-09 17:53:48 -05:00
Eric A. Miller
47954aba8e Correct munging of dot1dStpPortDesignatedPort in stp_p_port() and i_stp_port() methods 2014-11-09 17:43:41 -05:00
Eric A. Miller
09e18e9b64 Capture Aruba AP hardware version when available 2014-11-08 12:21:31 -05:00
Eric A. Miller
163ba86196 Add i_vlan_membership_untagged() to L3::Extreme 2014-11-08 10:55:39 -05:00
Eric A. Miller
e57e7d99d5 Add i_vlan_membership_untagged() to L3::AlteonAD 2014-11-08 10:06:12 -05:00
Eric A. Miller
7ad449303b L3::Force10 now inherits i_vlan_membership() and i_vlan_membership_untagged() from Bridge and only overrides VLAN mapping 2014-11-08 09:52:41 -05:00
Eric A. Miller
49b853de1a Document i_vlan_membership_untagged() 2014-11-08 09:40:07 -05:00
Eric A. Miller
03a81ad4be Add i_vlan_membership_untagged() method to L3::Aruba 2014-11-08 09:36:42 -05:00
Eric A. Miller
eb046b6a61 L3::Juniper now inherits i_vlan_membership() and i_vlan_membership_untagged() from Bridge and only overrides VLAN mapping
Correct VLAN mapping of FDB entries in L3::Juniper
2014-11-08 08:50:44 -05:00
Eric A. Miller
1bf62f9524 Use defined as test to catch vlan zero 2014-11-08 08:33:15 -05:00
Eric A. Miller
9aca213a5f Add i_vlan_membership_untagged() to L3::F5, L2::C1900, and L2::HP4000 2014-11-06 23:02:35 -05:00
Eric A. Miller
ce8bb68200 Add i_vlan_membership_untagged() to RapidCity 2014-11-06 21:31:56 -05:00
Eric A. Miller
7ee562c5ac i_vlan_membership_untagged() should return HoA 2014-11-05 22:58:35 -05:00
Eric A. Miller
bdb719004d Document i_vlan_membership_untagged() 2014-11-05 21:54:48 -05:00
Eric A. Miller
842ac96d48 Capture port VLANs on Cisco interfaces which are configured for trunking but are not in operational trunking mode 2014-11-05 21:07:11 -05:00
Eric A. Miller
5bb9011fb4 Override qb_fdb_index() in L3::Dell since the dot1qTpFdbTable uses dot1qVlanIndex rather than dot1qFdbId as an index 2014-11-01 20:20:12 -04:00
Eric A. Miller
97564f50b8 New method qb_fdb_index() for VLAN ID to FDB ID mapping. 2014-11-01 20:18:58 -04:00
Eric A. Miller
efcf6a0db3 Support for Fortinet devices in new class L3::Fortinet 2014-11-01 19:37:22 -04:00
Eric A. Miller
9e813784f7 Remove qb_fw_vlan() override from L2::HP as it should no longer be necessary. 2014-10-30 23:38:39 -04:00
Eric A. Miller
aaca03062b Use FDB ID to VID mapping if available to determine end station VLAN.
Use dot1qVlanCurrentTable if available to capture dynamic and static VLANs, fall back to dot1qVlanStaticTable if not available.
New method i_vlan_membership_untagged() for VLANs transmitted as untagged frames.
Add partial of zero to L3::Enterasys methods which use dot1qVlanCurrentTable to work around non standard TimeFilter implementation.
2014-10-30 23:36:12 -04:00
Eric A. Miller
c1242017e2 [#64] Misdetection: Wireless APs 2014-10-30 22:44:18 -04:00
Eric A. Miller
5f1426a0a3 Support obtaining FDB in Avaya SPBM edge deployments in L2::Baystack
NOTE: This requires a RAPID-CITY MIB with the rcBridgeSpbmMacTable
2014-10-21 23:23:20 -04:00
Eric A. Miller
e84225fb23 Use the same method for both i_vlan and i_pvid in BayRS 2014-10-21 20:53:28 -04:00
Eric A. Miller
32c0e64bfb Ignore komodo files 2014-10-21 20:51:57 -04:00
Jeroen van Ingen
0793ff31f5 No longer use default i_ignore() subs in L2/L3/L7 base classes 2014-10-21 16:54:49 +02:00
Jeroen van Ingen
d3c2c1b607 Remove all trailing whitespace from ChangeLog entries 2014-10-21 15:15:17 +02:00
Oliver Gorwits
893def7910 release 3.20 2014-09-08 13:50:56 +01:00
Eric A. Miller
f875639435 Override layers in Juniper for routers with switch modules not reporting L2 capability 2014-09-03 23:22:33 -04:00
Oliver Gorwits
70bb263d79 release 3.19 2014-08-01 07:53:34 +01:00
Eric A. Miller
536d7d6901 Only use L2::ZyXEL_DSLAM for ZyXEL DSL modules 2014-07-30 23:07:22 -04:00
Eric A. Miller
6ea34316b0 POD updates and update change log for begemot's merges 2014-07-30 23:04:12 -04:00
Eric A. Miller
aeebe5c95c POD updates 2014-07-30 23:02:31 -04:00
Eric A. Miller
eb62f95636 POD fix 2014-07-30 22:56:14 -04:00
Eric A. Miller
c7ee746fe6 Merge commit '3b6088f454b5211ea00267fddd45b9a6b3563312' 2014-07-30 22:49:54 -04:00
Eric A. Miller
9a062499b3 Merge commit '719f14984b5d614b7ee52493bf07d6ced99adad4' 2014-07-30 22:33:23 -04:00
Eric A. Miller
0c876452d8 Merge commit '2e480dbec54e3b31586f7660f7f88d8797ac2446' 2014-07-30 22:32:36 -04:00
Max Kosmach
3b6088f454 add L2:3Com.pm 2014-07-28 17:46:09 +04:00
Max Kosmach
719f14984b Add Ubiquiti UniFi AP support 2014-07-28 15:47:01 +04:00
Max Kosmach
2e480dbec5 Small H3C fixes 2014-07-28 15:41:46 +04:00
Max Kosmach
66910c7827 Add L2:3Com support 2014-07-28 15:32:04 +04:00
Eric A. Miller
0f5319bc52 Silence uninitialized value warning in L3::Cisco 2014-07-08 21:48:50 -04:00
Eric A. Miller
cd54b07e09 Fix Avaya detection in lldp_port() 2014-07-08 21:33:18 -04:00
Oliver Gorwits
b197e9739b release 3.18 2014-07-02 09:12:57 +01:00
Eric A. Miller
8dd32c0dd7 [#54] Possible bad values returned for lldp_port with some HP gear 2014-07-01 23:06:25 -04:00
Eric A. Miller
08e049eb31 [#54] Possible bad values returned for cdp_id with some HP gear (Joel Leonhardt) 2014-07-01 23:01:24 -04:00
Eric A. Miller
d09e4a125c L2::Netgear inheritance clean up and removal of unnecessary c_* methods defined in Info base class 2014-07-01 22:30:37 -04:00
Eric A. Miller
8353db2bc4 [#71] Don't try to match on a false port description in lldp_if 2014-07-01 22:26:07 -04:00
Eric A. Miller
250d2a0c0a Update change log for L3::Nexus capture of VPC Keepalive IP addresses 2014-07-01 20:07:37 -04:00
Eric A. Miller
46b3127bb5 [#58] Fix inheritance in L3::FWSM and L3::CiscoASA 2014-07-01 20:05:46 -04:00
Eric A. Miller
f1e9e3423d Merge branch 'jvi_nexus' 2014-07-01 19:56:26 -04:00
Eric A. Miller
158ee40f1b Correctly identify device type (class) for instantiated objects which have overridden layers. 2014-06-24 21:14:14 -04:00
Eric A. Miller
713d052b64 POD update 2014-06-24 21:00:29 -04:00
Eric A. Miller
0e28436086 Pseudo ENTITY-MIB methods added to L3::Tasman for hardware information 2014-06-24 21:00:02 -04:00
Jeroen van Ingen
3f7229f4e7 Cisco Nexus workaround: add probable VPC IP address to device IP address table, determined by checking listening UDP sockets 2014-06-24 17:50:03 +02:00
Oliver Gorwits
1ae7f8c8a2 release 3.17
POD tests are not required for distribution
2014-06-23 19:31:14 +01:00
Oliver Gorwits
8e63954c3f release 3.16 2014-06-23 13:53:22 +01:00
Eric A. Miller
0fbcd5f8b1 Documentation updates for Cisco inheritance clean-up 2014-06-22 20:16:34 -04:00
Eric A. Miller
71f84d48dc Clean up inheritance for L3 Cisco classes. With this change all applicable classes will now support LLDP and aggregation methods. 2014-06-22 19:57:48 -04:00
Eric A. Miller
867a635ab8 Remove SNMP::Info inheritance from CiscoStack to prevent issues caused by multiple inheritance, documentation states that this class should not be used directly. 2014-06-22 19:53:53 -04:00
Eric A. Miller
3d2c9ceaf5 Add L3::CiscoSwitch base class for L3 Cisco switches 2014-06-22 19:31:00 -04:00
Eric A. Miller
47736b08ce FWSM and ASA only support methods in CiscoStats, don't inherit other Cisco classes which the devices don't support 2014-06-22 19:28:03 -04:00
Eric A. Miller
3f49e5f8ef Add LLDP and CiscoStpExtensions to L3::Cisco 2014-06-22 17:35:32 -04:00
Eric A. Miller
7c8575bfa5 Clarify CISCO-VLAN-IFTABLE-RELATION-MIB usage comment 2014-06-22 11:21:55 -04:00
Eric A. Miller
102a7e10cc L3::Cisco i_vlan() will now call SUPER and try interface description as a fallback 2014-06-22 11:21:02 -04:00
Eric A. Miller
9148764d20 Remove CiscoImage from all classes as its now included in CiscoStats class 2014-06-22 09:31:44 -04:00
Eric A. Miller
ce619415de Make L2::Cisco base class for L2::Catalyst and L2::C2900
Add CiscoPortSecurity, CiscoStpExtensions, CiscoAgg to L2::Cisco
Remove CiscoQOS and CiscoImage from L2::Cisco
2014-06-21 11:41:17 -04:00
Eric A. Miller
745807007f Remove CiscoImage class as its now included in CiscoStats class 2014-06-21 11:37:55 -04:00
Eric A. Miller
e85b3f70aa Consolidate CiscoImage class into CiscoStats class 2014-06-21 11:36:33 -04:00
Eric A. Miller
edc0fe4fbe Enterprise edition versions 8 and 9 of C1900 support aggregation and stp extensions 2014-06-21 11:35:03 -04:00
Oliver Gorwits
3cceec9044 add MRO synopsis and remove empty all_methods keys 2014-06-20 13:48:36 +01:00
Oliver Gorwits
18602855da use array instead of hash for key/val 2014-06-19 17:04:22 +01:00
Oliver Gorwits
72c223f72e make all_methods explicitly show all subs/globals/funcs 2014-06-19 16:51:12 +01:00
Oliver Gorwits
c6b3c45412 version of all_methods using positional array for sub/global/func 2014-06-19 16:42:36 +01:00
Oliver Gorwits
c60a04f530 Add method resolution discovery in SNMP::Info::MRO helper module 2014-06-19 15:46:42 +01:00
Oliver Gorwits
f7430ab1a6 Add method resolution discovery in SNMP::Info::MRO helper module 2014-06-19 15:44:51 +01:00
Oliver Gorwits
827398228c Add superclass discovery methods 2014-06-18 13:22:09 +01:00
Oliver Gorwits
a264bb36cb release 3.15 2014-06-10 13:17:33 +01:00
Oliver Gorwits
c24e63ec4c Return serial number for Cisco 3850 from entPhysicalSerialNum 2014-06-10 13:12:08 +01:00
Oliver Gorwits
6519570839 Offline mode and Cache export/priming 2014-06-09 22:30:30 +01:00
Oliver Gorwits
2c88544158 implement cache and offline mode 2014-06-09 21:21:26 +01:00
Oliver Gorwits
d0722d3677 release 3.14 2014-06-07 12:35:18 +01:00
Oliver Gorwits
d2b404763b fix pod 2014-06-07 12:34:08 +01:00
Oliver Gorwits
88fb9e4df3 802.3ad LAG support in Layer3::H3C 2014-06-07 12:26:43 +01:00
Jeroen van Ingen
440ec276d3 Fallback in determination whether a device is LLDP capable 2014-06-06 09:41:13 +02:00
Jeroen van Ingen
6e91b90c48 Add LLDP capabilities to Layer2::HPVC class 2014-06-06 09:41:13 +02:00
Jeroen van Ingen
0bfc8c5ed6 Return correct VLAN info with qb_fw_table() on Layer2::HP 2014-06-06 09:41:13 +02:00
Oliver Gorwits
63547c2ea1 Don't unshift length from broken lldpRemManAddrTable implementations (G. Shtern) 2014-05-08 20:02:11 +01:00
Oliver Gorwits
efecf1bbb7 Improvements to Mikrotik module (Alex Z) 2014-04-18 17:08:01 +01:00
Oliver Gorwits
682b8c2a9c release 3.13 2014-03-27 23:22:13 +00:00
Oliver Gorwits
88295e8c1e Cisco PAgP support added to LAG method
Squashed commit of the following:

commit 5cb2d637c7e990bbb8f789b6878f4bcb99778157
Author: Brian De Wolf <git@bldewolf.com>
Date:   Wed Feb 26 18:31:22 2014 -0800

    Implement agg_ports_pagp

    This function was a stub that is now filled out.  Also filled out the function
    that merges PAgP and LAG groups and did minimal testing of the PAgP side (no
    LAG in use in my env).
2014-03-27 23:08:53 +00:00
Jeroen van Ingen
6764f15fd0 HP ProCurve LAG support by inheriting Info::Aggregate class 2014-03-25 11:32:43 +01:00
Oliver Gorwits
8b8ee8693e release 3.12 2014-02-10 21:08:24 +00:00
Oliver Gorwits
fe89001166 Foundry/Brocade aggreate port master ifIndex resolved properly 2014-02-09 12:41:46 +00:00
Eric A. Miller
416a18377c Modify L3::Passport to obtain forwarding table information from RAPID-CITY if information is not available in either Q-BRIDGE-MIB or BRIDGE-MIB. Needed for VSP 9000 prior to version 4.x (Tobias Gerlach) 2014-01-29 20:40:19 -05:00
Eric A. Miller
8fda38184c [#52] NETSCREEN-IP-ARP-MIB considered harmful 2014-01-28 23:06:53 -05:00
Oliver Gorwits
280e9260f7 release 3.11 2014-01-26 13:47:38 +00:00
Eric A. Miller
22642c1095 Skip default CPU management addresses on VSP and 8800/8600 series in L3::Passport to prevent erroneous duplicate addresses 2014-01-20 21:59:53 -05:00
Oliver Gorwits
d68b2047b0 rename IEEE802dot3ag to IEEE802dot3ad 2014-01-19 17:11:42 +00:00
Eric A. Miller
7240f034e5 Regex cleanup for additional support of Avaya 8800 series in L3::Passport 2014-01-19 12:03:50 -05:00
Eric A. Miller
97ce41e363 Additional documentation for new LAG support 2014-01-19 11:00:50 -05:00
Eric A. Miller
31a8abc3b8 Squashed commit of the following:
commit 9be20cd3e24b401d5bfeb2bcb40d61a7b33ffe2c
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:13:41 2014 -0500

    Re-organize part 2

commit 058fc6e000a27b8ffadf5857078e0ab1569d3fa2
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:08:31 2014 -0500

    Re-organize

commit 04f4602d6cf06f917bd4f19db737f877a46fd28e
Author: Eric A. Miller <emiller@cpan.org>
Date:   Sun Jan 19 10:04:09 2014 -0500

    Add MLT agg_ports() support for Avaya

commit 2cdc3aed77f551e3c6d04f4cfe390a876010ebcb
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 14:24:38 2014 +0000

    implement LAG support for Foundry

commit 7465816b53981f3211bdeb5a7a414d5a4e65c79f
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 13:15:13 2014 +0000

    implement LAG support for Arista

commit 67e8f13f635f4fb450ab5df6e9145830ef72cf7b
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 12:59:09 2014 +0000

    update gitignore to ignore SNMP dir

commit df4ca0eb44a4f0e5aa114630f0d22b5c9d7861f3
Author: Oliver Gorwits <oliver@cpan.org>
Date:   Sun Jan 12 12:49:53 2014 +0000

    implement LAG support for Cisco
2014-01-19 10:25:41 -05:00
Eric A. Miller
6b49bfd4c4 methods take precedence over globals, make sure that all classes have methods defined if needed to override new fw_mac and fw_port methods in Bridge class 2014-01-13 20:41:28 -05:00
Eric A. Miller
985b4aab3f Use Q-BRIDGE-MIB as default with fallback to BRIDGE-MIB across all classes for the fw_mac, fw_port, and fw_status methods 2014-01-10 19:26:38 -05:00
Eric A. Miller
a4e7c3a61a Fix Extreme XOS i_vlan_membership - Revert [28bbe0], fix bug with untagged being added to @ret twice (Robert Kerr) 2014-01-09 21:31:58 -05:00
Eric A. Miller
d82d8781c4 [#51] Collect nsIfMngIp when getting IP interfaces in L3::Netscreen 2014-01-04 18:33:20 -05:00
Eric A. Miller
b4c3f92ba3 Modify cdp_cap() to handle devices which return space delimited strings for cdpCacheCapabilities rather than hex strings 2013-12-17 19:18:52 -05:00
Oliver Gorwits
1c57d2eab8 release 3.10 2013-12-16 08:19:41 +00:00
Eric A. Miller
409de77b2c Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code
Conflicts:
	ChangeLog
2013-12-15 20:25:31 -05:00
Eric A. Miller
3e22e24dc9 Data values of zero are now sent to munge method instead of skipped 2013-12-15 20:19:08 -05:00
Oliver Gorwits
17b1bdacfe release 3.09 2013-12-16 00:02:39 +00:00
Eric A. Miller
b570fdbc89 Enable new *_cap methods in _get_topo_data() 2013-12-15 18:07:26 -05:00
Eric A. Miller
cceb0f4e5e Update change log 2013-12-15 11:05:29 -05:00
Eric A. Miller
04f8c7f7e2 Add c_cap() method which return a hash of arrays with each array containing the system capabilities reported as supported by the remote system via CDP or LLDP. 2013-12-15 11:04:14 -05:00
Eric A. Miller
37aca89af7 munge_caps() is no longer in use, so remove 2013-12-15 10:24:45 -05:00
Eric A. Miller
5445a496db Munge fdp_capabilities the same as cdp_capabilities, retain all the bits during munge 2013-12-15 10:21:50 -05:00
Eric A. Miller
0ab93b142c Correctly unpack bits in munge_bits() 2013-12-15 10:15:55 -05:00
Eric A. Miller
d39dc76949 [RT: #78232] Extend cdpCacheCapabilities to show more CDP bits
Add cdp_cap() which returns hash of arrays with each array containing the system capabilities supported by the remote system.
2013-12-15 10:11:34 -05:00
Eric A. Miller
c6abd7b62b Add lldp_cap() which returns hash of arrays with each array containing the system capabilities supported by the remote system. 2013-12-15 08:56:27 -05:00
Eric A. Miller
0e572db832 lldp_platform() now tries to return something useful from either lldp_rem_sysdesc() or lldp_rem_sysname(). 2013-12-15 08:34:27 -05:00
Eric A. Miller
602bb15b47 Alias lldp_rem_sysdesc() as lldp_platform() to provide a clue to type of remote LLDP device. 2013-12-08 21:55:24 -05:00
Eric A. Miller
b4882285c4 Fix power module indexing 2013-11-21 20:36:34 -05:00
Eric A. Miller
834b27bdad Fix for single instance table leafs in test_class_mocked.pl 2013-11-19 21:05:07 -05:00
Eric A. Miller
7db148a5a1 Aruba POE Support
Aruba utilizes Q-BRIDGE-MIB when available for VLAN information to better support wired switches
Capture serial number on newer Aruba devices
2013-11-19 21:03:37 -05:00
Eric A. Miller
9e332095a2 Attempt to fill in missing bp_index mappings on wired Aruba switches. 2013-11-18 21:33:17 -05:00
Eric A. Miller
7bf950026b POD spelling corrections 2013-11-17 20:35:12 -05:00
Eric A. Miller
f246444d89 [#41] Riverbed Steelhead support added in new class L3::Steelhead 2013-11-17 20:28:49 -05:00
Eric A. Miller
8e84aea1bf Add identification of IOS XR and version in CiscoStats 2013-11-17 14:53:41 -05:00
Eric A. Miller
d6a7a944cc Don't assume entity index 1 is the chassis and has serial in Layer3. 2013-11-17 14:50:21 -05:00
Eric A. Miller
fb478d3c7b When determining the BSSID in Airespace there is only one hexadecimal digit available so skip if outside the range of 1-16, 17 is reserved for 3rd party AP's. 2013-11-08 19:42:40 -05:00
Eric A. Miller
24f8a8fdba Remove "Switch" from model name in L3::Foundry 2013-11-08 19:16:42 -05:00
Eric A. Miller
28bbe0ee19 Modify _xos_i_vlan_membership() in L3::Extreme to only include tagged ports 2013-11-07 23:28:13 -05:00
Oliver Gorwits
c21ca2062e support *i_untagged in Bridge.pm to work on other platforms (falls back to *i_vlan) 2013-11-03 00:36:54 +00:00
Oliver Gorwits
e3e289a27c set_i_untagged combines both set_i_vlan and set_i_pvid in one method 2013-11-02 19:19:26 +00:00
Eric A. Miller
9540f6b9d3 L3::IBMGbTor defaults to lldpInfoRemoteDevicesLocalPort in lldp_if() unless there is a cross reference to either ifAlias or ifDescr
L3::IBMGbTor lldp_id() now uses lldpInfoRemoteDevicesSystemName
Add lldp_platform() support in L3::IBMGbTor
L3::IBMGbTor POD updates
2013-11-02 11:02:03 -04:00
Eric A. Miller
539943fb0f Correct LLDP address type detection in L3::IBMGbTor 2013-10-25 20:15:01 -04:00
Eric A. Miller
7a8ebffd40 Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code
Conflicts:
	ChangeLog
2013-10-23 23:27:51 -04:00
Eric A. Miller
3d48f4e210 [#45] IBM (Blade Network Technologies) Rackswitch support in new class L3::IBMGbTor 2013-10-23 23:18:26 -04:00
Oliver Gorwits
667cdbea13 release 3.08 2013-10-22 09:54:57 +01:00
Eric A. Miller
f5fb4dd3b0 Silence warning from uninitialized variable in L3::Passport e_descr() 2013-10-18 19:19:46 -04:00
Eric A. Miller
5a2722d049 Clean up more model names in L2::Baystack 2013-10-18 19:13:04 -04:00
Eric A. Miller
f3b6cfbd01 [#49] Perl 5.18 UNIVERSAL::can change could cause infinite loop 2013-10-18 19:02:46 -04:00
Oliver Gorwits
e239a6057c release 3.07_001 2013-10-17 19:05:15 +01:00
Bill Fenner
9b1c439e15 Use LLDP in Layer3::Aruba, for switches. 2013-10-17 07:35:13 -07:00
Eric A. Miller
074f2e7c8f Fix ignore Net-SNMP configuration file snmp.conf option in t/test_class.pl and t/util/test_class_mocked.pl 2013-10-15 22:26:51 -04:00
Eric A. Miller
4b1533e925 Don't try to munge undef values 2013-10-15 21:52:18 -04:00
Eric A. Miller
6812a60668 Support peth_port_power() power supplied by PoE ports in L2::Baystack 2013-10-15 21:50:49 -04:00
Eric A. Miller
6f0cb846f0 Get AP MAC->IP mappings arp cache table augmentation methods 2013-10-15 20:30:12 -04:00
Eric A. Miller
c79307692b [#46] Brocade (Foundry) Module Support
Brocade (Foundry) POE Support
2013-10-15 20:27:09 -04:00
Bill Fenner
08b2f50ac7 On EOS, the LLDP port ID is a dot1d port.
Don't bother trying the reverse-mapping through ifAlias trick, since
ifAlias is of course non-unique, if the user configures the same
description for multiple ports (e.g., "open port").
2013-10-11 11:22:20 -07:00
Eric A. Miller
3577fa1e42 update test_class.pl utility to allow ignore of snmp.conf and test summarize more standard class methods 2013-10-07 23:24:38 -04:00
Oliver Gorwits
cb6630582a Add docs note about make_snmpdata.pl under EXTENDING SNMP::Info 2013-10-07 20:59:11 +01:00
Bill Fenner
ca5fff31a7 Added missing ChangeLog entries for my two recent commits
4e2b642ed1: LLDP lldp_port()
cfce6296fb: Aironet IOS15
2013-10-07 09:49:19 -07:00
Bill Fenner
69b1f1e29e Merge branch 'master' of ssh://git.code.sf.net/p/snmp-info/code 2013-10-07 09:36:57 -07:00
Bill Fenner
4e2b642ed1 If the port ID claims to be interfaceName, use it for lldp_port
The LLDP spec says that if lldpRemPortIdSubtype is
"interface name", then lldpRemPortId should contain
ifName.  It doesn't say much about lldpRemPortDesc;
some vendors seem to always leave it empty, some use
the interface description / ifAlias.  Our algorithm
for lldp_port is now basically: If we find that
lldpRemPortIdSubtype is "interface name", then use
the lldpRemPortId, else use lldpRemPortDesc if set,
else use lldpRemPortId.
2013-10-07 09:32:18 -07:00
Eric A. Miller
3c26ce2a55 [#67] Add the possibility to set speed for Layer3::C4000 2013-10-04 21:28:37 -04:00
Eric A. Miller
7d2cf97c06 [#68] Fix device_port entries for switches with non-unique ifDesc 2013-10-04 21:22:29 -04:00
Bill Fenner
cfce6296fb Identify Layer2::Aironet running IOS15 2013-10-04 12:46:43 -07:00
Eric A. Miller
1601703ff2 [#69] set speed and duplex on Cisco VSS system (psychiatric) 2013-10-03 22:01:27 -04:00
Eric A. Miller
905ad3e2b7 miscellaneous POD updates 2013-10-03 20:26:11 -04:00
Eric A. Miller
15b7e95545 Rewrite of L3::Aruba, now supports pseudo ENTITY-MIB methods to gather module information, more interface information for APs, more wireless information to include client stats, and arpnip information from wireless clients. WARNING: AP device interfaces are now based on AP MAC and radio versus BSSID to align with other wireless classes. 2013-10-03 20:07:27 -04:00
Eric A. Miller
247f6f038d modify munge_null to remove all control characters 2013-10-02 23:39:52 -04:00
Eric A. Miller
7c6df7cce3 [#64] Add i_speed_admin() to L2::2900 (psychiatric) 2013-10-01 21:42:09 -04:00
Eric A. Miller
1a92306d51 [#66] Support for VSS via CISCO-VIRTUAL-SWITCH-MIB in L3::6500 2013-10-01 21:31:51 -04:00
Oliver Gorwits
59e9fae1d5 release 3.07 2013-10-01 20:21:29 +01:00
Eric A. Miller
998094241d update changelog with Nexus bug fixes 2013-09-29 23:35:24 -04:00
Eric A. Miller
d6c3313138 fix for device serial, just use entry with no parent since class could be stack rather than chassis 2013-09-29 23:17:32 -04:00
Eric A. Miller
b7e252b91a Overrides ipAddrTable methods, some versions do not index the table with the IPv4 address in accordance with the MIB definition.
Fix for device serial number to use the fabric serial number.
2013-09-29 22:27:39 -04:00
Jeroen van Ingen
6071beb15d Basic support for Pica8 switches in L3::Pica8 2013-09-20 14:55:48 +02:00
Oliver Gorwits
cda830686d [#48] Switch duplicate J9624A for J9626A in Layer2/HP (R. Kerr) 2013-08-24 16:57:24 +01:00
Oliver Gorwits
a29b888620 new release - 3.05 2013-08-16 17:54:08 +01:00
Oliver Gorwits
ae5a4d413d new release - 3.04_001 2013-08-16 09:27:04 +01:00
Nic Bernstein
03c4d1e81f Merge commit 'c3a727'
Updated ChangeLog to resolve conflicts
Conflicts:
	ChangeLog
2013-08-14 08:32:01 -05:00
Nic Bernstein
4efa0fd509 ENHANCEMENT ADD CISCO SMALL BUSINESS SUPPORT
Updated new package Info::Layer2::CiscoSB to remove hackish
index with index derived from EntPhysicalEntry table search.
2013-08-09 12:21:10 -05:00
Nic Bernstein
c3a727ce10 ENHANCEMENT TO INFO::LAYER2::NETGEAR
Clean up recent code, fix POD details, remove unnecessary hacks.
2013-08-09 10:39:45 -05:00
Nic Bernstein
afa97d845b ENHANCEMENT TO INFO::LAYER2::NETGEAR
* Add LLDP support for Netgear devices which provide it.
	* Change $netgear->interfaces() to use ifName rather than ifDescr
	  as the former is unique per interface while the latter is not.
	  If ifName is not present, concatenate ifDescr and ifIndex
	  to achieve a unique value.
	* Properly report hardware version, Serial No. and OS Version
2013-08-08 18:15:21 -05:00
Nic Bernstein
8671f65bfd ENHANCEMENT TO NETGEAR SUPPORT
Added LLDP support for Netgear devices which provide it.
Changed $netgear->interfaces() to use ifName rather than ifDescr
as the former is unique per interface while the latter is not.
2013-08-08 14:15:28 -05:00
Nic Bernstein
37737a6494 UPDATE CHANGELOG FOR CISCOSB ADDITION 2013-08-02 10:57:03 -05:00
Nic Bernstein
0ce8a55b88 ADD SUPPORT FOR CISCO SMALL BUSINESS DEVICES
New Feature: Support for the Cisco Small Business product line.  These
switches, currently the Sx300 and Sx500, were inherited from Linksys
and do not run IOS.

This has been tested with the following Cisco products:
 - SRW2024P-K9 V02i   (SG 300-28P)
 - SRW208P-K9 V02     (SF 300-8P)
 - SRW224G4P-K9 V02   (SF 300-24P)

We welcome reports from others, either success or failure.
2013-08-02 10:44:58 -05:00
Jeroen van Ingen
22dd49c1dc Add HP 2530 and 2920 models to Layer2::HP MODEL_MAP & re-sort the list 2013-08-02 15:34:54 +02:00
Oliver Gorwits
fd5812aefc version bump - 3.03 2013-07-11 12:36:58 +01:00
Oliver Gorwits
f4e37cdabe Add missing =back to POD (A. Hartmaier) 2013-07-11 12:34:51 +01:00
Oliver Gorwits
5324760463 version bump - 3.02 2013-07-08 21:25:14 +01:00
Oliver Gorwits
27120045d2 [RT#86725] - Identify Cisco Catalyst 3850 as Layer3::C6500 (C. Causer) 2013-07-08 21:19:32 +01:00
Oliver Gorwits
abfd93ea1b remove evil tabs 2013-07-08 21:15:06 +01:00
Jeroen van Ingen
070d911c60 Add support for Aruba LAN switches.
Known issue with Aruba AOS 7.2.0.0: nodes on "trusted" LAN ports in "access"
mode point to non-existing bp_index values; they will be mapped to the wrong
interface or not be mapped to an interface at all.
2013-06-24 10:42:58 +02:00
Jeroen van Ingen
8b14776c9a Add release date to headings for version 3.01 and 3.02 2013-06-24 10:35:30 +02:00
Oliver Gorwits
2d62372c7f Identify Cisco Aironet 1140 APs as Layer2::Aironet 2013-05-25 01:25:59 +01:00
Oliver Gorwits
3eae0b9d5c Support Alcatel devices with layer3 features. 2013-05-21 09:35:38 +01:00
Nic Bernstein
9a722bb2f8 Properly pull os_ver from Netgear GS series switches. 2013-04-15 16:30:32 -05:00
Oliver Gorwits
d3e39a4132 bump version for stable release 2013-04-13 11:05:26 +01:00
Oliver Gorwits
d82d495dcf final patch from Nic to fix arrayism 2013-04-11 17:07:47 +01:00
Oliver Gorwits
198df7cee4 update changelog 2013-04-11 17:06:52 +01:00
Oliver Gorwits
46cdb4c166 update manifest 2013-04-11 17:01:37 +01:00
Oliver Gorwits
62005c52d2 update VERSION 2013-04-11 17:00:28 +01:00
Oliver Gorwits
ca7651628d bug fix for Class name typos 2013-04-11 16:59:02 +01:00
Alexander Hartmaier
6358b7ad70 override i_description for Cisco ASA firewalls to return the configured interface name 2013-04-10 18:46:39 +02:00
Alexander Hartmaier
8aca1d97c0 fixed Cisco ASA detection for newer versions that return has_layer(3) 2013-04-10 18:27:08 +02:00
Moe Kraus
275a533843 added subclass for Cisco ASA firewalls which filters bad mac addresses in b_mac method 2013-04-10 18:26:31 +02:00
Oliver Gorwits
21bd4c662d bump version again for dev release 2013-02-11 13:43:19 +00:00
Oliver Gorwits
47d9d091d1 fix code in L3/Extreme to pass tests and be more correct 2013-02-11 13:41:49 +00:00
Eric A. Miller
da2ea09e84 Bump version 2013-02-10 22:52:51 -05:00
Eric A. Miller
9c71bdbcef [3598896] - Lantronix device support (J R Binks) and [3598337] - Lantronix SLC support 2013-02-10 22:40:03 -05:00
Eric A. Miller
318f9518b1 Support Juniper (Trapeze) Wireless Controllers in new class L2::Trapeze 2013-02-10 22:16:43 -05:00
Eric A. Miller
19e9fb5f67 Add more default topology methods to test_class_mocked.pl 2013-02-10 21:31:05 -05:00
Eric A. Miller
41833c1f29 Add new classes to MANIFEST 2013-02-10 21:28:40 -05:00
Eric A. Miller
4e2f950e41 [3033731] - Alcatel-Lucent OmniSwich AMAP Support 2013-02-10 21:27:52 -05:00
Eric A. Miller
ebe3f39ea1 Update README 2013-02-10 13:12:34 -05:00
Eric A. Miller
c6521d0b48 Use default Perl Critic policy as the older Conway PBP policy is outdated and includes depreciated modules, set severity to 5 2013-02-10 13:06:29 -05:00
Eric A. Miller
74b5c9f0e3 Use default Perl Critic policy as the older Conway PBP policy is outdated and includes depreciated modules 2013-02-10 13:05:46 -05:00
Eric A. Miller
4bfebe1563 Topology c_* methods should no longer be defined / overridden in device classes 2013-02-10 13:00:51 -05:00
Eric A. Miller
2ac4e65827 Mark extremeware_i_vlan(), extremeware_i_vlan_membership(), xos_i_vlan(), and xos_i_vlan_membership() as private, external API is i_vlan() and i_vlan_membership(). POD updates. 2013-02-10 12:58:22 -05:00
Eric A. Miller
b7a135db10 POD typo 2013-02-10 12:40:10 -05:00
Eric A. Miller
d4c460fd3d Fix for Perl::Critic flagged warning 2013-02-10 12:38:16 -05:00
Eric A. Miller
8f0ac35381 POD updates - spell check 2013-02-10 12:34:45 -05:00
Eric A. Miller
a9a3229c22 Bump version for first 3.0 beta release 2013-02-10 10:23:35 -05:00
Eric A. Miller
5da622ff88 POD update for Pod::Coverage 2013-02-10 10:03:54 -05:00
Eric A. Miller
32f33f5150 Update for removal of L2::Bay and L2::Foundry 2013-02-10 09:56:03 -05:00
Eric A. Miller
242013f3b0 - Corrections to mappings of interface attributes previously inherited from base class
- Simplify nsIfIndex to ifIndex mapping in _nsif_if_map()
- Fallback for interface attributes not support on versions prior to 5.4
- Change vendor to juniper
- Mark internal mapping methods private
- Documentation updates
2013-02-10 09:50:37 -05:00
Eric A. Miller
e46deb505f Fix for i_speed_admin() issue reported by Jiri Dvorak 2013-02-09 20:39:45 -05:00
Eric A. Miller
5d443fd1be fix for mocked getnext method when first IID is zero 2013-02-08 22:19:46 -05:00
Eric A. Miller
d53152858c [3323814] - Arp support for Netscreen (David Baldwin)
[3323821] - Add support for Netscreen w/ WLAN (eg SSG5) (David Baldwin)
2013-02-04 23:24:06 -05:00
Eric A. Miller
aefb31fb58 Updates to device matrix for Airespace, APC, Avaya, Bluecoat, Cisco, Kentrox, Mikrotik, and PacketFront. Change cdp attribute to topo. 2013-02-04 19:15:36 -05:00
Eric A. Miller
0be8219b9c Update device matrix for Extreme support 2013-02-04 18:22:35 -05:00
Eric A. Miller
cbb8bc5d77 Update device matrix for Citrix support 2013-02-04 18:17:16 -05:00
Eric A. Miller
6969dcbfec Remove depreciated L2::Bay and L2::Foundry for 3.0 release. Functionality is available through L2::Baystack and L3::Foundry respectively and they are no longer referenced by other classes. 2013-02-04 18:04:14 -05:00
Eric A. Miller
9e463ddddf Updates to documentation for Brocade acquisition of Foundry. Update of device support matrix for Foundry 2013-02-03 17:10:43 -05:00
Eric A. Miller
5ec034c475 Update Radware (Alteon) support in device matrix 2013-02-03 15:49:44 -05:00
Eric A. Miller
1694e648fc Update Juniper support device matrix 2013-02-03 15:13:22 -05:00
Eric A. Miller
16aa96ebf4 Updates to documentation for Avaya acquisition of Nortel. Update of device support matrix for recent Avaya additions 2013-02-03 14:35:51 -05:00
Eric A. Miller
43d06e184d Two new utilities added in t/util to assist in developing device support from snmpwalk output 2013-01-28 22:06:28 -05:00
Eric A. Miller
3ff432034a Fix typos in i_vlan(), ignore VirtualRouter interfaces 2013-01-28 20:15:36 -05:00
Eric A. Miller
0325bb1f25 Use fully qualified name when adding dynamically generated method to symbol table 2013-01-16 22:59:57 -05:00
Eric A. Miller
b9aebf7e9e - Move AIRESPACE-*-MIB methods to base Airespace class
- Add cd11_ssid() to support Nedisco feature request [3598089] Collect SSID in macsuck
2013-01-03 23:05:09 -05:00
Eric A. Miller
e1e693a7c8 [3599277] - Q-BRIDGE Support to collect VLAN in macsuck 2013-01-02 22:42:56 -05:00
Jeroen van Ingen
c8c548fe97 Add 'san-os' to CiscoStats os() method for Cisco devices running SAN-OS 2012-12-21 16:49:02 +01:00
Jeroen van Ingen
ddf971ed54 H3C class: use Q-BRIDGE-MIB, minor POD updates 2012-12-21 16:44:14 +01:00
Eric A. Miller
61e8f47986 [3185391] - Add support for F5 load balancers 2012-12-20 23:50:10 -05:00
Jeroen van Ingen
3ce9f403e6 Fix typo in LLDP.pm, noticed on previous commit... 2012-12-17 16:17:29 +01:00
Jeroen van Ingen
3741010044 Add extra check in LLDP local interface determination to improve H3C support 2012-12-17 16:15:32 +01:00
Eric A. Miller
badfb12243 Improved support of XOS based Extreme devices 2012-12-16 00:04:16 -05:00
Eric A. Miller
0713a6457c L2::Airespace now reports AP Ethernet MAC as port MAC for radio ports 2012-12-14 23:28:04 -05:00
Jeroen van Ingen
9abe744dac Clearly note that CiscoStats will now report IOS XE as 'ios-xe' and not as 'ios' anymore 2012-12-14 16:14:34 +01:00
Jeroen van Ingen
b4974aeacd Fix regex mistake in previous CiscoStats.pm update 2012-12-14 14:41:54 +01:00
Jeroen van Ingen
688a0de498 Add fallback method to determine IOS & IOS-XE versions when parsing description() failed 2012-12-13 17:10:35 +01:00
Jeroen van Ingen
7cef8465fa Load extra MIBs in H3C class to improve object type resolving 2012-12-13 14:40:03 +01:00
Eric A. Miller
532279d2b8 [rt.cpan.org #81781] [PATCH] Fix spelling error in Info/Layer7/APC.pm 2012-12-11 20:51:40 -05:00
Eric A. Miller
d67ffc3a6c Merge branch 'og-2-10-force10'
Conflicts:
	ChangeLog
	Info.pm
	Info/CiscoStpExtensions.pm
2012-12-11 20:22:17 -05:00
Eric A. Miller
c6776b1755 Multiple bug fixes for AUTOLOAD generated set_ methods 2012-12-10 20:06:42 -05:00
Oliver Gorwits
49566977ad update README 2012-12-08 23:35:40 +00:00
Oliver Gorwits
daf512e33e bump version 2012-12-08 23:35:25 +00:00
Oliver Gorwits
74816fc043 Add fall-back for sysDescr on Force10 2012-12-08 23:33:27 +00:00
Oliver Gorwits
c88e37e9b5 update MANIFEST and README 2012-12-08 20:08:39 +00:00
Oliver Gorwits
c1c448f3df update version 2012-12-08 20:06:51 +00:00
Oliver Gorwits
4f168a538b add W. Bulley's patch for Force10 support 2012-12-08 19:47:22 +00:00
Eric A. Miller
d94630af35 Merge branch 'master' of ssh://snmp-info.git.sourceforge.net/gitroot/snmp-info/snmp-info 2012-12-07 21:36:37 -05:00
Eric A. Miller
999dd1f468 Remove debug comment 2012-12-07 21:28:48 -05:00
Eric A. Miller
c3d5631c3c Doc update 2012-12-07 21:26:54 -05:00
Eric A. Miller
9dae6b20d7 Add support for 802.11n client tx rates 2012-12-07 21:26:00 -05:00
Carlos Vicente
4005640a2b Check if \$stp_ver is defined (Wim Vandersmissen) 2012-12-07 09:23:52 -05:00
Eric A. Miller
ca446faacf Support for Citrix Netscaler appliances in new class L7::Netscaler 2012-12-05 19:56:29 -05:00
Eric A. Miller
240539bd24 [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique part 2 - use ifName() instead of i_name() 2012-12-04 23:15:43 -05:00
Eric A. Miller
08e335f39c Typo in IPV6-MIB i6_n2p_phys_addr definition 2012-12-04 21:48:33 -05:00
Eric A. Miller
a9cc14b265 reverse accidental deletion during last commit 2012-12-04 20:38:36 -05:00
Eric A. Miller
9505f119b3 New configuration option 'IgnoreNetSNMPConf' will ignore Net-SNMP configuration files on object initialization 2012-12-04 20:13:44 -05:00
Jeroen van Ingen
683edf1668 Initial version for L3::H3C class. Work in progress, needs a lot of testing. LLDP doesn't map neighbors to correct ports yet. 2012-12-03 19:42:09 +01:00
Eric A. Miller
d9c52c1a88 Update internal comments 2012-11-30 20:20:47 -05:00
Eric A. Miller
0f1a76a564 AUTOLOAD once again tries to determine if a MIB leaf is a single instance returning a scalar or part of a table returning a reference to a hash. 2012-11-30 20:08:32 -05:00
Eric A. Miller
15cd354bae [3564920] LLDP-MIB::lldpLocPortDesc isn't always unique, use LLDP-MIB::lldpLocPortId this cross references to ifName 2012-11-29 22:48:24 -05:00
Eric A. Miller
91d67ed0ae Support for newer Radware Alteon ADC switches 4408/4416/5412/5224 and older AWS 2000/3000 series in existing L3::AlteonAD 2012-11-29 22:45:09 -05:00
Eric A. Miller
0740a7bd5e Correct an issue in _load_attr() when specifying the Module (MIB) as a prefix to resolve leaf name conflicts between private MIBs. Add even more verbose debugging output for _global and _load_attr() - now reports Module qualified leaf name and full OID to include any partial passed. 2012-11-29 21:35:38 -05:00
Eric A. Miller
84493a99b4 Merge branch 'em-autoload-topo'
Conflicts:
	ChangeLog
2012-11-28 23:18:39 -05:00
Eric A. Miller
f730fa3325 update changelog 2012-11-28 22:52:47 -05:00
Eric A. Miller
4b1007cb66 Support Avaya (Trapeze) Wireless Controllers in new class L2::NWSS2300 2012-11-28 22:48:24 -05:00
Eric A. Miller
436f7442b6 Add support for Avaya VSP 7000 series 2012-11-28 19:49:25 -05:00
Eric A. Miller
3af05ebba5 correction for passing partial on initial AUTOLOAD 2012-11-28 19:38:04 -05:00
Eric A. Miller
a83bc1bcb2 New global 2012-11-27 23:05:23 -05:00
Eric A. Miller
af65bb3a2b Add support for Avaya VSP 9000 2012-11-27 22:41:06 -05:00
Eric A. Miller
f2d9f6be27 New global 2012-11-27 22:39:25 -05:00
Eric A. Miller
ecea4ef4a4 Correct naming of global id method 2012-11-26 23:03:55 -05:00
Eric A. Miller
e4e099510a Documentation updates 2012-11-26 23:03:01 -05:00
Eric A. Miller
de28ff96c2 Strip orig_ from method name in _global() and _load_attr() 2012-11-26 20:46:26 -05:00
Eric A. Miller
6692ddcf1f Override peth_power_watts() with Extreme specific MIB 2012-11-26 19:51:05 -05:00
Eric A. Miller
ba7a105eb1 Additional documentation 2012-11-26 19:36:11 -05:00
Eric A. Miller
b9fb232859 New globals 2012-11-26 19:29:10 -05:00
Eric A. Miller
6f54cb429e New global box_descr() 2012-11-26 19:22:40 -05:00
Eric A. Miller
ae3398b11a Replace map function with hash iteration for munge handling in _load_attr() and _show_attr 2012-11-25 22:42:49 -05:00
Eric A. Miller
e97693d12d Rename c_* methods to cdp_* since c_* methods now report all topology. 2012-11-25 21:46:54 -05:00
Eric A. Miller
435bb7dbe2 No longer emulate CDP methods in other discovery protocol classes, use the class name as base (sonmp, fdp) rather than cdp. 2012-11-25 21:45:56 -05:00
Eric A. Miller
70bc5e78e9 Remove c_* methods from device classes as top level methods now handle. 2012-11-25 21:43:31 -05:00
Eric A. Miller
a163e5b82c Remove c_* methods from device classes as top level methods will now handle. 2012-11-25 21:39:32 -05:00
Eric A. Miller
5eb66fe442 Create new top level c_* topology methods and has_topo() method. 2012-11-25 20:38:55 -05:00
Eric A. Miller
b6cf462b16 Top level changes to Info.pm
1 - Simplify AUTOLOAD()
2 - Add dynamically generated methods to symbol table to avoid AUTOLOAD on subsequent calls
3 - Override UNIVERSAL::can() to work with dynamic methods
4 - [3160037] - Support _raw suffix on methods to skip munging
5 - Add default bulkwalk_no()
2012-11-23 22:58:46 -05:00
319 changed files with 51954 additions and 12760 deletions

56
.github/issue_template.md vendored Normal file
View File

@@ -0,0 +1,56 @@
<!---
READ THIS FIRST!
----------------
the more info you can provide, the easier it is for us the help you, so please
fill out as many of the items below as possible.
Provide a general summary of the issue in the Title above
when including netdisco config snippets, whitespace matters since it's a yaml file
for github issues it really helps if you include the relevant config parts in a codeblock (code fencing)
see the "code" subject on https://guides.github.com/features/mastering-markdown/ for that)
this should preserve spaces in the issue tracker and make troubleshooting quicker
-->
## Expected Behavior
<!--- If you're describing a bug, tell us what should happen -->
<!--- If you're suggesting a change/improvement, tell us how it should work -->
## Current Behavior
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
## Possible Solution
<!--- Not obligatory, but suggest a fix/reason for the bug, -->
<!--- or ideas how to implement the addition or change -->
## Steps to Reproduce (for bugs)
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant, or attach screenshots -->
1.
2.
3.
4.
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
## Your Device
<!--- Some basic info about your device will help out pinpointing the issue more easily -->
<!--- also, snmpwalk output of the following oid helps out a lot: .1.3.6.1.2.1.1 -->
<!--- this is the system leaf of the snmp mib-2 -->
* Vendor:
* Device Model:
* Operating System Version:
* Snmpwalk output of .1.3.6.1.2.1.1:
## Your Environment
<!--- Include as many relevant details about the environment you experienced the bug in -->
* SNMP::Info version used:
* Netdisco version (if used):

18
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: GitHub Release on Tag
on:
push:
tags:
- '[0-9].[0-9][0-9]'
jobs:
release_snmp_info:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Get the Tag
id: get_tag
run: echo ::set-output name=TAGVALUE::${GITHUB_REF#refs/tags/}
- name: Release
uses: softprops/action-gh-release@v1
with:
name: SNMP::Info ${{ steps.get_tag.outputs.TAGVALUE }}

122
.github/workflows/test_and_publish.yml vendored Normal file
View File

@@ -0,0 +1,122 @@
name: Test and Publish SNMP::Info
on:
workflow_dispatch:
inputs:
success_irc_squawk:
description: 'Squawk to IRC on successful tests'
required: false
default: false
debug_test_enabled:
description: 'With build and test debug'
required: false
default: false
push:
branches:
- master
tags:
- '[0-9].[0-9][0-9]'
pull_request:
types: [opened, synchronize, reopened]
jobs:
test_snmp_info:
name: Test and CPAN Upload
runs-on: ubuntu-latest
container:
image: 'netdisco/netdisco:latest-do'
options: '--user root --entrypoint /bin/ash'
volumes:
- '/home/runner/work:/github/workspace'
defaults:
run:
working-directory: /github/workspace/snmp-info/snmp-info
steps:
- name: Get the Tag or Branch
run: echo "GH_REF_SHORT=$(echo ${GITHUB_REF##*/})" >> $GITHUB_ENV
- name: Install packages
run: apk add openssh xz tmux bash curl sudo gcc make musl-dev perl-dev unzip jq
- name: Install fake apt-get
run: echo 'if [ "$1" == "update" ]; then exec apk update; else exec apk add openssh xz; fi' > /usr/local/bin/apt-get && chmod +x /usr/local/bin/apt-get
- name: Check out latest code
uses: actions/checkout@v1
- name: Fix owner of checkout
run: chown -R netdisco:netdisco /github/workspace/snmp-info/snmp-info
- name: Install Perl deps
run: |
sudo -u netdisco /home/netdisco/bin/localenv cpanm --notest Hook::LexWrap Test::Class::Most Test::Distribution Test::MockObject::Extends PPI Class::ISA Module::Info File::Slurp Test::Perl::Critic Test::Spelling CPAN::Uploader
sudo -u netdisco /home/netdisco/bin/localenv curl -L https://raw.githubusercontent.com/rjbs/CPAN-Uploader/4dd4fbad6bc96257c53a50ea2761932795dddf5c/lib/CPAN/Uploader.pm > /home/netdisco/perl5/lib/perl5/CPAN/Uploader.pm
- name: Run Tests
id: build_and_run_tests
run: |
sudo -u netdisco /home/netdisco/bin/localenv perl ./Build.PL
sudo -u netdisco /home/netdisco/bin/localenv ./Build test --test_files t/ --test_files xt/
continue-on-error: true
- name: IRC test failure notification
if: (steps.build_and_run_tests.outcome == 'failure') && (github.event_name != 'workflow_dispatch')
uses: Gottox/irc-message-action@v2
with:
channel: '#netdisco'
nickname: github-actions
message: |-
🤖 ${{ github.actor }} pushed to ${{ env.GH_REF_SHORT }}: https://github.com/${{ github.repository }}/commit/${{ github.sha }}
😭 TESTS have FAILED! 👀 https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: IRC test success notification
if: (steps.build_and_run_tests.outcome == 'success') && github.event.inputs.success_irc_squawk
uses: Gottox/irc-message-action@v2
with:
channel: '#netdisco'
nickname: github-actions
message: |-
🤖 ${{ github.actor }} pushed to ${{ env.GH_REF_SHORT }}: https://github.com/${{ github.repository }}/commit/${{ github.sha }} (tests PASSED 🎉)
- name: Make release
if: steps.build_and_run_tests.outcome == 'success'
run: |
sudo -u netdisco /home/netdisco/bin/localenv rm ./MANIFEST
sudo -u netdisco /home/netdisco/bin/localenv ./Build manifest
sudo -u netdisco /home/netdisco/bin/localenv ./Build distmeta
sudo -u netdisco /home/netdisco/bin/localenv ./Build dist
- name: Upload to CPAN
id: upload_to_cpan
if: startsWith(github.ref, 'refs/tags/')
env:
PAUSE_USERNAME: ${{ secrets.PAUSE_USERNAME }}
PAUSE_PASSWORD: ${{ secrets.PAUSE_PASSWORD }}
run: |
bash -c 'RELEASENAME=(SNMP-Info-*.tar.gz) && ! curl -LI --fail https://cpan.metacpan.org/authors/id/O/OL/OLIVER/${RELEASENAME}'
sudo -u netdisco /home/netdisco/bin/localenv cpan-upload -u '${{ env.PAUSE_USERNAME }}' -p '${{ env.PAUSE_PASSWORD }}' SNMP-Info-*.tar.gz
continue-on-error: true
- name: IRC upload failure notification
if: steps.upload_to_cpan.outcome == 'failure'
uses: Gottox/irc-message-action@v2
with:
channel: '#netdisco'
nickname: github-actions
message: |-
🤖 Failed to upload SNMP::Info release ${{ env.GH_REF_SHORT }} to CPAN! 😭
👀 https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: IRC upload success notification
if: steps.upload_to_cpan.outcome == 'success'
uses: Gottox/irc-message-action@v2
with:
channel: '#netdisco'
nickname: github-actions
message: |-
🤖 Uploaded SNMP::Info release ${{ env.GH_REF_SHORT }} to CPAN 🎉
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: always() && github.event.inputs.debug_test_enabled
with:
sudo: true
- name: Preserve status from tests
if: always() && (steps.build_and_run_tests.outcome == 'failure')
run: exit 1

14
.gitignore vendored Normal file
View File

@@ -0,0 +1,14 @@
*.swp
*.pid
test.pl
MYMETA.*
*.tar.gz
MANIFEST.*
*.komodo*
Makefile*
Build
_build
blib
cover_db
.idea
.vscode

54
Build.PL Normal file
View File

@@ -0,0 +1,54 @@
use strict;
use warnings;
use Module::Build;
Module::Build->new(
module_name => 'SNMP::Info',
license => 'bsd',
dist_author => 'Eric A. Miller <emiller@cpan.org>',
# dynamic_config => 1,
create_readme => 1,
configure_requires => {
'Module::Build' => '0.42',
},
# build_requires => {
# },
requires => {
'SNMP' => '0',
'Math::BigInt' => '0',
'NetAddr::IP' => '4.068',
},
recommends => {
'PPI' => '0',
'Class::ISA' => '0',
'Module::Info' => '0',
'Module::Load' => '0',
'File::Slurp' => '0',
},
test_requires => {
'Test::More' => '0.88',
'Test::Distribution' => '0',
'Test::Class::Most' => '0',
'Test::MockObject::Extends' => '0',
'File::Find' => '0',
'Path::Class' => '0',
'File::Slurper' => '0',
'Test::Exception' => '0.43',
'Class::Inspector' => '0',
'NetSNMP::default_store' => '0',
'Module::Find' => '0',
'Hook::LexWrap' => '0',
},
# script_files => [
# ],
# share_dir => 'share',
meta_merge => {
resources => {
homepage => 'http://netdisco.org/',
bugtracker => 'https://github.com/netdisco/snmp-info/issues',
repository => 'https://github.com/netdisco/snmp-info',
MailingList => 'https://lists.sourceforge.net/lists/listinfo/snmp-info-users',
IRC => 'irc://irc.libera.chat/#netdisco',
},
},
)->create_build_script;

485
ChangeLog
View File

@@ -1,485 +0,0 @@
SNMP::Info - Friendly OO-style interface to Network devices using SNMP.
version 2.09 (2012-11-28)
[NEW FEATURES]
* New method i_ssidmac() to get BSSID's from AP's with initial support
in L2::Aironet and Airespace classes
* Support for Avaya Secure Routers in new class L3::Tasman
* Add EDP and LLDP L2 Topology to L3::Extreme
* [3185393] Support for Juniper SSL VPN in new class L7::Neoteris
* [3381027] Support for Cisco Nexus in new class L3::Nexus
* [1424336] Support for Extreme Discovery Protocol (EDP)
[ENHANCEMENTS]
* [3017571] Add LLDP support for NetSNMP device class (begemot)
* [3418918] Extreme devices now report OS as either extremeware or xos
* [2809045] Strip preceding netscreen from model name in L3::Netscreen
* [] Classify Linksys 2024 as L3::Dell (Rogier Krieger)
[BUG FIXES]
* Fixed logic to return cached data for table methods when available and
not a partial fetch
* Fix typo in PoD for Bridge.pm and CiscoConfig.pm (William Bulley)
* Fix/improve IPv6 neighbor cache handling, especially for Cisco Nexus
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)
+ Added detection for Cisco 2960, 2940, 3400 w/ MetroBase
+ Added generic L2::Cisco Class
* Corrected detection for Cisco Supervisor Engine 2 and 32 (IOS).
* Fixed warnings in CiscoStack
* Updated ProCurve HP device detection for newer firmwares
version 1.03 (04/14/06) - Beta/developer release
* Use ipNetToMedia table instead of atTable for ARP
* Remove CiscoStack from Layer3::C4000
* Fixed bug in MAU class when polling devices without MAU-MIB support
version 1.01 (04/08/06) - Beta/developer release
+ Change version numbers to X.XX format. Odd releases are beta
or developer only releases. Even are official releases.
version 1.0 (04/07/06) - CVS only. No official release
+ Added Interface FlowControl status to CiscoStack (Nicolai Petri)
+ Added CiscoImage class (Matthew Tuttle)
+ Added C1200 and C350 IOS devices to L2::Aironet (Matthew Tuttle)
+ Added support for Foundry IronWare and gave L3::Foundry CPR
+ Added support for Foundry EdgeIrons as new class L2::Foundry
+ Added BulkWalk and BulkRepeaters options to new()
+ Added DebugSNMP option to new()
+ Added CISCO-ENTITY-VENDORTYPE-OID-MIB,CISCO-PRODUCTS-MIB,CISCO-STACK-MIB
to CiscoStats.pm for model()
+ Check for bulkwalk_no() method
+ Added Entity.pm to L3 and L2 classes per N. Petri's suggestion.
+ Added support for Passport/Accelar 1100 and 1200 series in L3::Passport
+ Added support for Passport/Accelar 8100 series in L3::Passport
+ Added support for Passport 1600 series as new class, L3::N1600
+ Added support for Extreme Alpine and Summit switches as new class
L3:Extreme (Mike Hunter and Eric Miller)
+ Added support for Aruba wireless switches (Eric Miller and Brian Chow)
+ Added support for Nortel 2700 series (Airespace) wireless switches
+ Added support for Synoptics hubs as new class L1:S3000
+ Added Cisco QOS and RTT classes (Alexander Hartmaier)
+ Added BGP Peer Table to L3 class (Carlos Vicente)
+ 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 CiscoStack class
+ CDP added to Aironet class
+ Added Juniper class
+ Added support for Catalyst 4000 and 4500, get admin. duplex
and speed properly
+ Added i_speed_high(), which i_speed() uses if needed to support
interfaces >4Gbps
* More error checking in _load_attr() around bulkwalk code
* Minor warning fix in L3::Aironet::os_ver()
* Abstracted remaining Cisco stuff from L3 to L3::Cisco
* Removed all Cisco stuff from L2
* Expanded Entity.pm to cover the whole ENTITY-MIB and improved docs.
* changed all refs to $DEBUG to $self->debug() for reentrant code
* [ 1111284 ] Parameters not being set with AutoSpecify - fixed.
* Turned off BULKWALK for C1900 and C6500 classes.
* Added exception handling for V2 ENDOFMIBVIEW
* Fix in SONMP when topology not enabled
* Fix in L3::Passport root_ip()
* Fix in L3::Passport bp_index() some devices not returning complete index.
* Enable set_i_up_admin() in Bayhub
* Recognize new Nortel model names in Baystack and Passport classes
* Orinoco class should now recognize more models
* Cleanup model recognition in Baystack class, recognize more models
* Modify Catalyst class to use CISCO-STACK-MIB for brige port index mapping
some devices having problems returning complete index from BRIDGE-MIB
* Check root ip for reachability before assignment
* HP class should recognize more models
* Fix in HP class for models not returning full bp_index
* [ 1436103 ] L2::Aironet devices weren't getting their model
translated properly
verison 0.9 (11/15/04)
+ ** Added full Nortel/Bay/BayStack support
by new developer Eric Miller.
L2::Bay now depricated.
+ Added Alteon Ace support (Eric Miller)
+ Added Nortel Cotivity support (Eric Miller)
+ Added Nortel BayRS support (Eric Miller)
+ Added Nortel Centillion support (Eric Miller)
+ Added Nortel AP 222x support (Eric Miller)
+ Added Orinco AP support (Eric Miller)
+ 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 C3560s to the C3550 class. Thanks to Nicolai.
* Fixed Bug where older Cisco's would append nulls to certain
CDP information. Would come up a 'DBD::Pg parser' error in Netdisco
* Changed so a failed _global() call is cached so it won't retry
an error over and over again if the same global is used.
* Added check in _set() to see if data came from sub or FUNCS/GLOBALS
Fails if came from sub.
version 0.8 (03/21/04)
+ Added Q-BRIDGE-MIB support to SNMP::Info::Bridge
+ Added Aironet AP4800 to Layer3::Aironet class
+ Added C3500XL devices to the Layer2::C2900 class
+ Added Cisco 3750 (37xxstack) to Layer3::C6500 class
+ Added Cisco Catalyst 4000 to Layer3::C6500 class
+ Added Cisco Catalyst 2970 to Layer3::C6500 Class
* Made Cisco Commuinty string indexing a boolean method for clarification
* Added VLAN info for HP devices using Q-BRIDGE-MIB
* Fixed warning about uninitialized value in CiscoStats line 92
* Added for more serial# checking for L2 and L3
* Fixed warning in Layer2::Bay about non numeric port line 199
Contributions from Dmitry Sergienko:
+ Added Cisco Aironet BR500 and AP1200 to L2::Aironet Class
* Fixed the Port name alias for Catalyst 2900 devices
+ Added Support For ZyXEL DSLAMs and Allied Telesys Switches
version 0.7 (08/14/03)
* Added Class for Catalyst 6500 Series - Layer3::C6500
* Added CiscoVTP support to 3550,2900, and Catalyst classes
* Extracted VLAN stuff from Layer2::Catalyst to SNMP::Info::CiscoVTP
* Extracted CISCO-STACK-MIB from Layer2::Catalyst to SNMP::Info::CiscoStack
* Added 2950's to the Layer2::C2900 class
* Added 3548's and 350x's to the Layer3::C3550 class
* Broke out 3550's into separate device types (3550-24, 3550-48)
* Added T1,dual T1, and T3 , ATM over OC-12 ... to the SPEED_MAP
* Fixed speed map -- OC-1 -> OC-3
* Fixed Bug where Catalyst Switch running IOS would report CatOS as os()
version 0.6 (06/18/03)
* Minor Bug Fix. SNMP::Info::Layer2::Bay and SNMP::Info::Layer2::C1900
didn't return 1 and failed to load on some versions of Perl.
version 0.5 (06/10/03)
* Added ability to get paritial tables. For example to get the
IP routing table for 128.114.* you can do
$ipr = $dev->ipr_dest('128.114');
* Added IP Routing Table entries from RFC1213 to SNMP::Info
* minor bug fixes
version 0.4 (04/29/03)
* BIG CHANGE ! Internal Data structure has changed.
* 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.
* Globals are now cached
* Added new argument 'AutoSpecify' to new() to auto-connect with subclass
detected in device_type()
* New method specify() returns a new subclass object
* Subclasses are automatically loaded when specify or autospecify is used!
* Added methods for Interface statistics (ifInOctets ...)
* Added methods for Memory and CPU statistics
* Added SNMP::Info::Entity, moved out of L2-HP
* Added SNMP::Info::Layer2::Aironet
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 more debugging
* Added info and munging for c_capabilities in SNMP::Info::CD
Thanks to Martin Lorensen <martin /at- lorensen.dk>
* Removed requirement for SNMP in the Makefile.PL and moved it to t/prereq.t
so that the Module will install via CPAN without trying to install the old
4.2.0 version of SNMP on CPAN. Will now fail in the test phase.
Thanks again to Martin Lorensen <martin /at- lorensen.dk>
* Moved tests from test.pl to t/*
version 0.2 (02/19/03)
* Added put_() methods and support for SNMP put commands
* Added SNMP::Info::Layer3::C3550 class for Cisco Catalyst 3550
* Fixed HP Detection in device_type()
* 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
version 0.1 (12/30/02)
* Initial Release
* SubClasses Included:
* SNMP::Info::Bridge
* SNMP::Info::CDP
* SNMP::Info::EtherLike
* SNMP::Info::MAU
* SNMP::Info::Layer1
o SNMP::Info::Layer1::Allied
o SNMP::Info::Layer1::Asante
* SNMP::Info::Layer2
o SNMP::Info::Layer2::Bay
o SNMP::Info::Layer2::C1900
o SNMP::Info::Layer2::C2900
o SNMP::Info::Layer2::Catalyst
o SNMP::Info::Layer2::HP
* SNMP::Info::Layer3
o SNMP::Info::Layer3::Aironet
o SNMP::Info::Layer3::Foundry

1478
Changes Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,879 +0,0 @@
# SNMP Device Compatibility Matrix
# SNMP::Info - (C) 2004 Max Baker
# This file is meant to detail the cababilities
# of network devices to supply data via SNMP.
# $Id$
#
# 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: 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
arpnip: yes
macsuck: yes
portmac: yes
duplex: no
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
device: 6000
#
# 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
modules: yes
device-family: Aironet
note: IOS and Aironet OS versions
class: Layer3::Aironet
device: AIRAP1100, AP1200, C1100, C1130, C1240
note: IOS based device
class: Layer2::Aironet
device: BR500
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
class: Layer3::Cisco
device: 1003
device-family: 1700
class: Layer3::Cisco
device: 1710
duplex: link
device-family: 2500
duplex: no
macsuck: yes
arpnip: yes
ver: 1
class: Layer3::Cisco
device: 2501,2503,2511,2514
device: AS2509RJ,AS2511RJ
device-family: 2600
duplex: link
arpnip: yes
macsuck: yes
class: Layer3::Cisco
device:2610, 2610XM, 2611, 2620, 2620XM, 2621, 2621XM, 2651XM, 2691
device-family: 2800
duplex: link
arpnip: yes
macsuck: yes
class: Layer3::Cisco
device: 2811,2821,2851
device-family: 3600
class: Layer3::Cisco
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 ancient IOS versions
device-family: AS5000
duplex: no
class: Layer3::Cisco
device: AS5300
#
# Cisco - Catalyst
#
device-family: Catalyst 1900
note: !Upgrade older (pre 9.0) versions of CatOS
note: !CatOS ver 9.00.03 through 9.00.06 have problems when trunking. Upgrade to 9.00.07 or higher.
ver: 1
duplex: both
vlan: write
class: Layer2::C1900
device: wsc1900c, wsc1900
device-family: Catalyst 2900
note: IOS
macsuck: vlan
duplex: write
vlan: write
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: 2924MXL
ver: 1
device-family: Catalyst 2940
note: IOS
macsuck: vlan
duplex: write
vlan: write
class: Layer2::C2900
portmac: yes
device: 2940-8TT
device-family: Catalyst 2950
note: IOS
macsuck: vlan
duplex: write
vlan: write
class: Layer2::C2900
portmac: yes
device: 2950-t24
device-family: Catalyst 2970
macsuck:vlan
duplex: write
vlan: write
note: Acts just like IOS Catalyst 6500 series
class: Layer3::C6500
device: 2960, 2970G-24T-E
device-family: Catalyst 3500 XL
portmac: yes
macsuck: vlan
duplex: write
vlan: write
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, 3524XL, 3548XL
device-family: Catalyst 3550
macsuck: vlan
duplex: write
vlan: write
class: Layer3::C3550
note: Run IOS
note: Has VLANs that don't accept SNMP connections. Don't know if they are standard (by name or number).
note: Uses CISCO-STACK-MIB like Catalyst 5000 series for serial,duplex,type but not name
note: Comes in flavors that support L2, L3 or combo.
device: 3550-12T
device: 3400 w/ MetroBase Image
device: 3550, 3560, 3550-24, 3550-48
note: L2/L3 Switch
arpnip: yes
macsuck: vlan
device-family: Catalyst 3750
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: !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, wsc4503, wsc4506
device: wsc4912g
note: Dedicated 12 port gig-e switch
device: 4006
duplex: both
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: 4503, 4506, 4507, 4510
duplex: both
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
device: wsc2926
note: !Can give false information over SNMP at times.
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: wsx5302
arpnip: yes
class: Layer3
note: Router blade that runs IOS
device-family: Catalyst 6500
macsuck:vlan
duplex: write
vlan: write
class: Layer3::C6500
note: Runs in two possible modes, native (IOS) and hybrid (IOS with CatOS on top).
note: Switch running Hybrid has WS-C in description field and loves L2::Catalyst class
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, 6509, sp72033, s3223, s32p3, s222
note: Native mode (IOS) reports L2+L3
device: wsc6509
duplex: write
class: Layer2::Catalyst
note: Hybrid Mode (Catalyst) reports L2 only
device: 6kMsfc
class: Layer3
duplex: no
vlan: no
note: IOS portion of Hybrid mode. VLAN and other L3 Services.
device: 6kMsfc2
class: Layer3
duplex: no
vlan: no
note: IOS portion of Hybrid mode. VLAN and other L3 Services.
device-family: Voice Gateway
class: Layer3
duplex: no
device: VG200
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: 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
vlan: yes
modules: no
device-family: FastIron
class: Layer3::Foundry
ver: 1
note: Support very limited
device: FastIron 4802
device-family: EdgeIron
ver: 2
class: Layer3::Foundry
cdp: yes
duplex: yes
macsuck: yes
device: EdgeIron 24G
note: Bug where spanning tree stuff loops forever when polled by SNMP.
device-family: IronWare
class: Layer3::Foundry
ver: 2
cdp: yes
note: FDP enabled.
duplex: yes
macsuck: yes
arpnip: yes
device: FWSX424
device: ServerIronGT
device: FLS624, FLS648
#
# HP
#
device-vendor: HP
note: HP Devices are very widely supported.
ver: 2
modules: yes
device-family: HP ProCurve (old)
class: Layer2::HP4000
duplex: both
macsuck: yes
arpnip: no
cdp: yes
vlan: write
note: devices in this class only have CDP support
note: VLAN info in HP-VLAN MIB
device: 1600M,2400,2424M,4000,8000
duplex: link
note: duplex issues?
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
#
# Kentrox
#
device-vendor: Kentrox
note: MIB not yet shipped
device: Kentrox DataSMART DSU/CSU
#
# NORTEL
#
device-vendor: Nortel
macsuck: yes
cdp: proprietary
note: SONMP Discovery Protocol Supported
device-family: BayStack Hub
duplex: both
ver: 1
modules: yes
class: Layer1::Bayhub
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
device: 102
device: System 5000
device-family: Ethernet Switch/Baystack Switch
macsuck: yes
duplex: both
vlan: write
modules: yes
class: Layer2::Baystack
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: Business Policy Switch (BPS)
device-family: Ethernet Routing Switch/Baystack Switch
arpnip: yes
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
duplex: both
vlan: yes
class: Layer2::Centillion
note: !Must be on version 4.x or 5.x (VLAN based) software.
device: 5000BH, 5005BH
device: C50,C100
device-family: AP222x
duplex: both
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, AP-2221
device-family: Alteon AD
arpnip: 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,AD3,AD4
device: 180,183,184
device-family: Multiprotocol Router/BayRS
arpnip: yes
portmac: yes
duplex: both
cdp: no
vlan: yes
modules: yes
class: Layer3::BayRS
device: AN,ARN,ASN,BLN,BCN
device: 2430,5430
device-family: VPN Router/Contivity
arpnip: yes
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,1750
device: 2500,2600,2700
device: 4500,4600,5000
device-family: Ethernet Routing Switch/Passport/Accelar LAN
arpnip: yes
macsuck: yes
portmac: yes
duplex: write
cdp: proprietary
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, 8610co, 8106, 8110
device: 1050,1100,1150,1200
device-family: Ethernet Routing Switch/Passport 1600 (Software < 2.1)
arpnip: yes
macsuck: yes
portmac: yes
duplex: both
cdp: proprietary
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
cdp: proprietary
ver: 1
class: Layer1::S3000
note: Uses proprietary MIBs to provide MAC to port mapping.
note: !Requires Advanced or Advanced Analyzer NMM
device: 281X
device: System 3000
device-family: Wireless Switch 2270
arpnip: no
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
macsuck: yes
duplex: no
cdp: no
class: Layer2::Orinoco
device-family: Orinoco
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)
device-family: Zyxel DSLAM
device:AAM10008-61, AAM1008-63

View File

@@ -1,442 +0,0 @@
# SNMP::Info::CDP
# $Id$
#
# 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
# 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::CDP;
use strict;
use Exporter;
use SNMP::Info;
@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.09';
# Five data structures required by SNMP::Info
%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',
);
%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' => \&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,
);
sub munge_power {
my $power = shift;
my $decimal = substr( $power, -3 );
$power =~ s/$decimal$/\.$decimal/;
return $power;
}
sub hasCDP {
my $cdp = shift;
my $ver = $cdp->{_version};
# SNMP v1 clients dont have the globals
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;
}
return $cdp->cdp_run();
}
sub c_if {
my $cdp = shift;
# See if by some miracle Cisco implemented the cdpCacheIfIndex entry
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;
}
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;
}
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 - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
my $cdp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $cdp->class();
print " Using device sub class : $class\n";
$hascdp = $cdp->hasCDP() ? 'yes' : 'no';
# Print out a map of device ports with CDP neighbors:
my $interfaces = $cdp->interfaces();
my $c_if = $cdp->c_if();
my $c_ip = $cdp->c_ip();
my $c_port = $cdp->c_port();
foreach my $cdp_key (keys %$c_ip){
my $iid = $c_if->{$cdp_key};
my $port = $interfaces->{$iid};
my $neighbor = $c_ip->{$cdp_key};
my $neighbor_port = $c_port->{$cdp_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
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.
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.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<CISCO-CDP-MIB>
=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 $cdp->hasCDP()
Is CDP is active in this device?
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. @#%$!
(C<cdpGlobalRun>)
=item $cdp->cdp_interval()
Interval in seconds at which CDP messages are generated.
(C<cdpGlobalMessageInterval>)
=item $cdp->cdp_holdtime()
Time in seconds that CDP messages are kept.
(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().
(C<cdpGlobalDeviceId>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 CDP CACHE ENTRIES
=over
=item $cdp->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
table below.
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
(Bit) - Description
=over
=item (0x40) - Provides level 1 functionality.
=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 (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 (0x02) - Performs level 2 transparent bridging.
=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.
(C<cdpCacheCapabilities>)
=item $cdp->c_domain()
Returns remote VTP Management Domain as defined in
C<CISCO-VTP-MIB::managementDomainName>
(C<cdpCacheVTPMgmtDomain>)
=item $cdp->c_duplex()
Returns the port duplex status from remote devices.
(C<cdpCacheDuplex>)
=item $cdp->c_id()
Returns remote device id string
(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.
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();
return $c_index if defined $c_index;
# if not, let's fake it
my $c_ip = $device->c_ip();
my %c_if
foreach my $key (keys %$c_ip){
$iid = $key;
## Truncate off .1 from cdp response
$iid =~ s/\.\d+$//;
$c_if{$key} = $iid;
}
return \%c_if;
=item $cdp->c_index()
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.
See c_if() entry.
(C<cdpCacheIfIndex>)
=item $cdp->c_ip()
If $cdp->c_proto() is supported, returns remote IPV4 address only. Otherwise
it will return all addresses.
(C<cdpCacheAddress>)
=item $cdp->c_addr()
Returns remote address
(C<cdpCacheAddress>)
=item $cdp->c_platform()
Returns remote platform id
(C<cdpCachePlatform>)
=item $cdp->c_port()
Returns remote port ID
(C<cdpDevicePort>)
=item $cdp->c_proto()
Returns remote address type received. Usually IP.
(C<cdpCacheAddressType>)
=item $cdp->c_ver()
Returns remote hardware version
(C<cdpCacheVersion>)
=item $cdp->c_vlan()
Returns the remote interface native VLAN.
(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
=cut

View File

@@ -1,444 +0,0 @@
# 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.09';
%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,492 +0,0 @@
# SNMP::Info::Layer2::Bay
# $Id$
# This module depricated. See Layer2::BayStack
#
# 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::Bay;
use strict;
use Exporter;
use SNMP::Info::Layer2;
@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/;
$VERSION = '2.09';
# Set for No CDP
%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',
);
%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{200_000_000} = '100 Mbps';
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, 'i_mac2' => \&SNMP::Info::munge_mac, );
sub os {
return 'bay';
}
sub os_ver {
my $bay = shift;
my $descr = $bay->description();
return unless defined $descr;
# 303 / 304
if ( $descr =~ m/Rev: \d+\.\d+\.\d+\.\d+-(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
# 450
if ( $descr =~ m/SW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub os_bin {
my $bay = shift;
my $descr = $bay->description();
return unless defined $descr;
# 303 / 304
if ( $descr =~ m/Rev: \d+\.(\d+\.\d+\.\d+)-\d+\.\d+\.\d+\.\d+/ ) {
return $1;
}
# 450
if ( $descr =~ m/FW:v(\d+\.\d+\.\d+\.\d+)/ ) {
return $1;
}
return;
}
sub vendor {
# or nortel, or synopsis?
return 'bay';
}
sub i_ignore {
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};
$i_ignore{$if}++ if $type =~ /(loopback|propvirtual|cpu)/i;
}
return \%i_ignore;
}
sub interfaces {
my $bay = shift;
my $i_index = $bay->i_index();
return $i_index;
}
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 ) {
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 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 $model;
}
# Hack in some CDP type stuff
sub c_if {
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my %c_if;
foreach my $entry ( keys %$bay_topo_port ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
$c_if{"$port.1"} = $port;
}
return \%c_if;
}
sub c_ip {
my $bay = shift;
my $bay_topo_ip = $bay->bay_topo_ip();
my $bay_topo_port = $bay->bay_topo_port();
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 ) {
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 );
}
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;
}
}
return \%c_ip;
}
sub c_port {
my $bay = shift;
my $bay_topo_port = $bay->bay_topo_port();
my $bay_topo_seg = $bay->bay_topo_seg();
my %c_port;
foreach my $entry ( keys %$bay_topo_seg ) {
my $port = $bay_topo_port->{$entry};
next unless defined $port;
next if $port == 0;
# 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};
# Segment id is (256 * remote slot_num) + (remote_port)
my $remote_port = $seg % 256;
$c_port{"$port.1"} = $remote_port;
}
return \%c_port;
}
sub c_platform {
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 ) {
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};
$c_platform{"$port.1"} = $platform;
}
return \%c_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Bay - SNMP Interface to old Bay Network BayStack Switches
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
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.
my $bay = new SNMP::Info::Layer2::Bay(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<SYNOPTICS-ROOT-MIB>
=item F<S5-ETH-MULTISEG-TOPOLOGY-MIB>
=item Inherited classes
MIBs required by L<SNMP::Info::Layer2/"Required MIBs"> and its superclasses.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $bay->vendor()
Returns 'bay' :)
=item $bay->model()
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 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.
(C<s5EnMsTopIpAddr>)
=item $bay->cdp_run()
Returns if the F<S5-ETH-MULTISEG-TOPOLOGY> info is on for this device.
(C<s5EnMsTopStatus>)
=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
=item $bay->interfaces()
Returns reference to map of IIDs to physical ports.
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() for this.
=item $bay->i_mac()
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
for each port mac.
=back
=head2 Pseudo CDP information
All entries with port=0 are local and ignored.
=over
=item $bay->c_if()
Returns reference to hash. Key: port.1 Value: port (iid)
=item $bay->c_ip()
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.
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
=item $bay->platform()
Returns reference to hash. Key: port.1 Value: Remote Device Type
=back
=head2 Layer2 Topology info (C<s5EnMsTopNmmTable>)
=over
=item $bay->bay_topo_slot()
Returns reference to hash. Key: Table entry, Value:slot number
(C<s5EnMsTopNmmSlot>)
=item $bay->bay_topo_port()
Returns reference to hash. Key: Table entry, Value:Port Number
(interface iid)
(C<s5EnMsTopNmmPort>)
=item $bay->bay_topo_ip()
Returns reference to hash. Key: Table entry, Value:Remote IP address of entry
(C<s5EnMsTopNmmIpAddr>)
=item $bay->bay_topo_seg()
Returns reference to hash. Key: Table entry, Value:Remote Segment ID
(C<s5EnMsTopNmmSegId>)
=item $bay->bay_topo_mac
(C<s5EnMsTopNmmMacAddr>)
Returns reference to hash. Key: Table entry, Value:Remote MAC address
=item $bay->bay_topo_platform
Returns reference to hash. Key: Table entry, Value:Remote Device Type
(C<s5EnMsTopNmmChassisType>)
=item $bay->bay_topo_localseg
Returns reference to hash. Key: Table entry, Value:Boolean, if bay_topo_seg()
is local
(C<s5EnMsTopNmmLocalSeg>)
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,349 +0,0 @@
# SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry Switches
# $Id$
#
# 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
# 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::Foundry;
use strict;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::FDP;
use SNMP::Info::EtherLike;
use SNMP::Info::MAU;
@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//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.09';
%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,
);
%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,
);
# 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;
# todo doc these
sub os_ver {
my $foundry = shift;
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';
}
# Default to OID method if no dice.
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_fwver = $foundry->e_fwver();
if ( defined $e_fwver->{$unit_iid} ) {
return $e_fwver->{$unit_iid};
}
# Not found in ENTITY-MIB, go up a level.
return $foundry->SUPER::os_ver();
}
sub model {
my $foundry = shift;
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';
}
# Default to OID method if no dice.
unless ( defined $unit_iid ) {
return $foundry->SUPER::model();
}
# Find Model Name
my $e_model = $foundry->e_model();
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 {
my $foundry = shift;
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';
}
return unless 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};
return $foundry->SUPER::serial();
}
sub interfaces {
my $foundry = shift;
my $i_descr = $foundry->i_description;
my $i_name = $foundry->i_name;
# use ifName only if it is in portn
# format. 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;
}
sub i_ignore {
my $foundry = shift;
my $i_type = $foundry->i_type();
my %i_ignore = ();
foreach my $iid ( keys %$i_type ) {
my $type = $i_type->{$iid} || '';
$i_ignore{$iid}++
# 33 is the console port
if $type =~ /(loopback|propvirtual|other|cpu|33)/i;
}
return \%i_ignore;
}
sub os {
return 'foundry';
}
sub vendor {
return 'foundry';
}
# this hangs on a edgeiron24g
# TODO: check by devicetype and deferr to SUPER if not bad device
sub stp_p_state { return; }
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Foundry - SNMP Interface to Foundry FastIron Network
Devices
=head1 AUTHOR
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,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
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
=over
=item SNMP::Info::Layer2
=item SNMP::Info::FDP
=back
=head2 Required MIBs
=over
=item F<FOUNDRY-SN-ROOT-MIB>
=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 $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 L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"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 $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 L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::FDP
See documentation in L<SNMP::Info::FDP/"TABLE METHODS"> for details.
=cut

View File

@@ -1,321 +0,0 @@
# 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.09';
%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,648 +0,0 @@
# 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.09';
%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

View File

@@ -1,674 +0,0 @@
# SNMP::Info::Layer3::C3550
# $Id$
#
# 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
# 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::C3550;
use strict;
use Exporter;
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/;
@SNMP::Info::Layer3::C3550::EXPORT_OK = qw//;
$VERSION = '2.09';
# 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::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::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 = (
%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';
}
sub model {
my $c3550 = shift;
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)?)$/ ) {
$model = "$1-$2";
}
return $model;
}
# Ports is encoded into the model number
sub ports {
my $c3550 = shift;
my $id = $c3550->id();
my $model = &SNMP::translateObj($id);
if ( $model =~ /(12|24|48)(C|T|TS|G|TS-E|TS-S|T-E)?$/ ) {
return $1;
}
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 {
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;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer3::C3550 - SNMP Interface to Cisco Catalyst 3550 Layer 2/3
Switches running IOS
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $c3550 = 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 = $c3550->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Cisco Catalyst 3550 Layer 2/3 Switches.
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.
my $c3550 = new SNMP::Info::Layer3::C3550(...);
=head2 Inherited Classes
=over
=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
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPower/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoPortSecurity/"Required MIBs"> for its own MIB
requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> 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
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $c3550->vendor()
Returns 'cisco'
=item $c3550->model()
Will take the translated model number and try to format it better.
355048 -> 3550-48
355012G -> 3550-12G
=item $c3550->ports()
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 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 L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in L<SNMP::Info::CiscoStack/"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::LLDP
See documentation in L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"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 $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 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 L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=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::CDP
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 L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"TABLE METHODS"> for details.
=cut

View File

@@ -1,623 +0,0 @@
# SNMP::Info::Layer3::C6500
# $Id$
#
# Copyright (c) 2008-2009 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
# 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::C6500;
use strict;
use Exporter;
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
/;
@SNMP::Info::Layer3::C6500::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.09';
# 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::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::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::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';
}
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 - SNMP Interface to Cisco Catalyst 6500 Layer 2/3
Switches running IOS and/or CatOS
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $c6500 = 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 = $c6500->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Cisco Catalyst 6500 Layer 2/3 Switches.
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.
my $c6500 = new SNMP::Info::Layer3::C6500(...);
=head2 Inherited Classes
=over
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CiscoStack
=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
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> 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::CiscoImage/"Required MIBs"> 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
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $c6500->vendor()
Returns 'cisco'
=item $c6500->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in L<SNMP::Info::CiscoStack/"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::CiscoStats
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
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::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 Overrides
=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 L<SNMP::Info::CiscoVTP/"TABLE METHODS"> for details.
=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::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::CiscoImage
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,670 +0,0 @@
# SNMP::Info::Layer3::Foundry - SNMP Interface to Foundry devices
# $Id$
#
# 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::Layer3::Foundry;
use strict;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::FDP;
use SNMP::Info::LLDP;
@SNMP::Info::Layer3::Foundry::ISA = qw/SNMP::Info::FDP SNMP::Info::LLDP
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer3::Foundry::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
$VERSION = '2.09';
%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::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,
# FOUNDRY-SN-SWITCH-GROUP-MIB
# snSwPortInfoTable - Switch Port Information Group
'sw_index' => 'snSwPortIfIndex',
'sw_duplex' => 'snSwPortInfoChnMode',
'sw_type' => 'snSwPortInfoMediaType',
'sw_speed' => 'snSwPortInfoSpeed',
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::FDP::MUNGE,
);
sub i_ignore {
my $foundry = shift;
my $partial = shift;
my $interfaces = $foundry->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 $foundry = shift;
my $partial = shift;
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};
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 $foundry = shift;
my $id = $foundry->id();
my $model = &SNMP::translateObj($id);
# 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//;
return $model;
}
sub os {
return 'foundry';
}
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->hasFDP();
}
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 - SNMP Interface to Foundry Network Devices
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $foundry = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $foundry->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Foundry Networks devices.
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(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3;
=item SNMP::Info::FDP;
=item SNMP::Info::LLDP;
=back
=head2 Required MIBs
=over
=item F<FOUNDRY-SN-ROOT-MIB>
=item F<FOUNDRY-SN-AGENT-MIB>
=item F<FOUNDRY-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 $foundry->model()
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'
=item $foundry->os()
Returns 'foundry'
=item $foundry->os_ver()
Returns the software version
=item $foundry->mac()
Returns MAC Address of root port.
(C<ifPhysAddress.1>)
=item $foundry->chassis()
Returns Chassis type.
(C<entPhysicalDescr.1>)
=item $foundry->serial()
Returns serial number of device.
=item $foundry->temp()
Returns the chassis temperature
(C<snChasActualTemperature>)
=item $foundry->ps1_type()
Returns the Description for the power supply
(C<snChasPwrSupplyDescription.1>)
=item $foundry->ps1_status()
Returns the status of the power supply.
(C<snChasPwrSupplyOperStatus.1>)
=item $foundry->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 $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->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>)
=back
=head2 Foundry Switch Port Information Table (C<snSwPortIfTable>)
=over
=item $foundry->sw_index()
Returns reference to hash. Maps Table to Interface IID.
(C<snSwPortIfIndex>)
=item $foundry->sw_duplex()
Returns reference to hash. Current duplex status for switch ports.
(C<snSwPortInfoChnMode>)
=item $foundry->sw_type()
Returns reference to hash. Current Port Type .
(C<snSwPortInfoMediaType>)
=item $foundry->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 $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

View File

@@ -1,231 +0,0 @@
# 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.09';
%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;
}
sub model {
my $netscreen = shift;
my $id = $netscreen->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::model() - Device does not support sysObjectID\n"
if $netscreen->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^netscreen//i;
return $model;
}
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->model()
(C<chassisModel>)
=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

View File

@@ -1,564 +0,0 @@
# SNMP::Info::Layer3::Nexus
#
# Copyright (c) 2012 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::Nexus;
use strict;
use Exporter;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
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::Nexus::ISA = qw/
SNMP::Info::CiscoVTP
SNMP::Info::CiscoStpExtensions
SNMP::Info::LLDP
SNMP::Info::CDP
SNMP::Info::CiscoImage
SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoConfig
SNMP::Info::CiscoPower
SNMP::Info::Layer3
Exporter
/;
@SNMP::Info::Layer3::Nexus::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
$VERSION = '2.09';
# 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 be reverse of 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::CDP::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
'CISCO-ENTITY-VENDORTYPE-OID-MIB' => 'cevMIBObjects',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::CiscoPower::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoImage::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
'mac' => 'dot1dBaseBridgeAddress',
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::CiscoPower::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoImage::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::CiscoPower::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoImage::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
sub cisco_comm_indexing { return 1; }
sub vendor {
return 'cisco';
}
sub os {
return 'nx-os';
}
sub os_ver {
my $nexus = shift;
my $descr = $nexus->description();
return $1 if ( $descr =~ /\),\s+Version\s+(.+?),/ );
return $descr;
}
sub serial {
my $nexus = shift;
my $e_class = $nexus->e_class();
foreach my $iid ( keys %$e_class ) {
my $class = $e_class->{$iid} || '';
if ($class =~ /chassis/) {
my $serial = $nexus->e_serial($iid);
return $serial->{$iid};
}
}
return;
}
# sysObjectID returns an IID to an entry in the CISCO-ENTITY-VENDORTYPE-OID-MIB.
# Look it up and return it.
sub model {
my $nexus = shift;
my $id = $nexus->id();
unless ( defined $id ) {
print
" SNMP::Info::Layer3::Nexus::model() - Device does not support sysObjectID\n"
if $nexus->debug();
return;
}
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^cevChassis//i;
return $model;
}
# Use CDP and/or LLDP
sub hasCDP {
my $nexus = shift;
return $nexus->hasLLDP() || $nexus->SUPER::hasCDP();
}
sub c_ip {
my $nexus = shift;
my $partial = shift;
my $cdp = $nexus->SUPER::c_ip($partial) || {};
my $lldp = $nexus->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 $nexus = shift;
my $partial = shift;
my $lldp = $nexus->lldp_if($partial) || {};
my $cdp = $nexus->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 $nexus = shift;
my $partial = shift;
my $lldp = $nexus->lldp_port($partial) || {};
my $cdp = $nexus->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 $nexus = shift;
my $partial = shift;
my $lldp = $nexus->lldp_id($partial) || {};
my $cdp = $nexus->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 $nexus = shift;
my $partial = shift;
my $lldp = $nexus->lldp_rem_sysdesc($partial) || {};
my $cdp = $nexus->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::Nexus - SNMP Interface to Cisco Nexus Switches running
NX-OS
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $nexus = 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 = $nexus->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Cisco Nexus Switches running NX-OS.
For speed or debugging purposes you can call the subclass directly, but not
after determining a more specific class using the method above.
my $nexus = new SNMP::Info::Layer3::Nexus(...);
=head2 Inherited Classes
=over
=item SNMP::Info::Layer3
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoPower
=item SNMP::Info::CiscoStpExtensions
=item SNMP::Info::LLDP
=back
=head2 Required MIBs
=over
=item F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
=back
=over
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> 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::CiscoStpExtensions/"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 a scalar value from SNMP
=over
=item $nexus->vendor()
Returns 'cisco'
=item $nexus->os()
Returns 'nx-os'
=item $nexus->os_ver()
Returns operating system version extracted fron C<sysDescr>.
=item $nexus->serial()
Returns the serial number of the chassis from F<ENTITY-MIB>.
=item $nexus->model()
Tries to reference $nexus->id() to F<CISCO-ENTITY-VENDORTYPE-OID-MIB>
Removes 'cevChassis' for readability.
=item $nexus->mac()
C<dot1dBaseBridgeAddress>
=item $nexus->cisco_comm_indexing()
Returns 1. Use vlan indexing.
=back
=head2 Globals imported from SNMP::Info::Layer3
See documentation in L<SNMP::Info::Layer3/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoVTP
See documentation in L<SNMP::Info::CiscoVTP/"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::CiscoImage
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::CiscoPower
See documentation in L<SNMP::Info::CiscoPower/"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::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 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 $nexus->hasCDP()
Returns true if the device is running either CDP or LLDP.
=item $nexus->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $nexus->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 $nexus->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $nexus->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $nexus->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::CiscoVTP
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::CiscoImage
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
See documentation in L<SNMP::Info::CiscoStpExtensions/"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,12 +1,12 @@
All code from version 0.7 on
Copyright (c) 2003-2009 Max Baker and SNMP::Info Developers
Copyright (c) 2003-2016 Max Baker and SNMP::Info Developers
All rights reserved.
Original Code
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,
@@ -14,17 +14,17 @@ modification, are permitted provided that the following conditions are met:
* 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
* 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
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;
(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
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.

401
MANIFEST
View File

@@ -1,107 +1,298 @@
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/EDP.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/Bay.pm
Info/Layer2/Baystack.pm
Info/Layer2/C1900.pm
Info/Layer2/C2900.pm
Info/Layer2/Catalyst.pm
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/Nexus.pm
Info/Layer3/PacketFront.pm
Info/Layer3/Passport.pm
Info/Layer3/Pf.pm
Info/Layer3/SonicWALL.pm
Info/Layer3/Sun.pm
Info/Layer3/Tasman.pm
Info/Layer3/Timetra.pm
Info/Layer7.pm
Info/Layer7/APC.pm
Info/Layer7/Neoteris.pm
Info/LLDP.pm
Info/MAU.pm
Info/NortelStack.pm
Info/PowerEthernet.pm
Info/RapidCity.pm
Info/SONMP.pm
Makefile.PL
.perltidyrc
Build.PL
Changes
contrib/DEVELOP
contrib/util/docmunge
contrib/util/make_dev_matrix.pl
contrib/util/make_snmpdata.pl
contrib/util/push_ver
contrib/util/run_test
contrib/util/test_class.pl
contrib/util/test_class_mocked.pl
lib/SNMP/Info.pm
lib/SNMP/Info/AdslLine.pm
lib/SNMP/Info/Aggregate.pm
lib/SNMP/Info/Airespace.pm
lib/SNMP/Info/AMAP.pm
lib/SNMP/Info/Bridge.pm
lib/SNMP/Info/CDP.pm
lib/SNMP/Info/CiscoAgg.pm
lib/SNMP/Info/CiscoConfig.pm
lib/SNMP/Info/CiscoPortSecurity.pm
lib/SNMP/Info/CiscoPower.pm
lib/SNMP/Info/CiscoQOS.pm
lib/SNMP/Info/CiscoRTT.pm
lib/SNMP/Info/CiscoStack.pm
lib/SNMP/Info/CiscoStats.pm
lib/SNMP/Info/CiscoStpExtensions.pm
lib/SNMP/Info/CiscoVTP.pm
lib/SNMP/Info/DocsisCM.pm
lib/SNMP/Info/DocsisHE.pm
lib/SNMP/Info/EDP.pm
lib/SNMP/Info/Entity.pm
lib/SNMP/Info/EtherLike.pm
lib/SNMP/Info/FDP.pm
lib/SNMP/Info/IEEE802_Bridge.pm
lib/SNMP/Info/IEEE802dot11.pm
lib/SNMP/Info/IEEE802dot3ad.pm
lib/SNMP/Info/IPv6.pm
lib/SNMP/Info/Layer1.pm
lib/SNMP/Info/Layer1/Allied.pm
lib/SNMP/Info/Layer1/Asante.pm
lib/SNMP/Info/Layer1/Bayhub.pm
lib/SNMP/Info/Layer1/Cyclades.pm
lib/SNMP/Info/Layer1/S3000.pm
lib/SNMP/Info/Layer2.pm
lib/SNMP/Info/Layer2/3Com.pm
lib/SNMP/Info/Layer2/Adtran.pm
lib/SNMP/Info/Layer2/Aerohive.pm
lib/SNMP/Info/Layer2/Airespace.pm
lib/SNMP/Info/Layer2/Aironet.pm
lib/SNMP/Info/Layer2/Allied.pm
lib/SNMP/Info/Layer2/Atmedia.pm
lib/SNMP/Info/Layer2/Baystack.pm
lib/SNMP/Info/Layer2/C1900.pm
lib/SNMP/Info/Layer2/C2900.pm
lib/SNMP/Info/Layer2/Catalyst.pm
lib/SNMP/Info/Layer2/Centillion.pm
lib/SNMP/Info/Layer2/Cisco.pm
lib/SNMP/Info/Layer2/CiscoSB.pm
lib/SNMP/Info/Layer2/Exinda.pm
lib/SNMP/Info/Layer2/HP.pm
lib/SNMP/Info/Layer2/HP4000.pm
lib/SNMP/Info/Layer2/HPVC.pm
lib/SNMP/Info/Layer2/Kentrox.pm
lib/SNMP/Info/Layer2/N2270.pm
lib/SNMP/Info/Layer2/NAP222x.pm
lib/SNMP/Info/Layer2/Netgear.pm
lib/SNMP/Info/Layer2/Nexans.pm
lib/SNMP/Info/Layer2/NWSS2300.pm
lib/SNMP/Info/Layer2/Orinoco.pm
lib/SNMP/Info/Layer2/Sixnet.pm
lib/SNMP/Info/Layer2/Trapeze.pm
lib/SNMP/Info/Layer2/Ubiquiti.pm
lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
lib/SNMP/Info/Layer3.pm
lib/SNMP/Info/Layer3/Aironet.pm
lib/SNMP/Info/Layer3/AlcatelLucent.pm
lib/SNMP/Info/Layer3/AlteonAD.pm
lib/SNMP/Info/Layer3/Altiga.pm
lib/SNMP/Info/Layer3/Arista.pm
lib/SNMP/Info/Layer3/Aruba.pm
lib/SNMP/Info/Layer3/ArubaCX.pm
lib/SNMP/Info/Layer3/BayRS.pm
lib/SNMP/Info/Layer3/BlueCoatSG.pm
lib/SNMP/Info/Layer3/C3550.pm
lib/SNMP/Info/Layer3/C4000.pm
lib/SNMP/Info/Layer3/C6500.pm
lib/SNMP/Info/Layer3/CheckPoint.pm
lib/SNMP/Info/Layer3/Ciena.pm
lib/SNMP/Info/Layer3/Cisco.pm
lib/SNMP/Info/Layer3/CiscoASA.pm
lib/SNMP/Info/Layer3/CiscoFWSM.pm
lib/SNMP/Info/Layer3/CiscoSwitch.pm
lib/SNMP/Info/Layer3/Contivity.pm
lib/SNMP/Info/Layer3/Cumulus.pm
lib/SNMP/Info/Layer3/Dell.pm
lib/SNMP/Info/Layer3/DLink.pm
lib/SNMP/Info/Layer3/Enterasys.pm
lib/SNMP/Info/Layer3/ERX.pm
lib/SNMP/Info/Layer3/Extreme.pm
lib/SNMP/Info/Layer3/F5.pm
lib/SNMP/Info/Layer3/Force10.pm
lib/SNMP/Info/Layer3/Fortinet.pm
lib/SNMP/Info/Layer3/Foundry.pm
lib/SNMP/Info/Layer3/Genua.pm
lib/SNMP/Info/Layer3/H3C.pm
lib/SNMP/Info/Layer3/HP9300.pm
lib/SNMP/Info/Layer3/Huawei.pm
lib/SNMP/Info/Layer3/IBMGbTor.pm
lib/SNMP/Info/Layer3/Juniper.pm
lib/SNMP/Info/Layer3/Lantronix.pm
lib/SNMP/Info/Layer3/Lenovo.pm
lib/SNMP/Info/Layer3/Microsoft.pm
lib/SNMP/Info/Layer3/Mikrotik.pm
lib/SNMP/Info/Layer3/N1600.pm
lib/SNMP/Info/Layer3/Netscreen.pm
lib/SNMP/Info/Layer3/NetSNMP.pm
lib/SNMP/Info/Layer3/Nexus.pm
lib/SNMP/Info/Layer3/OneAccess.pm
lib/SNMP/Info/Layer3/PacketFront.pm
lib/SNMP/Info/Layer3/PaloAlto.pm
lib/SNMP/Info/Layer3/Passport.pm
lib/SNMP/Info/Layer3/Pf.pm
lib/SNMP/Info/Layer3/Pica8.pm
lib/SNMP/Info/Layer3/Redlion.pm
lib/SNMP/Info/Layer3/Scalance.pm
lib/SNMP/Info/Layer3/SonicWALL.pm
lib/SNMP/Info/Layer3/Steelhead.pm
lib/SNMP/Info/Layer3/Sun.pm
lib/SNMP/Info/Layer3/Tasman.pm
lib/SNMP/Info/Layer3/Teltonika.pm
lib/SNMP/Info/Layer3/Timetra.pm
lib/SNMP/Info/Layer3/VMware.pm
lib/SNMP/Info/Layer3/VyOS.pm
lib/SNMP/Info/Layer3/Whiterabbit.pm
lib/SNMP/Info/Layer7.pm
lib/SNMP/Info/Layer7/APC.pm
lib/SNMP/Info/Layer7/Arbor.pm
lib/SNMP/Info/Layer7/CiscoIPS.pm
lib/SNMP/Info/Layer7/Gigamon.pm
lib/SNMP/Info/Layer7/Liebert.pm
lib/SNMP/Info/Layer7/Neoteris.pm
lib/SNMP/Info/Layer7/Netscaler.pm
lib/SNMP/Info/LLDP.pm
lib/SNMP/Info/MAU.pm
lib/SNMP/Info/MRO.pm
lib/SNMP/Info/NortelStack.pm
lib/SNMP/Info/PowerEthernet.pm
lib/SNMP/Info/RapidCity.pm
lib/SNMP/Info/SONMP.pm
LICENSE
MANIFEST This list of files
META.json
META.yml
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
t/00_load.t
xt/.perltidyrc
xt/00_local_distribution.t
xt/00_local_docininfo.t
xt/00_local_perlcritic.t
xt/00_local_pod-coverage.t
xt/00_local_pod.t
xt/00_local_prereq.t
xt/00_local_spelling.t
xt/00_local_versionsync.t
xt/10_remote_snmplabs.t
xt/21_run.t
xt/lib/My/Test/Class.pm
xt/lib/Test/SNMP/Info.pm
xt/lib/Test/SNMP/Info/AdslLine.pm
xt/lib/Test/SNMP/Info/Aggregate.pm
xt/lib/Test/SNMP/Info/Airespace.pm
xt/lib/Test/SNMP/Info/AMAP.pm
xt/lib/Test/SNMP/Info/Bridge.pm
xt/lib/Test/SNMP/Info/CDP.pm
xt/lib/Test/SNMP/Info/CiscoAgg.pm
xt/lib/Test/SNMP/Info/CiscoConfig.pm
xt/lib/Test/SNMP/Info/CiscoPortSecurity.pm
xt/lib/Test/SNMP/Info/CiscoPower.pm
xt/lib/Test/SNMP/Info/CiscoQOS.pm
xt/lib/Test/SNMP/Info/CiscoRTT.pm
xt/lib/Test/SNMP/Info/CiscoStats.pm
xt/lib/Test/SNMP/Info/CiscoStpExtensions.pm
xt/lib/Test/SNMP/Info/CiscoVTP.pm
xt/lib/Test/SNMP/Info/EDP.pm
xt/lib/Test/SNMP/Info/Entity.pm
xt/lib/Test/SNMP/Info/EtherLike.pm
xt/lib/Test/SNMP/Info/FDP.pm
xt/lib/Test/SNMP/Info/IEEE802dot11.pm
xt/lib/Test/SNMP/Info/IEEE802dot3ad.pm
xt/lib/Test/SNMP/Info/IPv6.pm
xt/lib/Test/SNMP/Info/Layer1.pm
xt/lib/Test/SNMP/Info/Layer1/Allied.pm
xt/lib/Test/SNMP/Info/Layer1/Asante.pm
xt/lib/Test/SNMP/Info/Layer1/Bayhub.pm
xt/lib/Test/SNMP/Info/Layer1/Cyclades.pm
xt/lib/Test/SNMP/Info/Layer1/S3000.pm
xt/lib/Test/SNMP/Info/Layer2.pm
xt/lib/Test/SNMP/Info/Layer2/3Com.pm
xt/lib/Test/SNMP/Info/Layer2/Aerohive.pm
xt/lib/Test/SNMP/Info/Layer2/Airespace.pm
xt/lib/Test/SNMP/Info/Layer2/Aironet.pm
xt/lib/Test/SNMP/Info/Layer2/Allied.pm
xt/lib/Test/SNMP/Info/Layer2/Atmedia.pm
xt/lib/Test/SNMP/Info/Layer2/Baystack.pm
xt/lib/Test/SNMP/Info/Layer2/C1900.pm
xt/lib/Test/SNMP/Info/Layer2/C2900.pm
xt/lib/Test/SNMP/Info/Layer2/Catalyst.pm
xt/lib/Test/SNMP/Info/Layer2/Centillion.pm
xt/lib/Test/SNMP/Info/Layer2/Cisco.pm
xt/lib/Test/SNMP/Info/Layer2/CiscoSB.pm
xt/lib/Test/SNMP/Info/Layer2/Exinda.pm
xt/lib/Test/SNMP/Info/Layer2/HP.pm
xt/lib/Test/SNMP/Info/Layer2/HP4000.pm
xt/lib/Test/SNMP/Info/Layer2/HPVC.pm
xt/lib/Test/SNMP/Info/Layer2/Kentrox.pm
xt/lib/Test/SNMP/Info/Layer2/N2270.pm
xt/lib/Test/SNMP/Info/Layer2/NAP222x.pm
xt/lib/Test/SNMP/Info/Layer2/Netgear.pm
xt/lib/Test/SNMP/Info/Layer2/Nexans.pm
xt/lib/Test/SNMP/Info/Layer2/NWSS2300.pm
xt/lib/Test/SNMP/Info/Layer2/Orinoco.pm
xt/lib/Test/SNMP/Info/Layer2/Sixnet.pm
xt/lib/Test/SNMP/Info/Layer2/Trapeze.pm
xt/lib/Test/SNMP/Info/Layer2/Ubiquiti.pm
xt/lib/Test/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
xt/lib/Test/SNMP/Info/Layer3.pm
xt/lib/Test/SNMP/Info/Layer3/Aironet.pm
xt/lib/Test/SNMP/Info/Layer3/AlcatelLucent.pm
xt/lib/Test/SNMP/Info/Layer3/AlteonAD.pm
xt/lib/Test/SNMP/Info/Layer3/Altiga.pm
xt/lib/Test/SNMP/Info/Layer3/Arista.pm
xt/lib/Test/SNMP/Info/Layer3/Aruba.pm
xt/lib/Test/SNMP/Info/Layer3/BayRS.pm
xt/lib/Test/SNMP/Info/Layer3/BlueCoatSG.pm
xt/lib/Test/SNMP/Info/Layer3/C3550.pm
xt/lib/Test/SNMP/Info/Layer3/C4000.pm
xt/lib/Test/SNMP/Info/Layer3/C6500.pm
xt/lib/Test/SNMP/Info/Layer3/CheckPoint.pm
xt/lib/Test/SNMP/Info/Layer3/Cisco.pm
xt/lib/Test/SNMP/Info/Layer3/CiscoASA.pm
xt/lib/Test/SNMP/Info/Layer3/CiscoFWSM.pm
xt/lib/Test/SNMP/Info/Layer3/CiscoSwitch.pm
xt/lib/Test/SNMP/Info/Layer3/Contivity.pm
xt/lib/Test/SNMP/Info/Layer3/Cumulus.pm
xt/lib/Test/SNMP/Info/Layer3/Dell.pm
xt/lib/Test/SNMP/Info/Layer3/DLink.pm
xt/lib/Test/SNMP/Info/Layer3/Enterasys.pm
xt/lib/Test/SNMP/Info/Layer3/ERX.pm
xt/lib/Test/SNMP/Info/Layer3/Extreme.pm
xt/lib/Test/SNMP/Info/Layer3/F5.pm
xt/lib/Test/SNMP/Info/Layer3/Force10.pm
xt/lib/Test/SNMP/Info/Layer3/Fortinet.pm
xt/lib/Test/SNMP/Info/Layer3/Foundry.pm
xt/lib/Test/SNMP/Info/Layer3/Genua.pm
xt/lib/Test/SNMP/Info/Layer3/H3C.pm
xt/lib/Test/SNMP/Info/Layer3/HP9300.pm
xt/lib/Test/SNMP/Info/Layer3/Huawei.pm
xt/lib/Test/SNMP/Info/Layer3/IBMGbTor.pm
xt/lib/Test/SNMP/Info/Layer3/Juniper.pm
xt/lib/Test/SNMP/Info/Layer3/Lantronix.pm
xt/lib/Test/SNMP/Info/Layer3/Lenovo.pm
xt/lib/Test/SNMP/Info/Layer3/Microsoft.pm
xt/lib/Test/SNMP/Info/Layer3/Mikrotik.pm
xt/lib/Test/SNMP/Info/Layer3/N1600.pm
xt/lib/Test/SNMP/Info/Layer3/Netscreen.pm
xt/lib/Test/SNMP/Info/Layer3/NetSNMP.pm
xt/lib/Test/SNMP/Info/Layer3/Nexus.pm
xt/lib/Test/SNMP/Info/Layer3/OneAccess.pm
xt/lib/Test/SNMP/Info/Layer3/PacketFront.pm
xt/lib/Test/SNMP/Info/Layer3/PaloAlto.pm
xt/lib/Test/SNMP/Info/Layer3/Passport.pm
xt/lib/Test/SNMP/Info/Layer3/Pf.pm
xt/lib/Test/SNMP/Info/Layer3/Pica8.pm
xt/lib/Test/SNMP/Info/Layer3/Redlion.pm
xt/lib/Test/SNMP/Info/Layer3/Scalance.pm
xt/lib/Test/SNMP/Info/Layer3/SonicWALL.pm
xt/lib/Test/SNMP/Info/Layer3/Steelhead.pm
xt/lib/Test/SNMP/Info/Layer3/Sun.pm
xt/lib/Test/SNMP/Info/Layer3/Tasman.pm
xt/lib/Test/SNMP/Info/Layer3/Teltonika.pm
xt/lib/Test/SNMP/Info/Layer3/Timetra.pm
xt/lib/Test/SNMP/Info/Layer3/VMware.pm
xt/lib/Test/SNMP/Info/Layer3/VyOS.pm
xt/lib/Test/SNMP/Info/Layer7.pm
xt/lib/Test/SNMP/Info/Layer7/APC.pm
xt/lib/Test/SNMP/Info/Layer7/Arbor.pm
xt/lib/Test/SNMP/Info/Layer7/CiscoIPS.pm
xt/lib/Test/SNMP/Info/Layer7/Gigamon.pm
xt/lib/Test/SNMP/Info/Layer7/Liebert.pm
xt/lib/Test/SNMP/Info/Layer7/Neoteris.pm
xt/lib/Test/SNMP/Info/Layer7/Netscaler.pm
xt/lib/Test/SNMP/Info/LLDP.pm
xt/lib/Test/SNMP/Info/MAU.pm
xt/lib/Test/SNMP/Info/NortelStack.pm
xt/lib/Test/SNMP/Info/PowerEthernet.pm
xt/lib/Test/SNMP/Info/RapidCity.pm
xt/lib/Test/SNMP/Info/SONMP.pm

View File

@@ -1,25 +1,73 @@
# Version control files and dirs.
\.bak$
\.pid$
\.swp$
^SNMP-Info-
^MANIFEST\.
# Avoid version control files.
\bRCS\b
\bCVS\b
\bSCCS\b
,v$
\B\.svn\b
\B\.git\b
\B\.gitignore\b
\b_darcs\b
\B\.cvsignore$
# Makemaker generated files and dirs.
^MANIFEST\.
^Makefile$
^blib/
^MakeMaker-\d
# Avoid VMS specific MakeMaker generated files
\bDescrip.MMS$
\bDESCRIP.MMS$
\bdescrip.mms$
# Temp, old and emacs backup files.
# Avoid Makemaker generated and utility files.
\bMANIFEST\.bak
\bMakefile$
\bblib/
\bMakeMaker-\d
\bpm_to_blib\.ts$
\bpm_to_blib$
\bblibdirs\.ts$ # 6.18 through 6.25 generated this
# Avoid Module::Build generated and utility files.
\bBuild$
\b_build/
\bBuild.bat$
\bBuild.COM$
\bBUILD.COM$
\bbuild.com$
# Avoid temp and backup files.
~$
\.old$
^#.*#$
^\.#
\#$
\b\.#
\.bak$
\.tmp$
\.#
\.rej$
# Private Regression Tests
\d+_local_
\.?perl\w+\.?rc$
# Avoid OS-specific files/dirs
# Mac OSX metadata
\B\.DS_Store
# Mac OSX SMB mount metadata files
\B\._
# Komodo project file
\.kpf$
# Avoid Devel::Cover and Devel::CoverX::Covered files.
\bcover_db\b
\bcovered\b
# Avoid MYMETA files
^MYMETA\.
.github
.travis
README.md
# Avoid Komodo project file
\.komodoproject$
# ignore intellij
\B\.idea

624
META.json Normal file
View File

@@ -0,0 +1,624 @@
{
"abstract" : "OO Interface to Network devices and MIBs through SNMP",
"author" : [
"Eric A. Miller <emiller@cpan.org>"
],
"dynamic_config" : 1,
"generated_by" : "Module::Build version 0.4231",
"license" : [
"bsd"
],
"meta-spec" : {
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
"version" : 2
},
"name" : "SNMP-Info",
"prereqs" : {
"configure" : {
"requires" : {
"Module::Build" : "0.42"
}
},
"runtime" : {
"recommends" : {
"Class::ISA" : "0",
"File::Slurp" : "0",
"Module::Info" : "0",
"Module::Load" : "0",
"PPI" : "0"
},
"requires" : {
"Math::BigInt" : "0",
"NetAddr::IP" : "4.068",
"SNMP" : "0"
}
},
"test" : {
"requires" : {
"Class::Inspector" : "0",
"File::Find" : "0",
"File::Slurper" : "0",
"Hook::LexWrap" : "0",
"Module::Find" : "0",
"NetSNMP::default_store" : "0",
"Path::Class" : "0",
"Test::Class::Most" : "0",
"Test::Distribution" : "0",
"Test::Exception" : "0.43",
"Test::MockObject::Extends" : "0",
"Test::More" : "0.88"
}
}
},
"provides" : {
"SNMP::Info" : {
"file" : "lib/SNMP/Info.pm",
"version" : "3.73"
},
"SNMP::Info::AMAP" : {
"file" : "lib/SNMP/Info/AMAP.pm",
"version" : "3.73"
},
"SNMP::Info::AdslLine" : {
"file" : "lib/SNMP/Info/AdslLine.pm",
"version" : "3.73"
},
"SNMP::Info::Aggregate" : {
"file" : "lib/SNMP/Info/Aggregate.pm",
"version" : "3.73"
},
"SNMP::Info::Airespace" : {
"file" : "lib/SNMP/Info/Airespace.pm",
"version" : "3.73"
},
"SNMP::Info::Bridge" : {
"file" : "lib/SNMP/Info/Bridge.pm",
"version" : "3.73"
},
"SNMP::Info::CDP" : {
"file" : "lib/SNMP/Info/CDP.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoAgg" : {
"file" : "lib/SNMP/Info/CiscoAgg.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoConfig" : {
"file" : "lib/SNMP/Info/CiscoConfig.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoPortSecurity" : {
"file" : "lib/SNMP/Info/CiscoPortSecurity.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoPower" : {
"file" : "lib/SNMP/Info/CiscoPower.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoQOS" : {
"file" : "lib/SNMP/Info/CiscoQOS.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoRTT" : {
"file" : "lib/SNMP/Info/CiscoRTT.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoStack" : {
"file" : "lib/SNMP/Info/CiscoStack.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoStats" : {
"file" : "lib/SNMP/Info/CiscoStats.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoStpExtensions" : {
"file" : "lib/SNMP/Info/CiscoStpExtensions.pm",
"version" : "3.73"
},
"SNMP::Info::CiscoVTP" : {
"file" : "lib/SNMP/Info/CiscoVTP.pm",
"version" : "3.73"
},
"SNMP::Info::DocsisCM" : {
"file" : "lib/SNMP/Info/DocsisCM.pm",
"version" : "3.73"
},
"SNMP::Info::DocsisHE" : {
"file" : "lib/SNMP/Info/DocsisHE.pm",
"version" : "3.73"
},
"SNMP::Info::EDP" : {
"file" : "lib/SNMP/Info/EDP.pm",
"version" : "3.73"
},
"SNMP::Info::Entity" : {
"file" : "lib/SNMP/Info/Entity.pm",
"version" : "3.73"
},
"SNMP::Info::EtherLike" : {
"file" : "lib/SNMP/Info/EtherLike.pm",
"version" : "3.73"
},
"SNMP::Info::FDP" : {
"file" : "lib/SNMP/Info/FDP.pm",
"version" : "3.73"
},
"SNMP::Info::IEEE802_Bridge" : {
"file" : "lib/SNMP/Info/IEEE802_Bridge.pm",
"version" : "3.73"
},
"SNMP::Info::IEEE802dot11" : {
"file" : "lib/SNMP/Info/IEEE802dot11.pm",
"version" : "3.73"
},
"SNMP::Info::IEEE802dot3ad" : {
"file" : "lib/SNMP/Info/IEEE802dot3ad.pm",
"version" : "3.73"
},
"SNMP::Info::IPv6" : {
"file" : "lib/SNMP/Info/IPv6.pm",
"version" : "3.73"
},
"SNMP::Info::LLDP" : {
"file" : "lib/SNMP/Info/LLDP.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1" : {
"file" : "lib/SNMP/Info/Layer1.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1::Allied" : {
"file" : "lib/SNMP/Info/Layer1/Allied.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1::Asante" : {
"file" : "lib/SNMP/Info/Layer1/Asante.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1::Bayhub" : {
"file" : "lib/SNMP/Info/Layer1/Bayhub.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1::Cyclades" : {
"file" : "lib/SNMP/Info/Layer1/Cyclades.pm",
"version" : "3.73"
},
"SNMP::Info::Layer1::S3000" : {
"file" : "lib/SNMP/Info/Layer1/S3000.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2" : {
"file" : "lib/SNMP/Info/Layer2.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::3Com" : {
"file" : "lib/SNMP/Info/Layer2/3Com.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Adtran" : {
"file" : "lib/SNMP/Info/Layer2/Adtran.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Aerohive" : {
"file" : "lib/SNMP/Info/Layer2/Aerohive.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Airespace" : {
"file" : "lib/SNMP/Info/Layer2/Airespace.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Aironet" : {
"file" : "lib/SNMP/Info/Layer2/Aironet.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Allied" : {
"file" : "lib/SNMP/Info/Layer2/Allied.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Atmedia" : {
"file" : "lib/SNMP/Info/Layer2/Atmedia.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Baystack" : {
"file" : "lib/SNMP/Info/Layer2/Baystack.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::C1900" : {
"file" : "lib/SNMP/Info/Layer2/C1900.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::C2900" : {
"file" : "lib/SNMP/Info/Layer2/C2900.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Catalyst" : {
"file" : "lib/SNMP/Info/Layer2/Catalyst.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Centillion" : {
"file" : "lib/SNMP/Info/Layer2/Centillion.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Cisco" : {
"file" : "lib/SNMP/Info/Layer2/Cisco.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::CiscoSB" : {
"file" : "lib/SNMP/Info/Layer2/CiscoSB.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Exinda" : {
"file" : "lib/SNMP/Info/Layer2/Exinda.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::HP" : {
"file" : "lib/SNMP/Info/Layer2/HP.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::HP4000" : {
"file" : "lib/SNMP/Info/Layer2/HP4000.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::HPVC" : {
"file" : "lib/SNMP/Info/Layer2/HPVC.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Kentrox" : {
"file" : "lib/SNMP/Info/Layer2/Kentrox.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::N2270" : {
"file" : "lib/SNMP/Info/Layer2/N2270.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::NAP222x" : {
"file" : "lib/SNMP/Info/Layer2/NAP222x.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::NWSS2300" : {
"file" : "lib/SNMP/Info/Layer2/NWSS2300.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Netgear" : {
"file" : "lib/SNMP/Info/Layer2/Netgear.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Nexans" : {
"file" : "lib/SNMP/Info/Layer2/Nexans.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Orinoco" : {
"file" : "lib/SNMP/Info/Layer2/Orinoco.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Sixnet" : {
"file" : "lib/SNMP/Info/Layer2/Sixnet.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Trapeze" : {
"file" : "lib/SNMP/Info/Layer2/Trapeze.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::Ubiquiti" : {
"file" : "lib/SNMP/Info/Layer2/Ubiquiti.pm",
"version" : "3.73"
},
"SNMP::Info::Layer2::ZyXEL_DSLAM" : {
"file" : "lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3" : {
"file" : "lib/SNMP/Info/Layer3.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Aironet" : {
"file" : "lib/SNMP/Info/Layer3/Aironet.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::AlcatelLucent" : {
"file" : "lib/SNMP/Info/Layer3/AlcatelLucent.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::AlteonAD" : {
"file" : "lib/SNMP/Info/Layer3/AlteonAD.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Altiga" : {
"file" : "lib/SNMP/Info/Layer3/Altiga.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Arista" : {
"file" : "lib/SNMP/Info/Layer3/Arista.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Aruba" : {
"file" : "lib/SNMP/Info/Layer3/Aruba.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::ArubaCX" : {
"file" : "lib/SNMP/Info/Layer3/ArubaCX.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::BayRS" : {
"file" : "lib/SNMP/Info/Layer3/BayRS.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::BlueCoatSG" : {
"file" : "lib/SNMP/Info/Layer3/BlueCoatSG.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::C3550" : {
"file" : "lib/SNMP/Info/Layer3/C3550.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::C4000" : {
"file" : "lib/SNMP/Info/Layer3/C4000.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::C6500" : {
"file" : "lib/SNMP/Info/Layer3/C6500.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::CheckPoint" : {
"file" : "lib/SNMP/Info/Layer3/CheckPoint.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Ciena" : {
"file" : "lib/SNMP/Info/Layer3/Ciena.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Cisco" : {
"file" : "lib/SNMP/Info/Layer3/Cisco.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::CiscoASA" : {
"file" : "lib/SNMP/Info/Layer3/CiscoASA.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::CiscoFWSM" : {
"file" : "lib/SNMP/Info/Layer3/CiscoFWSM.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::CiscoSwitch" : {
"file" : "lib/SNMP/Info/Layer3/CiscoSwitch.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Contivity" : {
"file" : "lib/SNMP/Info/Layer3/Contivity.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Cumulus" : {
"file" : "lib/SNMP/Info/Layer3/Cumulus.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::DLink" : {
"file" : "lib/SNMP/Info/Layer3/DLink.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Dell" : {
"file" : "lib/SNMP/Info/Layer3/Dell.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::ERX" : {
"file" : "lib/SNMP/Info/Layer3/ERX.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Enterasys" : {
"file" : "lib/SNMP/Info/Layer3/Enterasys.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Extreme" : {
"file" : "lib/SNMP/Info/Layer3/Extreme.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::F5" : {
"file" : "lib/SNMP/Info/Layer3/F5.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Force10" : {
"file" : "lib/SNMP/Info/Layer3/Force10.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Fortinet" : {
"file" : "lib/SNMP/Info/Layer3/Fortinet.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Foundry" : {
"file" : "lib/SNMP/Info/Layer3/Foundry.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Genua" : {
"file" : "lib/SNMP/Info/Layer3/Genua.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::H3C" : {
"file" : "lib/SNMP/Info/Layer3/H3C.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::HP9300" : {
"file" : "lib/SNMP/Info/Layer3/HP9300.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Huawei" : {
"file" : "lib/SNMP/Info/Layer3/Huawei.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::IBMGbTor" : {
"file" : "lib/SNMP/Info/Layer3/IBMGbTor.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Juniper" : {
"file" : "lib/SNMP/Info/Layer3/Juniper.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Lantronix" : {
"file" : "lib/SNMP/Info/Layer3/Lantronix.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Lenovo" : {
"file" : "lib/SNMP/Info/Layer3/Lenovo.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Microsoft" : {
"file" : "lib/SNMP/Info/Layer3/Microsoft.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Mikrotik" : {
"file" : "lib/SNMP/Info/Layer3/Mikrotik.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::N1600" : {
"file" : "lib/SNMP/Info/Layer3/N1600.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::NetSNMP" : {
"file" : "lib/SNMP/Info/Layer3/NetSNMP.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Netscreen" : {
"file" : "lib/SNMP/Info/Layer3/Netscreen.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Nexus" : {
"file" : "lib/SNMP/Info/Layer3/Nexus.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::OneAccess" : {
"file" : "lib/SNMP/Info/Layer3/OneAccess.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::PacketFront" : {
"file" : "lib/SNMP/Info/Layer3/PacketFront.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::PaloAlto" : {
"file" : "lib/SNMP/Info/Layer3/PaloAlto.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Passport" : {
"file" : "lib/SNMP/Info/Layer3/Passport.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Pf" : {
"file" : "lib/SNMP/Info/Layer3/Pf.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Pica8" : {
"file" : "lib/SNMP/Info/Layer3/Pica8.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Redlion" : {
"file" : "lib/SNMP/Info/Layer3/Redlion.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Scalance" : {
"file" : "lib/SNMP/Info/Layer3/Scalance.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::SonicWALL" : {
"file" : "lib/SNMP/Info/Layer3/SonicWALL.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Steelhead" : {
"file" : "lib/SNMP/Info/Layer3/Steelhead.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Sun" : {
"file" : "lib/SNMP/Info/Layer3/Sun.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Tasman" : {
"file" : "lib/SNMP/Info/Layer3/Tasman.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Teltonika" : {
"file" : "lib/SNMP/Info/Layer3/Teltonika.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::Timetra" : {
"file" : "lib/SNMP/Info/Layer3/Timetra.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::VMware" : {
"file" : "lib/SNMP/Info/Layer3/VMware.pm",
"version" : "3.73"
},
"SNMP::Info::Layer3::VyOS" : {
"file" : "lib/SNMP/Info/Layer3/VyOS.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7" : {
"file" : "lib/SNMP/Info/Layer7.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::APC" : {
"file" : "lib/SNMP/Info/Layer7/APC.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::Arbor" : {
"file" : "lib/SNMP/Info/Layer7/Arbor.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::CiscoIPS" : {
"file" : "lib/SNMP/Info/Layer7/CiscoIPS.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::Gigamon" : {
"file" : "lib/SNMP/Info/Layer7/Gigamon.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::Liebert" : {
"file" : "lib/SNMP/Info/Layer7/Liebert.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::Neoteris" : {
"file" : "lib/SNMP/Info/Layer7/Neoteris.pm",
"version" : "3.73"
},
"SNMP::Info::Layer7::Netscaler" : {
"file" : "lib/SNMP/Info/Layer7/Netscaler.pm",
"version" : "3.73"
},
"SNMP::Info::MAU" : {
"file" : "lib/SNMP/Info/MAU.pm",
"version" : "3.73"
},
"SNMP::Info::MRO" : {
"file" : "lib/SNMP/Info/MRO.pm",
"version" : "3.73"
},
"SNMP::Info::NortelStack" : {
"file" : "lib/SNMP/Info/NortelStack.pm",
"version" : "3.73"
},
"SNMP::Info::PowerEthernet" : {
"file" : "lib/SNMP/Info/PowerEthernet.pm",
"version" : "3.73"
},
"SNMP::Info::RapidCity" : {
"file" : "lib/SNMP/Info/RapidCity.pm",
"version" : "3.73"
},
"SNMP::Info::SONMP" : {
"file" : "lib/SNMP/Info/SONMP.pm",
"version" : "3.73"
}
},
"release_status" : "stable",
"resources" : {
"bugtracker" : {
"web" : "https://github.com/netdisco/snmp-info/issues"
},
"homepage" : "http://netdisco.org/",
"license" : [
"http://opensource.org/licenses/bsd-license.php"
],
"repository" : {
"url" : "https://github.com/netdisco/snmp-info"
},
"x_IRC" : "irc://irc.libera.chat/#netdisco",
"x_MailingList" : "https://lists.sourceforge.net/lists/listinfo/snmp-info-users"
},
"version" : "3.73",
"x_serialization_backend" : "JSON::PP version 4.06"
}

460
META.yml Normal file
View File

@@ -0,0 +1,460 @@
---
abstract: 'OO Interface to Network devices and MIBs through SNMP'
author:
- 'Eric A. Miller <emiller@cpan.org>'
build_requires:
Class::Inspector: '0'
File::Find: '0'
File::Slurper: '0'
Hook::LexWrap: '0'
Module::Find: '0'
NetSNMP::default_store: '0'
Path::Class: '0'
Test::Class::Most: '0'
Test::Distribution: '0'
Test::Exception: '0.43'
Test::MockObject::Extends: '0'
Test::More: '0.88'
configure_requires:
Module::Build: '0.42'
dynamic_config: 1
generated_by: 'Module::Build version 0.4231, CPAN::Meta::Converter version 2.150010'
license: bsd
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: '1.4'
name: SNMP-Info
provides:
SNMP::Info:
file: lib/SNMP/Info.pm
version: '3.73'
SNMP::Info::AMAP:
file: lib/SNMP/Info/AMAP.pm
version: '3.73'
SNMP::Info::AdslLine:
file: lib/SNMP/Info/AdslLine.pm
version: '3.73'
SNMP::Info::Aggregate:
file: lib/SNMP/Info/Aggregate.pm
version: '3.73'
SNMP::Info::Airespace:
file: lib/SNMP/Info/Airespace.pm
version: '3.73'
SNMP::Info::Bridge:
file: lib/SNMP/Info/Bridge.pm
version: '3.73'
SNMP::Info::CDP:
file: lib/SNMP/Info/CDP.pm
version: '3.73'
SNMP::Info::CiscoAgg:
file: lib/SNMP/Info/CiscoAgg.pm
version: '3.73'
SNMP::Info::CiscoConfig:
file: lib/SNMP/Info/CiscoConfig.pm
version: '3.73'
SNMP::Info::CiscoPortSecurity:
file: lib/SNMP/Info/CiscoPortSecurity.pm
version: '3.73'
SNMP::Info::CiscoPower:
file: lib/SNMP/Info/CiscoPower.pm
version: '3.73'
SNMP::Info::CiscoQOS:
file: lib/SNMP/Info/CiscoQOS.pm
version: '3.73'
SNMP::Info::CiscoRTT:
file: lib/SNMP/Info/CiscoRTT.pm
version: '3.73'
SNMP::Info::CiscoStack:
file: lib/SNMP/Info/CiscoStack.pm
version: '3.73'
SNMP::Info::CiscoStats:
file: lib/SNMP/Info/CiscoStats.pm
version: '3.73'
SNMP::Info::CiscoStpExtensions:
file: lib/SNMP/Info/CiscoStpExtensions.pm
version: '3.73'
SNMP::Info::CiscoVTP:
file: lib/SNMP/Info/CiscoVTP.pm
version: '3.73'
SNMP::Info::DocsisCM:
file: lib/SNMP/Info/DocsisCM.pm
version: '3.73'
SNMP::Info::DocsisHE:
file: lib/SNMP/Info/DocsisHE.pm
version: '3.73'
SNMP::Info::EDP:
file: lib/SNMP/Info/EDP.pm
version: '3.73'
SNMP::Info::Entity:
file: lib/SNMP/Info/Entity.pm
version: '3.73'
SNMP::Info::EtherLike:
file: lib/SNMP/Info/EtherLike.pm
version: '3.73'
SNMP::Info::FDP:
file: lib/SNMP/Info/FDP.pm
version: '3.73'
SNMP::Info::IEEE802_Bridge:
file: lib/SNMP/Info/IEEE802_Bridge.pm
version: '3.73'
SNMP::Info::IEEE802dot11:
file: lib/SNMP/Info/IEEE802dot11.pm
version: '3.73'
SNMP::Info::IEEE802dot3ad:
file: lib/SNMP/Info/IEEE802dot3ad.pm
version: '3.73'
SNMP::Info::IPv6:
file: lib/SNMP/Info/IPv6.pm
version: '3.73'
SNMP::Info::LLDP:
file: lib/SNMP/Info/LLDP.pm
version: '3.73'
SNMP::Info::Layer1:
file: lib/SNMP/Info/Layer1.pm
version: '3.73'
SNMP::Info::Layer1::Allied:
file: lib/SNMP/Info/Layer1/Allied.pm
version: '3.73'
SNMP::Info::Layer1::Asante:
file: lib/SNMP/Info/Layer1/Asante.pm
version: '3.73'
SNMP::Info::Layer1::Bayhub:
file: lib/SNMP/Info/Layer1/Bayhub.pm
version: '3.73'
SNMP::Info::Layer1::Cyclades:
file: lib/SNMP/Info/Layer1/Cyclades.pm
version: '3.73'
SNMP::Info::Layer1::S3000:
file: lib/SNMP/Info/Layer1/S3000.pm
version: '3.73'
SNMP::Info::Layer2:
file: lib/SNMP/Info/Layer2.pm
version: '3.73'
SNMP::Info::Layer2::3Com:
file: lib/SNMP/Info/Layer2/3Com.pm
version: '3.73'
SNMP::Info::Layer2::Adtran:
file: lib/SNMP/Info/Layer2/Adtran.pm
version: '3.73'
SNMP::Info::Layer2::Aerohive:
file: lib/SNMP/Info/Layer2/Aerohive.pm
version: '3.73'
SNMP::Info::Layer2::Airespace:
file: lib/SNMP/Info/Layer2/Airespace.pm
version: '3.73'
SNMP::Info::Layer2::Aironet:
file: lib/SNMP/Info/Layer2/Aironet.pm
version: '3.73'
SNMP::Info::Layer2::Allied:
file: lib/SNMP/Info/Layer2/Allied.pm
version: '3.73'
SNMP::Info::Layer2::Atmedia:
file: lib/SNMP/Info/Layer2/Atmedia.pm
version: '3.73'
SNMP::Info::Layer2::Baystack:
file: lib/SNMP/Info/Layer2/Baystack.pm
version: '3.73'
SNMP::Info::Layer2::C1900:
file: lib/SNMP/Info/Layer2/C1900.pm
version: '3.73'
SNMP::Info::Layer2::C2900:
file: lib/SNMP/Info/Layer2/C2900.pm
version: '3.73'
SNMP::Info::Layer2::Catalyst:
file: lib/SNMP/Info/Layer2/Catalyst.pm
version: '3.73'
SNMP::Info::Layer2::Centillion:
file: lib/SNMP/Info/Layer2/Centillion.pm
version: '3.73'
SNMP::Info::Layer2::Cisco:
file: lib/SNMP/Info/Layer2/Cisco.pm
version: '3.73'
SNMP::Info::Layer2::CiscoSB:
file: lib/SNMP/Info/Layer2/CiscoSB.pm
version: '3.73'
SNMP::Info::Layer2::Exinda:
file: lib/SNMP/Info/Layer2/Exinda.pm
version: '3.73'
SNMP::Info::Layer2::HP:
file: lib/SNMP/Info/Layer2/HP.pm
version: '3.73'
SNMP::Info::Layer2::HP4000:
file: lib/SNMP/Info/Layer2/HP4000.pm
version: '3.73'
SNMP::Info::Layer2::HPVC:
file: lib/SNMP/Info/Layer2/HPVC.pm
version: '3.73'
SNMP::Info::Layer2::Kentrox:
file: lib/SNMP/Info/Layer2/Kentrox.pm
version: '3.73'
SNMP::Info::Layer2::N2270:
file: lib/SNMP/Info/Layer2/N2270.pm
version: '3.73'
SNMP::Info::Layer2::NAP222x:
file: lib/SNMP/Info/Layer2/NAP222x.pm
version: '3.73'
SNMP::Info::Layer2::NWSS2300:
file: lib/SNMP/Info/Layer2/NWSS2300.pm
version: '3.73'
SNMP::Info::Layer2::Netgear:
file: lib/SNMP/Info/Layer2/Netgear.pm
version: '3.73'
SNMP::Info::Layer2::Nexans:
file: lib/SNMP/Info/Layer2/Nexans.pm
version: '3.73'
SNMP::Info::Layer2::Orinoco:
file: lib/SNMP/Info/Layer2/Orinoco.pm
version: '3.73'
SNMP::Info::Layer2::Sixnet:
file: lib/SNMP/Info/Layer2/Sixnet.pm
version: '3.73'
SNMP::Info::Layer2::Trapeze:
file: lib/SNMP/Info/Layer2/Trapeze.pm
version: '3.73'
SNMP::Info::Layer2::Ubiquiti:
file: lib/SNMP/Info/Layer2/Ubiquiti.pm
version: '3.73'
SNMP::Info::Layer2::ZyXEL_DSLAM:
file: lib/SNMP/Info/Layer2/ZyXEL_DSLAM.pm
version: '3.73'
SNMP::Info::Layer3:
file: lib/SNMP/Info/Layer3.pm
version: '3.73'
SNMP::Info::Layer3::Aironet:
file: lib/SNMP/Info/Layer3/Aironet.pm
version: '3.73'
SNMP::Info::Layer3::AlcatelLucent:
file: lib/SNMP/Info/Layer3/AlcatelLucent.pm
version: '3.73'
SNMP::Info::Layer3::AlteonAD:
file: lib/SNMP/Info/Layer3/AlteonAD.pm
version: '3.73'
SNMP::Info::Layer3::Altiga:
file: lib/SNMP/Info/Layer3/Altiga.pm
version: '3.73'
SNMP::Info::Layer3::Arista:
file: lib/SNMP/Info/Layer3/Arista.pm
version: '3.73'
SNMP::Info::Layer3::Aruba:
file: lib/SNMP/Info/Layer3/Aruba.pm
version: '3.73'
SNMP::Info::Layer3::ArubaCX:
file: lib/SNMP/Info/Layer3/ArubaCX.pm
version: '3.73'
SNMP::Info::Layer3::BayRS:
file: lib/SNMP/Info/Layer3/BayRS.pm
version: '3.73'
SNMP::Info::Layer3::BlueCoatSG:
file: lib/SNMP/Info/Layer3/BlueCoatSG.pm
version: '3.73'
SNMP::Info::Layer3::C3550:
file: lib/SNMP/Info/Layer3/C3550.pm
version: '3.73'
SNMP::Info::Layer3::C4000:
file: lib/SNMP/Info/Layer3/C4000.pm
version: '3.73'
SNMP::Info::Layer3::C6500:
file: lib/SNMP/Info/Layer3/C6500.pm
version: '3.73'
SNMP::Info::Layer3::CheckPoint:
file: lib/SNMP/Info/Layer3/CheckPoint.pm
version: '3.73'
SNMP::Info::Layer3::Ciena:
file: lib/SNMP/Info/Layer3/Ciena.pm
version: '3.73'
SNMP::Info::Layer3::Cisco:
file: lib/SNMP/Info/Layer3/Cisco.pm
version: '3.73'
SNMP::Info::Layer3::CiscoASA:
file: lib/SNMP/Info/Layer3/CiscoASA.pm
version: '3.73'
SNMP::Info::Layer3::CiscoFWSM:
file: lib/SNMP/Info/Layer3/CiscoFWSM.pm
version: '3.73'
SNMP::Info::Layer3::CiscoSwitch:
file: lib/SNMP/Info/Layer3/CiscoSwitch.pm
version: '3.73'
SNMP::Info::Layer3::Contivity:
file: lib/SNMP/Info/Layer3/Contivity.pm
version: '3.73'
SNMP::Info::Layer3::Cumulus:
file: lib/SNMP/Info/Layer3/Cumulus.pm
version: '3.73'
SNMP::Info::Layer3::DLink:
file: lib/SNMP/Info/Layer3/DLink.pm
version: '3.73'
SNMP::Info::Layer3::Dell:
file: lib/SNMP/Info/Layer3/Dell.pm
version: '3.73'
SNMP::Info::Layer3::ERX:
file: lib/SNMP/Info/Layer3/ERX.pm
version: '3.73'
SNMP::Info::Layer3::Enterasys:
file: lib/SNMP/Info/Layer3/Enterasys.pm
version: '3.73'
SNMP::Info::Layer3::Extreme:
file: lib/SNMP/Info/Layer3/Extreme.pm
version: '3.73'
SNMP::Info::Layer3::F5:
file: lib/SNMP/Info/Layer3/F5.pm
version: '3.73'
SNMP::Info::Layer3::Force10:
file: lib/SNMP/Info/Layer3/Force10.pm
version: '3.73'
SNMP::Info::Layer3::Fortinet:
file: lib/SNMP/Info/Layer3/Fortinet.pm
version: '3.73'
SNMP::Info::Layer3::Foundry:
file: lib/SNMP/Info/Layer3/Foundry.pm
version: '3.73'
SNMP::Info::Layer3::Genua:
file: lib/SNMP/Info/Layer3/Genua.pm
version: '3.73'
SNMP::Info::Layer3::H3C:
file: lib/SNMP/Info/Layer3/H3C.pm
version: '3.73'
SNMP::Info::Layer3::HP9300:
file: lib/SNMP/Info/Layer3/HP9300.pm
version: '3.73'
SNMP::Info::Layer3::Huawei:
file: lib/SNMP/Info/Layer3/Huawei.pm
version: '3.73'
SNMP::Info::Layer3::IBMGbTor:
file: lib/SNMP/Info/Layer3/IBMGbTor.pm
version: '3.73'
SNMP::Info::Layer3::Juniper:
file: lib/SNMP/Info/Layer3/Juniper.pm
version: '3.73'
SNMP::Info::Layer3::Lantronix:
file: lib/SNMP/Info/Layer3/Lantronix.pm
version: '3.73'
SNMP::Info::Layer3::Lenovo:
file: lib/SNMP/Info/Layer3/Lenovo.pm
version: '3.73'
SNMP::Info::Layer3::Microsoft:
file: lib/SNMP/Info/Layer3/Microsoft.pm
version: '3.73'
SNMP::Info::Layer3::Mikrotik:
file: lib/SNMP/Info/Layer3/Mikrotik.pm
version: '3.73'
SNMP::Info::Layer3::N1600:
file: lib/SNMP/Info/Layer3/N1600.pm
version: '3.73'
SNMP::Info::Layer3::NetSNMP:
file: lib/SNMP/Info/Layer3/NetSNMP.pm
version: '3.73'
SNMP::Info::Layer3::Netscreen:
file: lib/SNMP/Info/Layer3/Netscreen.pm
version: '3.73'
SNMP::Info::Layer3::Nexus:
file: lib/SNMP/Info/Layer3/Nexus.pm
version: '3.73'
SNMP::Info::Layer3::OneAccess:
file: lib/SNMP/Info/Layer3/OneAccess.pm
version: '3.73'
SNMP::Info::Layer3::PacketFront:
file: lib/SNMP/Info/Layer3/PacketFront.pm
version: '3.73'
SNMP::Info::Layer3::PaloAlto:
file: lib/SNMP/Info/Layer3/PaloAlto.pm
version: '3.73'
SNMP::Info::Layer3::Passport:
file: lib/SNMP/Info/Layer3/Passport.pm
version: '3.73'
SNMP::Info::Layer3::Pf:
file: lib/SNMP/Info/Layer3/Pf.pm
version: '3.73'
SNMP::Info::Layer3::Pica8:
file: lib/SNMP/Info/Layer3/Pica8.pm
version: '3.73'
SNMP::Info::Layer3::Redlion:
file: lib/SNMP/Info/Layer3/Redlion.pm
version: '3.73'
SNMP::Info::Layer3::Scalance:
file: lib/SNMP/Info/Layer3/Scalance.pm
version: '3.73'
SNMP::Info::Layer3::SonicWALL:
file: lib/SNMP/Info/Layer3/SonicWALL.pm
version: '3.73'
SNMP::Info::Layer3::Steelhead:
file: lib/SNMP/Info/Layer3/Steelhead.pm
version: '3.73'
SNMP::Info::Layer3::Sun:
file: lib/SNMP/Info/Layer3/Sun.pm
version: '3.73'
SNMP::Info::Layer3::Tasman:
file: lib/SNMP/Info/Layer3/Tasman.pm
version: '3.73'
SNMP::Info::Layer3::Teltonika:
file: lib/SNMP/Info/Layer3/Teltonika.pm
version: '3.73'
SNMP::Info::Layer3::Timetra:
file: lib/SNMP/Info/Layer3/Timetra.pm
version: '3.73'
SNMP::Info::Layer3::VMware:
file: lib/SNMP/Info/Layer3/VMware.pm
version: '3.73'
SNMP::Info::Layer3::VyOS:
file: lib/SNMP/Info/Layer3/VyOS.pm
version: '3.73'
SNMP::Info::Layer7:
file: lib/SNMP/Info/Layer7.pm
version: '3.73'
SNMP::Info::Layer7::APC:
file: lib/SNMP/Info/Layer7/APC.pm
version: '3.73'
SNMP::Info::Layer7::Arbor:
file: lib/SNMP/Info/Layer7/Arbor.pm
version: '3.73'
SNMP::Info::Layer7::CiscoIPS:
file: lib/SNMP/Info/Layer7/CiscoIPS.pm
version: '3.73'
SNMP::Info::Layer7::Gigamon:
file: lib/SNMP/Info/Layer7/Gigamon.pm
version: '3.73'
SNMP::Info::Layer7::Liebert:
file: lib/SNMP/Info/Layer7/Liebert.pm
version: '3.73'
SNMP::Info::Layer7::Neoteris:
file: lib/SNMP/Info/Layer7/Neoteris.pm
version: '3.73'
SNMP::Info::Layer7::Netscaler:
file: lib/SNMP/Info/Layer7/Netscaler.pm
version: '3.73'
SNMP::Info::MAU:
file: lib/SNMP/Info/MAU.pm
version: '3.73'
SNMP::Info::MRO:
file: lib/SNMP/Info/MRO.pm
version: '3.73'
SNMP::Info::NortelStack:
file: lib/SNMP/Info/NortelStack.pm
version: '3.73'
SNMP::Info::PowerEthernet:
file: lib/SNMP/Info/PowerEthernet.pm
version: '3.73'
SNMP::Info::RapidCity:
file: lib/SNMP/Info/RapidCity.pm
version: '3.73'
SNMP::Info::SONMP:
file: lib/SNMP/Info/SONMP.pm
version: '3.73'
recommends:
Class::ISA: '0'
File::Slurp: '0'
Module::Info: '0'
Module::Load: '0'
PPI: '0'
requires:
Math::BigInt: '0'
NetAddr::IP: '4.068'
SNMP: '0'
resources:
IRC: irc://irc.libera.chat/#netdisco
MailingList: https://lists.sourceforge.net/lists/listinfo/snmp-info-users
bugtracker: https://github.com/netdisco/snmp-info/issues
homepage: http://netdisco.org/
license: http://opensource.org/licenses/bsd-license.php
repository: https://github.com/netdisco/snmp-info
version: '3.73'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

View File

@@ -1,39 +0,0 @@
# Module makefile for SNMP::Info (using ExtUtils::MakeMaker)
# $Id$
require 5.006;
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";
}

858
README

File diff suppressed because it is too large Load Diff

View File

@@ -4,26 +4,30 @@ 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
Release and Testing Instructions:
- for netdisco see:
-> https://github.com/netdisco/netdisco/wiki/Developing
-> https://metacpan.org/pod/App::Netdisco
- for snmp::info see:
-> https://github.com/netdisco/snmp-info/wiki/Release-Process
-> https://metacpan.org/pod/SNMP::Info#EXTENDING-SNMP::INFO
- for netdisco-mibs see:
-> https://github.com/netdisco/netdisco-mibs/wiki
FAQ:
- Do I have to update the version number and timestamp in modified files before committing?
- 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 ().
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".
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

@@ -28,7 +28,7 @@ if ($@) {
} else {
$graph{$vendor}->{$family}=[];
}
}
}
my $now = scalar localtime;
@@ -83,7 +83,7 @@ foreach my $vendor (sort sort_nocase keys %$matrix){
} elsif (defined $vendor_defaults->{$a}){
$val = $vendor_defaults->{$a};
$class = 'vendor';
}
}
print " <TD CLASS='$class'>",join("<BR>\n",@$val),"</TD>\n";
}
print "</TR></TABLE>\n";
@@ -141,7 +141,7 @@ sub parse_data {
my ($cmd,$value);
if ($line =~ /^([a-z-_]+)\s*:\s*(.*)$/) {
$cmd = $1; $value = $2;
$cmd = $1; $value = $2;
} else {
print "What do i do with this line : $line \n";
next;
@@ -164,18 +164,18 @@ sub parse_data {
$family = $value;
$model = undef;
print "$family has no vendor.\n" unless defined $vendor;
$Matrix->{$vendor}->{families}->{$family} = {}
$Matrix->{$vendor}->{families}->{$family} = {}
unless defined $Matrix->{$vendor}->{families}->{$family};
$class = $Matrix->{$vendor}->{families}->{$family};
$class->{defaults}->{type}='family';
next;
}
}
if ($cmd eq 'device') {
$model = $value;
print "$model has no family.\n" unless defined $family;
print "$model has no vendor.\n" unless defined $vendor;
$Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {}
$Matrix->{$vendor}->{families}->{$family}->{models}->{$model} = {}
unless defined $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
$class = $Matrix->{$vendor}->{families}->{$family}->{models}->{$model};
$class->{defaults}->{type}='device';
@@ -233,7 +233,7 @@ sub html_head {
.vendor { font-size:12pt; color:#777777; }
.family { font-size:12pt; color:blue; }
.model { font-size:12pt; color:red; }
.note { color:red; }
.note { color:red; }
//-->
</STYLE>
</HEAD>
@@ -251,22 +251,13 @@ sub html_tail {
[<SPAN CLASS="family">Family Attribute</SPAN>]
[<SPAN CLASS="vendor">Vendor Attribute</SPAN>]
<h1>Attribute Key</h1>
A value of <B>-</B> signifies the information is not specified and can
A value of <B>-</B> signifies the information is not specified and can not
be assumed working.
<TABLE BORDER=1>
<TR>
<TD>Arpnip</TD>
<TD>Ability to collect ARP tables for MAC to IP translation.</TD>
</TR>
<TR>
<TD>CDP</TD>
<TD>Cisco Discovery Protocol usable.
<UL>
<LI><tt>Yes</tt> - Has CDP information through CISCO-CDP-MIB
<LI><tt>Proprietary</tt> means the device has its own L2 Discovery Protocol.
</UL>
</TD>
</TR>
<TR>
<TD>Class</TD>
<TD>SNMP::Info Class the the device currently uses. Devices using more generic
@@ -306,6 +297,16 @@ be assumed working.
switch port when doing a Macsuck.
</TD>
</TR>
<TR>
<TD>Topo</TD>
<TD>Ability to get Layer 2 Topology Information from device if the
protocol is enabled. SNMP::Info supports querying Link Layer
Discovery Protocol (LLDP), Cisco Discovery Protocol (CDP),
SynOptics/Bay/Nortel/Avaya Network Management Protocol (SONMP),
Foundry/Brocade Discovery Protocol (FDP), Extreme Discovery
Protocol (EDP), and Alcatel Mapping Adjacency Protocol (AMAP).
</TD>
</TR>
<TR>
<TD>Ver</TD>
<TD>SNMP Protocol Version the device has to use.</TD>
@@ -324,7 +325,7 @@ be assumed working.
</BODY>
</HTML>
end_tail
}
sub print_headers {

207
contrib/util/make_snmpdata.pl Executable file
View File

@@ -0,0 +1,207 @@
#!/usr/bin/perl
#
# make_snmpdata.pl
#
# Copyright (c) 2012 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.
use strict;
use warnings;
use Carp;
use Getopt::Long;
use Pod::Usage;
use SNMP;
local $| = 1;
my $mibdirs = ['/usr/local/share/snmp/mibs'];
my $comm = 'public';
my $ver = '2c';
my $dev;
my $ignore = 0;
my $help = 0;
GetOptions(
'community=s' => \$comm,
'device=s' => \$dev,
'ignore' => \$ignore,
'mibdir=s' => \$mibdirs,
'version' => \$ver,
'help|?' => sub { pod2usage(2); },
) or pod2usage(2);
unless ( defined $dev && $ver =~ /[1|2c]/ ) {
pod2usage(1);
}
local $ENV{'SNMPCONFPATH'} = '' if $ignore;
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
SNMP::addMibDirs($mibdirs);
# Connect to Device
my $sess = SNMP::Session->new(
'UseEnums' => 1,
'RetryNoSuch' => 1,
'DestHost' => $dev,
'Community' => $comm,
'Version' => $ver,
'UseSprintValue' => 1
);
my $sysdescr = $sess->get('sysDescr.0');
unless ( defined $sysdescr ) {
die "Couldn't connect to $dev via snmp.\n";
}
SNMP::loadModules(@ARGV);
# Create a hash of MIB Modules for which we want results
my %mib_hash = map {$_ => 1} @ARGV;
# Add the common MIB Modules we always want
my @common_mibs = ('SNMPv2-MIB', 'IF-MIB');
foreach my $mib (@common_mibs) {
$mib_hash{$mib} = 1;
}
foreach my $key ( sort( keys %SNMP::MIB ) ) {
my $module = $SNMP::MIB{$key}{moduleID} || '';
# IMPORTS pulls in many modules we don't want to walk
# Only walk those we've specified
next unless (defined $mib_hash{$module});
my $access = $SNMP::MIB{$key}{'access'} || '';
next unless ( $access =~ /Read|Create/x );
my $label = SNMP::translateObj( $key, 0, 1 ) || '';
snmpwalk($label);
}
sub snmpwalk {
return unless defined $sess;
my $label = shift;
my $var = SNMP::Varbind->new( [$label] );
my $e = 0;
my $last_iid = '';
my %seen = ();
while ( !$e ) {
$sess->getnext($var);
$e = $sess->{ErrorNum};
return if $var->[0] ne $label;
my $iid = $var->[1];
my $val = $var->[2];
return unless defined $iid;
# Check to see if we've already seen this IID (looping)
if ( defined $seen{$iid} and $seen{$iid} ) {
warn "Looping on $label iid:$iid. Skipped.\n";
return;
}
else { $seen{$iid}++; }
# why is it looping?
return if $last_iid eq $iid;
$last_iid = $iid;
my $line = "$label.$iid = $val";
print "$line\n";
}
return;
}
__END__
=head1 NAME
make_snmpdata.pl - Tool to get SNMP data for the SNMP::Info testing framework
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
make_snmpdata.pl [options] MIB-MODULE-1 MIB-MODULE-2
Options:
-community SNMP Community
-device IP Address to query
-ignore Ignore Net-SNMP configuration file
-mibdir Directory containing MIB Files
-version SNMP version to use
-help Brief help message
=head1 OPTIONS
=over 8
=item B<-community>
SNMP Community, either 1 or 2c. Defaults to version 2c
-community 2c
=item B<-device>
IP Address to query for the SNMP data. No default and a mandatory option.
-device 127.0.0.1
=item B<-ignore >
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
provided
-ignore
=item B<-mibdir>
Directory containing MIB Files. Mutiple directories should be separated by a
colon ':'. Defaults to /usr/local/share/snmp/mibs.
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
=item B<-version>
SNMP version to use. Only version 1 and 2c are supported. Defaults to 2c
-version 2c
=item B<-help>
Print help message and exits.
=back
=head1 DESCRIPTION
B<make_snmpdata.pl> will gather SNMP data by walking specified MIB files and
output the data to a file which can be used by the SNMP::Info testing
framework.
=cut

View File

@@ -3,9 +3,9 @@
use File::Glob qw/bsd_glob/;
my @pms = glob_rec("../Info");
my @pms = glob_rec("./lib");
$new_version = shift @ARGV || '2.09';
$new_version = shift @ARGV || die "missing new version\n";
foreach my $p (@pms) {
print "$p\n";
@@ -16,6 +16,7 @@ foreach my $p (@pms) {
while (<O>) {
s/^\s*\$VERSION\s+=\s*'[^']+'\s*;/\$VERSION = '$new_version';/;
s/^SNMP::Info - Version [\d.]+$/SNMP::Info - Version $new_version/;
print P;
}
@@ -34,7 +35,7 @@ sub glob_rec {
foreach my $f (@files) {
next if $f eq '\.$';
if (-d $f) {
push @pms, glob_rec($f);
next;

346
contrib/util/test_class.pl Executable file
View File

@@ -0,0 +1,346 @@
#!/usr/bin/perl
#
# test_class.pl
#
# Copyright (c) 2013 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.
use strict;
use warnings;
use Carp;
use Getopt::Long;
use Pod::Usage;
use SNMP::Info;
my $EMPTY = q{};
# Default Values
my $class = $EMPTY;
my @dump = ();
my $debug = 0;
my $cache = 0;
my $device = '';
my $comm = '';
my $ver = 2;
my $ignore = 0;
my $help = 0;
my $nobulk = 0;
my $mibdirs;
my %dumped;
GetOptions(
'c|class=s' => \$class,
'd|dev=s' => \$device,
's|comm=s' => \$comm,
'v|ver=i' => \$ver,
'i|ignore' => \$ignore,
'p|print=s' => \@dump,
'm|mibdir=s' => \$mibdirs,
'n|nobulk' => \$nobulk,
'x|debug+' => \$debug,
'k|cache' => \$cache,
'h|?|help' => sub { pod2usage(1); },
);
unless ( $device and $comm ) {
pod2usage(2);
}
if ( $ignore && !defined $mibdirs ) {
print "mibdirs must be provided if ignoring snmp.conf \n\n";
pod2usage(1);
}
local $ENV{'SNMPCONFPATH'} = $EMPTY if $ignore;
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
if ( defined $mibdirs ) {
SNMP::addMibDirs($mibdirs);
}
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
( my $mod = "$class.pm" )
=~ s{::}{/}xg; # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
if ( !eval { require $mod; 1; } ) {
croak "Could not load $class. Error Message: $@\n";
}
my $class_ver = $class->VERSION();
print
"Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
my %args = ();
if ($nobulk) {
$args{BulkWalk} = 0;
}
my $dev = $class->new(
'AutoSpecify' => 0,
'AutoVerBack' => 0,
'Debug' => $debug,
'Version' => $ver,
'DestHost' => $device,
'Community' => $comm,
%args
) or die "\n";
print "Connected to $device.\n";
print 'Detected Class: ', $dev->device_type(), "\n";
print "Using Class: $class (-c to change)\n";
my $layers = $dev->layers();
my $descr = $dev->description();
if ( !defined $layers || !defined $descr ) {
die
"Are you sure you got the right community string and version?\nCan't fetch layers or description.\n";
}
print "\nFetching base info...\n\n";
my @base_fns = qw/vendor model os os_ver description contact location
layers mac serial/;
foreach my $fn (@base_fns) {
test_global( $dev, $fn );
}
print "\nFetching interface info...\n\n";
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
i_up_admin i_name i_duplex i_duplex_admin i_stp_state
i_vlan i_pvid i_lastchange/;
foreach my $fn (@fns) {
test_fn( $dev, $fn );
}
print "\nFetching VLAN info...\n\n";
my @vlan = qw/v_index v_name/;
foreach my $fn (@vlan) {
test_fn( $dev, $fn );
}
print "\nFetching topology info...\n\n";
my @topo = qw/c_if c_ip c_port c_id c_platform/;
foreach my $fn (@topo) {
test_fn( $dev, $fn );
}
print "\nFetching module info...\n\n";
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
e_fwver e_swver e_model e_serial e_fru/;
foreach my $fn (@modules) {
test_fn( $dev, $fn );
}
foreach my $fn (@dump) {
if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
}
if ($cache) {
eval {
require Data::Printer;
} && eval {
print "\nDumping cache...\n\n";
Data::Printer::p $dev;
};
}
#--------------------------------
sub test_global {
my $info = shift;
my $method = shift;
my $value = $info->$method();
if ( !defined $value ) {
printf "%-20s Does not exist.\n", $method;
return 0;
}
$value =~ s/[[:cntrl:]]+/ /gx;
if ( length $value > 60 ) {
$value = substr $value, 0, 60;
$value .= '...';
}
printf "%-20s %s \n", $method, $value;
return 1;
}
sub test_fn {
my $info = shift;
my $method = shift;
my $results = $info->$method();
# If accidentally called on a global, pass it along nicely.
if ( defined $results && !ref $results ) {
return test_global( $dev, $method );
}
if ( !defined $results && !scalar keys %{$results} ) {
printf "%-20s Empty Results.\n", $method;
return 0;
}
printf "%-20s %d rows.\n", $method, scalar keys %{$results};
if ( grep {/^$method$/x} @dump ) {
$dumped{$method} = 1;
foreach my $iid ( keys %{$results} ) {
print " $iid : ";
if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
}
else {
print $results->{$iid};
}
print "\n";
}
}
return 1;
}
__END__
=head1 NAME
test_class.pl - Test a device against an SNMP::Info class.
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
test_class.pl [options]
Options:
-c|class SNMP::Info class to use, Layer2::Catalyst
-d|dev Device
-s|comm SNMP community
-v|ver SNMP version
-p|print Print values
-i|ignore Ignore Net-SNMP configuration file
-m|mibdir Directory containing MIB Files
-n|nobulk Disable bulkwalk
-x|debug Debugging flag
-k|cache Dump cache (requires Data::Printer to be installed)
-h|?|help Brief help message
=head1 OPTIONS
=over 8
=item B<-class>
Specific SNMP::Info class to use. Defaults to SNMP::Info if no specific
class provided.
-class Layer2::Catalyst
=item B<-dev>
Device to test against. No default and a mandatory option.
-dev 1.2.3.4
=item B<-comm>
SNMP community string. No default and a mandatory option.
-comm public
=item B<-ver>
SNMP version. Default 2.
-ver 1
=item B<-print>
Print values of a class method rather than summarizing. May be repeated
multiple times.
-print i_description -print i_type
=item B<-ignore >
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
provided.
-ignore
=item B<-mibdir>
Directory containing MIB Files. Multiple directories should be separated by a
colon ':'.
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
=item B<-nobulk >
Disable SNMP bulkwalk. Default bulkwalk is on and utilized with version 2.
-nobulk
=item B<-debug>
Turns on SNMP::Info debug.
-debug
=item B<-cache>
Dumps the table and leaf cache at the end of running. Requires that the
L<Data::Printer> module be installed, otherwise does nothing.
-cache
=item B<-help>
Print help message and exits.
=back
=head1 DESCRIPTION
B<test_class.pl> will test a device against a specfied SNMP::Info class.
This allows debugging and testing of live devices to include validating
device support with existing classes.
=cut

454
contrib/util/test_class_mocked.pl Executable file
View File

@@ -0,0 +1,454 @@
#!/usr/bin/env perl
#
# test_class_mocked.pl
#
# Copyright (c) 2012 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.
use strict;
use warnings;
use Carp;
use FindBin;
use lib "$FindBin::Bin/../../lib";
use File::Slurp qw(slurp);
use Getopt::Long;
use Pod::Usage;
use SNMP::Info;
use Test::MockObject::Extends;
my $EMPTY = q{};
# Default Values
my $class = $EMPTY;
my @dump = ();
my $debug = 0;
my $mibdirs;
my $ignore = 0;
my $help = 0;
my $file;
my %dumped;
GetOptions(
'c|class=s' => \$class,
'i|ignore' => \$ignore,
'p|print=s' => \@dump,
'x|debug+' => \$debug,
'm|mibdir=s' => \$mibdirs,
'file=s' => \$file,
'h|?|help' => sub { pod2usage(1); },
);
if ( !$file ) {
pod2usage(1);
}
if ( $ignore && !defined $mibdirs ) {
print "mibdirs must be provided if ignoring snmp.conf \n\n";
pod2usage(1);
}
local $ENV{'SNMPCONFPATH'} = $EMPTY if $ignore;
local $ENV{'MIBDIRS'} = "$mibdirs" if $ignore;
if ( defined $mibdirs ) {
SNMP::addMibDirs($mibdirs);
}
$class = $class ? "SNMP::Info::$class" : 'SNMP::Info';
( my $mod = "$class.pm" )
=~ s{::}{/}g; # SNMP::Info::Layer3 => SNMP/Info/Layer3.pm
if ( !eval { require $mod; 1; } ) {
croak "Could not load $class. Error Message: $@\n";
}
my $class_ver = $class->VERSION();
print
"Class $class ($class_ver) loaded from SNMP::Info $SNMP::Info::VERSION.\n";
if ( scalar @dump ) { print 'Dumping : ', join( q{,}, @dump ), "\n" }
my $mocked = create_mock_session();
my $dev = $class->new(
'AutoSpecify' => 0,
'BulkWalk' => 0,
'Debug' => $debug,
'Session' => $mocked,
) or die "\n";
print 'Detected Class: ', $dev->device_type(), "\n";
print "Using Class: $class (-c to change)\n";
my $layers = $dev->layers();
my $descr = $dev->description();
if ( !defined $layers || !defined $descr ) {
die "Are you sure you specified a file created with make_snmpdata.pl ?\n";
}
print "\nFetching base info...\n\n";
my @base_fns = qw/vendor model os os_ver description contact location
layers mac serial/;
foreach my $fn (@base_fns) {
test_global( $dev, $fn );
}
print "\nFetching interface info...\n\n";
my @fns = qw/interfaces i_type i_ignore i_description i_mtu i_speed i_mac i_up
i_up_admin i_name i_duplex i_duplex_admin i_stp_state
i_vlan i_pvid i_lastchange/;
foreach my $fn (@fns) {
test_fn( $dev, $fn );
}
print "\nFetching VLAN info...\n\n";
my @vlan = qw/v_index v_name/;
foreach my $fn (@vlan) {
test_fn( $dev, $fn );
}
print "\nFetching topology info...\n\n";
my @topo = qw/c_if c_ip c_port c_id c_platform/;
foreach my $fn (@topo) {
test_fn( $dev, $fn );
}
print "\nFetching module info...\n\n";
my @modules = qw/e_descr e_type e_parent e_name e_class e_pos e_hwver
e_fwver e_swver e_model e_serial e_fru/;
foreach my $fn (@modules) {
test_fn( $dev, $fn );
}
foreach my $fn (@dump) {
if ( !$dumped{$fn} ) { test_fn( $dev, $fn ) }
}
#--------------------------------
sub load_snmpdata {
my $data_file = shift;
my @lines = slurp($data_file);
my $snmp_data = {};
foreach my $line (@lines) {
next if !$line;
next if ( $line =~ /^#/ );
if ( $line =~ /^(\S+::\w+)[.]?(\S+)*\s=\s(.*)$/ ) {
my ( $leaf, $iid, $val ) = ( $1, $2, $3 );
next if !$leaf;
$iid ||= 0;
$val =~ s/\"//g;
$snmp_data->{$leaf}->{$iid} = $val;
}
}
return $snmp_data;
}
sub create_mock_session {
my $snmp_data = load_snmpdata($file);
my $session = SNMP::Session->new(
UseEnums => 1,
RetryNoSuch => 1,
Data => $snmp_data,
DestHost => '127.0.0.1',
Community => 'public',
Version => 2,
);
my $mock_session = Test::MockObject::Extends->new($session);
mock_get($mock_session);
mock_getnext($mock_session);
return $mock_session;
}
sub mock_get {
my $mock_session = shift;
$mock_session->mock(
'get',
sub {
my $self = shift;
my $vars = shift;
my ( $leaf, $iid, $oid, $oid_name );
my $c_data = $self->{Data};
# From SNMP::Info get will only be passed either an OID or
# SNMP::Varbind with a fully qualified leaf and potentially
# a partial
if ( ref($vars) =~ /SNMP::Varbind/ ) {
( $leaf, $iid ) = @{$vars};
}
else {
$oid = $vars;
$oid_name = SNMP::translateObj( $oid, 0, 1 ) || $EMPTY;
( $leaf, $iid ) = $oid_name =~ /^(\S+::\w+)[.]?(\S+)*$/;
}
$iid ||= 0;
my $new_iid = $iid;
my $val = $EMPTY;
my $data = $c_data->{$leaf} || {};
my $count = scalar keys %{$data} || 0;
if ( $count > 1 ) {
my $found = 0;
foreach my $d_iid ( sort keys %{$data} ) {
if ( $d_iid eq $iid ) {
$val = $data->{$d_iid};
$found = 1;
next;
}
elsif ( $found == 1 ) {
$new_iid = $d_iid;
last;
}
}
if ( $found && ( $new_iid eq $iid ) ) {
$leaf = 'unknown';
}
}
else {
$val = $data->{$iid};
$leaf = 'unknown';
}
if ( ref $vars =~ /SNMP::Varbind/ ) {
$vars->[0] = $leaf;
$vars->[1] = $new_iid;
$vars->[2] = $val;
}
return ( wantarray() ? $vars : $val );
}
);
return;
}
sub mock_getnext {
my $mock_session = shift;
$mock_session->mock(
'getnext',
sub {
my $self = shift;
my $vars = shift;
my ( $leaf, $iid, $oid, $oid_name );
my $c_data = $self->{Data};
# From SNMP::Info getnext will only be passed a SNMP::Varbind
# with a fully qualified leaf and potentially a partial
( $leaf, $iid ) = @{$vars};
unless (defined $iid) {
$iid = -1;
}
my $new_iid = $iid;
my $val = $EMPTY;
my $data = $c_data->{$leaf};
my $count = scalar keys %{$data} || 0;
if ( $count ) {
my $found = 0;
foreach my $d_iid ( sort keys %{$data} ) {
if ( $d_iid gt $iid && !$found ) {
$val = $data->{$d_iid};
$new_iid = $d_iid;
$found = 1;
next;
}
elsif ( $found == 1 ) {
last;
}
}
if ( $found && ( $new_iid eq $iid ) ) {
$leaf = 'unknown';
}
}
else {
$val = $data->{$iid};
$leaf = 'unknown';
}
$vars->[0] = $leaf;
$vars->[1] = $new_iid;
$vars->[2] = $val;
return ( wantarray() ? $vars : $val );
}
);
return;
}
sub test_global {
my $device = shift;
my $method = shift;
my $value = $device->$method();
if ( !defined $value ) {
printf "%-20s Does not exist.\n", $method;
return 0;
}
$value =~ s/[[:cntrl:]]+/ /g;
if ( length $value > 60 ) {
$value = substr $value, 0, 60;
$value .= '...';
}
printf "%-20s %s \n", $method, $value;
return 1;
}
sub test_fn {
my $device = shift;
my $method = shift;
my $results = $device->$method();
# If accidentally called on a global, pass it along nicely.
if ( defined $results && !ref $results ) {
return test_global( $dev, $method );
}
if ( !defined $results && !scalar keys %{$results} ) {
printf "%-20s Empty Results.\n", $method;
return 0;
}
printf "%-20s %d rows.\n", $method, scalar keys %{$results};
if ( grep {/^$method$/} @dump ) {
$dumped{$method} = 1;
foreach my $iid ( keys %{$results} ) {
print " $iid : ";
if ( ref( $results->{$iid} ) eq 'ARRAY' ) {
print '[ ', join( ', ', @{ $results->{$iid} } ), ' ]';
}
else {
print $results->{$iid};
}
print "\n";
}
}
return 1;
}
__END__
=head1 NAME
test_class_mocked.pl - Test a device against an SNMP::Info class using
output from make_snmpdata.pl stored in a text file.
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
test_class_mocked.pl [options]
Options:
-class SNMP::Info class to use, Layer2::Catalyst
-file File containing data gathered using make_snmpdata.pl
-print Print values
-debug Debugging flag
-ignore Ignore Net-SNMP configuration file
-mibdir Directory containing MIB Files
-help Brief help message
=head1 OPTIONS
=over 8
=item B<-class>
Specific SNMP::Info class to use. Defaults to SNMP::Info if no specific
class provided.
-class Layer2::Catalyst
=item B<-file>
File containing data gathered using make_snmpdata.pl. No default and a
mandatory option.
-file /data/mydevice.txt
=item B<-print>
Print values of a class method rather than summarizing. May be repeated
multiple times.
-print i_description -print i_type
=item B<-debug>
Turns on SNMP::Info debug.
-debug
=item B<-ignore >
Ignore Net-SNMP configuration file snmp.conf. If this used mibdirs must be
provided.
-ignore
=item B<-mibdir>
Directory containing MIB Files. Multiple directories should be separated by a
colon ':'.
-mibdir /usr/local/share/snmp/mibs/rfc:/usr/local/share/snmp/mibs/net-snmp
=item B<-help>
Print help message and exits.
=back
=head1 DESCRIPTION
B<test_class_mocked.pl> will test a device against an SNMP::Info class using
snmpwalk output from the utility B<make_snmpdata.pl> stored in a text file.
This allows debugging and testing without requiring network access to the
device being tested.
=cut

File diff suppressed because it is too large Load Diff

342
lib/SNMP/Info/AMAP.pm Normal file
View File

@@ -0,0 +1,342 @@
# SNMP::Info::AMAP
#
# Copyright (c) 2013 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::AMAP;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::AMAP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::AMAP::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
'ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB' => 'aipAMAPRemDeviceType',
);
%GLOBALS = (
);
%FUNCS = (
# ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB::aipAMAPRemHostname
'amap_rem_sysname' => 'aipAMAPRemHostname',
);
%MUNGE = ( 'amap_rem_sysname' => \&SNMP::Info::munge_null, );
sub hasAMAP {
my $amap = shift;
my $amap_ip = $amap->aipAMAPIpAddr() || {};
return 1 if ( scalar( keys %$amap_ip ) );
return;
}
# Break up the aipAMAPhostsTable INDEX into MAC and IP address.
sub _hosts_table_index {
my $idx = shift;
my @oids = split( /\./, $idx );
my $mac = join( '.', splice( @oids, 0, 6 ) );
return ( $mac, join( '.', @oids ) );
}
# Break up the aipAMAPportConnectionTable INDEX and return MAC
sub _conn_table_mac {
my $idx = shift;
my @oids = split( /\./, $idx );
my $local_idx = shift @oids;
my $mac = join( '.', splice( @oids, 0, 6 ) );
return ($mac);
}
# Since we need to get IP Addresses from the aipAMAPhostsTable which has
# a different index (MAC, IP) than the aipAMAPportConnectionTable which holds
# the remote device details we create a combined index and skip any
# IPs which have an address of 0.0.0.0. Would like to include only one
# address since they should all originate from the same device, but we don't
# know if they would all be reachable from the network management application.
#
# We don't implement partials since this is private index function
sub _amap_index {
my $amap = shift;
my $amap_ip = $amap->aipAMAPIpAddr() || {};
my $amap_rport = $amap->aipAMAPLocalPort() || {};
my %amap_index;
foreach my $key ( keys %$amap_ip ) {
my ( $mac, $ip ) = _hosts_table_index($key);
next if ( $ip eq '0.0.0.0' );
next unless $ip;
foreach my $idx ( keys %$amap_rport ) {
my $c_mac = _conn_table_mac($idx);
if ( $mac eq $c_mac ) {
my $index = "$idx.$ip";
$amap_index{$index} = $index;
}
}
}
return \%amap_index;
}
# Break up _amap_index INDEX into local index, MAC, remote index, and
# IP address
sub _amap_index_parts {
my $idx = shift;
my @oids = split( /\./, $idx );
my $local_idx = shift @oids;
my $mac = join( '.', splice( @oids, 0, 6 ) );
my $rem_idx = shift @oids;
return ( $local_idx, $mac, $rem_idx, join( '.', @oids ) );
}
sub amap_if {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $if_idx = $amap->aipAMAPLocalIfindex() || {};
my %amap_if;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $if_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$if_key/ ) {
my $if = $if_idx->{$if_key};
$amap_if{$key} = $if;
}
}
return \%amap_if;
}
sub amap_ip {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my %amap_ip;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
# MIB says should only be IPv4
next unless ( $ip =~ /\d+(\.\d+){3}/ );
$amap_ip{$key} = $ip;
}
return \%amap_ip;
}
sub amap_port {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_rport = $amap->aipAMAPLocalPort() || {};
my $amap_rslot = $amap->aipAMAPLocalSlot() || {};
my %amap_port;
foreach my $key ( sort keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $p_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$p_key/ ) {
my $port = $amap_rport->{$p_key};
my $slot = $amap_rslot->{$p_key} || 0;
next unless $port;
$amap_port{$key} = defined $slot ? "$slot\/$port" : $port;
}
}
return \%amap_port;
}
sub amap_id {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_name = $amap->amap_rem_sysname() || {};
my %amap_name;
foreach my $key ( sort keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $id_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$id_key/ ) {
my $name = $amap_name->{$id_key} || 0;
next unless $name;
$amap_name{$key} = $name;
}
}
return \%amap_name;
}
sub amap_platform {
my $amap = shift;
my $index = $amap->_amap_index() || {};
my $amap_topo_platform = $amap->aipAMAPRemDeviceType() || {};
my %amap_platform;
foreach my $key ( keys %$index ) {
my ( $local_idx, $mac, $rem_idx, $ip ) = _amap_index_parts($key);
my $pf_key = "$local_idx.$mac.$rem_idx";
if ( $key =~ /^$pf_key/ ) {
my $platform = $amap_topo_platform->{$pf_key};
next unless $platform;
$amap_platform{$key} = $platform;
}
}
return \%amap_platform;
}
1;
__END__
=head1 NAME
SNMP::Info::AMAP - SNMP Interface to Alcatel Mapping Adjacency Protocol (AMAP)
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $amap = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $amap->class();
print " Using device sub class : $class\n";
$hasamap = $amap->hasAMAP() ? 'yes' : 'no';
# Print out a map of device ports with AMAP neighbors:
my $interfaces = $amap->interfaces();
my $amap_if = $amap->amap_if();
my $amap_ip = $amap->amap_ip();
my $amap_port = $amap->amap_port();
foreach my $amap_key (keys %$amap_ip){
my $iid = $amap_if->{$amap_key};
my $port = $interfaces->{$iid};
my $neighbor = $amap_ip->{$amap_key};
my $neighbor_port = $amap_port->{$amap_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
SNMP::Info::AMAP is a subclass of SNMP::Info that provides an object oriented
interface to Alcatel Mapping Adjacency Protocol (AMAP) information through
SNMP.
AMAP is a Layer 2 protocol that allows a network device to advertise its
identity and capabilities on the local network providing topology information.
Create or use a device subclass that inherits this class. Do not use
directly.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<ALCATEL-IND1-INTERSWITCH-PROTOCOL-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=item $amap->hasAMAP()
Is AMAP is active in this device?
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $amap->amap_id()
Returns the string value used to identify the remote system.
=item $amap->amap_if()
Returns the mapping to the SNMP Interface Table.
=item $amap->amap_ip()
Returns remote IPv4 addresses. Note: AMAP returns all IP addresses associated
with the remote device. It would be preferable to include only one address
since they should all originate from the same device, but amap_ip() can not
determine if all addresses are reachable from the network management
application therefore all addresses are returned and the calling application
must determine which address to use and if they are in fact from the same
device.
=item $amap->amap_port()
Returns remote port ID
=item $amap->amap_platform()
Returns remote platform ID
=back
=cut

View File

@@ -30,15 +30,16 @@
package SNMP::Info::AdslLine;
use strict;
use warnings;
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/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'ADSL-LINE-MIB' => 'adslLineType' );
@@ -50,7 +51,7 @@ $VERSION = '2.09';
'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',
@@ -65,7 +66,7 @@ __END__
=head1 NAME
SNMP::Info::AdslLine - SNMP Interface to the ADSL-LINE-MIB
SNMP::Info::AdslLine - SNMP Interface to the F<ADSL-LINE-MIB>
=head1 AUTHOR
@@ -73,14 +74,14 @@ Alexander Hartmaier
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -88,7 +89,7 @@ Alexander Hartmaier
=head1 DESCRIPTION
SNMP::Info::AdslLine is a subclass of SNMP::Info that provides
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.
@@ -105,8 +106,6 @@ none.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over
@@ -120,7 +119,7 @@ MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head2 ATUC channel table (C<adslAtucChanTable>)
This table provides one row for each ATUC channel.
ADSL channel interfaces are those ifEntries where ifType
ADSL channel interfaces are those C<ifEntries> where C<ifType>
is equal to adslInterleave(124) or adslFast(125).
=over
@@ -146,7 +145,7 @@ is equal to adslInterleave(124) or adslFast(125).
=head2 ATUR channel table (C<adslAturChanTable>)
This table provides one row for each ATUR channel.
ADSL channel interfaces are those ifEntries where ifType
ADSL channel interfaces are those C<ifEntries> where C<ifType>
is equal to adslInterleave(124) or adslFast(125).
=over

View File

@@ -1,6 +1,6 @@
# $Id$
# SNMP::Info::Aggregate
#
# Copyright (c) 2005 Matt Tuttle
# Copyright (c) 2014 SNMP::Info Developers
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -27,88 +27,105 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
package SNMP::Info::CiscoImage;
package SNMP::Info::Aggregate;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoImage::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoImage::EXPORT_OK = qw//;
@SNMP::Info::Aggregate::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Aggregate::EXPORT_OK = qw/agg_ports_ifstack/;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'CISCO-IMAGE-MIB' => 'ciscoImageString', );
# Load MIB for leafs referenced within class
%MIBS = ('IF-MIB' => 'ifIndex',);
%GLOBALS = ();
%FUNCS = ( 'ci_images' => 'ciscoImageString', );
%FUNCS = ();
%MUNGE = ();
sub agg_ports_ifstack {
my $dev = shift;
my $partial = shift;
my $ifStack = $dev->ifStackStatus();
# TODO: if we want to do partial, we need to use inverse status
my $ifType = $dev->ifType();
my $ret = {};
foreach my $idx ( keys %$ifStack ) {
my ( $higher, $lower ) = split /\./, $idx;
next if ( $higher == 0 or $lower == 0 );
if ( $ifType->{ $higher } eq 'ieee8023adLag' or $ifType->{ $higher } eq 'propMultiplexor') {
$ret->{ $lower } = $higher;
}
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoImage - SNMP Interface to image strings for Cisco Devices
SNMP::Info::Aggregate - SNMP Interface to ifStackTable Aggregated Links
=head1 AUTHOR
Matt Tuttle (C<mtuttle@americanhebrewacademy.org>)
SNMP::Info Developers
=head1 SYNOPSIS
# 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
)
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 = $ci->class();
my $class = $info->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.
This class provides access to Aggregated Links configuration on devices
supporting C<ifStackTable>.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
None.
L<SNMP::Info>
=head2 Required MIBs
=over
=item F<CISCO-IMAGE-MIB>
=item F<IF-MIB>
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 METHODS
=head1 GLOBALS
=over 4
None.
=item C<agg_ports_ifstack>
=head1 TABLE METHODS
=over
=item $ci->ci_images()
Returns the table of image strings.
C<ciscoImageString>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Airespace
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,15 +30,16 @@
package SNMP::Info::Airespace;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::Airespace::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Airespace::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::MIBS,
@@ -84,7 +84,7 @@ $VERSION = '2.09';
'airespace_ess_ifname' => 'bsnDot11EssInterfaceName',
'airespace_ess_aclname' => 'bsnDot11EssAclName',
'airespace_ess_bcast' => 'bsnDot11EssBroadcastSsid',
# AIRESPACE-WIRELESS-MIB::bsnAPTable
'airespace_ap_mac' => 'bsnAPDot3MacAddress',
'airespace_ap_name' => 'bsnAPName',
@@ -148,6 +148,16 @@ $VERSION = '2.09';
# AIRESPACE-SWITCHING-MIB::agentPortConfigTable
'airespace_duplex_admin' => 'agentPortPhysicalMode',
'airespace_duplex' => 'agentPortPhysicalStatus',
# 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_ssid' => 'bsnMobileStationSsid',
);
%MUNGE = (
@@ -158,6 +168,8 @@ $VERSION = '2.09';
'airespace_bl_mac' => \&SNMP::Info::munge_mac,
'airespace_if_mac' => \&SNMP::Info::munge_mac,
'airespace_sta_mac' => \&SNMP::Info::munge_mac,
'cd11_rxpkt' => \&munge_64bits,
'cd11_txpkt' => \&munge_64bits,
);
sub layers {
@@ -496,8 +508,8 @@ sub ip_index {
my $airespace = shift;
my $partial = shift;
my $ip_index = $airespace->orig_ip_index($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my $ip_index = $airespace->SUPER::ip_index($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my %ip_index;
foreach my $ip ( keys %$ip_index ) {
@@ -522,9 +534,9 @@ sub ip_netmask {
my $airespace = shift;
my $partial = shift;
my $ip_mask = $airespace->orig_ip_netmask($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my $if_mask = $airespace->airespace_if_mask() || {};
my $ip_mask = $airespace->SUPER::ip_netmask($partial) || {};
my $if_ip = $airespace->airespace_if_ip() || {};
my $if_mask = $airespace->airespace_if_mask() || {};
my %ip_netmask;
foreach my $ip ( keys %$ip_mask ) {
@@ -565,6 +577,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $airespace = shift;
my $partial = shift;
return $airespace->SUPER::fw_mac($partial);
}
sub fw_port {
my $airespace = shift;
my $partial = shift;
@@ -676,42 +695,52 @@ sub i_ssidmac {
foreach my $oid ( keys %$ssidlist ) {
my @parts = split( /\./, $oid );
my $ssid_idx = pop (@parts);
my $slot = pop (@parts);
my $last = pop (@parts);
my $ssid_idx = pop(@parts);
my $slot = pop(@parts);
my $last = pop(@parts);
my $iid = $oid;
# Get radio band
$iid =~ s/\.\d+$//;
my $ap_type = $apif_type->{$iid};
# Determine if IOS based
$iid =~ s/\.\d+$//;
my $ios = $ap_ios->{$iid} || '';
# Four cases:
# IOS and 2.4Ghz count up, starts at zero
if ($ios and $ap_type =~ /b$/) {
$last = $last + ($ssid_idx - 1);
# 17 can be used as index for 3rd Party AP's. We only have one
# hexadecimal digit to work with so skip if outside the range
if ( $ssid_idx > 0 and $ssid_idx < 17 ) {
# Four cases:
# IOS and 2.4Ghz count up, starts at zero
if ( $ios and $ap_type =~ /b$/ ) {
$last = $last + ( $ssid_idx - 1 );
}
# IOS and 5Ghz - count down from maximum of 16
elsif ( $ios and $ap_type =~ /a$/ ) {
$last = $last + ( 16 - $ssid_idx );
}
# VxWorks and 5Ghz - count up, starts at zero
elsif ( $ios and $ap_type =~ /a$/ ) {
$last = $last + ( $ssid_idx - 1 );
}
# VxWorks and 2.4Ghz - count down from maximum of 16
else {
$last = $last + ( 16 - $ssid_idx );
}
}
# IOS and 5Ghz - count down from maximum of 16
elsif ($ios and $ap_type =~ /a$/) {
$last = $last + (16 - $ssid_idx);
}
# VxWorks and 5Ghz - count up, starts at zero
elsif ($ios and $ap_type =~ /a$/) {
$last = $last + ($ssid_idx - 1);
}
# VxWorks and 2.4Ghz - count down from maximum of 16
else {
$last = $last + (16 - $ssid_idx);
}
push (@parts, $last);
my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
$i_ssidmac{$oid} = $bssid;
push( @parts, $last );
my $bssid = join( ':', map { sprintf( "%02x", $_ ) } @parts );
$i_ssidmac{$oid} = $bssid;
}
return \%i_ssidmac;
return \%i_ssidmac;
}
sub i_80211channel {
@@ -735,14 +764,14 @@ sub dot11_cur_tx_pwr_mw {
my $partial = shift;
my $cur = $airespace->airespace_apif_power($partial);
my $pwr_abs = $airespace->airespace_apif_a_pwr($partial);
my $dot11_cur_tx_pwr_mw = {};
foreach my $idx ( keys %$cur ) {
my $pwr = $cur->{$idx};
if ( $pwr >= 1 && $pwr <= 8 ) {
my @pwr_list = split(/,/, $pwr_abs->{$idx} );
$dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];
my @pwr_list = split(/,/, $pwr_abs->{$idx} );
$dot11_cur_tx_pwr_mw->{$idx} = $pwr_list[$pwr-1];
}
else {
@@ -1031,6 +1060,13 @@ sub at_netaddr {
return $ret;
}
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__
@@ -1051,7 +1087,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -1080,7 +1116,7 @@ Do not use directly.
=over
None.
=item None.
=back
@@ -1168,7 +1204,7 @@ valid only when the Transfer Mode is tftp.
=item $airespace->airespace_ul_path()
Transfer upload tftp path configures the directory path where the file is to
be uploaded to. The switch remembers the last file path used.
be uploaded to. The switch remembers the last file path used.
(C<agentTransferUploadPath>)
@@ -1206,12 +1242,9 @@ switch.
=item $airespace->layers()
Returns 00000011. Class emulates Layer 2 functionality for Thin APs through
Returns 00000111. Class emulates Layer 2 functionality for Thin APs through
proprietary MIBs.
=item $airespace->at_netaddr()
=item $airespace->at_paddr()
=item $airespace->serial()
(C<agentInventorySerialNumber>)
@@ -1238,7 +1271,7 @@ Returns reference to hash. Indicates whether the SSID is broadcast.
Returns reference to hash. Current operating frequency channel of the radio
interface.
=item $dot11->dot11_cur_tx_pwr_mw()
=item $airespace->dot11_cur_tx_pwr_mw()
Returns reference to hash. Current transmit power, in milliwatts, of the
radio interface.
@@ -1246,7 +1279,7 @@ radio interface.
=item $airespace->i_ssidmac()
With the same keys as i_ssidlist, returns the Basic service set
identification (BSSID), MAC address, the AP is using for the SSID.
identification (BSSID), MAC address, the AP is using for the SSID.
=back
@@ -1313,7 +1346,7 @@ Name of the interface used by this WLAN.
Name of ACL for the WLAN. This is applicable only when Web Authentication is
enabled.
(C<bsnDot11EssAclName>)
(C<bsnDot11EssAclName>)
=item $airespace->airespace_ess_bcast()
@@ -1639,14 +1672,14 @@ to an empty string.
=item $airespace->i_index()
Returns reference to map of IIDs to Interface index.
Returns reference to map of IIDs to Interface index.
Extends C<ifIndex> to support thin APs and WLAN virtual interfaces as device
interfaces.
=item $airespace->interfaces()
Returns reference to map of IIDs to ports. Thin APs are implemented as device
Returns reference to map of IIDs to ports. Thin APs are implemented as device
interfaces. The thin AP MAC address airespace_ap_mac() and Slot ID
airespace_apif_slot() are used as the port identifier. Virtual interfaces
use airespace_if_name() as the port identifier.
@@ -1659,15 +1692,15 @@ airespace_if_name() for virtual interfaces.
=item $airespace->i_description()
Returns reference to map of IIDs to interface types. Returns C<ifDescr>
for Ethernet interfaces, airespace_ap_loc() for thin AP interfaces, and
airespace_if_name() for virtual interfaces.
Returns reference to map of IIDs to interface descriptions. Returns
C<ifDescr> for Ethernet interfaces, airespace_ap_loc() for thin AP
interfaces, and airespace_if_name() for virtual interfaces.
=item $airespace->i_type()
Returns reference to map of IIDs to interface descriptions. Returns
C<ifType> for Ethernet interfaces, airespace_apif_type() for thin AP
interfaces, and airespace_if_type() for virtual interfaces.
Returns reference to map of IIDs to interface types. Returns C<ifType>
for Ethernet interfaces, airespace_apif_type() for thin AP interfaces, and
airespace_if_type() for virtual interfaces.
=item $airespace->i_up()
@@ -1684,7 +1717,7 @@ for thin AP interfaces.
=item $airespace->i_mac()
Returns reference to map of IIDs to MAC address of the interface. Returns
C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual
C<ifPhysAddress> for Ethernet interfaces and airespace_if_mac() for virtual
interfaces.
=item $airespace->i_vlan()
@@ -1718,7 +1751,7 @@ the interface iid.
=item $airespace->fw_port()
Returns reference to a hash, value being airespace_sta_mac() and
airespace_sta_slot() combined to match the interface iid.
airespace_sta_slot() combined to match the interface iid.
=item $airespace->fw_mac()
@@ -1790,4 +1823,32 @@ entity which 'contains' this entity.
=back
=head2 Arp Cache Table Augmentation
The controller has knowledge of MAC->IP mappings for wireless clients.
Augmenting the arp cache data with these MAC->IP mappings enables visibility
for stations that only communicate locally.
=over
=item $airespace->at_paddr()
Adds MAC addresses extracted from the index of C<bsnMobileStationIpAddress>.
=item $airespace->at_netaddr()
Adds IP addresses from C<bsnMobileStationIpAddress>.
=back
=head1 Data Munging Callback Subroutines
=over
=item munge_64bits()
Truncate packet values to 32 bits.
=back
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Bridge
# $Id$
#
# Changes since Version 0.7 Copyright (c) 2004 Max Baker
# All rights reserved.
@@ -34,19 +33,21 @@
package SNMP::Info::Bridge;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::Bridge::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Bridge::EXPORT_OK = qw//;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE $INIT/;
our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $INIT);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'BRIDGE-MIB' => 'dot1dBaseBridgeAddress',
'Q-BRIDGE-MIB' => 'dot1qPvid',
'RSTP-MIB' => 'dot1dStpPortOperEdgePort',
);
%GLOBALS = (
@@ -84,6 +85,17 @@ $VERSION = '2.09';
'bs_to' => 'dot1dStaticAllowedToGoTo',
'bs_status' => 'dot1dStaticStatus',
# These leafs are not part of a table, but placed here
# to return a hash reference to ease API compatibility with
# MST and PVST implementations indexed by a spanning tree
# instance id
'stp_i_mac' => 'dot1dBaseBridgeAddress',
'stp_i_time' => 'dot1dStpTimeSinceTopologyChange',
'stp_i_ntop' => 'dot1dStpTopChanges',
'stp_i_root' => 'dot1dStpDesignatedRoot',
'stp_i_root_port' => 'dot1dStpRootPort',
'stp_i_priority' => 'dot1dStpPriority',
# Spanning Tree Protocol Table : dot1dStpPortTable
'stp_p_id' => 'dot1dStpPort',
'stp_p_priority' => 'dot1dStpPortPriority',
@@ -93,6 +105,10 @@ $VERSION = '2.09';
'stp_p_bridge' => 'dot1dStpPortDesignatedBridge',
'stp_p_port' => 'dot1dStpPortDesignatedPort',
# Rapid Spanning Tree Protocol Table : dot1dStpExtPortEntry
'is_edgeport_admin' => 'dot1dStpPortAdminEdgePort',
'is_edgeport_oper' => 'dot1dStpPortOperEdgePort',
# Q-BRIDGE-MIB : dot1qPortVlanTable
'qb_i_vlan' => 'dot1qPvid',
'qb_i_vlan_type' => 'dot1qPortAcceptableFrameTypes',
@@ -125,15 +141,18 @@ $VERSION = '2.09';
'b_mac' => \&SNMP::Info::munge_mac,
'fw_mac' => \&SNMP::Info::munge_mac,
'bs_mac' => \&SNMP::Info::munge_mac,
'stp_root' => \&SNMP::Info::munge_mac,
'stp_root' => \&SNMP::Info::munge_prio_mac,
'stp_i_mac' => \&SNMP::Info::munge_mac,
'stp_i_root' => \&SNMP::Info::munge_prio_mac,
'stp_p_root' => \&SNMP::Info::munge_prio_mac,
'stp_p_bridge' => \&SNMP::Info::munge_prio_mac,
'stp_p_port' => \&SNMP::Info::munge_prio_mac,
'stp_p_port' => \&SNMP::Info::munge_prio_port,
'qb_cv_egress' => \&SNMP::Info::munge_port_list,
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
'qb_v_egress' => \&SNMP::Info::munge_port_list,
'qb_v_fbdn_egress' => \&SNMP::Info::munge_port_list,
'qb_v_untagged' => \&SNMP::Info::munge_port_list,
'qb_cv_untagged' => \&SNMP::Info::munge_port_list,
);
@@ -158,6 +177,29 @@ sub qb_fw_mac {
return $qb_fw_mac;
}
sub qb_fw_vlan {
my $bridge = shift;
my $partial = shift;
my $qb_fw_port = $bridge->qb_fw_port($partial);
my $qb_fdb_ids = $bridge->qb_fdb_index() || {};
my $qb_fw_vlan = {};
foreach my $idx ( keys %$qb_fw_port ) {
my ( $fdb_id, $mac ) = _qb_fdbtable_index($idx);
# Many devices do not populate the dot1qVlanCurrentTable, so default
# to FDB ID = VID, but if we have a mapping use it.
my $vlan = $fdb_id;
# defined as test since some devices have a vlan 0
if (defined $qb_fdb_ids->{$fdb_id}) {
$vlan = $qb_fdb_ids->{$fdb_id};
}
$qb_fw_vlan->{$idx} = $vlan;
}
return $qb_fw_vlan;
}
sub qb_i_vlan_t {
my $bridge = shift;
my $partial = shift;
@@ -176,6 +218,60 @@ sub qb_i_vlan_t {
return $i_vlan;
}
sub qb_fdb_index {
my $bridge = shift;
my $partial = shift;
# Some devices may not implement TimeFilter in a standard manner
# appearing to loop on this request. Override in the device class,
# see Enterasys for example.
my $qb_fdb_ids = $bridge->dot1qVlanFdbId() || {};
# Strip the TimeFilter
my $vl_fdb_index = {};
for my $fdb_entry (keys(%$qb_fdb_ids)) {
(my $vlan = $fdb_entry) =~ s/^\d+\.//;
$vl_fdb_index->{$qb_fdb_ids->{$fdb_entry}} = $vlan;
}
return $vl_fdb_index;
}
# Most devices now support Q-BRIDGE-MIB, fall back to
# BRIDGE-MIB for those that don't.
sub fw_mac {
my $bridge = shift;
unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){
my $qb = $bridge->qb_fw_mac();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
}
return $bridge->SUPER::fw_mac();
}
sub fw_port {
my $bridge = shift;
unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){
my $qb = $bridge->qb_fw_port();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
}
return $bridge->SUPER::fw_port();
}
sub fw_status {
my $bridge = shift;
unless ($bridge->can('cisco_comm_indexing') && $bridge->cisco_comm_indexing()){
my $qb = $bridge->qb_fw_status();
return $qb if (ref {} eq ref $qb and scalar keys %$qb);
}
return $bridge->SUPER::fw_status();
}
sub i_stp_state {
my $bridge = shift;
my $partial = shift;
@@ -206,11 +302,11 @@ sub i_stp_port {
my %i_stp_port;
foreach my $index ( keys %$stp_p_port ) {
my $bridge = $stp_p_port->{$index};
my $bport = $stp_p_port->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $bridge;
$i_stp_port{$iid} = $bridge;
next unless defined $bport;
$i_stp_port{$iid} = $bport;
}
return \%i_stp_port;
}
@@ -225,11 +321,11 @@ sub i_stp_id {
my %i_stp_id;
foreach my $index ( keys %$stp_p_id ) {
my $bridge = $stp_p_id->{$index};
my $bport = $stp_p_id->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $bridge;
$i_stp_id{$iid} = $bridge;
next unless defined $bport;
$i_stp_id{$iid} = $bport;
}
return \%i_stp_id;
}
@@ -244,11 +340,11 @@ sub i_stp_bridge {
my %i_stp_bridge;
foreach my $index ( keys %$stp_p_bridge ) {
my $bridge = $stp_p_bridge->{$index};
my $bport = $stp_p_bridge->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $bridge;
$i_stp_bridge{$iid} = $bridge;
next unless defined $bport;
$i_stp_bridge{$iid} = $bport;
}
return \%i_stp_bridge;
}
@@ -295,24 +391,37 @@ sub i_vlan {
return $i_vlan;
}
sub i_untagged { goto &i_vlan }
sub i_vlan_membership {
my $bridge = shift;
my $partial = shift;
my $index = $bridge->bp_index();
# Use VlanCurrentTable if available since it will include dynamic
# VLANs. However, some devices do not populate the table.
my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
return $bridge->_vlan_hoa($v_ports, $partial);
}
sub i_vlan_membership_untagged {
my $bridge = shift;
my $partial = shift;
# Use VlanCurrentTable if available since it will include dynamic
# VLANs. However, some devices do not populate the table.
my $v_ports = $bridge->qb_cv_untagged() || $bridge->qb_v_untagged();
# 11/07 - Todo: Issue with some devices trying to query VlanCurrentTable
# as table may grow very large with frequent VLAN changes.
# 06/08 - VlanCurrentTable may be due to timefilter, should query with
# zero partial for no time filter.
# my $v_ports = $bridge->qb_cv_egress() || $bridge->qb_v_egress();
return $bridge->_vlan_hoa($v_ports, $partial);
}
my $v_ports = $bridge->qb_v_egress() || {};
sub _vlan_hoa {
my $bridge = shift;
my ( $v_ports, $partial ) = @_;
my $i_vlan_membership = {};
my $index = $bridge->bp_index();
my $vlan_hoa = {};
foreach my $idx ( keys %$v_ports ) {
next unless ( defined $v_ports->{$idx} );
my $portlist = $v_ports->{$idx};
@@ -320,7 +429,7 @@ sub i_vlan_membership {
my $vlan;
# Strip TimeFilter if we're using VlanCurrentTable
( $vlan = $idx ) =~ s/^\d+\.//;
($vlan = $idx) =~ s/^(\d+\.)*//g;
# Convert portlist bit array to bp_index array
for ( my $i = 0; $i <= $#$portlist; $i++ ) {
@@ -332,10 +441,10 @@ sub i_vlan_membership {
my $ifindex = $index->{$port};
next unless ( defined($ifindex) ); # shouldn't happen
next if ( defined $partial and $ifindex !~ /^$partial$/ );
push( @{ $i_vlan_membership->{$ifindex} }, $vlan );
push( @{ $vlan_hoa->{$ifindex} }, $vlan );
}
}
return $i_vlan_membership;
return $vlan_hoa;
}
sub set_i_pvid {
@@ -352,6 +461,8 @@ sub set_i_vlan {
return;
}
sub set_i_untagged { goto &set_i_vlan }
sub set_add_i_vlan_tagged {
my $bridge = shift;
@@ -450,10 +561,10 @@ Max Baker
=head1 SYNOPSIS
my $bridge = new SNMP::Info (
my $bridge = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'switch',
DestHost => 'switch',
Community => 'public',
Version => 2
);
@@ -474,7 +585,7 @@ Max Baker
my $port = $interfaces->{$iid};
print "Port:$port forwarding to $mac\n";
}
}
=head1 DESCRIPTION
@@ -483,12 +594,12 @@ MAC Forwarding Table and Spanning Tree Protocol info.
F<Q-BRIDGE-MIB> holds 802.1q information -- VLANs and Trunking. Cisco tends
not to use this MIB, but some proprietary ones. HP and some nicer vendors use
this. This is from C<RFC2674_q>.
this. This is from C<RFC2674_q>.
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
For debugging you can call new() directly as you would in SNMP::Info
my $bridge = new SNMP::Info::Bridge(...);
@@ -504,12 +615,11 @@ None.
=item F<Q-BRIDGE-MIB>
=item F<RSTP-MIB>
=back
F<BRIDGE-MIB> needs to be extracted from
ftp://ftp.cisco.com/pub/mibs/v1/v1.tar.gz
=head1 GLOBAL METHODS
=head1 GLOBALS
These are methods that return scalar values from SNMP
@@ -552,19 +662,19 @@ Returns root of STP.
(C<dot1dStpDesignatedRoot>)
=item $bridge->qb_vlans_max()
=item $bridge->qb_vlans_max()
Maximum number of VLANS supported on this device.
(C<dot1qMaxSupportedVlans>)
=item $bridge->qb_vlans()
=item $bridge->qb_vlans()
Current number of VLANs that are configured in this device.
(C<dot1qNumVlans>)
=item $bridge->qb_next_vlan_index()
=item $bridge->qb_next_vlan_index()
The next available value for C<dot1qVlanIndex> of a local VLAN entry in
C<dot1qVlanStaticTable>
@@ -584,6 +694,10 @@ to a hash.
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $vtp->i_untagged()
An alias for C<i_vlan>.
=item $bridge->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
@@ -592,18 +706,28 @@ IDs. These are the VLANs which are members of the egress list for the port.
Example:
my $interfaces = $bridge->interfaces();
my $vlans = $bridge->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 $bridge->i_vlan_membership_untagged()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the untagged egress list for
the port.
=item $bridge->qb_i_vlan_t()
Returns reference to hash: key = C<dot1dBasePort>, value = either 'trunk' for
tagged ports or the VLAN ID.
=item $bridge->qb_fdb_index()
Returns reference to hash: key = FDB ID, value = VLAN ID.
=item $bridge->v_index()
Returns VLAN IDs
@@ -612,7 +736,7 @@ Returns VLAN IDs
=head2 Forwarding Table (C<dot1dTpFdbEntry>)
=over
=over
=item $bridge->fw_mac()
@@ -657,6 +781,48 @@ to this port.
=back
=head2 Spanning Tree Instance Globals
These are not part of a table, but return a hash reference to ease API
compatibility with MST and PVST implementations indexed by a spanning tree
instance id.
=over
=item $bridge->stp_i_time()
Returns time since last topology change detected. (100ths/second)
(C<dot1dStpTimeSinceTopologyChange>)
=item $bridge->stp_i_time()
Returns the total number of topology changes detected.
(C<dot1dStpTopChanges>)
=item $bridge->stp_i_root()
Returns root of STP.
(C<dot1dStpDesignatedRoot>)
=item $bridge->stp_i_root_port()
Returns the port number of the port that offers the lowest cost path
to the root bridge.
(C<dot1dStpRootPort>)
=item $bridge->stp_i_priority()
Returns the port number of the port that offers the lowest cost path
to the root bridge.
(C<dot1dStpPriority>)
=back
=head2 Spanning Tree Protocol Table (C<dot1dStpPortTable>)
Descriptions are straight from F<BRIDGE-MIB.my>
@@ -788,7 +954,7 @@ The set of ports which are assigned to the egress list for this VLAN.
=item $bridge->qb_cv_untagged()
The set of ports which should transmit egress packets for this VLAN as
untagged.
untagged.
(C<dot1qVlanCurrentUntaggedPorts>)
@@ -826,7 +992,7 @@ for this VLAN.
=item $bridge->qb_v_untagged()
The set of ports which should transmit egress packets for this VLAN as
untagged.
untagged.
(C<dot1qVlanStaticUntaggedPorts>)
@@ -855,6 +1021,10 @@ identifier (iid)
(C<dot1qTpFdbPort>)
=item $bridge->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID
=item $bridge->qb_fw_status()
Returns reference to hash of forwarding table entries status
@@ -862,13 +1032,13 @@ Returns reference to hash of forwarding table entries status
(C<dot1qTpFdbStatus>)
=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.
operations.
=over
@@ -876,6 +1046,10 @@ operations.
Currently unsupported. Throws an error and returns.
=item $bridge->set_i_untagged(vlan, ifIndex)
An alias for C<set_i_vlan>.
=item $bridge->set_i_pvid(pvid, ifIndex)
Currently unsupported. Throws an error and returns.
@@ -888,4 +1062,6 @@ Currently unsupported. Throws an error and returns.
Currently unsupported. Throws an error and returns.
=back
=cut

535
lib/SNMP/Info/CDP.pm Normal file
View File

@@ -0,0 +1,535 @@
# SNMP::Info::CDP
#
# 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
# 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::CDP;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CDP::EXPORT_OK = qw//;
our
($VERSION, $DEBUG, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $INIT, %CDP_CAPABILITIES);
$VERSION = '3.74';
# Five data structures required by SNMP::Info
%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_gid' => 'cdpGlobalDeviceId',
);
%FUNCS = (
'cdp_proto' => 'cdpCacheAddressType',
'cdp_addr' => 'cdpCacheAddress',
'cdp_ver' => 'cdpCacheVersion',
'cdp_dev_id' => 'cdpCacheDeviceId',
'cdp_dev_port' => 'cdpCacheDevicePort',
'cdp_platform' => 'cdpCachePlatform',
'cdp_capabilities' => 'cdpCacheCapabilities',
'cdp_domain' => 'cdpCacheVTPMgmtDomain',
'cdp_vlan' => 'cdpCacheNativeVLAN',
'cdp_duplex' => 'cdpCacheDuplex',
'cdp_power' => 'cdpCachePowerConsumption',
'cdp_pri_mgmt_type'=> 'cdpCachePrimaryMgmtAddrType',
'cdp_pri_mgmt_addr'=> 'cdpCachePrimaryMgmtAddr',
'cdp_sec_mgmt_type'=> 'cdpCacheSecondaryMgmtAddrType',
'cdp_sec_mgmt_addr'=> 'cdpCacheSecondaryMgmtAddr',
);
%MUNGE = (
'cdp_capabilities' => \&SNMP::Info::munge_bits,
'cdp_platform' => \&SNMP::Info::munge_null,
'cdp_domain' => \&SNMP::Info::munge_null,
'cdp_ver' => \&SNMP::Info::munge_null,
'cdp_ip' => \&SNMP::Info::munge_ip,
'cdp_power' => \&munge_power,
);
%CDP_CAPABILITIES = (
'Router' => 0x001,
'Trans-Bridge' => 0x002,
'Source-Route-Bridge' => 0x004,
'Switch' => 0x008,
'Host' => 0x010,
'IGMP' => 0x020,
'Repeater' => 0x040,
'VoIP-Phone' => 0x080,
'Remotely-Managed-Device' => 0x100,
'Supports-STP-Dispute' => 0x200,
'Two-port Mac Relay' => 0x400,
);
sub munge_power {
my $power = shift;
my $decimal = substr( $power, -3 );
$power =~ s/$decimal$/\.$decimal/;
return $power;
}
sub hasCDP {
my $cdp = shift;
# Check the global that is supposed to indicate CDP is running
my $cdp_run = $cdp->cdp_run();
return 1 if $cdp_run;
# SNMP v1 clients don't have the globals, fallback
# by checking if it would report neighbors
my $cdp_ip = $cdp->cdp_ip() || {};
return 1 if scalar keys %$cdp_ip;
return;
}
sub cdp_if {
my $cdp = shift;
my $cdp_ip = $cdp->cdp_ip();
unless ( defined $cdp_ip ) {
$cdp->error_throw(
"SNMP::Info::CDP:cdp_if() - Device doesn't have cdp_ip() data. Can't fake cdp_index()"
);
return;
}
my %cdp_if;
foreach my $key ( keys %$cdp_ip ) {
next unless defined $key;
my $iid = $key;
# Truncate .1 from cdp cache entry
$iid =~ s/\.\d+$//;
$cdp_if{$key} = $iid;
}
return \%cdp_if;
}
sub cdp_ip {
my $cdp = shift;
my $partial = shift;
my $cdp_addr = $cdp->cdp_addr($partial) || {};
my $cdp_proto = $cdp->cdp_proto($partial) || {};
my %cdp_ip;
foreach my $key ( keys %$cdp_addr ) {
my $addr = $cdp_addr->{$key};
my $proto = $cdp_proto->{$key};
next unless defined $addr;
next if ( defined $proto and $proto ne 'ip' );
my $ip = join( '.', unpack( 'C4', $addr ) );
$cdp_ip{$key} = $ip;
}
return \%cdp_ip;
}
sub cdp_cap {
my $cdp = shift;
my $partial = shift;
# Some devices return a hex-string, others return a space separated
# string, we need the raw data to determine return value and
# take appropriate action
my $cdp_caps = $cdp->cdp_capabilities_raw($partial) || {};
my %cdp_cap;
foreach my $key ( keys %$cdp_caps ) {
my $cap_raw = $cdp_caps->{$key};
next unless $cap_raw;
# Simple check, smallest single string is either Host or IGMP with a
# space added on the end for a length of 5, hex string is normally
# 4 bytes, but since only one byte was traditionally needed process
# as hex for a length of 4 or less
if ( length $cap_raw < 5 ) {
my $cap_hex = join( '',
map { sprintf "%x", $_ } unpack( 'C*', $cap_raw ) );
foreach my $capability ( keys %CDP_CAPABILITIES ) {
if ( ( hex $cap_hex ) & $CDP_CAPABILITIES{$capability} ) {
push( @{ $cdp_cap{$key} }, $capability );
}
}
}
else {
my @caps = split /\s/, $cap_raw;
push( @{ $cdp_cap{$key} }, @caps );
}
}
return \%cdp_cap;
}
sub cdp_id {
my $cdp = shift;
my $partial = shift;
my $ch = $cdp->cdp_dev_id($partial) || {};
my %cdp_id;
foreach my $key ( sort keys %$ch ) {
my $id = $ch->{$key};
next unless $id;
$id = SNMP::Info::munge_mac($id) || SNMP::Info::munge_null($id);
$cdp_id{$key} = $id;
}
return \%cdp_id;
}
sub cdp_port {
my $cdp = shift;
my $partial = shift;
my $ch = $cdp->cdp_dev_port($partial) || {};
# most devices return a string with the interface name here (Port-ID TLV)
# see https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/cdp/command/cdp-cr-book/cdp-cr-a1.html
# it seems however that some devices report hex encoded mac addresses for this, see
# https://github.com/netdisco/snmp-info/issues/252
# once these bad devices get known we can figure out workarounds for them
my %cdp_port;
foreach my $key ( sort keys %$ch ) {
my $port = $ch->{$key};
next unless $port;
$port = SNMP::Info::munge_null($port);
$cdp_port{$key} = $port;
}
return \%cdp_port;
}
1;
__END__
=head1 NAME
SNMP::Info::CDP - SNMP Interface to Cisco Discovery Protocol (CDP) using SNMP
=head1 AUTHOR
Max Baker
=head1 SYNOPSIS
my $cdp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $cdp->class();
print " Using device sub class : $class\n";
$hascdp = $cdp->hasCDP() ? 'yes' : 'no';
# Print out a map of device ports with CDP neighbors:
my $interfaces = $cdp->interfaces();
my $cdp_if = $cdp->cdp_if();
my $cdp_ip = $cdp->cdp_ip();
my $cdp_port = $cdp->cdp_port();
foreach my $cdp_key (keys %$cdp_ip){
my $iid = $cdp_if->{$cdp_key};
my $port = $interfaces->{$iid};
my $neighbor = $cdp_ip->{$cdp_key};
my $neighbor_port = $cdp_port->{$cdp_key};
print "Port : $port connected to $neighbor / $neighbor_port\n";
}
=head1 DESCRIPTION
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 by Cisco and
several other vendors.
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.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<CISCO-CDP-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=item $cdp->hasCDP()
Is CDP is active in this device?
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. @#%$!
(C<cdpGlobalRun>)
=item $cdp->cdp_interval()
Interval in seconds at which CDP messages are generated.
(C<cdpGlobalMessageInterval>)
=item $cdp->cdp_holdtime()
Time in seconds that CDP messages are kept.
(C<cdpGlobalHoldTime>)
=item $cdp->cdp_gid()
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().
(C<cdpGlobalDeviceId>)
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 CDP CACHE ENTRIES
=over
=item $cdp->cdp_capabilities()
Returns Device Functional Capabilities. Results are munged into an ascii
binary string, MSB. Each digit represents a bit from the table below from
the CDP Capabilities Mapping to Smartport Type table within the
Cisco Small Business 200 Series Smart Switch Administration Guide,
L<http://www.cisco.com/c/en/us/support/switches/small-business-200-series-smart-switches/products-maintenance-guides-list.html>:
(Bit) - Description
=over
=item (0x400) - Two-Port MAC Relay.
=item (0x200) - CAST Phone Port / CVTA / Supports-STP-Dispute depending
upon platform.
=item (0x100) - Remotely-Managed Device.
=item (0x80) - VoIP Phone.
=item (0x40) - Provides level 1 functionality.
=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 (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 (0x02) - Performs level 2 transparent bridging.
=item (0x01) - Performs level 3 routing for at least one network layer
protocol.
=back
Thanks to Martin Lorensen for a pointer to the original information and
CPAN user Alex for updates.
(C<cdpCacheCapabilities>)
=item $cdp->cdp_domain()
Returns remote VTP Management Domain as defined in
C<CISCO-VTP-MIB::managementDomainName>
(C<cdpCacheVTPMgmtDomain>)
=item $cdp->cdp_duplex()
Returns the port duplex status from remote devices.
(C<cdpCacheDuplex>)
=item $cdp->cdp_id()
Returns remote device id string
(C<cdpCacheDeviceId>)
=item $cdp->cdp_if()
Returns the mapping to the SNMP Interface Table.
Note that a lot devices don't implement $cdp->cdp_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 :
# it exists, yay.
my $cdp_index = $device->cdp_index();
return $cdp_index if defined $cdp_index;
# if not, let's fake it
my $cdp_ip = $device->cdp_ip();
my %cdp_if
foreach my $key (keys %$cdp_ip){
$iid = $key;
## Truncate off .1 from cdp response
$iid =~ s/\.\d+$//;
$cdp_if{$key} = $iid;
}
return \%cdp_if;
=item $cdp->cdp_index()
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->cdp_if()
instead.
See cdp_if() entry.
(C<cdpCacheIfIndex>)
=item $cdp->cdp_ip()
If $cdp->cdp_proto() is supported, returns remote IPV4 address only. Otherwise
it will return all addresses.
(C<cdpCacheAddress>)
=item $cdp->cdp_addr()
Returns remote address
(C<cdpCacheAddress>)
=item $cdp->cdp_platform()
Returns remote platform id
(C<cdpCachePlatform>)
=item $cdp->cdp_port()
Returns remote Port-ID. Most of the time this is a string with the port name, but this
is not guaranteed to be so.
(C<cdpCacheDevicePort>)
=item $cdp->cdp_proto()
Returns remote address type received. Usually IP.
(C<cdpCacheAddressType>)
=item $cdp->cdp_ver()
Returns remote hardware version
(C<cdpCacheVersion>)
=item $cdp->cdp_vlan()
Returns the remote interface native VLAN.
(C<cdpCacheNativeVLAN>)
=item $cdp->cdp_power()
Returns the amount of power consumed by remote device in milliwatts munged
for decimal placement.
(C<cdpCachePowerConsumption>)
=item $cdp->cdp_cap()
Returns hash of arrays with each array containing the system capabilities
supported by the remote system. Possible elements in the array are
C<Router>, C<Trans-Bridge>, C<Source-Route-Bridge>, C<Switch>, C<Host>,
C<IGMP>, C<Repeater>, C<VoIP-Phone>, C<Remotely-Managed-Device>,
C<Supports-STP-Dispute>, and C<Two-port Mac Relay>.
=back
=head1 Data Munging Callback Subroutines
=over
=item $cdp->munge_power()
Inserts a decimal at the proper location.
=back
=cut

252
lib/SNMP/Info/CiscoAgg.pm Normal file
View File

@@ -0,0 +1,252 @@
# SNMP::Info::CiscoAgg
#
# Copyright (c) 2019 SNMP::Info Developers
# 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::CiscoAgg;
use strict;
use warnings;
use Exporter;
use SNMP::Info::IEEE802dot3ad;
@SNMP::Info::CiscoAgg::ISA = qw/
SNMP::Info::IEEE802dot3ad
Exporter
/;
@SNMP::Info::CiscoAgg::EXPORT_OK = qw/
agg_ports
agg_ports_cisco
agg_ports_lag
agg_ports_pagp
/;
our ($DEBUG, $VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::IEEE802dot3ad::MIBS,
'CISCO-PAGP-MIB' => 'pagpGroupIfIndex',
'CISCO-LAG-MIB' => 'clagAggPortListPorts',
'CISCO-IF-EXTENSION-MIB' => 'cieIfLastInTime',
);
%GLOBALS = ();
%FUNCS = (
%SNMP::Info::IEEE802dot3ad::FUNCS,
'lag_ports' => 'clagAggPortListPorts',
'lag_members' => 'clagAggPortListInterfaceIndexList',
);
%MUNGE = (
%SNMP::Info::IEEE802dot3ad::MUNGE,
'lag_ports' => \&SNMP::Info::munge_port_list,
'lag_members' => \&munge_port_ifindex,
);
sub munge_port_ifindex {
my $plist = shift;
return unless defined $plist;
return unless length $plist;
my $list = [ map {sprintf "%d", hex($_)} unpack( "(A8)*", join( '' , map { sprintf "%02x", $_} unpack( "(C4)*", $plist ) )) ];
return $list;
}
sub agg_ports_cisco {
my $dev = shift;
my $group = $dev->lag_members;
my $mapping = {};
for my $master (keys %$group) {
my $slaves = $group->{$master};
for my $slave (@$slaves) {
$mapping->{$slave} = $master;
}
}
return $mapping;
}
sub agg_ports_pagp {
my $dev = shift;
# Note that this mapping will miss any interfaces that are down during
# polling. If one of the members is up, we could use
# pagpAdminGroupCapability to figure things out, but if they're all
# down, we're hosed. Since we could be hosed anyway, we skip the fancy
# stuff.
my $mapping = {};
my $group = $dev->pagpGroupIfIndex;
for my $slave (keys %$group) {
my $master = $group->{$slave};
next if($master == 0 || $slave == $master);
$mapping->{$slave} = $master;
}
return $mapping;
}
sub agg_ports_lag {
my $dev = shift;
# same note as for agg_ports_pagp, it will miss mappings if interfaces
# are down or lacp is not synced.
my $mapping = {};
my $group = $dev->dot3adAggPortSelectedAggID;
for my $slave (keys %$group) {
my $master = $group->{$slave};
next if($master == 0 || $slave == $master);
$mapping->{$slave} = $master;
}
return $mapping;
}
# combine PAgP, LAG & Cisco proprietary data
sub agg_ports {
my $ret = {%{agg_ports_pagp(@_)}, %{agg_ports_lag(@_)}, %{agg_ports_cisco(@_)}};
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoAgg - SNMP Interface to Cisco Aggregated Links
=head1 AUTHOR
SNMP::Info Developers
=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
This class provides access to Aggregated Links configuration on Cisco devices.
It combines Cisco PAgP, Cisco proprietary info and IEEE 802.3ad information.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
L<SNMP::Info::IEEE802dot3ad>
=head2 Required MIBs
=over
=item F<CISCO-PAGP-MIB>
=item F<CISCO-LAG-MIB>
=item F<CISCO-IF-EXTENSION-MIB>
=back
=head1 TABLE METHODS
=over 4
=item C<agg_ports>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=item C<agg_ports_cisco>
Implements the cisco LAG info retrieval. Merged into C<agg_ports> data
automatically. Will fetch all members of C<clagAggPortListInterfaceIndexList>
even if they are not running an aggregation protocol.
=item C<agg_ports_pagp>
Implements the PAgP LAG info retrieval. Merged into C<agg_ports> data
automatically.
=item C<lag_members>
Mimics C<ad_lag_ports> from L<SNMP::Info::IEEE802dot3ad> but based on ifindex
instead of instead of bp_index.
=back
=head2 OVERRIDES
=over
=item C<agg_ports_lag>
This will retrieve LAG ports based on C<dot3adAggPortSelectedAggID> data.
It will be merged into C<agg_ports> data.
=back
=head2 Table Methods imported from SNMP::Info::IEEE802dot3ad
=over
See documentation in L<SNMP::Info::IEEE802dot3ad> for details.
=back
=head1 MUNGES
=over
=item C<munge_port_ifindex>
Takes C<clagAggPortListInterfaceIndexList>, uses the index as master port, then
returns all members as ifindex. Works with single or multiple slaves to a master.
=back
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoConfig
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,15 +30,16 @@
package SNMP::Info::CiscoConfig;
use strict;
use warnings;
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/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'CISCO-CONFIG-COPY-MIB' => 'ccCopyTable',
@@ -97,6 +97,10 @@ sub copy_run_tftp {
print "Using new method, row iid: $rand\n" if $ciscoconfig->debug();
#Check each set, delete created row if any fail
unless ( $ciscoconfig->set_config_row_status( 5, $rand ) ) {
$ciscoconfig->error_throw("Initializing config copy instruction failed");
return;
}
unless ( $ciscoconfig->set_config_source_type( 4, $rand ) ) {
$ciscoconfig->error_throw("Setting source type failed");
unless ( $ciscoconfig->set_config_row_status( 6, $rand ) ) {
@@ -275,7 +279,7 @@ Justin Hunter, Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -332,10 +336,6 @@ These are methods that return scalar value from SNMP
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
@@ -431,7 +431,7 @@ Table of Flash copy operation entries.
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.
operations.
=over
@@ -448,7 +448,7 @@ 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')
$ciscoconfig->copy_run_tftp('1.2.3.4', 'myconfig')
or die "Couldn't save config. ",$ciscoconfig->error(1);
=item $ciscoconfig->copy_run_start()

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoPortSecurity
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,19 +30,22 @@
package SNMP::Info::CiscoPortSecurity;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoPortSecurity::ISA = qw/Exporter/;
@SNMP::Info::CiscoPortSecurity::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoPortSecurity::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PAECAPABILITIES/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PAECAPABILITIES);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'CISCO-PORT-SECURITY-MIB' => 'ciscoPortSecurityMIB',
'CISCO-PAE-MIB' => 'ciscoPaeMIB',
'IEEE8021-PAE-MIB' => 'dot1xAuthLastEapolFrameSource',
'CISCO-ERR-DISABLE-MIB' => 'ciscoErrDisableMIB',
);
%GLOBALS = (
@@ -81,37 +83,34 @@ $VERSION = '2.09';
# 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',
# CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry
'cerr_i_cause' => 'cErrDisableIfStatusCause',
);
%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'
1 => 'dot1xPaePortSuppCapable',
);
sub munge_pae_capabilities {
@@ -123,13 +122,29 @@ sub munge_pae_capabilities {
return join( ' ', @vals );
}
# Define a generic method to show the cause for a port to be err-disabled.
# Cisco indexes cErrDisableIfStatusCause by {ifindex,vlan}, but for a more
# generic method, using ifIndex only makes it easier to implement across
# device classes. Besides, several (most?) err-disable features will disable
# the whole interface anyway, and not just a vlan on the interface.
sub i_err_disable_cause {
my $cps = shift;
my $ret;
my $causes = $cps->cerr_i_cause() || {};
foreach my $interfacevlan (keys %$causes) {
my ($iid, $vid) = split(/\./, $interfacevlan);
$ret->{$iid} = $causes->{$interfacevlan};
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::CiscoPortSecurity - SNMP Interface to data from
F<CISCO-PORT-SECURITY-MIB> and F<CISCO-PAE-MIB>
F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and F<CISCO-ERR-DISABLE-MIB>.
=head1 AUTHOR
@@ -137,14 +152,14 @@ Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -153,8 +168,9 @@ Eric Miller
=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.
an interface to the F<CISCO-PORT-SECURITY-MIB>, F<CISCO-PAE-MIB> and
F<CISCO-ERR-DISABLE-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.
@@ -172,16 +188,14 @@ None.
=item F<IEEE8021-PAE-MIB>
=item F<CISCO-ERR-DISABLE-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=back
=head2 F<CISCO-PORT-SECURITY-MIB> globals
=over
@@ -300,10 +314,6 @@ These are methods that return scalar values from SNMP
(C<cpsIfVlanMaxSecureMacAddr>)
=item $cps->cps_i_v()
(C<cpsIfVlanIndex>)
=back
=head2 C<CISCO-PORT-SECURITY-MIB::cpsIfVlanSecureMacAddrTable>
@@ -322,14 +332,6 @@ These are methods that return scalar values from SNMP
(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>
@@ -348,10 +350,6 @@ These are methods that return scalar values from SNMP
(C<cpsSecureMacAddrType>)
=item $cps->cps_m_mac()
(C<cpsSecureMacAddress>)
=back
=head2 C<IEEE8021-PAE-MIB::dot1xPaePortEntry>
@@ -374,6 +372,31 @@ The source MAC address carried in the most recently received EAPOL frame.
=back
=head2 C<CISCO-ERR-DISABLE-MIB::cErrDisableIfStatusEntry>
=over
=item $cps->cerr_i_cause()
C<cErrDisableIfStatusCause>
Indicates the feature/event that caused the {interface, vlan} (or the entire
interface) to be error-disabled.
=back
=head1 METHODS
=over
=item C<i_err_disable_cause>
Returns a HASH reference mapping ifIndex to err-disabled cause. The returned
data is sparse, so if the ifIndex is not present in the return value, the port
is not err-disabled.
=back
=head1 Data Munging Callback Subroutines
=over

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoPower
# $Id$
#
# Copyright (c) 2008 Bill Fenner
# All rights reserved.
@@ -31,24 +30,26 @@
package SNMP::Info::CiscoPower;
use strict;
use warnings;
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/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'CISCO-POWER-ETHERNET-EXT-MIB' => 'cpeExtPsePortEntPhyIndex',
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption' );
'CISCO-CDP-MIB' => 'cdpCachePowerConsumption',
);
%GLOBALS = ();
%FUNCS = (
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
%FUNCS = (
'cpeth_ent_phy' => 'cpeExtPsePortEntPhyIndex',
'peth_port_power' => 'cpeExtPsePortPwrConsumption',
);
%MUNGE = ();
@@ -113,14 +114,14 @@ Bill Fenner
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -153,6 +154,8 @@ Note that it requires that the device inherits from Info::Entity.
=item F<CISCO-POWER-ETHERNET-EXT-MIB>
=item F<CISCO-CDP-MIB>
=back
=head1 GLOBALS
@@ -175,8 +178,8 @@ 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")
(C<cpeExtPsePortPwrConsumption>)
=back
=head2 CDP Port table
@@ -185,8 +188,8 @@ Power supplied by PoE ports, in milliwatts
=item $poe->peth_port_neg_power()
Power negotiated using CDP, in milliwats
("cdpCachePowerConsumption")
Power negotiated using CDP, in milliwatts
(C<cdpCachePowerConsumption>)
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoQOS
# $Id$
#
# Copyright (c) 2005 Alexander Hartmaier
# All rights reserved.
@@ -31,15 +30,16 @@
package SNMP::Info::CiscoQOS;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoQOS::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoQOS::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'CISCO-CLASS-BASED-QOS-MIB' => 'cbQosIfIndex', );
@@ -86,14 +86,14 @@ Alexander Hartmaier
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $qos = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $qos->class();
@@ -101,7 +101,7 @@ Alexander Hartmaier
=head1 DESCRIPTION
SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides
SNMP::Info::CiscoQOS is a subclass of SNMP::Info that provides
information about a cisco device's QoS config.
Use or create in a subclass of SNMP::Info. Do not use directly.
@@ -118,8 +118,6 @@ none.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoRTT
# $Id$
#
# Copyright (c) 2005 Alexander Hartmaier
# All rights reserved.
@@ -31,15 +30,16 @@
package SNMP::Info::CiscoRTT;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoRTT::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoRTT::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'CISCO-RTTMON-MIB' => 'rttMonCtrlAdminOwner', );
@@ -67,14 +67,14 @@ Alexander Hartmaier
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $rtt = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $rtt->class();
@@ -82,7 +82,7 @@ Alexander Hartmaier
=head1 DESCRIPTION
SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides
SNMP::Info::CiscoRTT is a subclass of SNMP::Info that provides
information about a cisco device's RTT values.
Use or create in a subclass of SNMP::Info. Do not use directly.
@@ -99,8 +99,6 @@ none.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over
@@ -113,7 +111,7 @@ None
=head2 Overall Control Group Table
This table is from C<CISCO-RTTMAN-MIB::rttMonCtrlAdminTable>
This table is from C<CISCO-RTTMON-MIB::rttMonCtrlAdminTable>
=over

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoStack
# $Id$
#
# Copyright (c) 2008 Max Baker
# All rights reserved.
@@ -31,15 +30,15 @@
package SNMP::Info::CiscoStack;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoStack::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoStack::ISA = qw/Exporter/;
@SNMP::Info::CiscoStack::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'CISCO-STACK-MIB' => 'ciscoStackMIB', );
@@ -107,7 +106,7 @@ $VERSION = '2.09';
1 => 'other',
2 => 'ok',
3 => 'minorFault',
4 => 'majorFault'
4 => 'majorFault',
);
# Changes binary byte describing each port into ascii, and returns
@@ -195,7 +194,7 @@ sub i_duplex_admin {
next if ( defined $partial and $iid !~ /^$partial$/ );
# Test for gigabit
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 1 ) {
if ( defined $p_duplex_cap->{$port} and $p_duplex_cap->{$port} == 0 ) {
$i_duplex_admin->{$iid} = 'full';
}
@@ -215,9 +214,8 @@ sub i_speed_admin {
my $partial = shift;
my %i_speed_admin;
my $p_port = $stack->p_port() || {};
my %mapping = reverse %$p_port;
my $p_speed = $stack->p_speed( $mapping{$partial} );
my $p_port = $stack->p_port() || {};
my $p_speed = $stack->p_speed() || {};
my %speeds = (
'autoDetect' => 'auto',
@@ -288,8 +286,7 @@ __END__
=head1 NAME
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB> and
F<CISCO-PORT-SECURITY-MIB>
SNMP::Info::CiscoStack - SNMP Interface to data from F<CISCO-STACK-MIB>
=head1 AUTHOR
@@ -297,17 +294,17 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ciscostats = new SNMP::Info(
# Let SNMP::Info determine the correct subclass for you.
my $ciscostack = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $ciscostats->class();
my $class = $ciscostack->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
@@ -388,7 +385,7 @@ Returns a map to IID for ports that are physical ports, not vlans, etc.
=item $stack->i_type()
Crosses p_port() with p_type() and returns the results.
Crosses p_port() with p_type() and returns the results.
Overrides with C<ifType> if p_type() isn't available.
@@ -427,7 +424,7 @@ C<portAdminSpeed>
Example:
my %if_map = reverse %{$stack->interfaces()};
$stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
$stack->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port speed. ",$stack->error(1);
=item $stack->set_i_duplex_admin(duplex, ifIndex)
@@ -441,7 +438,7 @@ C<portAdminSpeed>
Example:
my %if_map = reverse %{$stack->interfaces()};
$stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
$stack->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port duplex. ",$stack->error(1);
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoStats
# $Id$
#
# Changes since Version 0.7 Copyright (c) 2008-2009 Max Baker and SNMP::Info Developers
# All rights reserved.
@@ -34,23 +33,25 @@
package SNMP::Info::CiscoStats;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoStats::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoStats::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'SNMPv2-MIB' => 'sysDescr',
'CISCO-PROCESS-MIB' => 'cpmCPUTotal5sec',
'CISCO-MEMORY-POOL-MIB' => 'ciscoMemoryPoolUsed',
'OLD-CISCO-SYSTEM-MIB' => 'writeMem',
'CISCO-PRODUCTS-MIB' => 'sysName',
'CISCO-PRODUCTS-MIB' => 'ciscoIGS',
'ENTITY-MIB' => 'entPhysicalSoftwareRev',
'CISCO-IMAGE-MIB' => 'ciscoImageString',
# some older catalysts live here
'CISCO-STACK-MIB' => 'wsc1900sysID',
@@ -87,6 +88,9 @@ $VERSION = '2.09';
# CISCO-FLASH-MIB::ciscoFlashDeviceTable
'cisco_flash_size' => 'ciscoFlashDeviceSize',
# CISCO-IMAGE-MIB
'ci_images' => 'ciscoImageString',
);
%MUNGE = ();
@@ -100,13 +104,20 @@ sub os {
my $descr = $l2->description() || '';
# order here matters - there are Catalysts that run IOS and have catalyst
# in their description field.
# in their description field, as well as Catalysts that run IOS-XE.
return 'ios-xe' if ( $descr =~ /Denali/ );
return 'ios-xe' if ( $descr =~ /Fuji/ );
return 'ios-xe' if ( $descr =~ /Everest/ );
return 'ios-xe' if ( $descr =~ /Gibraltar/ );
return 'ios-xe' if ( $descr =~ /IOS-XE/ );
return 'ios-xr' if ( $descr =~ /IOS XR/ );
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/ );
return 'san-os' if ( $descr =~ /Cisco SAN-OS/ );
if ( $descr =~ /Application Control Engine Service Module/ ) {
# Only the admin context implements the entity MIB
@@ -195,6 +206,13 @@ sub os_ver {
return $1;
}
if ( defined $os
and $os eq 'ios-xr'
and defined $descr
and $descr =~ m/Version (\d+[\.\d]+)/ )
{
return $1;
}
# Newer Catalysts and IOS devices
if ( defined $descr
@@ -203,6 +221,15 @@ sub os_ver {
return $1;
}
# Generic fallback: try to determine running image from CISCO-IMAGE-MIB
my $image_info = $l2->ciscoImageString() || {};
foreach my $row (keys %$image_info) {
my $info_string = $image_info->{$row};
if ($info_string =~ /CW_VERSION\$([^\$]+)\$/) {
return $1;
}
}
return;
}
@@ -311,7 +338,7 @@ Eric Miller, Max Baker, Sam Stickland
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $ciscostats = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
@@ -319,7 +346,7 @@ Eric Miller, Max Baker, Sam Stickland
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $ciscostats->class();
@@ -328,7 +355,7 @@ Eric Miller, Max Baker, Sam Stickland
=head1 DESCRIPTION
SNMP::Info::CiscoStats is a subclass of SNMP::Info that provides cpu, memory,
os and version information about Cisco Devices.
os and version information about Cisco Devices.
Use or create in a subclass of SNMP::Info. Do not use directly.
@@ -358,9 +385,9 @@ None.
=item F<ENTITY-MIB>
=back
=item F<CISCO-IMAGE-MIB>
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=back
=head1 GLOBALS
@@ -388,64 +415,41 @@ Returns mem_free() + mem_used()
=item $ciscostats->os()
Tries to parse if device is running IOS or CatOS from description()
Tries to parse if device is running 'IOS', 'CatOS', 'IOS-XE' or something else
from description()
Available values :
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
'ios' for Cisco IOS
'ios-xe' for Cisco IOS XE
'ios-xr' for Cisco IOS XR
'pix' for Cisco PIX
'asa' for Cisco ASA
'fwsm' for Single-mode FWSM
'fwsm-admin' for Admin context of multi-context FWSM
'fwsm-context' for Standard context of multi-context FWSM
'ace-admin' for Admin context of ACE module
'ace-context' for Standard context of ACE module (NB: No OS version
detection is available, but will be the same as it's
'ace admin')
'css' for Cisco Content Switch
'css-sca' for Cisco Content Switch Secure Content Acceleration
'san-os' for Cisco SAN-OS
=item $ciscostats->os_ver()
Tries to parse device operating system version from description()
Tries to parse device operating system version from description(), falls back
to parsing C<CISCO-IMAGE-MIB::ciscoImageString> if needed
=item $ciscostats->os_bin()
Tries to parse ROMMON version from rom_id() string
Tries to parse C<ROMMON> version from rom_id() string
=item $ciscostats->ios_cpu()
Current CPU usage in percent.
C<1.3.6.1.4.1.9.2.1.56.0> =
C<1.3.6.1.4.1.9.2.1.56.0> =
C<OLD-CISCO-CPU-MIB:avgBusyPer>
=item $ciscostats->ios_cpu_1min()
@@ -540,4 +544,16 @@ zero if the device has been removed.
=back
=head2 Cisco Image Table (C<ciscoImageTable>)
=over
=item $ci->ci_images()
Returns the table of image strings.
C<ciscoImageString>
=back
=cut

View File

@@ -1,41 +1,43 @@
# SNMP::Info::CiscoStpExtensions
#
# Copyright (c)2009 Carlos Vicente
# All rights reserved.
# 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 the
# names of its contributors may be used to endorse or promote products
# * 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
# 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;
# (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
# 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 warnings;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use vars qw/$VERSION $DEBUG %MIBS %FUNCS %GLOBALS %MUNGE %PORTSTAT $INIT/;
$VERSION = '2.09';
our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, %PORTSTAT, $INIT);
$VERSION = '3.74';
@SNMP::Info::CiscoStpExtensions::ISA = qw/SNMP::Info::Bridge SNMP::Info Exporter/;
@SNMP::Info::CiscoStpExtensions::EXPORT_OK = qw//;
@@ -52,12 +54,15 @@ $VERSION = '2.09';
'stpx_stp_type' => 'stpxSpanningTreeType',
'stpx_bpduguard_enable' => 'stpxFastStartBpduGuardEnable',
'stpx_bpdufilter_enable' => 'stpxFastStartBpduFilterEnable',
'stpx_faststart_default' => 'stpxFastStartGlobalDefaultMode',
);
%FUNCS = (
%SNMP::Info::Bridge::FUNCS,
'stpx_rootguard_enabled' => 'stpxRootGuardConfigEnabled',
'stpx_loopguard_enabled' => 'stpxLoopGuardConfigEnabled',
'stpx_faststart_enabled' => 'stpxFastStartPortEnable',
'stpx_faststart_operational' => 'stpxFastStartPortMode',
'stpx_port_bpduguard_mode' => 'stpxFastStartPortBpduGuardMode',
'stpx_port_bpdufilter_mode' => 'stpxFastStartPortBpduFilterMode',
'stpx_smst_root' => 'stpxSMSTInstanceCISTRegionalRoot',
@@ -67,7 +72,7 @@ $VERSION = '2.09';
%MUNGE = (
%SNMP::Info::Bridge::MUNGE,
'stpx_mst_config_digest' => \&SNMP::Info::CiscoStpExtensions::oct2str,
'stpx_mst_config_digest' => \&SNMP::Info::CiscoStpExtensions::oct2str,
);
@@ -75,7 +80,7 @@ $VERSION = '2.09';
sub stp_ver {
my $self = shift;
my $stp_ver = $self->SUPER::stp_ver();
if ( $stp_ver eq 'unknown' ){
if ( !defined($stp_ver) || $stp_ver eq 'unknown' ){
if ( defined $self->stpx_stp_type() ){
$stp_ver = $self->stpx_stp_type();
}
@@ -101,11 +106,11 @@ sub 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;
@@ -135,7 +140,7 @@ sub mst_vlan2instance {
$res{$vlan} = $inst;
last;
}
}
}
}
}
return \%res;
@@ -157,7 +162,7 @@ sub i_rootguard_enabled {
$res{$iid} = $enabled;
}
return \%res;
}
}
sub i_loopguard_enabled {
my $self = shift;
@@ -175,7 +180,7 @@ sub i_loopguard_enabled {
$res{$iid} = $enabled;
}
return \%res;
}
}
sub i_bpduguard_enabled {
my $self = shift;
@@ -184,7 +189,7 @@ sub i_bpduguard_enabled {
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};
@@ -207,7 +212,7 @@ sub i_bpdufilter_enabled {
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};
@@ -223,6 +228,36 @@ sub i_bpdufilter_enabled {
return \%res;
}
sub i_faststart_enabled {
my $self = shift;
my $partial = shift;
my $faststart_default = $self->stpx_faststart_default();
my $bp_index = $self->bp_index($partial);
my $faststart = $self->stpx_faststart_enabled();
my $faststart_oper = $self->stpx_faststart_operational();
my %res;
# stpxFastStartPortEnable is deprecated in favour of stpxFastStartPortMode
# see https://github.com/netdisco/netdisco/issues/12
foreach my $index ( keys %$faststart, keys %$faststart_oper ){
my $mode = $faststart_oper->{$index} || $faststart->{$index};
my $iid = $bp_index->{$index};
next unless defined $iid;
next unless defined $mode;
if ( $mode eq 'default' ){
$res{$iid} = $faststart_default;
}else{
$res{$iid} = $mode;
}
$res{$iid} = 'enable' if $res{$iid} eq 'true';
$res{$iid} = 'disable' if $res{$iid} eq 'false';
$res{$iid} = 1 if $res{$iid} =~ m/enable/i; # enableForTrunk
$res{$iid} = 0 if $res{$iid} eq 'disable';
}
return \%res;
}
sub oct2str {
my ($v) = @_;
@@ -242,12 +277,25 @@ Carlos Vicente
=head1 SYNOPSIS
my $stpx = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $stpx->class();
print " Using device sub class : $class\n";
=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
For debugging you can call new() directly as you would in SNMP::Info
my $stpx = new SNMP::Info::CiscoStpExtensions(...);
@@ -255,15 +303,21 @@ For debugging you can call new() directly as you would in SNMP::Info
=over
=item SNMP::Info
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::Bridge
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head2 Required MIBs
=head1 GLOBAL METHODS
=over
=item F<CISCO-STP-EXTENSIONS-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
@@ -271,7 +325,7 @@ These are methods that return scalar values from SNMP
=item $stpx->stp_ver()
Returns the particular STP version running on this device.
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>
@@ -289,25 +343,25 @@ to a hash.
=item $stpx->mst_config_digest()
Returns the Multiple Spanning Tree (MST) configuration digest
Returns the Multiple Spanning Tree (MST) configuration digest
(C<stpxSMSTConfigDigest>)
=item $stpx->mst_region_name()
Returns the Multiple Spanning Tree (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
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
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()
@@ -338,6 +392,13 @@ Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxFastStartBpduFilterEnable>)
=item $stpx->i_faststart_enabled()
Returns 1 or 0 depending on whether FastStart (aka PortFast) is enabled on a
given port. Format is a hash reference with key = C<ifIndex>, value = [1|0]
(C<stpxFastStartPortEnable> and C<stpxFastStartPortMode>)
=back
=head1 MUNGES

View File

@@ -1,5 +1,4 @@
# SNMP::Info::CiscoVTP
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::CiscoVTP;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::CiscoVTP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::CiscoVTP::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'CISCO-VTP-MIB' => 'vtpVlanName',
@@ -61,7 +61,6 @@ $VERSION = '2.09';
%FUNCS = (
# CISCO-VTP-MIB::managementDomainTable
'vtp_d_index' => 'managementDomainIndex',
'vtp_d_name' => 'managementDomainName',
'vtp_d_mode' => 'managementDomainLocalMode',
'vtp_d_rev' => 'managementDomainConfigRevNumber',
@@ -149,6 +148,7 @@ sub i_vlan {
my $port_vlan = $vtp->vtp_trunk_native($partial) || {};
my $i_vlan = $vtp->i_vlan2($partial) || {};
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
my %i_vlans;
@@ -165,15 +165,23 @@ sub i_vlan {
foreach my $port ( keys %$port_vlan ) {
my $vlan = $port_vlan->{$port};
next unless defined $vlan;
# ports up and trunking should have a trunking status
my $stat = $trunk_dyn_stat->{$port};
if ( defined $stat and $stat =~ /^trunking/ ) {
# vtp_trunk_dyn_stat is not useful for down ports
# so we use vtp_trunk_dyn to see if trunking is set
my $dyn = $trunk_dyn->{$port};
if (($stat and $stat =~ /^trunking/ )
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))))
{
$i_vlans{$port} = $vlan;
}
}
# Check in CISCO-VLAN-IFTABLE-RELATION-MIB
# Is this only for Aironet??? If so, it needs
# to be removed from this class
# Used for traditional Cisco Routers and Aironet
my $v_cvi_if = $vtp->v_cvi_if();
if ( defined $v_cvi_if ) {
@@ -191,6 +199,22 @@ sub i_vlan {
return \%i_vlans;
}
sub i_untagged {
my $vtp = shift;
my ( $ifindex ) = @_;
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
# so we use vtp_trunk_dyn as a hint to use i_pvid
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
return $vtp->i_pvid(@_);
}
else {
return $vtp->i_vlan(@_);
}
}
sub i_vlan_membership {
my $vtp = shift;
my $partial = shift;
@@ -202,6 +226,8 @@ sub i_vlan_membership {
my $vtp_vlans = $vtp->v_state();
my $i_vlan = $vtp->i_vlan2($partial) || {};
my $trunk_dyn_stat = $vtp->vtp_trunk_dyn_stat($partial) || {};
my $trunk_dyn = $vtp->vtp_trunk_dyn($partial) || {};
my $i_voice_vlan = $vtp->i_voice_vlan($partial) || {};
my $i_vlan_membership = {};
@@ -209,14 +235,24 @@ sub i_vlan_membership {
foreach my $port ( keys %$i_vlan ) {
my $vlan = $i_vlan->{$port};
next unless defined $vlan;
my $stat = $trunk_dyn_stat->{$port};
if ( defined $stat and $stat =~ /notTrunking/ ) {
my $dyn = $trunk_dyn->{$port};
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
}
# Get voice VLANs
foreach my $port ( keys %$i_voice_vlan ) {
my $vlan = $i_voice_vlan->{$port};
next unless defined $vlan;
next unless ($vlan =~ m/[[:digit:]]+/ and $vlan < 4095);
my $dyn = $trunk_dyn->{$port};
unless ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate'))) {
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
}
# Get trunk ports
my %oper_vlans;
foreach my $iid ( keys %$vtp_vlans ) {
my $vlan = 0;
@@ -233,7 +269,9 @@ sub i_vlan_membership {
foreach my $port ( keys %$ports_vlans ) {
my $stat = $trunk_dyn_stat->{$port};
if ( defined $stat and $stat =~ /^trunking/ ) {
my $dyn = $trunk_dyn->{$port};
if (($stat and $stat =~ /^trunking/ )
or ($dyn and (($dyn eq 'on') or ($dyn eq 'onNoNegotiate')))) {
my $k = 0;
my $list1 = $ports_vlans->{$port} || '0';
my $list2 = $ports_vlans_2k->{$port} || '0';
@@ -255,6 +293,20 @@ sub i_vlan_membership {
return $i_vlan_membership;
}
sub i_vlan_membership_untagged {
my $vtp = shift;
my $partial = shift;
my $vlans = $vtp->i_vlan($partial);
my $i_vlan_membership = {};
foreach my $port (keys %$vlans) {
my $vlan = $vlans->{$port};
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
return $i_vlan_membership;
}
sub set_i_pvid {
my $vtp = shift;
my ( $vlan_id, $ifindex ) = @_;
@@ -306,6 +358,22 @@ sub set_i_vlan {
return;
}
sub set_i_untagged {
my $vtp = shift;
my ( $vlan_id, $ifindex ) = @_;
# cannot defer to i_vlan - vtp_trunk_dyn_stat is not useful for down ports
# so we use vtp_trunk_dyn as a hint to use i_pvid
my $trunking = eval { $vtp->vtp_trunk_dyn($ifindex)->{$ifindex} };
if ($trunking and (($trunking eq 'on') or ($trunking eq 'onNoNegotiate'))) {
return $vtp->set_i_pvid(@_);
}
else {
return $vtp->set_i_vlan(@_);
}
}
sub set_add_i_vlan_tagged {
my $vtp = shift;
my ( $vlan_id, $ifindex ) = @_;
@@ -461,14 +529,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $vtp = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $vtp->class();
@@ -476,7 +544,7 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides
SNMP::Info::CiscoVTP is a subclass of SNMP::Info that provides
information about a Cisco device's VLAN and VTP Domain membership.
Use or create in a subclass of SNMP::Info. Do not use directly.
@@ -497,8 +565,6 @@ None.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
=over
@@ -540,6 +606,10 @@ Your device will only implement a subset of these methods.
Returns a mapping between C<ifIndex> and assigned VLAN ID for access ports
and the default VLAN ID for trunk ports.
=item $vtp->i_untagged()
An alias for C<i_vlan>.
=item $vtp->i_vlan_membership()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
@@ -548,13 +618,19 @@ IDs. These are the VLANs which are members of enabled VLAN list for the port.
Example:
my $interfaces = $vtp->interfaces();
my $vlans = $vtp->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 $vtp->i_vlan_membership_untagged()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the untagged egress list for
the port.
=back
=head2 VLAN Table (C<CISCO-VTP-MIB::vtpVlanTable>)
@@ -644,7 +720,7 @@ for a good treaty of how to connect to the VLANs
=item $vtp->i_vlan_type()
Static, Dynamic, or multiVlan.
Static, Dynamic, or multiVlan.
(C<vmVlanType>)
@@ -691,7 +767,7 @@ Each bit represents a VLAN. This is 3072 through 4095
=over
=item $vtp->i_voice_vlan()
=item $vtp->i_voice_vlan()
(C<vmVoiceVlanId>)
@@ -701,10 +777,6 @@ Each bit represents a VLAN. This is 3072 through 4095
=over
=item $vtp->vtp_d_index()
(C<managementDomainIndex>)
=item $vtp->vtp_d_name()
(C<managementDomainName>)
@@ -810,7 +882,7 @@ Each bit represents a VLAN. This is 3072 through 4095
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.
operations.
=over
@@ -822,7 +894,7 @@ VLAN ID and port C<ifIndex>. This method should only be used on end station
Example:
my %if_map = reverse %{$vtp->interfaces()};
$vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})
$vtp->set_i_vlan('2', $if_map{'FastEthernet0/1'})
or die "Couldn't change port VLAN. ",$vtp->error(1);
=item $vtp->set_i_pvid ( pvid, ifIndex )
@@ -832,9 +904,15 @@ port C<ifIndex>. This method should only be used on trunk ports.
Example:
my %if_map = reverse %{$vtp->interfaces()};
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
$vtp->set_i_pvid('2', $if_map{'FastEthernet0/1'})
or die "Couldn't change port default VLAN. ",$vtp->error(1);
=item $vtp->set_i_untagged ( vlan, ifIndex )
This method attempts to work out whether the port referenced by ifIndex is
trunking, and if so will return the value of C<set_i_pvid>. Otherwise, the
value of C<set_i_vlan> is returned.
=item $vtp->set_add_i_vlan_tagged ( vlan, ifIndex )
Adds the VLAN to the enabled VLANs list of the port, must be supplied with the
@@ -842,7 +920,7 @@ numeric VLAN ID and port C<ifIndex>.
Example:
my %if_map = reverse %{$vtp->interfaces()};
$vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
$vtp->set_add_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
or die "Couldn't add port to egress list. ",$vtp->error(1);
=item $vtp->set_remove_i_vlan_tagged ( vlan, ifIndex )
@@ -852,7 +930,7 @@ with the numeric VLAN ID and port C<ifIndex>.
Example:
my %if_map = reverse %{$vtp->interfaces()};
$vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
$vtp->set_remove_i_vlan_tagged('2', $if_map{'FastEthernet0/1'})
or die "Couldn't add port to egress list. ",$vtp->error(1);
=back

126
lib/SNMP/Info/DocsisCM.pm Normal file
View File

@@ -0,0 +1,126 @@
# SNMP::Info::DocsisCM - SNMP Interface to DOCSIS Cable Modems
#
# Copyright (c) 2019 by The Netdisco Developer Team.
#
# 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::DocsisCM;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::DocsisCM::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::DocsisCM::EXPORT_OK = qw//;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE
);
sub vendor {
my $cm = shift;
my $descr = $cm->description();
return $1 if $descr =~ /VENDOR: (.*?);/;
}
sub model {
my $cm = shift;
my $descr = $cm->description();
return $1 if $descr =~ /MODEL: (.*?)>>/;
}
sub os {
return "CM";
}
sub os_ver {
my $cm = shift;
my $descr = $cm->description();
return $1 if $descr =~ /SW_REV: (.*?);/;
}
1;
__END__
=head1 NAME
SNMP::Info::DocsisCM - SNMP Interface for DOCSIS Cable Modems
=head1 DESCRIPTION
SNMP::Info::DocsisCM is a subclass of SNMP::Info that provides info
about a given cable modem. Extracts data from the sysDescr, which is
mandated in the DOCSIS specification to match
"HW_REV: <value>; VENDOR: <value>; BOOTR: <value>; SW_REV: <value>; MODEL: <value>"
=head2 Inherited Classes
None.
=head2 Required MIBs
None.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $cm->vendor()
Returns the vendor of the cable modem.
=item $cm->model()
Returns the model of the cable modem.
=item $cm->os()
Returns 'cm', as the actual os is vendor and model dependent.
=item $cm->os_ver()
Returns the version of the software, extracted from the SW_REV field.
=back

124
lib/SNMP/Info/DocsisHE.pm Normal file
View File

@@ -0,0 +1,124 @@
package SNMP::Info::DocsisHE;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::DocsisHE::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::DocsisHE::EXPORT_OK = qw//;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
'DOCS-IF3-MIB' => 'docsIf3Mib',
'DOCS-IF-MIB' => 'docsIfMib',
);
%GLOBALS = ();
%FUNCS = (
# DOCSIS 3.0 (DOCS-IF3-MIB) from CableLabs
'docs_if3_cmts_cm_status_md_if_index'=> 'docsIf3CmtsCmRegStatusMdIfIndex',
# DOCSIS (1.1, etc) from IETF
'docs_if_cmts_cm_status_inet_address_type' => 'docsIfCmtsCmStatusInetAddressType',
'docs_if_cmts_cm_status_inet_address' => 'docsIfCmtsCmStatusInetAddress',
'docs_cmts_cm_down_channel_if_index' => 'docsIfCmtsCmStatusDownChannelIfIndex',
'docs_cmts_cm_up_channel_if_index' => 'docsIfCmtsCmStatusUpChannelIfIndex',
);
%MUNGE = ();
1;
__END__
=head1 NAME
SNMP::Info::DocsisHE - SNMP Interface for F<DOCS-IF-MIB> and F<DOCS-IF3-MIB>
=head1 AUTHOR
Ryan Gasik
=head1 SYNOPSIS
my $cmts = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'cmts',
Community => 'public',
Version => 2
);
# Get a list of modems off the DOCSIS CMTS
my $modems = $cmts->docs_if_cmts_cm_status_inet_address()
=head1 DESCRIPTION
SNMP::Info::DocsisHE is a subclass of SNMP::Info that provides information
about the cable modems of a DOCSIS CMTS.
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<DOCS-IF-MIB>
Standard IETF MIBs for DOCSIS 1.1
=item F<DOCS-IF3-MIB>
CableLabs MIBs for DOCSIS 3
=back
=head1 GLOBALS
None.
=head1 TABLE METHODS
=over
=item $info->docs_if3_cmts_cm_status_md_if_index()
Returns reference to hash of the IfIndex associated with each cable modem.
(C<docsIf3CmtsCmRegStatusMdIfIndex>)
=item $info->docs_if_cmts_cm_status_inet_address_type()
Returns reference to hash of the type of IP address (ie, IPv4, IPv6)
associated with each cable modem
(C<docsIfCmtsCmStatusInetAddressType>)
=item $info->docs_if_cmts_cm_status_inet_address()
Returns reference to hash of the IP address associated with each
cable modem.
(C<docsIfCmtsCmStatusInetAddress>)
=item $info->docs_cmts_cm_down_channel_if_index()
Returns reference to hash of the IfIndex of the down channel
(for DOCSIS 1.1) or a down channel (DOCSIS 3+) associated with each
cable modem.
(C<docsIfCmtsCmStatusDownChannelIfIndex>)
=item $info->docs_cmts_cm_up_channel_if_index()
Returns reference to hash of the IfIndex of the up channel
(for DOCSIS 1.1) or a up channel (DOCSIS 3+) associated with each
cable modem.
(C<docsIfCmtsCmStatusUpChannelIfIndex>)
=back
=cut

View File

@@ -31,15 +31,16 @@
package SNMP::Info::EDP;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::LLDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::LLDP::EXPORT_OK = qw//;
@SNMP::Info::EDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::EDP::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'EXTREME-EDP-MIB' => 'extremeEdpPortIfIndex',
@@ -64,7 +65,7 @@ sub hasEDP {
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
return 1 if ( scalar( keys %$edp_ip ) );
return;
}
@@ -75,12 +76,12 @@ sub hasEDP {
# address since they should all originate from the same device, but we don't
# know if they would all be reachable from the network management application.
#
# We don't inplement partials since this is private index function
# We don't implement partials since this is private index function
sub _edp_index {
my $edp = shift;
my $edp_ip = $edp->extremeEdpNeighborVlanIpAddress() || {};
my %edp_index;
foreach my $key ( keys %$edp_ip ) {
my $ip = $edp_ip->{$key};
@@ -103,7 +104,7 @@ sub edp_if {
$iid = $1 if $iid =~ /^(\d+)\./;
$edp_if{$key} = $iid;
}
return \%edp_if;
}
@@ -193,10 +194,10 @@ Eric Miller
=head1 SYNOPSIS
my $edp = new SNMP::Info (
my $edp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
DestHost => 'router',
Community => 'public',
Version => 2
);
@@ -204,10 +205,10 @@ Eric Miller
my $class = $edp->class();
print " Using device sub class : $class\n";
$haslldp = $edp->hasLLDP() ? 'yes' : 'no';
$hasedp = $edp->hasEDP() ? 'yes' : 'no';
# Print out a map of device ports with LLDP neighbors:
my $interfaces = $edp->interfaces();
# Print out a map of device ports with EDP neighbors:
my $interfaces = $edp->interfaces();
my $edp_if = $edp->edp_if();
my $edp_ip = $edp->edp_ip();
my $edp_port = $edp->edp_port();
@@ -222,7 +223,7 @@ Eric Miller
=head1 DESCRIPTION
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
SNMP::Info::EDP is a subclass of SNMP::Info that provides an object oriented
interface to EDP information through SNMP.
EDP is a Layer 2 protocol that allows a network device to advertise its
@@ -243,7 +244,7 @@ None.
=back
=head1 GLOBAL METHODS
=head1 GLOBALS
These are methods that return scalar values from SNMP
@@ -251,7 +252,7 @@ These are methods that return scalar values from SNMP
=item $edp->hasEDP()
Is EDP is active in this device?
Is EDP active on this device?
=back
@@ -285,7 +286,7 @@ Returns remote port ID
Returns the operating system version of the remote system.
Nulls are removed before the value is returned.
Nulls are removed before the value is returned.
(C<extremeEdpNeighborSoftwareVersion>)

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Entity
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::Entity;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::Entity::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Entity::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'ENTITY-MIB' => 'entPhysicalSerialNum' );
@@ -75,7 +75,7 @@ sub e_index {
my $entity = shift;
my $partial = shift;
# Force use of MIB leaf to avoid inheritance issues in psuedo classes
# Force use of MIB leaf to avoid inheritance issues in pseudo classes
my $e_descr = $entity->entPhysicalDescr($partial);
return unless ($e_descr);
@@ -109,6 +109,57 @@ sub e_port {
return \%e_port;
}
sub entity_derived_serial {
my $entity = shift;
my $e_parent = $entity->e_parent() || {};
my $e_class = $entity->e_class() || {};
# Sort keys to return a consistent result between runs
foreach my $iid ( sort keys %$e_parent ) {
my $parent = $e_parent->{$iid};
my $class = $e_class->{$iid} || '';
# Only consider serial numbers for entries without a parent, or
# if they are of type "chassis"
if ( $parent eq '0' or $class eq 'chassis') {
my $serial = $entity->e_serial($iid);
if ( $serial && $serial->{$iid} ) {
return $serial->{$iid};
}
else {
my $descr = $entity->e_descr($iid);
if ( $descr and $descr->{$iid} =~ /serial#?:\s*([a-z0-9]+)/i )
{
return $1;
}
}
}
}
return;
}
sub entity_derived_os_ver {
my $entity = shift;
my $e_parent = $entity->e_parent() || {};
my $e_class = $entity->e_class() || {};
# Sort keys to return a consistent result between runs
foreach my $iid ( sort keys %$e_parent ) {
my $parent = $e_parent->{$iid};
my $class = $e_class->{$iid} || '';
# Only consider serial numbers for entries without a parent, or
# if they are of type "chassis"
if ( $parent eq '0' or $class eq 'chassis') {
my $os_ver = $entity->e_swver($iid);
if ( $os_ver && $os_ver->{$iid} ) {
return $os_ver->{$iid};
}
}
}
return;
}
1;
__END__
@@ -123,14 +174,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $entity = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $entity->class();
@@ -138,7 +189,7 @@ Max Baker
=head1 DESCRIPTION
F<ENTITY-MIB> is used by Layer 2 devices from HP, Aironet, Foundry, Cisco,
F<ENTITY-MIB> is used by Layer 2 devices from Brocade, Cisco, HP,
and more.
See RFC 2737 for full details.
@@ -162,8 +213,6 @@ none.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
none.
@@ -173,6 +222,23 @@ none.
These are methods that return tables of information in the form of a reference
to a hash.
=over
=item $entity->entity_derived_serial()
Tries to determine the device serial number from the F<ENTITY-MIB>. Only
considers serial numbers for entries without a parent, or if they are of type
chassis. Looks at C<entPhysicalSerialNum> and then C<entPhysicalDescr> for
serial number.
=item $entity->entity_derived_os_ver()
Tries to determine the device OS version from the F<ENTITY-MIB>. Only
considers serial numbers for entries without a parent, or if they are of type
chassis. Looks at C<entPhysicalSoftwareRev> for the version.
=back
=head2 Entity Table
=over

View File

@@ -1,5 +1,4 @@
# SNMP::Info::EtherLike
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::EtherLike;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::EtherLike::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::EtherLike::EXPORT_OK = qw//;
use vars qw/$VERSION %MIBS %FUNCS %GLOBALS %MUNGE/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'EtherLike-MIB' => 'etherMIB' );
@@ -68,8 +68,7 @@ $VERSION = '2.09';
'el_xmit_defer' => 'dot3StatsDeferredTransmissions',
# Ethernet-like Collision Statistics Group
'el_coll_count' => 'dot3CollCount',
'el_coll_freq' => 'dot3CollFrequencies'
'el_coll_freq' => 'dot3CollFrequencies',
);
%MUNGE = ( %SNMP::Info::MUNGE, 'el_duplex' => \&munge_el_duplex, );
@@ -96,22 +95,22 @@ Max Baker
=head1 SYNOPSIS
my $el = new SNMP::Info (
my $el = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
DestHost => 'router',
Community => 'public',
Version => 2
);
my $class = $cdp->class();
my $class = $el->class();
print " Using device sub class : $class\n";
# 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();
my $el_duplex = $el->el_duplex();
foreach my $el_port (keys %$el_duplex){
my $duplex = $el_duplex->{$el_port};
@@ -123,7 +122,7 @@ Max Baker
=head1 DESCRIPTION
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
SNMP::Info::EtherLike is a subclass of SNMP::Info that supplies
access to the F<ETHERLIKE-MIB> used by some Layer 3 Devices such as
Cisco routers.
@@ -134,7 +133,7 @@ directly.
=head2 Inherited Classes
None.
None.
=head2 Required MIBs
@@ -144,8 +143,6 @@ None.
=back
MIBs can be found at ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
=head1 GLOBALS
These are methods that return scalar values from SNMP

View File

@@ -1,5 +1,4 @@
# SNMP::Info::FDP
# $Id$
#
# Copyright (c) 2008 Bruce Rodger, Max Baker
# All rights reserved.
@@ -34,54 +33,44 @@
package SNMP::Info::FDP;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::FDP::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::FDP::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%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',
'fdp_proto' => 'snFdpCacheAddressType',
'fdp_ip' => 'snFdpCacheAddress',
'fdp_ver' => 'snFdpCacheVersion',
'fdp_id' => 'snFdpCacheDeviceId',
'fdp_port' => 'snFdpCacheDevicePort',
'fdp_platform' => 'snFdpCachePlatform',
'fdp_capabilities' => 'snFdpCacheCapabilities',
'fdp_cache_type' => 'snFdpCacheVendorId',
);
%MUNGE = (
'c_capabilities' => \&SNMP::Info::munge_caps,
'c_ip' => \&SNMP::Info::munge_ip
'fdp_capabilities' => \&SNMP::Info::munge_bits,
'fdp_ip' => \&SNMP::Info::munge_ip,
);
sub cdp_run {
sub fdp_run {
my $fdp = shift;
my $fdp_run = $fdp->fdp_run();
my $fdp_run = $fdp->orig_fdp_run();
# if fdp_run isn't implemented on device, assume FDP is on
return $fdp_run if defined $fdp_run;
@@ -91,9 +80,7 @@ sub cdp_run {
sub hasFDP {
my $fdp = shift;
my $ver = $fdp->{_version};
#my $ver = $fdp->fdp_ver;
my $ver = $fdp->snmp_ver();
# SNMP v1 clients dont have the globals
if ( defined $ver and $ver == 1 ) {
@@ -107,15 +94,10 @@ sub hasFDP {
return $fdp->fdp_run();
}
sub c_if {
sub fdp_if {
my $fdp = shift;
# See if by some miracle Cisco implemented the fdpCacheIfIndex entry
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();
my $fdp_ip = $fdp->fdp_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()"
@@ -150,10 +132,10 @@ Bruce Rodger, Max Baker
=head1 SYNOPSIS
my $fdp = new SNMP::Info (
my $fdp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
DestHost => 'router',
Community => 'public',
Version => 2
);
@@ -164,7 +146,7 @@ Bruce Rodger, Max Baker
$hasfdp = $fdp->hasFDP() ? 'yes' : 'no';
# Print out a map of device ports with FDP neighbors:
my $interfaces = $fdp->interfaces();
my $interfaces = $fdp->interfaces();
my $fdp_if = $fdp->fdp_if();
my $fdp_ip = $fdp->fdp_ip();
my $fdp_port = $fdp->fdp_port();
@@ -179,19 +161,18 @@ Bruce Rodger, Max Baker
=head1 DESCRIPTION
SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented
SNMP::Info::FDP is a subclass of SNMP::Info that provides an object oriented
interface to FDP information through SNMP.
FDP is a Layer 2 protocol that supplies topology information of
devices that also speak FDP, mostly switches and routers. It has
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.
virtually identical. FDP is implemented in Brocade (Foundry) devices.
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.
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.
=head2 Inherited Classes
@@ -205,11 +186,11 @@ None.
=item F<FOUNDRY-SN-SWITCH-GROUP-MIB>
Needs a reasonably recent MIB. Works OK with B2R07604A.mib, but doesn't
work with B2R07600C.
work with B2R07600C.
=back
=head1 GLOBAL METHODS
=head1 GLOBALS
These are methods that return scalar values from SNMP
@@ -217,13 +198,13 @@ These are methods that return scalar values from SNMP
=item $fdp->hasFDP()
Is FDP is active in this device?
Is FDP is active in this device?
Accounts for SNMP version 1 devices which may have FDP but not fdp_run()
=item $fdp->fdp_run()
Is FDP enabled on this device?
Is FDP enabled on this device?
(C<fdpGlobalRun>)
@@ -235,19 +216,10 @@ Interval in seconds at which FDP messages are generated.
=item $fdp->fdp_holdtime()
Time in seconds that FDP messages are kept.
Time in seconds that FDP messages are kept.
(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().
(C<fdpGlobalDeviceId>)
=back
=head2 Overrides
@@ -256,28 +228,28 @@ CDP compatibility
=over
=item $fdp->c_interval()
=item $fdp->fdp_interval()
Interval in seconds at which FDP messages are generated.
(C<fdpGlobalMessageInterval>)
=item $fdp->c_holdtime()
=item $fdp->fdp_holdtime()
Time in seconds that FDP messages are kept.
Time in seconds that FDP messages are kept.
(C<fdpGlobalHoldTime>)
=item $fdp->c_id()
=item $fdp->fdp_id()
Returns FDP device 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()
=item $fdp->fdp_run()
Is FDP enabled on this device?
@@ -294,11 +266,10 @@ CDP compatibility
=over
=item $fdp->c_capabilities()
=item $fdp->fdp_capabilities()
Returns Device Functional Capabilities. Results are munged into an ascii
binary string, 7 digits long, MSB. Each digit represents a bit from the
table below.
binary string, MSB. Each digit represents a bit from the table below.
From L<http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm#18843>:
@@ -328,47 +299,25 @@ protocol.
=back
Thanks to Martin Lorensen C<martin -at- lorensen.dk> for a pointer to
this information.
Thanks to Martin Lorensen for a pointer to this information.
(C<fdpCacheCapabilities>)
=item $fdp->c_domain()
The CDP version of this returns remote VTP Management Domain as defined
in C<CISCO-VTP-MIB::managementDomainName>
(C<fdpCacheVTPMgmtDomain>)
=item $fdp->c_duplex()
Returns the port duplex status from remote devices.
(C<fdpCacheDuplex>)
=item $fdp->c_id()
=item $fdp->fdp_id()
Returns remote device id string
(C<fdpCacheDeviceId>)
=item $fdp->c_if()
=item $fdp->fdp_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.
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();
return $fdp_index if defined $fdp_index;
# if not, let's fake it
my $fdp_ip = $device->fdp_ip();
my %fdp_if
foreach my $key (keys %$fdp_ip){
$iid = $key;
@@ -376,56 +325,44 @@ truncate the last number off of it :
$iid =~ s/\.\d+$//;
$fdp_if{$key} = $iid;
}
return \%fdp_if;
=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.
See fdp_if() entry.
(C<fdpCacheIfIndex>)
=item $fdp->c_ip()
=item $fdp->fdp_ip()
Returns remote IP address
(C<fdpCacheAddress>)
=item $fdp->c_platform()
=item $fdp->fdp_platform()
Returns remote platform id
Returns remote platform id
(C<fdpCachePlatform>)
=item $fdp->c_port()
=item $fdp->fdp_port()
Returns remote port ID
(C<fdpDevicePort>)
=item $fdp->c_proto()
=item $fdp->fdp_proto()
Returns remote address type received. Usually IP.
(C<fdpCacheAddressType>)
=item $fdp->c_ver()
=item $fdp->fdp_ver()
Returns remote hardware version
(C<fdpCacheVersion>)
=item $fdp->c_vlan()
=item $fdp->fdp_cache_type()
Returns the remote interface native VLAN.
Returns type of entry received, either FDP or CDP.
(C<fdpCacheNativeVLAN>)
(C<snFdpCacheVendorId>)
=back

View File

@@ -0,0 +1,230 @@
# SNMP::Info::IEEE802_Bridge
#
# 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
# 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::IEEE802_Bridge;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::IEEE802_Bridge::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::IEEE802_Bridge::EXPORT_OK = qw//;
our ($VERSION, $DEBUG, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $INIT);
$VERSION = '3.74';
%MIBS = (
'IEEE8021-Q-BRIDGE-MIB' => 'ieee8021QBridgeVlanCurrentEgressPorts',
);
%GLOBALS = (
);
%FUNCS = (
'iqb_i_vlan' => 'ieee8021QBridgePvid',
'iqb_i_vlan_type' => 'ieee8021QBridgePortAcceptableFrameTypes',
'iqb_i_vlan_in_flt' => 'ieee8021QBridgePortIngressFiltering',
'iqb_cv_egress' => 'ieee8021QBridgeVlanCurrentEgressPorts',
'iqb_cv_untagged' => 'ieee8021QBridgeVlanCurrentUntaggedPorts',
'iqb_cv_stat' => 'ieee8021QBridgeVlanStatus',
'iqb_v_name' => 'ieee8021QBridgeVlanStaticName',
'iqb_v_egress' => 'ieee8021QBridgeVlanStaticEgressPorts',
'iqb_v_fbdn_egress' => 'ieee8021QBridgeVlanForbiddenEgressPorts',
'iqb_v_untagged' => 'ieee8021QBridgeVlanStaticUntaggedPorts',
'iqb_v_stat' => 'ieee8021QBridgeVlanStaticRowStatus',
);
%MUNGE = (
# Inherit all the built in munging
%SNMP::Info::MUNGE,
# Add ones for our class
'iqb_cv_egress' => \&SNMP::Info::munge_port_list,
'iqb_cv_untagged' => \&SNMP::Info::munge_port_list,
'iqb_v_egress' => \&SNMP::Info::munge_port_list,
'iqb_v_fbdn_egress' => \&SNMP::Info::munge_port_list,
'iqb_v_untagged' => \&SNMP::Info::munge_port_list,
);
1;
__END__
=head1 NAME
SNMP::Info::IEEE802_Bridge - SNMP Interface to SNMP data available through the
F<IEEE8021-Q-BRIDGE-MIB>
=head1 AUTHOR
Jeroen van Ingen
=head1 SYNOPSIS
FIXME update with better example
my $bridge = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'switch',
Community => 'public',
Version => 2
);
my $class = $bridge->class();
print " Using device sub class : $class\n";
# Grab Forwarding Tables
my $interfaces = $bridge->interfaces();
my $fw_mac = $bridge->fw_mac();
my $fw_port = $bridge->fw_port();
my $bp_index = $bridge->bp_index();
foreach my $fw_index (keys %$fw_mac){
my $mac = $fw_mac->{$fw_index};
my $bp_id = $fw_port->{$fw_index};
my $iid = $bp_index->{$bp_id};
my $port = $interfaces->{$iid};
print "Port:$port forwarding to $mac\n";
}
=head1 DESCRIPTION
F<IEEE8021-Q-BRIDGE-MIB> is used by some newer switches / Layer 2 devices.
It is derived from the IETF Q-BRIDGE-MIB (RFC 4363), extending it with the
concept of multiple VLAN-aware bridges (PBB).
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 $bridge = new SNMP::Info::IEEE802_Bridge(...);
=head2 Inherited Classes
None.
=head2 Required MIBs
=over
=item F<IEEE8021-Q-BRIDGE-MIB>
=back
=head1 GLOBALS
These are methods that return scalar values from SNMP
=over
=back
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
to a hash.
=head2 Per-port VLAN configuration in the device (C<ieee8021QBridgePortVlanTable>)
=over
=item $bridge->iqb_i_vlan()
(C<ieee8021QBridgePvid>)
=item $bridge->iqb_i_vlan_type()
(C<ieee8021QBridgePortAcceptableFrameTypes>)
=item $bridge->iqb_i_vlan_in_flt()
(C<ieee8021QBridgePortIngressFiltering>)
=back
=head2 VLAN Current Table (C<ieee8021QBridgeVlanCurrentTable>)
=over
=item $bridge->iqb_cv_egress()
(C<ieee8021QBridgeVlanCurrentEgressPorts>)
=item $bridge->iqb_cv_untagged()
(C<ieee8021QBridgeVlanCurrentUntaggedPorts>)
=item $bridge->iqb_cv_stat()
(C<ieee8021QBridgeVlanStatus>)
=back
=head2 VLAN Static Table (C<ieee8021QBridgeVlanStaticTable>)
=over
=item $bridge->iqb_v_name()
(C<ieee8021QBridgeVlanStaticName>)
=item $bridge->iqb_v_egress()
(C<ieee8021QBridgeVlanStaticEgressPorts>)
=item $bridge->iqb_v_fbdn_egress()
(C<ieee8021QBridgeVlanForbiddenEgressPorts>)
=item $bridge->iqb_v_untagged()
(C<ieee8021QBridgeVlanStaticUntaggedPorts>)
=item $bridge->iqb_v_stat()
C<active> !
(C<ieee8021QBridgeVlanStaticRowStatus>)
=back
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::IEEE802dot11
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,14 +30,16 @@
package SNMP::Info::IEEE802dot11;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::IEEE802dot11::ISA = qw/Exporter/;
@SNMP::Info::IEEE802dot11::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::IEEE802dot11::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( 'IEEE802dot11-MIB' => 'dot11DesiredSSID', );
@@ -202,7 +203,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";

View File

@@ -0,0 +1,153 @@
# SNMP::Info::IEEE802dot3ad
#
# Copyright (c) 2018 SNMP::Info Developers
# 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::IEEE802dot3ad;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Aggregate;
@SNMP::Info::IEEE802dot3ad::ISA = qw/
SNMP::Info::Aggregate
Exporter
/;
@SNMP::Info::IEEE802dot3ad::EXPORT_OK = qw/
agg_ports_lag
/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Aggregate::MIBS,
'IEEE8023-LAG-MIB' => 'dot3adAggPortSelectedAggID',
);
%GLOBALS = ();
%FUNCS = (
'ad_lag_ports' => 'dot3adAggPortListPorts',
);
%MUNGE = (
'ad_lag_ports' => \&SNMP::Info::munge_port_list,
);
sub agg_ports_lag {
my $dev = shift;
# TODO: implement partial
my $ports = $dev->ad_lag_ports();
my $index = $dev->bp_index() || {};
return {} unless ref {} eq ref $ports and scalar keys %$ports;
my $ret = {};
foreach my $m ( keys %$ports ) {
my $idx = $m;
my $portlist = $ports->{$m};
next unless $portlist;
# While dot3adAggTable is indexed by ifIndex, the portlist is indexed
# with a dot1dBasePort, so we need to use dot1dBasePortIfIndex to map to
# the ifIndex. If we don't have dot1dBasePortIfIndex assume
# dot1dBasePort = ifIndex
for ( my $i = 0; $i <= scalar(@$portlist); $i++ ) {
my $ifindex = $i+1;
if ( exists($index->{$i+1}) and defined($index->{$i+1}) ) {
$ifindex = $index->{$i+1};
}
$ret->{$ifindex} = $idx if ( @$portlist[$i] );
}
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::IEEE802dot3ad - SNMP Interface to IEEE Aggregated Links
=head1 AUTHOR
SNMP::Info Developers
=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
This class provides access to Aggregated Links configuration on devices
implementing C<IEEE8023-LAG-MIB>.
Use or create in a subclass of SNMP::Info. Do not use directly.
=head2 Inherited Classes
L<SNMP::Info::Aggregate>
=head2 Required MIBs
=over
=item F<IEEE8023-LAG-MIB>
=back
=head1 METHODS
=over 4
=item C<agg_ports_lag>
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back
=cut

View File

@@ -30,13 +30,14 @@
package SNMP::Info::IPv6;
use strict;
use warnings;
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/;
our ($VERSION, %MIBS, %FUNCS, %GLOBALS, %MUNGE, $METHOD);
use constant {
IPMIB => 1,
@@ -44,22 +45,22 @@ use constant {
IPV6MIB => 3,
};
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%MIBS = (
'IP-MIB' => 'ipv6InterfaceTableLastChange',
'IPV6-MIB' => 'ipv6IfTableLastChange',
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
'CISCO-IETF-IP-MIB' => 'cInetNetToMediaNetAddress',
);
%GLOBALS = ();
%FUNCS = (
%FUNCS = (
'ip_n2p_phys_addr' => 'ipNetToPhysicalPhysAddress', # IP-MIB
'c_inet_phys_addr' => 'cInetNetToMediaPhysAddress', # CISCO-IETF-IP-MIB
'i6_n2p_phys_addr' => 'ipv6NetToMediaNetAddress', # IPV6-MIB
'i6_n2p_phys_addr' => 'ipv6NetToMediaPhysAddress', # IPV6-MIB
'ip_n2p_phys_type' => 'ipNetToPhysicalType', # IP-MIB
'c_inet_phys_type' => 'cInetNetToMediaType', # CISCO-IETF-IP-MIB
@@ -67,20 +68,24 @@ $VERSION = '2.09';
'ip_n2p_phys_state' => 'ipNetToPhysicalState', # IP-MIB
'c_inet_phys_state' => 'cInetNetToMediaState', # CISCO-IETF-IP-MIB
'i6_n2p_phys_state' => 'ipv6NetToMediaState', # IPV6-MIB
'i6_n2p_phys_state' => 'ipv6IfNetToMediaState', # IPV6-MIB
'ip_pfx_origin' => 'ipAddressPrefixOrigin', # IP-MIB
'c_pfx_origin' => 'cIpAddressPfxOrigin', # CISCO-IETF-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_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
# Commented out are not-accessible according to MIB
#'ip_addr6_pfxlen' => 'ipAddressPrefixLength', # IP-MIB
#'c_addr6_pfxlen' => 'cIpAddressPfxLength', # CISCO-IETF-IP-MIB
'i6_addr_pfxlen' => 'ipv6AddrPfxLength', # IPV6-MIB
'ip_addr6_index' => 'ipAddressIfIndex', # IP-MIB
'c_addr6_index' => 'cIpAddressIfIndex', # CISCO-IETF-IP-MIB
'ip_addr6_type' => 'ipAddressType', # IP-MIB
'c_addr6_type' => 'cIpAddressType', # CISCO-IETF-IP-MIB
);
%MUNGE = (
@@ -102,8 +107,8 @@ sub ipv6_n2p_mac {
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;
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;
@@ -129,8 +134,8 @@ sub ipv6_n2p_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;
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;
@@ -138,10 +143,16 @@ sub ipv6_n2p_addr {
if ($addrtype == 2) { # IPv6
my $v6_packed = pack("C*", split(/\./, $v6addr));
if (length($v6_packed) == 15) {
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
# Workaround for some some IP-MIB implementations, eg on Cisco Nexus: no explicit addrsize,
# so what we've collected in that variable is actually the first byte of the address.
$v6_packed = pack('C', $addrsize) . $v6_packed;
}
if (length($v6_packed) == 17) {
# Workaround for IPV6-MIB on Windows 2012: if the address is one byte too long, the SNMP agent probably has an incorrect
# implementation where a length field precedes the actual IPv6 address.
# In that case, the first character should be chr(16), ie 0x10; strip it if that's the case.
$v6_packed =~ s/^\x10//;
}
if (length($v6_packed) == 16) {
$v6addr = join(':', map { sprintf("%04x", $_) } unpack("n*", $v6_packed) );
$return->{$row} = $v6addr;
@@ -167,8 +178,8 @@ sub ipv6_n2p_if {
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;
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;
@@ -194,8 +205,8 @@ sub ipv6_n2p_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;
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;
@@ -221,8 +232,8 @@ sub ipv6_n2p_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;
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;
@@ -307,7 +318,9 @@ sub ipv6_addr_prefix {
foreach my $row (keys %$ipv6_addr_prefix){
if ($row =~ /^(\d+)\.[\d\.]+$/) {
my $type = $1;
if ($type == 2) { # IPv6
if (($type == 2) or ($type == 4)) { # IPv6
# Remove interface specific part from vrf interfaces
if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
# Remove the OID part from the value
my $val = $ipv6_addr_prefix->{$row};
if ( $val =~ /^.+?((?:\d+\.){19}\d+)$/ ){
@@ -321,9 +334,60 @@ sub ipv6_addr_prefix {
return $return;
}
sub ipv6_addr_prefixlength {
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) or ($type == 4)) { # IPv6
# Remove interface specific part from vrf interfaces
if ($row =~ /^((\d+\.){17}\d+)/) { $row = $1 }
# Remove the OID part from the value
my $val = $ipv6_addr_prefix->{$row};
if ( $val =~ /^.+?((?:\d+\.){19}(\d+))$/ ) {
$val = $2;
$return->{$row} = $val;
}
}
}
}
printf("%s: data comes from %s.\n", &_my_sub_name, $info->_method_used() ) if $info->debug();
return $return;
}
sub ipv6_addr {
my $info = shift;
my $return;
my $indexes = $info->ipv6_index();
foreach my $row (keys %$indexes) {
my @parts = split(/\./, $row);
my $is_valid = 0;
if (scalar @parts == 18) {
my $addrtype = shift @parts;
$is_valid = 1;
} elsif (scalar @parts == 17) {
$is_valid = 1;
}
my $addrsize = shift @parts; # First element now is addrsize, should be 16
if ($is_valid && $addrsize == 16) {
$return->{$row} = join(':', unpack('(H4)*', pack('C*', @parts)));
} else {
warn sprintf("%s: unable to decode table index to IPv6 address. Raw data is [%s].\n", &_my_sub_name, $row);
}
}
return $return;
}
sub _method_used {
my $info = shift;
my $return = 'none of the MIBs';
# FIXME ugh! a global. makes order of calls important for debug.
if (defined $info::METHOD) {
if ($info::METHOD eq IPMIB) {
$return = 'IP-MIB';
@@ -343,6 +407,7 @@ sub _test_methods {
foreach my $method (sort {$test->{$a} <=> $test->{$b}} keys %$test) {
$return = $info->$method || {};
if (scalar keys %$return) {
# FIXME ugh! a global. makes order of calls important for debug.
$info::METHOD = $test->{$method};
last;
}
@@ -378,14 +443,14 @@ Jeroen van Ingen and Carlos Vicente
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -393,11 +458,12 @@ Jeroen van Ingen and Carlos Vicente
=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.
The SNMP::Info::IPv6 class implements functions to for mapping IPv6 addresses
to MAC addresses, interfaces and more. It will use data from the F<IP-MIB>,
F<IPV6-MIB>, or the F<CISCO-IETF-IP-MIB>, whichever is supported by the
device.
This class is inherited by Info::Layer3 to provide IPv6 node tracking across
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
@@ -414,7 +480,9 @@ none.
=over
=item F<IP-MIB>
=item F<IPV6-MIB>
=item F<CISCO-IETF-IP-MIB>
=back
@@ -454,10 +522,18 @@ Maps an IPv6 address to its type (unicast, anycast, etc.)
Maps an IPv6 prefix with its origin (manual, well-known, dhcp, etc.)
=item $info->ipv6_addr_prefix()
=item $info->ipv6_addr_prefix()
Maps IPv6 addresses with their prefixes
=item $info->ipv6_addr_prefixlength()
Maps IPv6 addresses with their prefix length
=item $info->ipv6_addr()
Maps a table instance to an IPv6 address
=back
=head2 Internet Address Translation Table
@@ -472,7 +548,7 @@ Maps an address of type C<cInetNetToMediaNetAddressType> on interface C<ifIndex>
=head1 MUNGES
=over
=over
=item munge_physaddr()

View File

@@ -1,7 +1,6 @@
# SNMP::Info::LLDP
# $Id$
#
# Copyright (c) 2008 Eric Miller
# Copyright (c) 2018 Eric Miller
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -31,18 +30,20 @@
package SNMP::Info::LLDP;
use strict;
use warnings;
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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
'LLDP-MIB' => 'lldpLocSysCapEnabled',
'LLDP-EXT-MED-MIB' => 'lldpXMedMIB',
'LLDP-EXT-DOT1-MIB' => 'lldpXdot1MIB',
'LLDP-EXT-DOT3-MIB' => 'lldpXdot3MIB',
);
@@ -54,10 +55,13 @@ $VERSION = '2.09';
);
%FUNCS = (
# LLDP-MIB::lldpLocManAddrTable
'lldp_lman_addr' => 'lldpLocManAddrIfId',
# LLDP-MIB::LldpLocPortEntry
'lldp_lport_id' => 'lldpLocPortId',
'lldp_lport_desc' => 'lldpLocPortDesc',
# LLDP-MIB::lldpRemTable
'lldp_rem_id_type' => 'lldpRemChassisIdSubtype',
'lldp_rem_id' => 'lldpRemChassisId',
@@ -67,6 +71,19 @@ $VERSION = '2.09';
'lldp_rem_sysname' => 'lldpRemSysName',
'lldp_rem_sysdesc' => 'lldpRemSysDesc',
'lldp_rem_sys_cap' => 'lldpRemSysCapEnabled',
'lldp_rem_cap_spt' => 'lldpRemSysCapSupported',
# LLDP-MIB::lldpXMedRemInventoryTable
'lldp_rem_hw_rev' => 'lldpXMedRemHardwareRev',
'lldp_rem_fw_rev' => 'lldpXMedRemFirmwareRev',
'lldp_rem_sw_rev' => 'lldpXMedRemSoftwareRev',
'lldp_rem_serial' => 'lldpXMedRemSerialNum',
'lldp_rem_vendor' => 'lldpXMedRemMfgName',
'lldp_rem_model' => 'lldpXMedRemModelName',
'lldp_rem_asset' => 'lldpXMedRemAssetID',
'lldp_rem_media_cap' => 'lldpXMedRemCapCurrent',
'lldp_rem_media_cap_spt' => 'lldpXMedRemCapSupported',
# LLDP-MIB::lldpRemManAddrTable
'lldp_rman_addr' => 'lldpRemManAddrIfSubtype',
@@ -78,8 +95,22 @@ $VERSION = '2.09';
'lldp_rem_sysname' => \&SNMP::Info::munge_null,
'lldp_rem_sysdesc' => \&SNMP::Info::munge_null,
'lldp_rem_port_desc' => \&SNMP::Info::munge_null,
'lldp_lport_id' => \&SNMP::Info::munge_null,
'lldp_lport_desc' => \&SNMP::Info::munge_null,
'lldp_sys_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_sys_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_cap_spt' => \&SNMP::Info::munge_bits,
'lldp_rem_hw_rev' => \&SNMP::Info::munge_null,
'lldp_rem_fw_rev' => \&SNMP::Info::munge_null,
'lldp_rem_sw_rev' => \&SNMP::Info::munge_null,
'lldp_rem_serial' => \&SNMP::Info::munge_null,
'lldp_rem_vendor' => \&SNMP::Info::munge_null,
'lldp_rem_model' => \&SNMP::Info::munge_null,
'lldp_rem_asset' => \&SNMP::Info::munge_null,
'lldp_rem_media_cap' => \&SNMP::Info::munge_bits,
'lldp_rem_media_cap_spt' => \&SNMP::Info::munge_bits,
);
sub hasLLDP {
@@ -88,8 +119,13 @@ sub hasLLDP {
# 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;
# If the device doesn't return local system capabilities, fallback
# by checking if it would report neighbors
my $lldp_rem = $lldp->lldp_rem_id() || {};
return 1 if scalar keys %$lldp_rem;
return;
}
@@ -98,23 +134,39 @@ sub lldp_if {
my $partial = shift;
my $addr = $lldp->lldp_rem_pid($partial) || {};
my $i_descr = $lldp->i_description() || {};
my $i_descr = $lldp->i_description() || {};
my $i_alias = $lldp->i_alias() || {};
my %r_i_descr = reverse %$i_descr;
my %r_i_alias = reverse %$i_alias;
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} ) {
# Local LLDP port may not equate to ifIndex, see LldpPortNumber
# TEXTUAL-CONVENTION in LLDP-MIB. Cross reference lldpLocPortDesc
# with ifDescr and ifAlias to get ifIndex, prefer ifDescr over
# ifAlias because using cross ref with description is correct
# behavior according to the LLDP-MIB. Some devices (eg H3C gear)
# seem to use ifAlias though.
# snmp::info #372 -> to make things even more complex some devices
# have different behaviour depending on os version (nx-os 6 vs 7)
# so we made this a function to allow overrides in more specific
# modules
my $lldp_desc = $lldp->lldp_lport_desc($port);
my $desc = $lldp_desc->{$port};
# If cross reference is successful use it, otherwise stick with
# lldpRemLocalPortNum
if ( $desc && exists $r_i_descr{$desc} ) {
$port = $r_i_descr{$desc};
}
elsif ( $desc && exists $r_i_alias{$desc} ) {
$port = $r_i_alias{$desc};
}
$lldp_if{$key} = $port;
}
return \%lldp_if;
@@ -128,7 +180,7 @@ sub lldp_ip {
my %lldp_ip;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
next unless defined $index;
next unless $proto == 1;
$lldp_ip{$index} = $addr;
@@ -136,6 +188,38 @@ sub lldp_ip {
return \%lldp_ip;
}
sub lldp_ipv6 {
my $lldp = shift;
my $partial = shift;
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
my %lldp_ipv6;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
next unless defined $index;
next unless $proto == 2;
$lldp_ipv6{$index} = $addr;
}
return \%lldp_ipv6;
}
sub lldp_mac {
my $lldp = shift;
my $partial = shift;
my $rman_addr = $lldp->lldp_rman_addr($partial) || {};
my %lldp_ipv6;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
next unless defined $index;
next unless $proto == 6;
$lldp_ipv6{$index} = $addr;
}
return \%lldp_ipv6;
}
sub lldp_addr {
my $lldp = shift;
my $partial = shift;
@@ -144,7 +228,7 @@ sub lldp_addr {
my %lldp_ip;
foreach my $key ( keys %$rman_addr ) {
my ( $index, $proto, $addr ) = _lldp_addr_index($key);
my ( $index, $proto, $addr ) = $lldp->_lldp_addr_index($key);
next unless defined $index;
$lldp_ip{$index} = $addr;
}
@@ -158,27 +242,40 @@ sub lldp_port {
my $pdesc = $lldp->lldp_rem_desc($partial) || {};
my $pid = $lldp->lldp_rem_pid($partial) || {};
my $ptype = $lldp->lldp_rem_pid_type($partial) || {};
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
my %lldp_port;
foreach my $key ( sort keys %$pid ) {
my $port = $pdesc->{$key};
my $type = $ptype->{$key};
if ( $type
and ( $type eq 'interfaceName' or $type eq 'local' )
and ( defined $pid->{$key} and $pid->{$key} !~ /^\d+$/ ) )
{
# If the pid claims to be an interface name,
# believe it.
$port = $pid->{$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 ) );
$port = SNMP::Info::munge_mac($port)
}
}
# Nortel lldpRemPortDesc doesn't match ifDescr, but we can still
# Avaya/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";
if ( defined $desc->{$key}
&& $desc->{$key}
=~ /^Ethernet\s(?:Routing\s)?Switch\s\d|^Virtual\sServices\sPlatform\s\d/
&& $port =~ /^(Unit\s+(\d+)\s+)?Port\s+(\d+)$/ )
{
$port = defined $1 ? "$2.$3" : "1.$3";
}
$lldp_port{$key} = $port;
@@ -202,12 +299,16 @@ sub lldp_id {
# May need to format other types in the future
if ( $type =~ /mac/ ) {
$id = join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $id ) );
$id = SNMP::Info::munge_mac($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];
elsif ( $type eq 'networkAddress' ) {
if ( length( unpack( 'H*', $id ) ) == 10 ) {
# IP address - first octet is IANA Address Family Number, need
# walk with IPv6
my @octets
= ( map { sprintf "%02x", $_ } unpack( 'C*', $id ) )
[ 1 .. 4 ];
$id = join '.', map { hex($_) } @octets;
}
}
@@ -216,6 +317,88 @@ sub lldp_id {
return \%lldp_id;
}
sub lldp_platform {
my $lldp = shift;
my $partial = shift;
my $rid = $lldp->lldp_rem_id($partial) || {};
my $desc = $lldp->lldp_rem_sysdesc($partial) || {};
my $name = $lldp->lldp_rem_sysname($partial) || {};
my %lldp_platform;
foreach my $key ( keys %$rid ) {
$lldp_platform{$key} = $desc->{$key} || $name->{$key};
}
return \%lldp_platform;
}
sub lldp_cap {
my $lldp = shift;
my $partial = shift;
my $lldp_caps = $lldp->lldp_rem_cap_spt($partial) || {};
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
# be able to enumerate for us, so we have to get it from the MIB
# and enumerate ourselves
my $oid
= SNMP::translateObj( 'LLDP-MIB::lldpRemSysCapEnabled', 0, 1 ) || '';
my $enums = (
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
? $SNMP::MIB{$oid}{'enums'}
: {}
);
my %r_enums = reverse %$enums;
my %lldp_cap;
foreach my $key ( keys %$lldp_caps ) {
my $cap_bits = $lldp_caps->{$key};
next unless $cap_bits;
my $count = 0;
foreach my $bit ( split //, $cap_bits ) {
if ($bit) {
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
}
$count++;
}
}
return \%lldp_cap;
}
sub lldp_media_cap {
my $lldp = shift;
my $partial = shift;
my $lldp_caps = $lldp->lldp_rem_media_cap_spt($partial) || {};
# Encoded as BITS which Perl Net-SNMP implementation doesn't seem to
# be able to enumerate for us, so we have to get it from the MIB
# and enumerate ourselves
my $oid = SNMP::translateObj( 'lldpXMedRemCapCurrent', 0, 1 ) || '';
my $enums = (
( ref {} eq ref $SNMP::MIB{$oid}{'enums'} )
? $SNMP::MIB{$oid}{'enums'}
: {}
);
my %r_enums = reverse %$enums;
my %lldp_cap;
foreach my $key ( keys %$lldp_caps ) {
my $cap_bits = $lldp_caps->{$key};
next unless $cap_bits;
my $count = 0;
foreach my $bit ( split //, $cap_bits ) {
if ($bit) {
push( @{ $lldp_cap{$key} }, $r_enums{$count} );
}
$count++;
}
}
return \%lldp_cap;
}
#sub root_ip {
# my $lldp = shift;
#
@@ -237,24 +420,32 @@ sub lldp_id {
# 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);
my $lldp = shift;
my $idx = shift;
my @oids = split( /\./, $idx );
my $index = join( '.', splice( @oids, 0, 3 ) );
my $proto = shift(@oids);
shift(@oids) if scalar @oids > 4; # $length
# IPv4
if ( $proto == 1 ) {
return ( $index, $proto, join( '.', @oids ) );
}
# IPv6
elsif ( $proto == 2 ) {
return ( $index, $proto,
join( ':', unpack( '(H4)*', pack( 'C*', @oids ) ) ) );
}
# MAC
elsif ( $proto == 6 ) {
return ( $index, $proto,
join( ':', map { sprintf "%02x", $_ } @oids ) );
}
# TODO - Need to handle other protocols, i.e. IPv6
# TODO - Other protocols may be used as well; implement when needed?
else {
return;
}
@@ -273,10 +464,10 @@ Eric Miller
=head1 SYNOPSIS
my $lldp = new SNMP::Info (
my $lldp = new SNMP::Info (
AutoSpecify => 1,
Debug => 1,
DestHost => 'router',
DestHost => 'router',
Community => 'public',
Version => 2
);
@@ -302,7 +493,7 @@ Eric Miller
=head1 DESCRIPTION
SNMP::Info::LLDP is a subclass of SNMP::Info that provides an object oriented
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
@@ -322,13 +513,15 @@ None.
=item F<LLDP-MIB>
=item F<LLDP-EXT-MED-MIB>
=item F<LLDP-EXT-DOT1-MIB>
=item F<LLDP-EXT-DOT3-MIB>
=back
=head1 GLOBAL METHODS
=head1 GLOBALS
These are methods that return scalar values from SNMP
@@ -336,7 +529,7 @@ These are methods that return scalar values from SNMP
=item $lldp->hasLLDP()
Is LLDP is active in this device?
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.
@@ -347,7 +540,7 @@ 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.
Nulls are removed before the value is returned.
(C<lldpLocSysName>)
@@ -361,7 +554,7 @@ Nulls are removed before the value is returned.
(C<lldpLocSysDesc>)
=item $lldp->lldp_sys_cap()
=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
@@ -411,24 +604,55 @@ with the remote system.
=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>).
Returns the mapping to the SNMP Interface Table. Tries to cross reference
(C<lldpLocPortDesc>) with (C<ifDescr>) and (C<ifAlias>) 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_ipv6()
Returns remote IPv6 address, if known. Returns for all other address types,
use lldp_addr if you don't care about return address type.
=item $lldp->lldp_mac()
Returns remote (management) MAC address, if known. Returns for all other
address types, use lldp_addr if you don't care about 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.
Currently only returns IPv4, IPv6 or MAC addresses. If the remote device
returns more than one address type, this method will give only one. Which one
is returned is decided by chance, phase of the moon and Perl hash ordering.
Use lldp_mac, lldp_ip or lldp_ipv6 if you want a specific address type.
=item $lldp->lldp_port()
Returns remote port ID
=item $lldp->lldp_platform()
Tries to return something useful from C<lldp_rem_sysdesc()> or
C<lldp_rem_sysname()>.
=item $lldp->lldp_cap()
Returns hash of arrays with each array containing the system capabilities
supported by the remote system. Possible elements in the array are
enumerated from C<LldpSystemCapabilitiesMap>.
=item $lldp->lldp_media_cap()
Returns hash of arrays with each array containing the media capabilities
supported by the remote system. Possible elements in the array are
enumerated from C<LldpXMedCapabilities>.
=back
=head2 LLDP Remote Table (C<lldpRemTable>)
@@ -444,7 +668,7 @@ the remote system.
=item $lldp->lldp_rem_id()
Returns the string value used to identify the chassis component associated
Returns the string value used to identify the chassis component associated
with the remote system.
(C<lldpRemChassisId>)
@@ -468,7 +692,7 @@ the remote system.
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.
Nulls are removed before the value is returned.
(C<lldpRemPortDesc>)
@@ -477,7 +701,7 @@ Nulls are removed before the value is returned.
Returns the string value used to identify the system name of the remote
system.
Nulls are removed before the value is returned.
Nulls are removed before the value is returned.
(C<lldpRemSysName>)
@@ -486,15 +710,74 @@ Nulls are removed before the value is returned.
Returns the string value used to identify the system description of the
remote system.
Nulls are removed before the value is returned.
Nulls are removed before the value is returned.
(C<lldpRemSysDesc>)
=item $lldp->lldp_rem_sys_cap()
=item $lldp->lldp_rem_hw_rev()
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:
Returns the string value used to identify the hardware revision of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemHardwareRev>)
=item $lldp->lldp_rem_fw_rev()
Returns the string value used to identify the firmware revision of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemHardwareRev>)
=item $lldp->lldp_rem_sw_rev()
Returns the string value used to identify the software revision of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemSoftwareRev>)
=item $lldp->lldp_rem_serial()
Returns the string value used to identify the serial number of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemSerialNum>)
=item $lldp->lldp_rem_vendor()
Returns the string value used to identify the manufacturer of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemMfgName>)
=item $lldp->lldp_rem_asset()
Returns the string value used to identify the asset number of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemAssetID>)
=item $lldp->lldp_rem_model()
Returns the string value used to identify the model of the
remote system. Nulls are removed before the value is returned.
(C<lldpXMedRemModelName>)
=item $lldp->lldp_rem_media_cap_spt()
Returns which media capabilities are supported on the remote system. Results
are munged into an ascii binary string, LSB.
=item $lldp->lldp_rem_media_cap()
Returns which media capabilities are enabled on the remote system. Results
are munged into an ascii binary string, LSB.
=item $lldp->lldp_rem_sys_cap()
Returns which system capabilities are enabled on the remote system. Results
are munged into an ascii binary string, LSB. Each digit represents a bit
from the table below:
=over

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer1 - SNMP Interface to Layer1 Devices
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::Layer1;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
@SNMP::Info::Layer1::ISA = qw/SNMP::Info Exporter/;
@SNMP::Info::Layer1::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = ( %SNMP::Info::MIBS, 'SNMP-REPEATER-MIB' => 'rptrPortGroupIndex' );
@@ -49,7 +49,7 @@ $VERSION = '2.09';
%SNMP::Info::GLOBALS,
'ports_managed' => 'ifNumber',
'rptr_slots' => 'rptrGroupCapacity',
'slots' => 'rptrGroupCapacity'
'slots' => 'rptrGroupCapacity',
);
%FUNCS = (
@@ -86,7 +86,7 @@ sub ports {
}
# $l1->model() - Looks at sysObjectID which gives the oid of the system
# name, contained in a propriatry MIB.
# name, contained in a proprietary MIB.
sub model {
my $l1 = shift;
my $id = $l1->id();
@@ -172,14 +172,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $l1 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $l1->class();
@@ -203,15 +203,15 @@ 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
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.
after determining a more specific class using the method above.
my $l1 = new SNMP::Info::Layer1(...);
=head2 Inherited Classes
=head2 Inherited Classes
=over
@@ -219,7 +219,7 @@ after determining a more specific class using the method above.
=back
=head2 Required MIBs
=head2 Required MIBs
=over
@@ -227,12 +227,9 @@ after determining a more specific class using the method above.
=back
MIBs required for L<SNMP::Info/"Required MIBs">
MIBs required for L<SNMP::Info/"REQUIREMENTS">
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
See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements.
=head1 GLOBALS
@@ -242,7 +239,7 @@ These are methods that return scalar value from SNMP
=item $l1->ports_managed()
Gets the number of ports under the interface mib
Gets the number of ports under the interface mib
(C<ifNumber>)
@@ -278,7 +275,7 @@ Number of 'groups' in the Repeater MIB
=head2 Global Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"GLOBALS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=head1 TABLE METHODS
@@ -341,6 +338,6 @@ Group (slot) Number for given port.
=head2 Table Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer1::Allied
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::Layer1::Allied;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer1;
@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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, 'root_ip' => 'actualIPAddr', );
@@ -52,9 +52,14 @@ $VERSION = '2.09';
'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';
@@ -68,9 +73,10 @@ sub os_ver {
my $allied = shift;
my $descr = $allied->description();
if ( $descr =~ m/version (\d+\.\d+)/ ) {
if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
return $1;
}
return;
}
sub model {
@@ -78,7 +84,7 @@ sub model {
my $desc = $allied->description();
if ( $desc =~ /(AT-\d{4}\S{1}?)/ ) {
if ( defined ($desc) && $desc =~ /(AT-\d{4}\S{1})/ ) {
return $1;
}
return;
@@ -127,14 +133,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $allied = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myhub',
Community => 'public',
Version => 1
)
)
or die "Can't connect to DestHost.\n";
my $class = $allied->class();
@@ -142,8 +148,8 @@ Max Baker
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Allied device through SNMP. See inherited classes' documentation for
Provides abstraction to the configuration information obtainable from a
Allied device through SNMP. See inherited classes' documentation for
inherited methods.
=head2 Inherited Classes
@@ -180,7 +186,7 @@ Returns 'allied' :)
=item $allied->os()
Returns 'allied'
Returns 'allied'
=item $allied->os_ver()

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer1::Asante
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,15 +32,16 @@
package SNMP::Info::Layer1::Asante;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer1;
@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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer1::GLOBALS, );
@@ -50,11 +50,11 @@ $VERSION = '2.09';
%SNMP::Info::Layer1::FUNCS,
'asante_port' => 'ePortIndex',
'asante_group' => 'ePortGrpIndex',
'i_type' => 'ePortStateType',
'i_type' => 'ePortGrpIndex',
'asante_up' => 'ePortStateLinkStatus',
);
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-HUB1012-MIB' => 'asante' );
%MIBS = ( %SNMP::Info::Layer1::MIBS, 'ASANTE-AH1012-MIB' => 'asante' );
%MUNGE = ( %SNMP::Info::Layer1::MUNGE, );
@@ -81,9 +81,10 @@ sub os_ver {
my $asante = shift;
my $descr = $asante->description();
if ( $descr =~ /software v(\d+\.\d+)/ ) {
if ( defined ($descr) && $descr =~ /software v(\d+\.\d+)/ ) {
return $1;
}
return;
}
sub vendor {
@@ -94,7 +95,7 @@ sub model {
my $asante = shift;
my $id = $asante->id();
my $model = &SNMP::translateObj($id);
my $model = SNMP::translateObj($id);
return $model;
}
@@ -108,8 +109,8 @@ sub i_up {
my $i_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} = 'down' if $up =~ /off/;
$i_up->{$port} = 'up' if $up =~ /on/;
}
return $i_up;
@@ -149,7 +150,7 @@ sub i_name {
my $asante = shift;
my $partial = shift;
my $i_name = $asante->orig_i_descr($partial) || {};
my $i_name = $asante->orig_i_description($partial) || {};
my %i_name;
@@ -172,14 +173,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $asante = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $asante->class();
@@ -187,7 +188,7 @@ Max Baker
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Provides abstraction to the configuration information obtainable from an
Asante device through SNMP.
=head2 Inherited Classes
@@ -202,7 +203,7 @@ Asante device through SNMP.
=over
=item F<ASANTE-HUB1012-MIB>
=item F<ASANTE-AH1012-MIB>
=back
@@ -226,11 +227,11 @@ Culls software version from description()
=item $asante->vendor()
Returns 'asante' :)
Returns 'asante'
=item $asante->model()
Cross references $asante->id() to the F<ASANTE-HUB1012-MIB> and returns
Cross references $asante->id() to the F<ASANTE-AH1012-MIB> and returns
the results.
=back
@@ -249,7 +250,7 @@ See L<SNMP::Info::Layer1/"GLOBALS"> for details.
Returns reference to the map between IID and physical Port.
=item $asante->i_description()
=item $asante->i_description()
Description of the interface.

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer1::Bayhub
# $Id$
#
# Copyright (c) 2008 Eric Miller, Max Baker
# All rights reserved.
@@ -31,18 +30,19 @@
package SNMP::Info::Layer1::Bayhub;
use strict;
use warnings;
use Exporter;
use SNMP::Info::SONMP;
use SNMP::Info::NortelStack;
use SNMP::Info::Layer2;
@SNMP::Info::Layer1::Bayhub::ISA
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack SNMP::Info::Layer2 Exporter/;
= 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -93,7 +93,7 @@ sub os {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub model {
@@ -334,6 +334,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $bayhub = shift;
my $partial = shift;
return $bayhub->SUPER::fw_mac($partial);
}
sub fw_port {
my $bayhub = shift;
my $partial = shift;
@@ -469,7 +476,7 @@ __END__
=head1 NAME
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay / Nortel Hubs
SNMP::Info::Layer1::Bayhub - SNMP Interface to Bay/Nortel/Avaya Hubs
=head1 AUTHOR
@@ -485,7 +492,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -494,14 +501,9 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Provides abstraction to the configuration information obtainable from a
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.
my $bayhub = new SNMP::Info::Layer1::Bayhub(...);
the proprietary MIB.
=head2 Inherited Classes
@@ -541,7 +543,7 @@ These are methods that return scalar value from SNMP
=item $bayhub->vendor()
Returns 'nortel'
Returns 'avaya'
=item $bayhub->os()
@@ -600,18 +602,18 @@ to a hash.
=item $bayhub->i_index()
Returns reference to map of IIDs to Interface index.
Returns reference to map of IIDs to Interface index.
Since hubs do not support C<ifIndex>, the interface index is created using the
formula (board * 256 + port).
=item $bayhub->interfaces()
Returns reference to map of IIDs to physical ports.
Returns reference to map of IIDs to physical ports.
=item $bayhub->i_duplex()
Returns half, hubs do not support full duplex.
Returns half, hubs do not support full duplex.
=item $bayhub->i_duplex_admin()
@@ -637,7 +639,7 @@ State choices are 'up' or 'down'
Example:
my %if_map = reverse %{$bayhub->interfaces()};
$bayhub->set_i_up_admin('down', $if_map{'1.1'})
$bayhub->set_i_up_admin('down', $if_map{'1.1'})
or die "Couldn't change port state. ",$bayhub->error(1);
=item $bayhub->bp_index()
@@ -664,51 +666,51 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details.
=over
=item $bayhub->e_index()
=item $bayhub->e_index()
Returns ns_e_index().
=item $bayhub->e_class()
=item $bayhub->e_class()
Returns ns_e_class().
=item $bayhub->e_descr()
=item $bayhub->e_descr()
Returns ns_e_descr().
=item $bayhub->e_name()
=item $bayhub->e_name()
Returns ns_e_name().
=item $bayhub->e_fwver()
=item $bayhub->e_fwver()
Returns ns_e_fwver().
=item $bayhub->e_hwver()
=item $bayhub->e_hwver()
Returns ns_e_hwver().
=item $bayhub->e_parent()
=item $bayhub->e_parent()
Returns ns_e_parent().
=item $bayhub->e_pos()
=item $bayhub->e_pos()
Returns ns_e_pos().
=item $bayhub->e_serial()
=item $bayhub->e_serial()
Returns ns_e_serial().
=item $bayhub->e_swver()
=item $bayhub->e_swver()
Returns ns_e_swver().
=item $bayhub->e_type()
=item $bayhub->e_type()
Returns ns_e_type().
=item $bayhub->e_vendor()
=item $bayhub->e_vendor()
Returns ns_e_vendor().

View File

@@ -0,0 +1,640 @@
# SNMP::Info::Layer1::Cyclades
#
# Copyright (c) 2018 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 warnings;
use Exporter;
use SNMP::Info::Layer1;
@SNMP::Info::Layer1::Cyclades::ISA = qw/SNMP::Info::Layer1 Exporter/;
@SNMP::Info::Layer1::Cyclades::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer1::MIBS,
'CYCLADES-ACS-SYS-MIB' => 'cyACSversion',
'CYCLADES-ACS5K-SYS-MIB' => 'cyACS5Kversion',
'CYCLADES-ACS-CONF-MIB' => 'cyACSConf',
'CYCLADES-ACS5K-CONF-MIB' => 'cyACS5KConf',
'CYCLADES-ACS-INFO-MIB' => 'cyACSInfo',
'CYCLADES-ACS5K-INFO-MIB' => 'cyACS5KInfo',
'ACS-MIB' => 'acs6016',
'ACS8000-MIB' => 'acs8048',
);
%GLOBALS = (
%SNMP::Info::Layer1::GLOBALS,
# CYCLADES-ACS-SYS-MIB
'cy_os_ver' => 'cyACSversion',
'cy_model' => 'cyACSpname',
'cy_serial' => 'cyACSDevId',
'cy_ps1_status' => 'cyACSPw1',
'cy_ps2_status' => 'cyACSPw2',
# CYCLADES-ACS-CONF-MIB
'cy_root_ip' => 'CYCLADES_ACS_CONF_MIB__cyEthIPaddr',
# CYCLADES-ACS5K-SYS-MIB
'cy5k_os_ver' => 'cyACS5Kversion',
'cy5k_model' => 'cyACS5Kpname',
'cy5k_serial' => 'cyACS5KDevId',
'cy5k_ps1_status' => 'cyACS5KPw1',
'cy5k_ps2_status' => 'cyACS5KPw2',
# CYCLADES-ACS5K-CONF-MIB
'cy5k_root_ip' => 'CYCLADES_ACS5K_CONF_MIB__cyEthIPaddr',
# ACS-MIB
'acs_os_ver' => 'ACS_MIB__acsFirmwareVersion',
'acs_model' => 'ACS_MIB__acsProductModel',
'acs_serial' => 'ACS_MIB__acsSerialNumber',
'acs_ps1_status' => 'ACS_MIB__acsPowerSupplyStatePw1',
'acs_ps2_status' => 'ACS_MIB__acsPowerSupplyStatePw2',
# ACS8000-MIB
'acs8k_os_ver' => 'ACS8000_MIB__acsFirmwareVersion',
'acs8k_model' => 'ACS8000_MIB__acsProductModel',
'acs8k_serial' => 'ACS8000_MIB__acsSerialNumber',
'acs8k_ps1_status' => 'ACS8000_MIB__acsPowerSupplyStatePw1',
'acs8k_ps2_status' => 'ACS8000_MIB__acsPowerSupplyStatePw2',
);
%FUNCS = (
%SNMP::Info::Layer1::FUNCS,
# CYCLADES-ACS-INFO-MIB::cyInfoSerialTable
'cy_port_tty' => 'CYCLADES_ACS_INFO_MIB__cyISPortTty',
'cy_port_name' => 'CYCLADES_ACS_INFO_MIB__cyISPortName',
'cy_port_speed' => 'CYCLADES_ACS_INFO_MIB__cyISPortSpeed',
'cy_port_cd' => 'CYCLADES_ACS_INFO_MIB__cyISPortSigCD',
# CYCLADES-ACS-CONF-MIB::cySerialPortTable
'cy_port_socket' => 'CYCLADES_ACS_CONF_MIB__cySPortSocketPort',
# CYCLADES-ACS5K-INFO-MIB::cyInfoSerialTable
'cy5k_port_tty' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortTty',
'cy5k_port_name' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortName',
'cy5k_port_speed' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSpeed',
'cy5k_port_cd' => 'CYCLADES_ACS5K_INFO_MIB__cyISPortSigCD',
# CYCLADES-ACS5K-CONF-MIB::cySerialPortTable
'cy5k_port_socket' => 'CYCLADES_ACS5K_CONF_MIB__cySPortSocketPort',
# ACS-MIB::acsSerialPortTable
'acs_port_tty' => 'ACS_MIB__acsSerialPortTableDeviceName',
'acs_port_name' => 'ACS_MIB__acsSerialPortTableName',
'acs_port_speed' => 'ACS_MIB__acsSerialPortTableComSpeed',
'acs_port_cd' => 'ACS_MIB__acsSerialPortTableSignalStateDCD',
# Equivalent to cySPortSocketPort doesn't exist in ACS-MIB
# Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs
# to be unique so that we can differentiate between the index in the
# acsSerialPortTable from ifIndex which are both integers
# ACS-MIB::acsSerialPortTableEntry
'acs_port_socket' => 'ACS_MIB__acsSerialPortTableDeviceName',
# ACS8000-MIB::acsSerialPortTable
'acs8k_port_tty' => 'ACS8000_MIB__acsSerialPortTableDeviceName',
'acs8k_port_name' => 'ACS8000_MIB__acsSerialPortTableName',
'acs8k_port_speed' => 'ACS8000_MIB__acsSerialPortTableComSpeed',
'acs8k_port_cd' => 'ACS8000_MIB__acsSerialPortTableSignalStateDCD',
# Equivalent to cySPortSocketPort doesn't exist in ACS-MIB
# Use 'acsSerialPortTableDeviceName' as an equivalent, it just needs
# to be unique so that we can differentiate between the index in the
# acsSerialPortTable from ifIndex which are both integers
# ACS8000-MIB::acsSerialPortTableEntry
'acs8k_port_socket' => 'ACS8000_MIB__acsSerialPortTableDeviceName',
);
%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 'avocent';
}
# Use "short circuit" to return the first MIB instance that returns data to
# reduce network communications
# We'll try newest (acs*) first assuming those are most likely deployed
sub os_ver {
my $cyclades = shift;
return
$cyclades->acs_os_ver()
|| $cyclades->acs8k_os_ver()
|| $cyclades->cy5k_os_ver()
|| $cyclades->cy_os_ver()
|| undef;
}
sub vendor {
return 'vertiv';
}
sub model {
my $cyclades = shift;
my $model
= $cyclades->acs_model()
|| $cyclades->acs8k_model()
|| $cyclades->cy5k_model()
|| $cyclades->cy_model()
|| undef;
return lc($model) if ( defined $model );
my $id = $cyclades->id();
my $prod = SNMP::translateObj($id);
return $prod || $id;
}
sub serial {
my $cyclades = shift;
return
$cyclades->acs_serial()
|| $cyclades->acs8k_serial()
|| $cyclades->cy5k_serial()
|| $cyclades->cy_serial()
|| undef;
}
sub root_ip {
my $cyclades = shift;
return
$cyclades->cy5k_root_ip()
|| $cyclades->cy_root_ip()
|| undef;
}
sub ps1_status {
my $cyclades = shift;
return
$cyclades->acs_ps1_status()
|| $cyclades->acs8k_ps1_status()
|| $cyclades->cy5k_ps1_status()
|| $cyclades->cy_ps1_status()
|| undef;
}
sub ps2_status {
my $cyclades = shift;
return
$cyclades->acs_ps2_status()
|| $cyclades->acs8k_ps2_status()
|| $cyclades->cy5k_ps2_status()
|| $cyclades->cy_ps2_status()
|| undef;
}
# 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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $cyclades->cy_port_socket()
|| {};
my $cy_p_tty
= $cyclades->acs_port_tty()
|| $cyclades->acs8k_port_tty()
|| $cyclades->cy5k_port_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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $cyclades->cy_port_socket()
|| {};
my $cy_p_speed
= $cyclades->acs_port_speed()
|| $cyclades->acs8k_port_speed()
|| $cyclades->cy5k_port_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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $cyclades->cy_port_socket()
|| {};
my $cy_p_up
= $cyclades->acs_port_cd()
|| $cyclades->acs8k_port_cd()
|| $cyclades->cy5k_port_cd()
|| $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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $cyclades->cy_port_socket()
|| {};
my $cy_p_desc
= $cyclades->acs_port_name()
|| $cyclades->acs8k_port_name()
|| $cyclades->cy5k_port_name()
|| $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->acs_port_socket()
|| $cyclades->acs8k_port_socket()
|| $cyclades->cy5k_port_socket()
|| $cyclades->cy_port_socket()
|| {};
my $cy_p_desc
= $cyclades->acs_port_name()
|| $cyclades->acs8k_port_name()
|| $cyclades->cy5k_port_name()
|| $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/Avocent 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/Avocent device through SNMP.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer1
=back
=head2 Required MIBs
=over
=item F<ACS-MIB>
=item F<ACS6000-MIB>
=item F<CYCLADES-ACS-SYS-MIB>
=item F<CYCLADES-ACS-CONF-MIB>
=item F<CYCLADES-ACS-INFO-MIB>
=item F<CYCLADES-ACS5K-SYS-MIB>
=item F<CYCLADES-ACS5K-CONF-MIB>
=item F<CYCLADES-ACS5K-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<acsFirmwareVersion>), (C<cyACS5Kversion>), or (C<cyACSversion>)
=item $cyclades->serial()
(C<acsSerialNumber>), (C<cyACS5KDevId>), or (C<cyACSDevId>)
=item $cyclades->root_ip()
(C<cyEthIPaddr>)
=item $cyclades->ps1_status()
(C<acsPowerSupplyStatePw1>), (C<cyACS5KPw1>), or (C<cyACSPw1>)
=item $cyclades->ps2_status()
(C<acsPowerSupplyStatePw2>), (C<cyACS5KPw2>), or (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 'vertiv'
=item $cyclades->os()
Returns 'avocent'
=item $cyclades->model()
Returns lower case (C<cyACSpname>) or (C<acsProductModel>) if it exists
otherwise tries to reference $cyclades->id() to one of the MIBs listed above
=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, either the listening socket
port C<cySPortSocketPort> or C<acsSerialPortTableDeviceName> name to avoid
conflicts with C<ifIndex>.
=item $cyclades->interfaces()
Returns reference to map of IIDs to physical ports. Extended to include
serial ports, C<acsSerialPortTableDeviceName> or C<cyISPortTty>.
=item $cyclades->i_speed()
Returns interface speed. Extended to include serial ports,
C<acsSerialPortTableComSpeed> or C<cyISPortSpeed>.
=item $cyclades->i_up()
Returns link status for each port. Extended to include serial ports,
C<acsSerialPortTableSignalStateDCD> or C<cyISPortSigCD>.
=item $cyclades->i_description()
Returns description of each port. Extended to include serial ports,
C<acsSerialPortTableName> or C<cyISPortName>.
=item $cyclades->i_name()
Returns name of each port. Extended to include serial ports,
C<acsSerialPortTableName> or C<cyISPortName>.
=back
=head2 Table Methods imported from SNMP::Info::Layer1
See L<SNMP::Info::Layer1/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer1::S3000
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,15 +30,16 @@
package SNMP::Info::Layer1::S3000;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -324,6 +324,13 @@ sub bp_index {
return \%bp_index;
}
sub fw_mac {
my $s3000 = shift;
my $partial = shift;
return $s3000->SUPER::fw_mac($partial);
}
sub fw_port {
my $s3000 = shift;
my $partial = shift;
@@ -366,7 +373,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -375,15 +382,10 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Provides abstraction to the configuration information obtainable from a
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.
my $s3000 = new SNMP::Info::Layer1::S3000(...);
=head2 Inherited Classes
=over
@@ -440,7 +442,7 @@ Returns the firmware version. (C<s3AgentFwVer>)
=item $s3000->mac()
Returns MAC of the advertised IP address of the device.
Returns MAC of the advertised IP address of the device.
=back
@@ -470,7 +472,7 @@ to a hash.
=item $s3000->i_index()
Returns reference to map of IIDs to Interface index.
Returns reference to map of IIDs to Interface index.
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
@@ -478,11 +480,11 @@ than one module.
=item $s3000->interfaces()
Returns reference to map of IIDs to physical ports.
Returns reference to map of IIDs to physical ports.
=item $s3000->i_duplex()
Returns half, hubs do not support full duplex.
Returns half, hubs do not support full duplex.
=item $s3000->i_duplex_admin()
@@ -509,7 +511,7 @@ State choices are 'up' or 'down'
Example:
my %if_map = reverse %{$s3000->interfaces()};
$s3000->set_i_up_admin('down', $if_map{'1.1'})
$s3000->set_i_up_admin('down', $if_map{'1.1'})
or die "Couldn't change port state. ",$s3000->error(1);
=item $s3000->bp_index()

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2 - SNMP Interface to Layer2 Devices
# $Id$
#
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
#
@@ -33,30 +32,36 @@
package SNMP::Info::Layer2;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::Entity;
use SNMP::Info::PowerEthernet;
use SNMP::Info::LLDP;
use SNMP::Info::DocsisHE;
@SNMP::Info::Layer2::ISA
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet Exporter/;
= qw/SNMP::Info SNMP::Info::Bridge SNMP::Info::Entity SNMP::Info::PowerEthernet SNMP::Info::LLDP SNMP::Info::DocsisHE Exporter/;
@SNMP::Info::Layer2::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::Entity::MIBS, %SNMP::Info::PowerEthernet::MIBS,
%SNMP::Info::LLDP::MIBS, %SNMP::Info::DocsisHE::MIBS,
);
%GLOBALS = (
%SNMP::Info::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::DocsisHE::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::PowerEthernet::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'serial1' =>
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
);
@@ -64,6 +69,7 @@ $VERSION = '2.09';
%FUNCS = (
%SNMP::Info::FUNCS, %SNMP::Info::Bridge::FUNCS,
%SNMP::Info::Entity::FUNCS, %SNMP::Info::PowerEthernet::FUNCS,
%SNMP::Info::LLDP::FUNCS, %SNMP::Info::DocsisHE::FUNCS,
);
%MUNGE = (
@@ -71,14 +77,16 @@ $VERSION = '2.09';
# Inherit all the built in munging
%SNMP::Info::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::DocsisHE::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::PowerEthernet::MUNGE,
%SNMP::Info::LLDP::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 proprietary MIB.
sub model {
my $l2 = shift;
my $id = $l2->id();
@@ -113,38 +121,18 @@ 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;
# 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;
}
sub i_ignore {
my $l2 = shift;
my $partial = shift;
my $i_type = $l2->i_type($partial) || {};
my %i_ignore = ();
foreach my $if ( keys %$i_type ) {
my $type = $i_type->{$if};
$i_ignore{$if}++
if $type =~ /(loopback|other|cpu)/i;
my $entity_serial = $l2->entity_derived_serial();
if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){
return $entity_serial;
}
return \%i_ignore;
my $serial1 = $l2->serial1();
if ( defined $serial1 and $serial1 !~ /^\s*$/ ) {
return $serial1;
}
return;
}
sub interfaces {
@@ -155,10 +143,28 @@ sub interfaces {
my $i_descr = $l2->i_description($partial) || {};
# Replace the Index with the ifDescr field.
foreach my $iid ( keys %$i_descr ) {
# Check for duplicates in ifDescr, if so uniquely identify by adding
# ifIndex to repeated values
my (%seen, %first_seen_as);
foreach my $iid ( sort keys %$i_descr ) {
my $port = $i_descr->{$iid};
next unless defined $port;
$interfaces->{$iid} = $port;
$port = SNMP::Info::munge_null($port);
$port =~ s/^\s+//; $port =~ s/\s+$//;
next unless length $port;
if ( $seen{$port}++ ) {
# (#320) also fixup the port this is a duplicate of
$interfaces->{ $first_seen_as{$port} }
= sprintf( "%s (%d)", $port, $first_seen_as{$port} );
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
}
else {
$interfaces->{$iid} = $port;
$first_seen_as{$port} = $iid;
}
}
return $interfaces;
}
@@ -176,14 +182,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $l2 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $l2->class();
@@ -206,11 +212,11 @@ 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
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.
after determining a more specific class using the method above.
my $l2 = new SNMP::Info::Layer2(...);
@@ -222,8 +228,14 @@ after determining a more specific class using the method above.
=item SNMP::Info::Bridge
=item SNMP::Info::DocsisHE
=item SNMP::Info::Entity
=item SNMP::Info::LLDP
=item SNMP::Info::PowerEthernet
=back
=head2 Required MIBs
@@ -248,7 +260,7 @@ These are methods that return scalar value from SNMP
=item $l2->model()
Cross references $l2->id() with product IDs in the
Cross references $l2->id() with product IDs in the
Cisco MIBs.
For HP devices, removes C<'hpswitch'> from the name
@@ -261,13 +273,13 @@ Tries to discover the vendor from $l2->model() and $l2->description()
=item $l2->serial()
Returns serial number if available through SNMP
Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB.
=back
=head2 Globals imported from SNMP::Info
See documentation in L<SNMP::Info/"GLOBALS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=head2 Globals imported from SNMP::Info::Bridge
@@ -277,6 +289,10 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
See documentation in L<SNMP::Info::Entity/"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
@@ -293,17 +309,11 @@ name.
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 C<ifType> of loopback, propvirtual, other, and cpu
=back
=head2 Table Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
@@ -313,4 +323,8 @@ See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::Entity/"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

@@ -0,0 +1,203 @@
# SNMP::Info::Layer2::3Com - SNMP Interface to 3Com Devices
#
# Copyright (c) 2019 by The Netdisco Developer Team.
#
# 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::3Com;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::CDP;
@SNMP::Info::Layer2::3Com::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::3Com::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'A3Com-products-MIB' => 'wlanAP7760',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
);
sub os {
return '3Com';
}
sub serial {
my $dev = shift;
my $e_serial = $dev->e_serial();
# Find entity table entry for this unit
foreach my $e ( sort keys %$e_serial ) {
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
return $e_serial->{$e};
}
}
return;
}
sub os_ver {
my $dev = shift;
my $e_swver = $dev->e_swver();
# Find entity table entry for this unit
foreach my $e ( sort keys %$e_swver ) {
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
return $e_swver->{$e};
}
}
return;
}
sub vendor {
return '3com';
}
sub model {
my $dsmodel = shift;
my $descr = $dsmodel->description();
if (defined ($descr)) {
if ($descr =~ /^([\S ]+) Software.*/) {
return $1;
} else {
return $descr;
}
}
return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::3Com - SNMP Interface to L2 3Com Switches
=head1 AUTHOR
Max Kosmach
=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 => 2
)
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 3Com L2 devices
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<A3Com-products-MIB>
=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 $device->vendor()
Returns '3com'
=item $device->os()
Returns '3Com'
=item $device->os_ver()
Return os version
=item $device->model()
Returns device model extracted from description
=item $device->serial()
Returns serial number
=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 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -0,0 +1,308 @@
# SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices
#
# Copyright (c) 2019 by The Netdisco Developer Team.
#
# 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::Adtran;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Layer3;
@SNMP::Info::Layer2::Adtran::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Adtran::EXPORT_OK = qw//;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '3.74';
# This will be filled in with the device's index into the EntPhysicalEntry
# table by the serial() function.
our $index = undef;
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::Layer3::MIBS,
# 'ADTRAN-GENEVC-MIB' => 'adGenEVCMIB',
# 'ADTRAN-GENMEF-MIB' => 'adGenMEFMIB',
# 'ADTRAN-GENPORT-MIB' => 'adGenPort',
'ADTRAN-MIB' => 'adtran',
'ADTRAN-AOSUNIT' => 'adGenAOSUnitMib',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::Layer3::GLOBALS,
'serial' => 'adProdSerialNumber',
'ad_mgmtevcvid' => 'adGenEVCSysMgmtEVCSTagVID',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS,
%SNMP::Info::Layer3::FUNCS,
'ad_evcstag' => 'adGenEVCLookupName',
'ad_menport' => 'adGenMenPortRowStatus',
'ad_evcnamevid' => 'adGenEVCSTagVID',
'ad_mgmtevcports' => 'adGenSysMgmtEVCInterfaceConnectionType',
'ad_evcmapuniport' => 'adGenMEFMapUNIPort',
'ad_evcmapevc' => 'adGenMEFMapAssociatedEVCAlias',
'ad_genportcustuse' => 'adGenPortCustomerUse',
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::Layer3::MUNGE );
sub vendor {
return 'adtran';
}
sub os {
return 'aos';
}
sub layers {
my $adtran = shift;
my $layers = $adtran->SUPER::layers();
# Some netvantas don't report L2 properly
my $macs = $adtran->fw_mac();
if (keys %$macs) {
my $l = substr $layers, 6, 1, "1";
}
return $layers;
}
sub os_ver {
my $adtran = shift;
my $ver = $adtran->adProdSwVersion() || undef;
return $ver if (defined $ver);
my $aos_ver = $adtran->adAOSDeviceVersion();
return $aos_ver;
}
sub model {
my $adtran = shift;
my $id = $adtran->id();
my $mod = $adtran->adProdName() || undef;
return $mod if (defined $mod);
my $model = $adtran->adAOSDeviceProductName() || undef;
return $model;
}
sub serial {
my $adtran = shift;
my $e_serial = $adtran->e_serial() || {};
my $serial2 = $e_serial->{1} || undef;
return $serial2 if ( defined $serial2 );
return $adtran->orig_serial();
}
sub i_name {
my $adtran = shift;
my $partial = shift;
my $i_name = $adtran->SUPER::i_alias() || undef;
return $i_name if (defined $i_name);
$i_name = {};
my $adname = $adtran->ad_genportcustuse() || undef;
if (defined $adname) {
foreach my $port (keys %$adname) {
my @splitout = split(/\./,$port);
$i_name->{$splitout[1]} = $adname->{$port};
}
}
return $i_name;
}
sub i_vlan {
my $adtran = shift;
my $partial = shift;
my $uniports = $adtran->ad_evcmapuniport() || undef;
my $evcmaps = $adtran->ad_evcmapevc() || undef;
my $v_names = $adtran->ad_evcnamevid() || undef;
if (defined $uniports) {
my $vlans = {};
foreach my $oid (keys %$v_names) {
my $name = pack("C*", split(/\./,$oid));
$vlans->{$name} = $v_names->{$oid};
}
my $i_vlan = {};
foreach my $evcmap (keys %$evcmaps) {
$i_vlan->{$uniports->{$evcmap}} = $vlans->{$evcmaps->{$evcmap}};
}
return $i_vlan;
}
return {};
}
sub i_vlan_membership {
my $adtran = shift;
my $partial = shift;
my $i_vlan = $adtran->ad_menport();
if (defined $i_vlan) {
my $vlans = {};
my $v_name = $adtran->v_name();
foreach my $vid (keys %$v_name) {
$vlans->{$v_name->{$vid}} = $vid;
}
my $if_vlans = {};
foreach my $entry (keys %$i_vlan) {
my @splitout = split(/(\.0)+\./,$entry);
my $name = pack("C*", split(/\./,$splitout[0]));
push @{$if_vlans->{$splitout[2]}}, $vlans->{$name};
}
my $mgmtevcports = $adtran->ad_mgmtevcports();
my $mgmtevcid = $adtran->ad_mgmtevcvid();
foreach my $port (keys %$mgmtevcports) {
push @{$if_vlans->{$port}}, $mgmtevcid;
}
return $if_vlans;
}
return {};
}
sub v_name {
my $adtran = shift;
my $partial = shift;
my $v_index = $adtran->ad_evcstag();
return {} unless defined $v_index;
$v_index->{$adtran->ad_mgmtevcvid()} = 'system-management-evc';
return $v_index;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Adtran - SNMP Interface to Adtran Devices
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $adtran = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $adtran->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for adtran Devices running JUNOS
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::Layer3
=back
=head2 Inherited Classes' MIBs
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer3/"Required MIBs"> for its own MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
=over
=item $adtran->vendor()
Returns 'adtran'
=item $adtran->os()
Returns 'aos'
=item $adtran->layers()
Ensures that layer two is reported, at least.
=item $adtran->os_ver()
Returns the software version extracted first from C<adProdSwVersion> or
C<adAOSDeviceVersion>.
=item $adtran->model()
Returns the model extracted first from C<adProdName> or
C<adAOSDeviceProductName>.
=item $adtran->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.
=over
=item $adtran->v_name()
VLAN names table.
=item $adtran->i_name()
Interface names table.
=item $adtran->i_vlan()
Returns a mapping between C<ifIndex> and the PVID or default VLAN.
=item $adtran->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 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::Layer3
See documentation in L<SNMP::Info::Layer3/"TABLE METHODS"> for details.
=cut

View File

@@ -0,0 +1,512 @@
# SNMP::Info::Layer2::Aerohive
#
# Copyright (c) 2018 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::Layer2::Aerohive;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Aerohive::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Aerohive::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'AH-SYSTEM-MIB' => 'ahSystemSerial',
'AH-INTERFACE-MIB' => 'ahSSIDName',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
# AH-SYSTEM-MIB
'serial' => 'ahSystemSerial',
'os_bin' => 'ahFirmwareVersion',
# not documented in the most recent mib,
# but this is the base mac for the device
'ah_mac' => '.1.3.6.1.4.1.26928.1.3.2.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
# AH-INTERFACE-MIB::ahRadioAttributeTable
'i_80211channel' => 'ahRadioChannel',
'dot11_cur_tx_pwr_mw' => 'ahRadioTxPower',
# AH-INTERFACE-MIB::ahXIfTable
'ah_i_ssidlist' => 'ahSSIDName',
# AH-INTERFACE-MIB::ahAssociationTable
'cd11_txrate' => 'ahClientLastTxRate',
'cd11_uptime' => 'ahClientLinkUptime',
'cd11_sigstrength' => 'ahClientRSSI',
'cd11_rxpkt' => 'ahClientRxDataFrames',
'cd11_txpkt' => 'ahClientTxDataFrames',
'cd11_rxbyte' => 'ahClientRxDataOctets',
'cd11_txbyte' => 'ahClientTxDataOctets',
'cd11_ssid' => 'ahClientSSID',
'ah_c_vlan' => 'ahClientVLAN',
'ah_c_ip' => 'ahClientIP',
);
%MUNGE
= ( %SNMP::Info::Layer2::MUNGE, 'at_paddr' => \&SNMP::Info::munge_mac, );
# hiveos does not have sysServices
sub layers {
return '00000111';
}
sub vendor {
return 'aerohive';
}
sub os {
return 'hiveos';
}
sub serial {
my $aerohive = shift;
return $aerohive->ahSystemSerial()
|| $aerohive->SUPER::serial();
}
sub os_ver {
my $aerohive = shift;
my $descr = $aerohive->description();
if ( defined ($descr) && $descr =~ m/\bHiveOS\s(\d+\.\w+)\b/ix ) {
return $1;
}
return;
}
sub mac {
my $aerohive = shift;
my $ahmac = $aerohive->ah_mac();
# newer hiveos version just return the mac address
if (defined $ahmac) {
# aerohive has a 0000:0000:0000 mac format by default,
# change to 00:00:00:00:00:00
$ahmac =~ s/(..)(..:?)/$1:$2/g;
return $ahmac;
}
my @macs;
my $macs = $aerohive->i_mac();
foreach my $iid (keys %$macs) {
if (defined $macs->{$iid}) {
push( @macs, $macs->{$iid} );
}
@macs = sort(@macs);
}
return $macs[0];
}
sub model {
my $aerohive = shift;
my $descr = $aerohive->description();
if ( defined ($descr) && $descr =~ m/\b(?:Hive|)(AP\d+)\b/ix ) {
return $1;
}
return;
}
sub i_ssidlist {
my $aerohive = shift;
my $partial = shift;
my $ssids = $aerohive->ah_i_ssidlist($partial) || {};
my %i_ssidlist;
foreach my $iid ( keys %$ssids ) {
my $ssid = $ssids->{$iid};
next if $ssid =~ /N\/A/i;
$i_ssidlist{$iid} = $ssid;
}
return \%i_ssidlist;
}
sub i_ssidmac {
my $aerohive = shift;
my $partial = shift;
my $ssids = $aerohive->i_ssidlist($partial) || {};
my $macs = $aerohive->i_mac($partial) || {};
my %i_ssidmac;
foreach my $iid ( keys %$ssids ) {
my $mac = $macs->{$iid};
next unless $mac;
$i_ssidmac{$iid} = $mac;
}
return \%i_ssidmac;
}
# Break up the ahAssociationEntry INDEX into ifIndex and MAC Address.
sub _ah_association_index {
my $idx = shift;
my @values = split( /\./, $idx );
my $ifindex = shift(@values);
my $length = shift(@values);
return ( $ifindex, join( ':', map { sprintf "%02x", $_ } @values ) );
}
sub cd11_port {
my $aerohive = shift;
my $cd11_txrate = $aerohive->cd11_txrate();
my $interfaces = $aerohive->interfaces();
my %ret;
foreach ( keys %$cd11_txrate ) {
my ( $ifindex, $mac ) = _ah_association_index($_);
$ret{$_} = $interfaces->{$ifindex};
}
return \%ret;
}
sub cd11_mac {
my $aerohive = shift;
my $cd11_txrate = $aerohive->cd11_txrate();
my %ret;
foreach ( keys %$cd11_txrate ) {
my ( $ifindex, $mac ) = _ah_association_index($_);
$ret{$_} = $mac;
}
return \%ret;
}
# Does not support the standard Bridge MIB
sub bp_index {
my $aerohive = shift;
my $partial = shift;
# somewhere caching is doing something strange, without load_
# netdisco can't find bp_index mappings & will not registerer
# any clients. netdisco/netdisco#496
my $i_index = $aerohive->load_i_index($partial) || {};
my %bp_index;
foreach my $iid ( keys %$i_index ) {
my $index = $i_index->{$iid};
next unless defined $index;
$bp_index{$index} = $iid;
}
return \%bp_index;
}
sub qb_fw_port {
my $aerohive = shift;
my $partial = shift;
my $txrate = $aerohive->cd11_txrate($partial) || {};
my $qb_fw_port = {};
foreach my $idx ( keys %$txrate ) {
my ( $fdb_id, $mac ) = _ah_association_index($idx);
$qb_fw_port->{$idx} = $fdb_id;
}
return $qb_fw_port;
}
sub qb_fw_mac {
my $aerohive = shift;
my $partial = shift;
my $txrate = $aerohive->cd11_txrate($partial) || {};
my $qb_fw_mac = {};
foreach my $idx ( keys %$txrate ) {
my ( $fdb_id, $mac ) = _ah_association_index($idx);
$qb_fw_mac->{$idx} = $mac;
}
return $qb_fw_mac;
}
sub qb_fw_vlan {
my $aerohive = shift;
my $partial = shift;
my $vlans = $aerohive->ah_c_vlan($partial) || {};
my $qb_fw_vlan = {};
foreach my $idx ( keys %$vlans ) {
my $vlan = $vlans->{$idx};
next unless defined $vlan;
$qb_fw_vlan->{$idx} = $vlan;
}
return $qb_fw_vlan;
}
# arpnip:
#
# This is the AP snooping on the MAC->IP mappings.
# Pretending this is arpnip data allows us to get MAC->IP
# mappings even for stations that only communicate locally.
sub at_paddr {
my $aerohive = shift;
my $txrate = $aerohive->cd11_txrate() || {};
my $at_paddr = {};
foreach my $idx ( keys %$txrate ) {
my ( $fdb_id, $mac ) = _ah_association_index($idx);
$at_paddr->{$idx} = $mac;
}
return $at_paddr;
}
sub at_netaddr {
my $aerohive = shift;
my $ips = $aerohive->ah_c_ip() || {};
my $ret = {};
foreach my $idx ( keys %$ips ) {
next if ( $ips->{$idx} eq '0.0.0.0' );
$ret->{$idx} = $ips->{$idx};
}
return $ret;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Aerohive - SNMP Interface to Aerohive / Extreme
access points
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $aerohive = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $aerohive->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from an
Aerohive / Extreme wireless access point through SNMP.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<AH-SYSTEM-MIB>
=item F<AH-INTERFACE-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.
=over
=item $aerohive->vendor()
Returns 'aerohive'.
=item $aerohive->os()
Returns 'hiveos'.
=item $aerohive->serial()
Returns the serial number extracted from C<ahSystemSerial>.
=item $aerohive->os_ver()
Returns the OS version extracted from C<sysDescr>.
=item $aerohive->os_bin()
Returns the firmware version extracted from C<ahFirmwareVersion>.
=item $aerohive->mac()
Returns the base mac address of the aerohive unit from an undocumented
snmp oid. if this oid is not available it will walk all interfaces and
return the lowest numbered mac address.
=item $aerohive->model()
Returns the model extracted from C<sysDescr>.
=back
=head2 Overrides
=over
=item $aerohive->layers()
Returns 00000111. Layer 2 and Layer 3 functionality through proprietary MIBs.
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See 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.
=over
=item $aerohive->i_ssidlist()
Returns reference to hash. SSID's recognized by the radio interface.
=item $aerohive->i_ssidmac()
With the same keys as i_ssidlist, returns the Basic service set
identification (BSSID), MAC address, the AP is using for the SSID.
=item $aerohive->i_80211channel()
Returns reference to hash. Current operating frequency channel of the radio
interface.
C<ahRadioChannel>
=item $aerohive->dot11_cur_tx_pwr_mw()
Returns reference to hash. Current transmit power, in milliwatts, of the
radio interface.
C<ahRadioTxPower>
=item $aerohive->cd11_port()
Returns radio interfaces.
=item $aerohive->cd11_mac()
Returns client radio interface MAC addresses.
=back
=head2 Overrides
=over
=item $aerohive->bp_index()
Simulates bridge MIB by returning reference to a hash mapping i_index() to
the interface iid.
=item $aerohive->qb_fw_port()
Returns reference to hash of forwarding table entries port interface
identifier (iid).
=item $aerohive->qb_fw_mac()
Returns reference to hash of forwarding table MAC Addresses.
C<ahClientMac>
=item $aerohive->qb_fw_vlan()
Returns reference to hash of forwarding table entries VLAN ID.
C<ahClientVLAN>
=back
=head2 Arp Cache Table Augmentation
The AP has knowledge of MAC->IP mappings for wireless clients.
Augmenting the arp cache data with these MAC->IP mappings enables visibility
for stations that only communicate locally.
=over
=item $aerohive->at_paddr()
C<ahClientMac>
=item $aerohive->at_netaddr()
C<ahClientIP>
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Airespace
# $Id$
#
# Copyright (c) 2008 Eric Miller
#
@@ -30,6 +29,7 @@
package SNMP::Info::Layer2::Airespace;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Bridge;
use SNMP::Info::CDP;
@@ -39,15 +39,16 @@ use SNMP::Info::Airespace;
= 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%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',
'CISCO-LWAPP-DOT11-MIB' => 'cldHtDot11nChannelBandwidth',
'CISCO-LWAPP-AP-MIB' => 'cLApIfMacAddress',
);
%GLOBALS = (
@@ -58,28 +59,84 @@ $VERSION = '2.09';
%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',
# CISCO-LWAPP-AP-MIB::cLApTable
'ap_if_mac' => 'cLApIfMacAddress',
# CISCO-LWAPP-DOT11-CLIENT-MIB::cldcClientTable
'client_txrate' => 'cldcClientCurrentTxRateSet',
'cd11_proto' => 'cldcClientProtocol',
'cd11_rateset' => 'cldcClientDataRateSet',
# CISCO-LWAPP-DOT11-MIB::cldHtMacOperationsTable
'cd11n_ch_bw' => 'cldHtDot11nChannelBandwidth',
);
%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,
'ap_if_mac' => \&SNMP::Info::munge_mac,
'cd11n_ch_bw' => \&munge_cd11n_ch_bw,
'cd11_rateset' => \&munge_cd11_rateset,
'cd11_proto' => \&munge_cd11_proto,
);
# 802.11n Modulation and Coding Scheme (MCS)
my $mcs_index = {
20 => {
m0 => '6.5',
m1 => '13',
m2 => '19.5',
m3 => '26',
m4 => '39',
m5 => '52',
m6 => '58.5',
m7 => '65',
m8 => '13',
m9 => '26',
m10 => '39',
m11 => '52',
m12 => '78',
m13 => '104',
m14 => '117',
m15 => '130',
m16 => '19.5',
m17 => '39',
m18 => '58.5',
m19 => '78',
m20 => '117',
m21 => '156',
m22 => '175.5',
m23 => '195',
# This is a cheat for 802.11a bonded
m108 => '108',
},
40 => {
m0 => '15',
m1 => '30',
m2 => '45',
m3 => '60',
m4 => '90',
m5 => '120',
m6 => '135',
m7 => '157.5',
m8 => '30',
m9 => '60',
m10 => '90',
m11 => '120',
m12 => '180',
m13 => '240',
m14 => '270',
m15 => '300',
m16 => '45',
m17 => '90',
m18 => '135',
m19 => '180',
m20 => '270',
m21 => '360',
m22 => '405',
m23 => '450',
}
};
sub os {
return 'cisco';
}
@@ -96,9 +153,6 @@ sub model {
return $model;
}
# vlan:
# AIRESPACE-SWITCHING-MIB::agentInterfaceVlanId
sub cd11_mac {
my $airespace = shift;
my $cd11_sigstrength = $airespace->cd11_sigstrength();
@@ -111,13 +165,48 @@ sub cd11_mac {
return $ret;
}
sub munge_cd11_txrate {
my $rate = shift;
if ( $rate ) {
return [ $rate * 1.0 ];
} else {
return [ 0.0 ];
sub cd11_txrate {
my $airespace = shift;
my $rates = $airespace->client_txrate() || {};
my $protos = $airespace->cd11_proto() || {};
my $bws = $airespace->cd11n_ch_bw() || {};
my $cd11_txrate = {};
foreach my $idx ( keys %$rates ) {
my $rate = $rates->{$idx} || '0.0';
if ( $rate =~ /^\d+/ ) {
$cd11_txrate->{$idx} = [ $rate * 1.0 ];
}
elsif ( $rate =~ /^m/ ) {
my $band = $protos->{$idx};
my $bw = $bws->{$band};
# FIXME throw some kind of error if we get an index/rate that we haven't implemented yet? Now we simply return "0.0"...
$cd11_txrate->{$idx} = [ $mcs_index->{$bw}->{$rate} || '0.0' ];
}
else {
$cd11_txrate->{$idx} = [ $rate ];
}
}
return $cd11_txrate;
}
sub munge_cd11n_ch_bw {
my $bw = shift;
if ( $bw =~ /forty/ ) {
return 40;
}
return 20;
}
sub munge_cd11_proto {
my $bw = shift;
return 2 if ( $bw eq 'dot11n5' );
return 1;
}
sub munge_cd11_rateset {
@@ -125,11 +214,29 @@ sub munge_cd11_rateset {
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;
# Cisco provides the AP's Ethernet MAC via
# CISCO-LWAPP-AP-MIB::cLApIfMacAddress this was not available pre-Cisco
sub i_mac {
my $airespace = shift;
my $partial = shift;
my $i_index = $airespace->i_index($partial) || {};
my $ap_mac = $airespace->ap_if_mac() || {};
my $i_mac = $airespace->SUPER::i_mac() || {};
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}/ ) {
$index =~ s/\.\d+$//;
next unless defined $index;
my $sys_mac = join( '.', map { hex($_) } split( ':', $index ) );
my $mac = $ap_mac->{$sys_mac};
$i_mac->{$iid} = $mac;
}
}
return $i_mac;
}
1;
@@ -154,7 +261,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -163,14 +270,9 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from
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
@@ -187,6 +289,12 @@ my $airespace = new SNMP::Info::Layer2::Airespace(...);
=over
=item F<CISCO-LWAPP-DOT11-CLIENT-MIB>
=item F<CISCO-LWAPP-DOT11-MIB>
=item F<CISCO-LWAPP-AP-MIB>
=item Inherited Classes' MIBs
See L<SNMP::Info::Airespace/"Required MIBs"> for its own MIB requirements.
@@ -234,14 +342,28 @@ See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
These are methods that return tables of information in the form of a reference
to a hash.
=over
=over
=item cd11_mac()
=back
Returns client radio interface MAC addresses.
=item cd11_txrate()
Returns client transmission speed in Mbs.
=back
=head2 Overrides
=over
=item i_mac()
Adds AP Ethernet MAC as port mac on radio ports from C<CISCO-LWAPP-AP-MIB>.
=back
=head2 Table Methods imported from SNMP::Info::Airespace
See documentation in L<SNMP::Info::Airespace/"TABLE METHODS"> for details.
@@ -254,15 +376,22 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
=head1 MUNGES
=head1 Data Munging Callback Subroutines
=over
=item munge_64bits()
=item munge_cd11n_ch_bw()
Converts 802.11n channel bandwidth to either 20 or 40.
=item munge_cd11_proto()
Converts 802.11n 2.4Ghz to 1 and 5Ghz to 2 to correspond to the
(C<cldHtMacOperationsTable>) index.
=item munge_cd11_rateset()
=item munge_cd11_txrate()
Converts rate set to array.
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Aironet
# $Id$
#
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
#
@@ -33,9 +32,9 @@
package SNMP::Info::Layer2::Aironet;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Entity;
use SNMP::Info::EtherLike;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
@@ -43,30 +42,28 @@ use SNMP::Info::CDP;
use SNMP::Info::IEEE802dot11;
@SNMP::Info::Layer2::Aironet::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::Entity SNMP::Info::EtherLike
= qw/SNMP::Info::Layer2 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%GLOBALS = (
%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'
'ps1_type' => 'cpoePdCurrentPowerSource',
);
%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,
@@ -88,7 +85,6 @@ $VERSION = '2.09';
%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,
@@ -97,12 +93,12 @@ $VERSION = '2.09';
'CISCO-DOT11-ASSOCIATION-MIB' => 'cDot11ClientSubIfIndex',
'CISCO-DOT11-SSID-SECURITY-MIB' => 'cdot11SecVlanNameId',
'CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB' => 'cviRoutedVlanIfIndex',
'CISCO-POE-PD-MIB' => 'cpoePdCurrentPowerSource',
);
%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,
@@ -117,7 +113,6 @@ $VERSION = '2.09';
= \&SNMP::Info::IEEE802dot11::dot11_cur_tx_pwr_mw;
sub vendor {
# Sorry, but it's true.
return 'cisco';
}
@@ -134,11 +129,16 @@ sub interfaces {
# Tag on e_descr.1
sub description {
my $aironet = shift;
my $descr = $aironet->descr();
my $descr = $aironet->SUPER::description();
my $e_descr = $aironet->e_descr();
$descr = "$e_descr->{1} $descr" if defined $e_descr->{1};
if (defined $e_descr->{1}) {
if (defined $descr) {
$descr = "$e_descr->{1} $descr"
} else {
$descr = "$e_descr->{1}"
}
}
return $descr;
}
@@ -442,7 +442,7 @@ sub i_ssidmac {
my $partial = shift;
my $mbss_mac_addr = $aironet->mbss_mac_addr();
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
# Same logic as i_ssidbcast to return same indexes as i_ssidlist
my $map = {};
foreach my $key ( keys %$mbss_mac_addr ) {
my ( $interface, @idx ) = split( /\./, $key );
@@ -457,6 +457,18 @@ sub i_ssidmac {
return $i_ssidmac;
}
###
# PoE status. The ps1_type is the PoE injector type, which is just
# a scalar; the status is a little more complex.
sub ps1_status {
my $aironet = shift;
my $idx = $aironet->cpoePdCurrentPowerLevel();
my $mw = $aironet->cpoePdSupportedPower( $idx );
my $descr = $aironet->cpoePdSupportedPowerMode( $idx );
return sprintf( "%.2fW (%s)", $mw->{$idx} * 0.001, $descr->{$idx} );
}
1;
__END__
@@ -471,14 +483,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $aironet = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $aironet->class();
@@ -504,7 +516,7 @@ 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.
after determining a more specific class using the method above.
my $aironet = new SNMP::Info::Layer2::Aironet(...);
@@ -514,8 +526,6 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
=item SNMP::Info::Layer2
=item SNMP::Info::Entity
=item SNMP::Info::EtherLike
=item SNMP::Info::CiscoStats
@@ -528,6 +538,16 @@ my $aironet = new SNMP::Info::Layer2::Aironet(...);
=over
=item F<CISCO-DOT11-ASSOCIATION-MIB>
=item F<CISCO-DOT11-IF-MIB>
=item F<CISCO-DOT11-SSID-SECURITY-MIB>
=item F<CISCO-POE-PD-MIB>
=item F<CISCO-VLAN-IFTABLE-RELATIONSHIP-MIB>
=item Inherited Classes
MIBs required by the inherited classes listed above.
@@ -540,17 +560,13 @@ These are methods that return scalar value from SNMP
=over
=item $aironet->discription()
Adds info from method e_descr() from SNMP::Info::Entity
=item $aironet->vendor()
Returns 'cisco'
=item $aironet->description()
System description
System description. Adds info from method e_descr() from SNMP::Info::Entity
=back
@@ -558,10 +574,6 @@ System description
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EtherLike
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
@@ -576,7 +588,7 @@ Returns radio interfaces.
=item $aironet->cd11_mac()
Returns radio interface MAC addresses.
Returns client radio interface MAC addresses.
=item $aironet->cd11_ssid()
@@ -646,7 +658,12 @@ being broadcast.
=item $aironet->i_ssidmac()
With the same keys as i_ssidlist, returns the Basic service set
identification (BSSID), MAC address, the AP is using for the SSID.
identification (BSSID), MAC address, the AP is using for the SSID.
=item $aironet ps1_status()
Returns the PoE injector status based on C<cpoePdSupportedPower> and
C<cpoePdSupportedPowerMode>.
=back
@@ -654,10 +671,6 @@ identification (BSSID), MAC address, the AP is using for the SSID.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Entity
See documentation in L<SNMP::Info::Entity/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::EtherLike
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Allied
# $Id$
#
# Copyright (c) 2008 Max Baker
# All rights reserved.
@@ -31,6 +30,7 @@
package SNMP::Info::Layer2::Allied;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::Layer1;
@@ -38,9 +38,9 @@ use SNMP::Info::Layer1;
@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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
@@ -70,17 +70,17 @@ sub os_ver {
my $allied = shift;
my $descr = $allied->description();
if ( $descr =~ m/version (\d+\.\d+)/ ) {
if ( defined ($descr) && $descr =~ m/version (\d+\.\d+)/ ) {
return $1;
}
return;
}
sub model {
my $allied = shift;
my $desc = $allied->description();
if ( $desc =~ /(AT-80\d{2}\S*)/ ) {
if ( defined ($desc) && $desc =~ /(AT-80\d{2}\S*)/ ) {
return $1;
}
return;
@@ -137,14 +137,14 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net>
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $allied = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myhub',
Community => 'public',
Version => 1
)
)
or die "Can't connect to DestHost.\n";
my $class = $allied->class();
@@ -152,8 +152,8 @@ Max Baker, Dmitry Sergienko <dmitry@trifle.net>
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Allied device through SNMP. See inherited classes' documentation for
Provides abstraction to the configuration information obtainable from a
Allied device through SNMP. See inherited classes' documentation for
inherited methods.
=head2 Inherited Classes
@@ -190,11 +190,11 @@ These are methods that return scalar value from SNMP
=item $allied->vendor()
Returns 'allied' :)
Returns 'allied'
=item $allied->os()
Returns 'allied'
Returns 'allied'
=item $allied->os_ver()
@@ -212,7 +212,7 @@ Tries to cull out C<AT-nnnnX> out of the description field.
=item $allied->mac()
Returns device MAC.
Returns device MAC.
=back

View File

@@ -0,0 +1,168 @@
# SNMP::Info::Layer2::Atmedia
#
# Copyright (c) 2018 Netdisco Developers
# 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::Atmedia;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Atmedia::ISA = qw/SNMP::Info::Layer2/;
@SNMP::Info::Layer2::Atmedia::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = ( %SNMP::Info::Layer2::MIBS );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'os_ver' => '.1.3.6.1.4.1.13458.1.2.1.0',
'atm_serial' => '.1.3.6.1.4.1.13458.1.1.2.0',
'atm_hardversion' => '.1.3.6.1.4.1.13458.1.3.1.0',
'atm_model' => '.1.3.6.1.4.1.13458.1.1.6.0',
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS);
%MUNGE = (%SNMP::Info::Layer2::MUNGE);
sub serial {
my $atmedia = shift;
return $atmedia->atm_serial();
}
sub os {
return 'Atmedia-OS';
}
sub model {
my $atmedia = shift;
my $atmedia_model = $atmedia->atm_model();
if (defined $atmedia_model) {
$atmedia_model =~ s/\<|\>//g;
$atmedia_model =~ s/\//_/g;
return $atmedia_model;
}
return;
}
sub vendor {
return 'atmedia';
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Atmedia - SNMP Interface to atmedia encryptors
=head1 AUTHOR
Netdisco Developers
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $atmedia = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myhub',
Community => 'public',
Version => 1
)
or die "Can't connect to DestHost.\n";
my $class = $atmedia->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to information obtainable from a atmedia encryptor
through SNMP. See inherited classes' documentation for inherited methods.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=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
=head2 Overrides
=over
=item $atmedia->vendor()
Returns 'atmedia'
=item $atmedia->os()
Returns 'Atmedia-OS'
=item $atmedia->os_ver()
(C<acSoftVersion>)
=item $atmedia->model()
(C<acDescr>)
=item $atmedia->serial()
(C<acSerialNumber>)
=back
=head2 Globals imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE METHODS
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Baystack
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
# All rights reserved.
@@ -31,39 +30,41 @@
package SNMP::Info::Layer2::Baystack;
use strict;
use warnings;
use Exporter;
use SNMP::Info::SONMP;
use SNMP::Info::NortelStack;
use SNMP::Info::RapidCity;
use SNMP::Info::LLDP;
use SNMP::Info::Layer3;
@SNMP::Info::Layer2::Baystack::ISA
= qw/SNMP::Info::SONMP SNMP::Info::NortelStack
SNMP::Info::RapidCity SNMP::Info::LLDP
SNMP::Info::RapidCity
SNMP::Info::Layer3 Exporter/;
@SNMP::Info::Layer2::Baystack::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer3::MIBS, %SNMP::Info::LLDP::MIBS,
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::RapidCity::MIBS, %SNMP::Info::NortelStack::MIBS,
%SNMP::Info::SONMP::MIBS,
'BAY-STACK-PETH-EXT-MIB' => 'bspePethPsePortExtMeasuredPower',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS, %SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::RapidCity::GLOBALS, %SNMP::Info::NortelStack::GLOBALS,
%SNMP::Info::SONMP::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer3::FUNCS, %SNMP::Info::LLDP::FUNCS,
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::RapidCity::FUNCS, %SNMP::Info::NortelStack::FUNCS,
%SNMP::Info::SONMP::FUNCS,
'peth_port_power' => 'bspePethPsePortExtMeasuredPower',
);
# 450's report full duplex as speed = 20mbps?!
@@ -72,34 +73,27 @@ $SNMP::Info::SPEED_MAP{200_000_000} = '100 Mbps';
$SNMP::Info::SPEED_MAP{2_000_000_000} = '1.0 Gbps';
%MUNGE = (
%SNMP::Info::Layer3::MUNGE, %SNMP::Info::LLDP::MUNGE,
%SNMP::Info::Layer3::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 $descr and $descr =~ /Business Ethernet Switch.*SW:v/i ) )
{
if ( $descr =~ /Business Ethernet Switch.*SW:v/i ) {
return 'bes';
}
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)/ )
)
)
if ( ( ( $model =~ /(420|425|BPS)/ ) and ( $descr =~ m/SW:v[1-2]/i ) )
or ( ( $model =~ /(410|450|380)/ ) ) )
{
return 'baystack';
}
if ( $model =~ /VSP/ ) {
return 'vsp';
}
return 'boss';
}
@@ -126,7 +120,7 @@ sub os_bin {
}
sub vendor {
return 'nortel';
return 'avaya';
}
sub model {
@@ -141,9 +135,12 @@ sub model {
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+)/ );
# Pull sreg- from all
$model =~ s/^sreg-//;
# Strip ES/ERS/BayStack etc. from those families
$model =~ s/^(E(R)?S|BayStack|Ethernet(Routing)?Switch)-?//;
$model =~ s/-ethSwitchNMM//;
return $model;
}
@@ -214,7 +211,7 @@ sub i_name {
sub index_factor {
my $baystack = shift;
my $model = $baystack->model();
my $model = $baystack->model() || "";
my $os = $baystack->os();
my $os_ver = $baystack->os_ver();
my $op_mode = $baystack->ns_op_mode();
@@ -228,142 +225,16 @@ sub index_factor {
my $index_factor = 32;
$index_factor = 64
if ( ( defined $model and $model =~ /(470)/ )
if ( ( $model =~ /(470)/ )
or ( $os =~ m/(boss|bes)/ ) and ( $op_mode eq 'pure' ) );
$index_factor = 128
if ( ( defined $model and $model =~ /(5[56]\d\d)/ )
if ( ( $model =~ /(5[56]\d\d)|VSP|4950|59100/ )
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.
@@ -469,14 +340,68 @@ sub peth_port_ifindex {
return \%peth_port_ifindex;
}
# Currently only ERS 4800 v5.8+ support the rcBridgeSpbmMacTable
# which holds the FDB for a SPBM edge deployment.
#
# Q-BRIDGE still holds some entries when the rcBridgeSpbmMacTable is in use
# so we merge hash entries.
sub fw_mac {
my $rapidcity = shift;
my $qb = $rapidcity->SUPER::fw_mac() || {};
my $spbm = $rapidcity->rc_spbm_fw_mac() || {};
my $fw_mac = { %$qb, %$spbm };
return $fw_mac;
}
sub fw_port {
my $rapidcity = shift;
my $qb = $rapidcity->SUPER::fw_port() || {};
my $spbm = $rapidcity->rc_spbm_fw_port() || {};
my $fw_port = { %$qb, %$spbm };
return $fw_port;
}
sub fw_status {
my $rapidcity = shift;
my $qb = $rapidcity->SUPER::fw_status() || {};
my $spbm = $rapidcity->rc_spbm_fw_status() || {};
my $fw_status = { %$qb, %$spbm };
return $fw_status;
}
sub qb_fw_vlan {
my $rapidcity = shift;
my $qb = $rapidcity->SUPER::qb_fw_vlan() || {};
my $spbm = $rapidcity->rc_spbm_fw_vlan() || {};
my $qb_fw_vlan = { %$qb, %$spbm };
return $qb_fw_vlan;
}
# Baystack uses S5-AGENT-MIB (loaded in NortelStack) versus RAPID-CITY
sub stp_ver {
my $rapidcity = shift;
return $rapidcity->s5AgSysSpanningTreeOperMode()
|| $rapidcity->SUPER::stp_ver();
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Baystack - SNMP Interface to Nortel Ethernet (Baystack)
Switches
SNMP::Info::Layer2::Baystack - SNMP Interface to Avaya Ethernet Switch
(Baystack) and VSP 7000 series switches
=head1 AUTHOR
@@ -491,7 +416,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $baystack->class();
@@ -499,13 +424,9 @@ Eric Miller
=head1 DESCRIPTION
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.
my $baystack = new SNMP::Info::Layer2::Baystack(...);
Provides abstraction to the configuration information obtainable from an
Avaya Ethernet Switch (formerly Nortel/Bay Baystack) and VSP 7000 series
through SNMP.
=head2 Inherited Classes
@@ -517,8 +438,6 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
=item SNMP::Info::RapidCity
=item SNMP::Info::LLDP
=item SNMP::Info::Layer3
=back
@@ -527,6 +446,8 @@ my $baystack = new SNMP::Info::Layer2::Baystack(...);
=over
=item F<BAY-STACK-PETH-EXT-MIB>
=back
=head2 Inherited MIBs
@@ -537,8 +458,6 @@ 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
@@ -549,7 +468,7 @@ These are methods that return scalar value from SNMP
=item $baystack->vendor()
Returns 'nortel'
Returns 'avaya'
=item $baystack->model()
@@ -569,6 +488,14 @@ Returns 'baystack' or 'boss' depending on software version.
Returns the firmware version extracted from C<sysDescr>.
=item $baystack->stp_ver()
Returns the particular STP version running on this device.
Values: C<nortelStpg>, C<pvst>, C<rstp>, C<mstp>, C<ieee8021d>
(C<s5AgSysSpanningTreeOperMode>)
=back
=head2 Overrides
@@ -600,10 +527,6 @@ See L<SNMP::Info::NortelStack/"GLOBALS"> for details.
See L<SNMP::Info::RapidCity/"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::Layer3
See L<SNMP::Info::Layer3/"GLOBALS"> for details.
@@ -623,10 +546,10 @@ Returns reference to the map between IID and physical Port.
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
The physical port name is returned as slot.port.
=item $baystack->i_ignore()
@@ -635,9 +558,9 @@ Returns reference to hash of IIDs to ignore.
=item $baystack->i_mac()
Returns the C<ifPhysAddress> table entries.
Returns the C<ifPhysAddress> table entries.
Removes all entries matching '00:00:00:00:00:00' -- Certain
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()
@@ -645,10 +568,16 @@ revisions of Baystack firmware report all zeros for each port mac.
Crosses C<ifName> with C<ifAlias> and returns the human set port name if
exists.
=item $poe->peth_port_ifindex()
=item $baystack->peth_port_ifindex()
Maps the C<pethPsePortTable> to C<ifIndex> by way of the F<ENTITY-MIB>.
=item $baystack->peth_port_power()
Power supplied by PoE ports, in milliwatts
(C<bspePethPsePortExtMeasuredPower>)
=back
=head2 F<ENTITY-MIB> Information
@@ -659,111 +588,89 @@ L<SNMP::Info::NortelStack/"TABLE METHODS"> for details on ns_e_* methods.
=over
=item $baystack->e_index()
=item $baystack->e_index()
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().
=item $baystack->e_class()
=item $baystack->e_class()
If the device doesn't support C<entPhysicalClass>, this will try ns_e_class().
=item $baystack->e_descr()
=item $baystack->e_descr()
If the device doesn't support C<entPhysicalDescr>, this will try ns_e_descr().
=item $baystack->e_name()
=item $baystack->e_name()
If the device doesn't support C<entPhysicalName>, this will try ns_e_name().
=item $baystack->e_fwver()
=item $baystack->e_fwver()
If the device doesn't support C<entPhysicalFirmwareRev>, this will try
ns_e_fwver().
=item $baystack->e_hwver()
=item $baystack->e_hwver()
If the device doesn't support C<entPhysicalHardwareRev>, this will try
ns_e_hwver().
=item $baystack->e_parent()
=item $baystack->e_parent()
If the device doesn't support C<entPhysicalContainedIn>, this will try
ns_e_parent().
=item $baystack->e_pos()
=item $baystack->e_pos()
If the device doesn't support C<entPhysicalParentRelPos>, this will try
ns_e_pos().
=item $baystack->e_serial()
=item $baystack->e_serial()
If the device doesn't support C<entPhysicalSerialNum>, this will try
ns_e_serial().
=item $baystack->e_swver()
=item $baystack->e_swver()
If the device doesn't support C<entPhysicalSoftwareRev>, this will try
ns_e_swver().
=item $baystack->e_type()
=item $baystack->e_type()
If the device doesn't support C<entPhysicalVendorType>, this will try
ns_e_type().
=item $baystack->e_vendor()
=item $baystack->e_vendor()
If the device doesn't support C<entPhysicalMfgName>, this will try
ns_e_vendor().
=back
=head2 Topology information
=head2 Layer 2 Forwarding Database
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.
These methods try to obtain the layer 2 forwarding database entries via the
normal bridge methods as well as SPBM entries via rapid city methods.
=over
=item $baystack->hasCDP()
=item $baystack->fw_mac()
Returns true if the device is running either SONMP or LLDP.
Returns reference to hash of forwarding table MAC Addresses
=item $baystack->c_if()
=item $baystack->fw_port()
Returns reference to hash. Key: iid Value: local device port (interfaces)
Returns reference to hash of forwarding table entries port interface
identifier (iid)
=item $baystack->c_ip()
=item $baystack->qb_fw_vlan()
Returns reference to hash. Key: iid Value: remote IPv4 address
Returns reference to hash of forwarding table entries VLAN ID
If multiple entries exist with the same local port, c_if(), with the same IPv4
address, c_ip(), it may be a duplicate entry.
=item $baystack->fw_status()
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
Returns reference to hash of forwarding table entries status
=back
@@ -779,10 +686,6 @@ See L<SNMP::Info::NortelStack/"TABLE METHODS"> 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.

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::C1900
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,23 +32,28 @@
package SNMP::Info::Layer2::C1900;
use strict;
use warnings;
use Exporter;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CiscoStpExtensions;
use SNMP::Info::CiscoAgg;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::C1900::ISA = qw/SNMP::Info::CDP SNMP::Info::CiscoStats
SNMP::Info::CiscoConfig SNMP::Info::Layer2
SNMP::Info::CiscoConfig SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg SNMP::Info::Layer2
Exporter/;
@SNMP::Info::Layer2::C1900::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoAgg::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
@@ -58,6 +62,8 @@ $VERSION = '2.09';
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoAgg::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
@@ -75,6 +81,8 @@ $VERSION = '2.09';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoAgg::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
@@ -84,8 +92,9 @@ $VERSION = '2.09';
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
%SNMP::Info::Layer2::MUNGE, %SNMP::Info::CiscoAgg::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE, %SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoStats::MUNGE, %SNMP::Info::CDP::MUNGE,
);
sub bulkwalk_no { return 1; }
@@ -191,6 +200,8 @@ sub set_i_duplex_admin {
my $iid = $c1900->c1900_p_ifindex($port);
return 0 unless $iid->{$port};
$duplex = lc($duplex);
return 0 unless defined $duplexes{$duplex};
@@ -203,16 +214,17 @@ sub i_vlan {
my $partial = shift;
# Overlap allows more than one VLAN per port. Unable to determine default
my $overlap = $c1900->bridgeGroupAllowMembershipOverlap()
my $overlap
= $c1900->bridgeGroupAllowMembershipOverlap()
|| $c1900->vlanAllowMembershipOverlap()
|| 'disabled';
if ( $overlap eq 'enabled' ) {
return;
return {};
}
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|| $c1900->vlanMemberPortOfVlan();
|| $c1900->vlanMemberPortOfVlan() || {};
my $i_pvid = {};
foreach my $idx ( keys %$member_of ) {
@@ -234,7 +246,7 @@ sub i_vlan_membership {
my $partial = shift;
my $member_of = $c1900->bridgeGroupMemberPortOfBridgeGroup()
|| $c1900->vlanMemberPortOfVlan();
|| $c1900->vlanMemberPortOfVlan() || {};
my $i_vlan_membership = {};
foreach my $idx ( keys %$member_of ) {
@@ -251,6 +263,8 @@ sub i_vlan_membership {
return $i_vlan_membership;
}
sub i_vlan_membership_untagged { return {}; }
sub bp_index {
my $c1900 = shift;
my $partial = shift;
@@ -258,7 +272,7 @@ sub bp_index {
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});
$index->{$iid} = $iid if ( !defined $index->{$iid} );
}
return $index;
}
@@ -277,14 +291,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $c1900 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 1
)
)
or die "Can't connect to DestHost.\n";
my $class = $c1900->class();
@@ -297,11 +311,6 @@ 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.
my $c1900 = new SNMP::Info::Layer2::C1900(...);
=head2 Inherited classes
=over
@@ -312,6 +321,10 @@ after determining a more specific class using the method above.
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoStpExtensions
=item SNMP::Info::CiscoAgg
=item SNMP::Info::Layer2
=back
@@ -324,8 +337,6 @@ after determining a more specific class using the method above.
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
=back
=head2 Inherited MIBs
@@ -336,6 +347,10 @@ 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::CiscoStpExtensions/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
@@ -357,14 +372,14 @@ Returns 'catalyst'
=item $c1900->os_ver()
Returns CatOS version if obtainable. First tries to use
SNMP::Info::CiscoStats->os_ver() . If that fails then it
Returns CatOS version if obtainable. First tries to use
SNMP::Info::CiscoStats->os_ver() . If that fails then it
checks for the presence of $c1900->c1900_flash_status() and culls
the version from there.
=item $c1900->vendor()
Returns 'cisco' :)
Returns 'cisco'
=back
@@ -394,6 +409,10 @@ See L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
See L<SNMP::Info::CiscoConfig/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoStpExtensions
See L<SNMP::Info::CiscoStpExtensions/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
@@ -437,13 +456,16 @@ 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->i_vlan_membership_untagged()
Unsupported, returns nothing.
=item $c1900->bp_index()
@@ -477,7 +499,7 @@ Gives admin setting for Duplex Info
=item $c1900->c1900_p_name()
Gives human set name for port
Gives human set name for port
(C<swPortName>)
@@ -513,6 +535,14 @@ See L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
See L<SNMP::Info::CiscoConfig/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoStpExtensions
See L<SNMP::Info::CiscoStpExtensions/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoAgg
See L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
@@ -522,7 +552,7 @@ See L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
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.
operations.
=over
@@ -533,7 +563,7 @@ choices are 'auto', 'half', 'full'.
Example:
my %if_map = reverse %{$c1900->interfaces()};
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
$c1900->set_i_duplex_admin('auto', $if_map{'1'})
or die "Couldn't change port duplex. ",$c1900->error(1);
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::C2900
# $Id$
#
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond.
#
@@ -33,34 +32,23 @@
package SNMP::Info::Layer2::C2900;
use strict;
use warnings;
use Exporter;
use SNMP::Info::CiscoVTP;
use SNMP::Info::CDP;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::Layer2;
use SNMP::Info::Layer2::Cisco;
@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::ISA = qw/SNMP::Info::Layer2::Cisco Exporter/;
@SNMP::Info::Layer2::C2900::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS, %SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS, %SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::Layer2::Cisco::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
%SNMP::Info::Layer2::Cisco::FUNCS,
'i_name' => 'ifAlias',
# C2900PortEntry
@@ -71,15 +59,12 @@ $VERSION = '2.09';
);
%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',
%SNMP::Info::Layer2::Cisco::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,
%SNMP::Info::Layer2::Cisco::MUNGE,
);
sub vendor {
@@ -139,6 +124,31 @@ sub i_duplex_admin {
return \%i_duplex_admin;
}
sub i_speed_admin {
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_speed_admin();
my %reverse_2900 = reverse %$c2900_p_index;
my %i_speed_admin;
foreach my $if ( keys %$interfaces ) {
my $port_2900 = $reverse_2900{$if};
next unless defined $port_2900;
my $speed = $c2900_p_admin->{$port_2900};
next unless defined $speed;
$speed = 'auto' if $speed eq 'autoDetect';
$speed = '10 Mbps' if $speed eq 's10000000';
$speed = '100 Mbps' if $speed eq 's100000000';
$i_speed_admin{$if} = $speed;
}
return \%i_speed_admin;
}
sub set_i_speed_admin {
my $c2900 = shift;
my ( $speed, $iid ) = @_;
@@ -179,7 +189,7 @@ sub set_i_duplex_admin {
return $c2900->set_c2900_p_duplex_admin( $duplexes{$duplex}, $iid );
}
# Use i_descritption for port key, cuz i_name can be manually entered.
# Use i_description for port key, cuz i_name can be manually entered.
sub interfaces {
my $c2900 = shift;
my $partial = shift;
@@ -215,7 +225,7 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $c2900 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
@@ -223,7 +233,7 @@ Max Baker
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $c2900->class();
@@ -231,27 +241,14 @@ Max Baker
=head1 DESCRIPTION
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.
my $c2900 = new SNMP::Info::Layer2::C2900(...);
Provides abstraction to the configuration information obtainable from a
C2900 device through SNMP.
=head2 Inherited Classes
=over
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoConfig
=item SNMP::Info::Layer2
=item SNMP::Info::Layer2::Cisco
=back
@@ -267,15 +264,7 @@ Part of the v2 MIBs from Cisco.
=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.
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
@@ -287,7 +276,7 @@ These are methods that return scalar value from SNMP
=item $c2900->vendor()
Returns 'cisco' :)
Returns 'cisco'
=item $c2900->cisco_comm_indexing()
@@ -295,25 +284,9 @@ Returns 1. Use vlan indexing.
=back
=head2 Globals imported from SNMP::Info::CiscoVTP
=head2 Globals imported from SNMP::Info::Layer2::Cisco
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 L<SNMP::Info::Layer2/"GLOBALS"> for details.
See L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
=head1 TABLE METHODS
@@ -331,8 +304,8 @@ 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.
Next all dots are changed for forward slashes so that the physical port name
is the same as the broad-casted CDP port name.
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.
@@ -349,9 +322,13 @@ Returns reference to hash of IIDs to admin duplex setting
Crosses $c2900->c2900_p_index() with $c2900->c2900_p_duplex_admin()
=item $c2900->i_speed_admin()
Returns reference to hash of IIDs to admin speed setting.
=back
=head2 F<C2900-MIB> Port Entry Table
=head2 F<C2900-MIB> Port Entry Table
=over
@@ -375,38 +352,22 @@ Gives admin setting for Duplex Info
=item $c2900->c2900_p_speed_admin()
Gives Admin speed of port
Gives Admin speed of port
(C<c2900PortAdminSpeed>)
=back
=head2 Table Methods imported from SNMP::Info::CiscoVTP
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
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.
See L<SNMP::Info::Layer2::Cisco/"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.
operations.
=over
@@ -421,7 +382,7 @@ port C<ifIndex>.
Example:
my %if_map = reverse %{$c2900->interfaces()};
$c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
$c2900->set_i_speed_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port speed. ",$c2900->error(1);
=item $c2900->set_i_duplex_admin(duplex, ifIndex)
@@ -435,7 +396,7 @@ port C<ifIndex>.
Example:
my %if_map = reverse %{$c2900->interfaces()};
$c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
$c2900->set_i_duplex_admin('auto', $if_map{'FastEthernet0/1'})
or die "Couldn't change port duplex. ",$c2900->error(1);
=back

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Catalyst
# $Id$
#
# Copyright (c) 2002,2003 Regents of the University of California
# Copyright (c) 2008 Max Baker changes from version 0.8 and beyond
@@ -32,59 +31,46 @@
package SNMP::Info::Layer2::Catalyst;
use strict;
use warnings;
use Exporter;
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 SNMP::Info::Layer2::Cisco;
@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/;
= qw/SNMP::Info::CiscoStack SNMP::Info::Layer2::Cisco Exporter/;
@SNMP::Info::Layer2::Catalyst::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%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,
%SNMP::Info::Layer2::Cisco::MIBS,
%SNMP::Info::CiscoStack::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
%SNMP::Info::Layer2::Cisco::GLOBALS,
%SNMP::Info::CiscoStack::GLOBALS,
);
%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,
%SNMP::Info::Layer2::Cisco::FUNCS,
%SNMP::Info::CiscoStack::FUNCS,
);
%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,
%SNMP::Info::Layer2::Cisco::MUNGE,
%SNMP::Info::CiscoStack::MUNGE,
);
# Overidden Methods
# Overridden Methods
# i_physical sets a hash entry as true if the iid is a physical port
sub i_physical {
my $cat = shift;
my $p_port = $cat->p_port();
my $p_port = $cat->p_port() || {};
my %i_physical;
foreach my $port ( keys %$p_port ) {
@@ -118,8 +104,8 @@ sub os_ver {
# Workaround for incomplete bp_index
sub bp_index {
my $cat = shift;
my $p_index = $cat->p_port();
my $b_index = $cat->p_oidx();
my $p_index = $cat->p_port() || {};
my $b_index = $cat->p_oidx() || {};
my %bp_index;
foreach my $iid ( keys %$p_index ) {
@@ -187,14 +173,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $cat = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $cat->class();
@@ -220,7 +206,7 @@ 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.
after determining a more specific class using the method above.
my $cat = new SNMP::Info::Layer2::Catalyst(...);
@@ -228,18 +214,10 @@ after determining a more specific class using the method above.
=over
=item SNMP::Info::Layer2::Cisco
=item SNMP::Info::CiscoStack
=item SNMP::Info::CiscoVTP
=item SNMP::Info::CDP
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
@@ -248,19 +226,10 @@ after determining a more specific class using the method above.
=item Inherited Classes' MIBs
See L<SNMP::Info::Layer2::Cisco/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStack/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoVTP/"Required MIBs"> 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
These MIBs are found in the standard v2 MIBs from Cisco.
@@ -277,7 +246,7 @@ Returns 'catalyst'
=item $cat->os_ver()
Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails
Tries to use the value from SNMP::Info::CiscoStats->os_ver() and if it fails
it grabs $cat->m_swver()->{1} and uses that.
=item $cat->vendor()
@@ -290,30 +259,14 @@ Returns 1. Use vlan indexing.
=back
=head2 Global Methods imported from SNMP::Info::Layer2::Cisco
See documentation in L<SNMP::Info::Layer2::Cisco/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::CiscoStack
See documentation in L<SNMP::Info::CiscoStack/"GLOBALS"> for details.
=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
@@ -326,11 +279,11 @@ to a hash.
=item $cat->interfaces()
Returns the map between SNMP Interface Identifier (iid) and physical port
name.
name.
=item $cat->i_name()
Returns reference to hash of iid to human set name.
Returns reference to hash of iid to human set name.
C<portName>
@@ -348,29 +301,12 @@ have problems with F<BRIDGE-MIB>
=back
=head2 Table Methods imported from SNMP::Info::Layer2::Cisco
See documentation in L<SNMP::Info::Layer2::Cisco/"TABLE METHODS"> for details.
=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 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 L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Centillion
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,9 +30,9 @@
package SNMP::Info::Layer2::Centillion;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::NortelStack;
use SNMP::Info::SONMP;
@@ -41,9 +40,9 @@ use SNMP::Info::SONMP;
= 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::MIBS,
@@ -246,6 +245,20 @@ sub slot_offset {
return 0;
}
sub fw_mac {
my $centillion = shift;
my $partial = shift;
return $centillion->SUPER::fw_mac($partial);
}
sub fw_port {
my $centillion = shift;
my $partial = shift;
return $centillion->SUPER::fw_port($partial);
}
1;
__END__
@@ -260,14 +273,14 @@ Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $centillion = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $centillion->class();
@@ -275,14 +288,9 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
Centillion device through SNMP.
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.
my $centillion = new SNMP::Info::Layer2::centillion(...);
Note: This class supports version 4.X and 5.X which are VLAN based rather
than bridge group based.
@@ -314,7 +322,7 @@ than bridge group based.
=item Inherited Classes' MIBs
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info/"REQUIREMENTS"> for its own MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
@@ -332,7 +340,7 @@ These are methods that return scalar value from SNMP
=item $centillion->vendor()
Returns 'Nortel'
Returns 'nortel'
=item $centillion->model()
@@ -343,7 +351,7 @@ Removes C<sreg-> from the model name
=item $centillion->os()
Returns 'Centillion'
Returns 'centillion'
=item $centillion->tftp_action()
@@ -371,11 +379,6 @@ Returns 'Centillion'
=over
=item $centillion->layers()
Returns 00000011. Class emulates Layer 2 functionality through proprietary
MIBs.
=item $centillion->index_factor()
Required by SNMP::Info::SONMP. Number representing the number of ports
@@ -390,7 +393,7 @@ start at 0. Returns 0.
=head2 Globals imported from SNMP::Info
See documentation in L<SNMP::Info/"GLOBALS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=head2 Globals imported from SNMP::Info::Bridge
@@ -421,7 +424,7 @@ to a hash.
formula:
port = index % 256
slot = int(index / 256)
The physical port name is returned as slot.port.
=item $centillion->i_duplex()
@@ -460,13 +463,13 @@ Returns a mapping between C<ifIndex> and the VLAN.
=item $centillion->centillion_p_index()
Returns reference to hash. Maps table IIDs to Interface IIDs
Returns reference to hash. Maps table IIDs to Interface IIDs
(C<cnDot3ExtnIfIndex>)
=item $centillion->centillion_p_duplex()
Returns reference to hash. Maps port operational duplexes to IIDs
Returns reference to hash. Maps port operational duplexes to IIDs
(C<cnDot3ExtnIfOperConnectionType>)
@@ -484,19 +487,19 @@ Returns reference to hash. Maps port admin duplexes to IIDs
=item $centillion->centillion_i_vlan_index()
Returns reference to hash. Key: Table entry, Value: Index
Returns reference to hash. Key: Table entry, Value: Index
(C<cnVlanPortMemberIfIndex>)
=item $centillion->centillion_i_vlan()
Returns reference to hash. Key: Table entry, Value: VLAN ID
Returns reference to hash. Key: Table entry, Value: VLAN ID
(C<cnVlanPortMemberVID>)
=item $centillion->centillion_i_vlan_type()
Returns reference to hash. Key: Table entry, Value: VLAN Type
Returns reference to hash. Key: Table entry, Value: VLAN Type
(C<cnVlanPortMemberIngressType>)
@@ -504,7 +507,7 @@ Returns reference to hash. Key: Table entry, Value: VLAN Type
=head2 Table Methods imported from SNMP::Info
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info/"USAGE"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Cisco
# $Id$
#
# Copyright (c) 2008 Max Baker
# All rights reserved.
@@ -31,53 +30,76 @@
package SNMP::Info::Layer2::Cisco;
use strict;
use warnings;
use Exporter;
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::CiscoPortSecurity;
use SNMP::Info::CiscoStpExtensions;
use SNMP::Info::CiscoAgg;
use SNMP::Info::Layer2;
@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
SNMP::Info::CiscoStats SNMP::Info::CiscoRTT
SNMP::Info::CiscoConfig SNMP::Info::CiscoPortSecurity
SNMP::Info::CiscoStpExtensions SNMP::Info::CiscoAgg
SNMP::Info::Layer2
Exporter/;
@SNMP::Info::Layer2::Cisco::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%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,
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::CiscoAgg::MIBS,
%SNMP::Info::CiscoStpExtensions::MIBS,
%SNMP::Info::CiscoPortSecurity::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CiscoRTT::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CDP::MIBS,
%SNMP::Info::CiscoVTP::MIBS,
);
%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,
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::CiscoAgg::GLOBALS,
%SNMP::Info::CiscoStpExtensions::GLOBALS,
%SNMP::Info::CiscoPortSecurity::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CiscoRTT::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::CiscoVTP::GLOBALS,
);
%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,
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::CiscoAgg::FUNCS,
%SNMP::Info::CiscoStpExtensions::FUNCS,
%SNMP::Info::CiscoPortSecurity::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CiscoRTT::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::CiscoVTP::FUNCS,
);
%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,
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::CiscoAgg::MUNGE,
%SNMP::Info::CiscoStpExtensions::MUNGE,
%SNMP::Info::CiscoPortSecurity::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CiscoRTT::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::CiscoVTP::MUNGE,
);
1;
@@ -85,8 +107,9 @@ __END__
=head1 NAME
SNMP::Info::Layer2::Cisco - SNMP Interface to L3 and L2+L3 IOS Cisco Device
that are not covered in other classes.
SNMP::Info::Layer2::Cisco - SNMP Interface to L2 Cisco devices that are
not covered in other classes and the base L2 Cisco class for other device
specific L2 Cisco classes.
=head1 AUTHOR
@@ -94,7 +117,7 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $cisco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
@@ -102,7 +125,7 @@ Max Baker
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $cisco->class();
@@ -110,7 +133,8 @@ Max Baker
=head1 DESCRIPTION
Subclass for Generic Cisco Routers running IOS
Subclass for Generic Layer 2 Cisco devices and the base L2 Cisco class for
other device specific L2 Cisco classes.
=head2 Inherited Classes
@@ -122,14 +146,16 @@ Subclass for Generic Cisco Routers running IOS
=item SNMP::Info::CiscoStats
=item SNMP::Info::CiscoImage
=item SNMP::Info::CiscoRTT
=item SNMP::Info::CiscoQOS
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoPortSecurity
=item SNMP::Info::CiscoStpExtensions
=item SNMP::Info::CiscoAgg
=item SNMP::Info::Layer2
=back
@@ -142,18 +168,20 @@ Subclass for Generic Cisco Routers running IOS
See L<SNMP::Info::CiscoVTP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CDP/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoImage/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStats/"Required MIBs"> 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::CiscoPortSecurity/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoStpExtensions/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::CiscoAgg/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
=back
@@ -166,7 +194,7 @@ These are methods that return scalar value from SNMP
=item $cisco->vendor()
Returns 'cisco'
Returns 'cisco'
=back
@@ -182,22 +210,22 @@ See documentation in L<SNMP::Info::CDP/"GLOBALS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::CiscoImage
See documentation in L<SNMP::Info::CiscoImage/"GLOBALS"> for details.
=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::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"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::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
@@ -219,22 +247,26 @@ See documentation in L<SNMP::Info::CDP/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::CiscoStats/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::CiscoImage
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::CiscoPortSecurity
See documentation in L<SNMP::Info::CiscoPortSecurity/"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::CiscoAgg
See documentation in L<SNMP::Info::CiscoAgg/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.

View File

@@ -0,0 +1,311 @@
# SNMP::Info::Layer2::CiscoSB
#
# Copyright (c) 2013 Nic Bernstein
#
# 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
# 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::CiscoSB;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
use SNMP::Info::EtherLike;
use SNMP::Info::CiscoStats;
use SNMP::Info::CiscoConfig;
use SNMP::Info::CDP;
@SNMP::Info::Layer2::CiscoSB::ISA
= qw/SNMP::Info::Layer2 SNMP::Info::EtherLike
SNMP::Info::CiscoStats SNMP::Info::CiscoConfig SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::CiscoSB::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '3.74';
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::CiscoStats::GLOBALS,
%SNMP::Info::CiscoConfig::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
'descr' => 'sysDescr',
'mac' => 'rndBasePhysicalAddress',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::CiscoStats::FUNCS,
%SNMP::Info::CiscoConfig::FUNCS,
%SNMP::Info::CDP::FUNCS,
'peth_port_power' => 'rlPethPsePortOutputPower',
);
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::CiscoStats::MIBS,
%SNMP::Info::CiscoConfig::MIBS,
%SNMP::Info::CDP::MIBS,
'CISCOSB-POE-MIB' => 'rlPethPsePortOutputPower',
'CISCOSB-DEVICEPARAMS-MIB' => 'rndBasePhysicalAddress',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::CiscoStats::MUNGE,
%SNMP::Info::CiscoConfig::MUNGE,
%SNMP::Info::CDP::MUNGE,
);
sub vendor {
return 'cisco';
}
sub os {
return 'ros';
}
# Walk the entPhysicalSerialNum table and return the first serial found
sub serial {
my $ciscosb = shift;
my $e_serial = $ciscosb->e_serial();
# Find entity table entry for this unit
foreach my $e ( sort keys %$e_serial ) {
if (defined $e_serial->{$e} and $e_serial->{$e} !~ /^\s*$/) {
return $e_serial->{$e};
}
}
}
sub os_ver {
my $ciscosb = shift;
my $e_swver = $ciscosb->e_swver();
foreach my $e ( sort keys %$e_swver ) {
if (defined $e_swver->{$e} and $e_swver->{$e} !~ /^\s*$/) {
return $e_swver->{$e};
}
}
}
# Grab e_model from Entity and tag on e_hwver
sub model {
my $ciscosb = shift;
my $e_model = $ciscosb->e_model();
my $e_hwver = $ciscosb->e_hwver();
foreach my $e ( sort keys %$e_model ) {
if (defined $e_model->{$e} and $e_model->{$e} !~ /^\s*$/) {
return $e_model->{$e};
#my $model = "$e_model->{$e} $e_hwver->{$e}";
#return $model;
}
}
return $ciscosb->description();
}
# CISCOSBinterfaces.mib also contains duplex info if needed
sub i_duplex {
my $ciscosb = shift;
my $partial = shift;
my $el_duplex = $ciscosb->el_duplex($partial);
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;
}
}
# ifDescr is the same for all interfaces in a class, but the ifName is
# unique, so let's use that for port name.
sub interfaces {
my $ciscosb = shift;
my $partial = shift;
my $interfaces = $ciscosb->i_name($partial);
return $interfaces;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::CiscoSB - SNMP Interface to Cisco Small Business series
=head1 AUTHOR
Nic Bernstein (shamelessly stolen from Max Baker's Aironet code)
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ciscosb = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ciscosb->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides interface to SNMP Data available on Cisco Small Business (nee LinkSys)
managed switches. [i.e. those matching enterprises(1).cisco(9).otherEnterprises(6).ciscosb(1)]
=head2 Inherited Classes
=over
=item SNMP::Info::CDP
=item SNMP::Info::CiscoConfig
=item SNMP::Info::CiscoStats
=item SNMP::Info::EtherLike
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<CISCOSB-DEVICEPARAMS-MIB>
=item F<CISCOSB-POE-MIB>
=item Inherited Classes
MIBs required by the inherited classes listed above.
=back
=head1 GLOBALS
These are methods that return scalar value from SNMP.
=over
=item $ciscosb->mac()
Returns mac from (C<rndBasePhysicalAddress>)
=item $ciscosb->os_ver()
Returns software version (C<entPhysicalSoftwareRev>)
=item $ciscosb->serial()
Returns serial number of unit (C<entPhysicalSerialNum>)
=item $ciscosb->model()
Returns model and hardware revision of unit
(C<entPhysicalModelName+entPhysicalHardwareRev>)
=back
=head2 Overrides
=over
=item $ciscosb->vendor()
Returns 'cisco'.
=item $ciscosb->os()
Returns 'ros'.
=back
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::EtherLike
See documentation in L<SNMP::Info::EtherLike/"GLOBALS"> for details.
=head1 TABLE METHODS
=over
=item $ciscosb->peth_port_power()
Power supplied by PoE ports, in milliwatts.
(C<rlPethPsePortOutputPower>)
=item $ciscosb->i_duplex()
Return duplex based upon the result of EtherLike->el_duplex().
=back
=head2 Overrides
=over
=item $ciscosb->interfaces()
Uses the i_name() field.
=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::EtherLike
See documentation in L<SNMP::Info::EtherLike/"TABLE METHODS"> for details.
=cut

View File

@@ -0,0 +1,201 @@
# SNMP::Info::Layer2::Exinda
#
# Copyright (c) 2018 nick nauwelaerts
# 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::Exinda;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Exinda::ISA = qw/
SNMP::Info::Layer2
Exporter
/;
@SNMP::Info::Layer2::Exinda::EXPORT_OK = qw//;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'EXINDA-MIB' => 'systemVersion',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
# EXINDA-MIB
'exinda_model' => 'hardwareSeries',
'serial1' => 'systemHostId',
'uptime' => 'systemUptime',
'os_ver' => 'systemVersion',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
);
# layer 2: bridged shaping and failopen interfaces
# layer 3/4: ip and layer 4 protocol fiddling and accell
# layer 7: wccp support
sub layers {
return '01001110';
}
sub vendor {
return 'exinda';
}
# overwrite l2->model, hardwareSeries returns a plain string
sub model {
my $exinda = shift;
return $exinda->exinda_model;
}
# systemHostId (and thus serial1) is actually also a mac address
sub mac {
my $exinda = shift;
my $exinda_mac = $exinda->serial1;
return unless (defined $exinda_mac && (length $exinda_mac) == 12);
return join(":", $exinda_mac =~ m/\w{2}/g);
}
sub os {
return 'exos';
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Exinda - SNMP Interface to exinda / gfi traffic shapers.
=head1 AUTHORS
nick nauwelaerts
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $exinda = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $exinda->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Subclass for exinda / gfi network orchestrator traffic shapers.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<EXINDA-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.
=over
=item $exinda->layers()
Returns '01001110'.
=item $exinda->mac()
Returns a mac address extracted from C<systemHostId>.
=item $exinda->model()
Returns C<hardwareSeries>.
=item $exinda->os()
Returns 'exos'.
=item $exinda->os_ver()
Returns C<systemVersion>.
=item $exinda->uptime()
Returns the uptime extracted from C<systemUptime>.
=item $exinda->vendor()
Returns 'exinda'.
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head1 TABLE ENTRIES
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 L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::HP - SNMP Interface to HP ProCurve Switches
# $Id$
#
# Copyright (c) 2008-2009 Max Baker changes from version 0.8 and beyond.
#
@@ -33,42 +32,49 @@
package SNMP::Info::Layer2::HP;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
use SNMP::Info::LLDP;
use SNMP::Info::CDP;
use SNMP::Info::Aggregate 'agg_ports_ifstack';
@SNMP::Info::Layer2::HP::ISA
= qw/SNMP::Info::Layer3 SNMP::Info::MAU SNMP::Info::LLDP
SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::HP::ISA = qw/
SNMP::Info::Aggregate
SNMP::Info::Layer3
SNMP::Info::MAU
SNMP::Info::CDP
Exporter
/;
@SNMP::Info::Layer2::HP::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CDP::MIBS,
'RFC1271-MIB' => 'logDescription',
'HP-ICF-OID' => 'hpSwitch4000',
'STATISTICS-MIB' => 'hpSwitchCpuStat',
'NETSWITCH-MIB' => 'hpMsgBufFree',
'CONFIG-MIB' => 'hpSwitchConfig',
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
'HP-ICF-BRIDGE' => 'hpicfBridgeRstpForceVersion',
'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent',
'SEMI-MIB' => 'hpHttpMgSerialNumber',
%SNMP::Info::Aggregate::MIBS,
'RFC1271-MIB' => 'logDescription',
'HP-ICF-OID' => 'hpSwitch4000',
'STATISTICS-MIB' => 'hpSwitchCpuStat',
'NETSWITCH-MIB' => 'hpMsgBufFree',
'CONFIG-MIB' => 'hpSwitchConfig',
'HP-ICF-CHASSIS' => 'hpicfSensorObjectId',
'HP-ICF-BRIDGE' => 'hpicfBridgeRstpForceVersion',
'HP-ICF-POE-MIB' => 'hpicfPoePethPsePortCurrent',
'SEMI-MIB' => 'hpHttpMgSerialNumber',
'HP-SWITCH-PL-MIB' => 'hpSwitchProliant',
'BLADETYPE4-NETWORK-MIB' => 'hpProLiant-GbE2c-InterconnectSwitch',
);
%GLOBALS = (
%SNMP::Info::Layer3::GLOBALS,
%SNMP::Info::MAU::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
%SNMP::Info::CDP::GLOBALS,
%SNMP::Info::Aggregate::GLOBALS,
'serial1' => 'entPhysicalSerialNum.1',
'serial2' => 'hpHttpMgSerialNumber.0',
'hp_cpu' => 'hpSwitchCpuStat.0',
@@ -85,8 +91,8 @@ $VERSION = '2.09';
%FUNCS = (
%SNMP::Info::Layer3::FUNCS,
%SNMP::Info::MAU::FUNCS,
%SNMP::Info::LLDP::FUNCS,
%SNMP::Info::CDP::FUNCS,
%SNMP::Info::Aggregate::FUNCS,
'i_type2' => 'ifType',
# RFC1271
@@ -101,7 +107,7 @@ $VERSION = '2.09';
'hp_s_oid' => 'hpicfSensorObjectId',
'hp_s_name' => 'hpicfSensorDescr',
'hp_s_status' => 'hpicfSensorStatus',
# HP-ICF-POE-MIB
'peth_port_power' => 'hpicfPoePethPsePortPower',
);
@@ -110,17 +116,19 @@ $VERSION = '2.09';
# Inherit all the built in munging
%SNMP::Info::Layer3::MUNGE,
%SNMP::Info::MAU::MUNGE,
%SNMP::Info::LLDP::MUNGE,
%SNMP::Info::CDP::MUNGE,
%SNMP::Info::Aggregate::MUNGE,
'c_id' => \&munge_hp_c_id,
);
# Model map, reverse sorted by common model name (sort -k2 -r)
# Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB
# Potential sources for model information: http://www.hp.com/rnd/software/switches.htm or HP-ICF-OID MIB
%MODEL_MAP = (
'J8131A' => 'WAP-420-WW',
'J8130A' => 'WAP-420-NA',
'J9833A' => 'PS1810-8G',
'J9834A' => 'PS1810-24G',
'J8133A' => 'AP520WL',
'J8680A' => '9408sl',
'J9091A' => '8212zl',
@@ -135,8 +143,10 @@ $VERSION = '2.09';
'J8992A' => '6200yl-24G',
'J4902A' => '6108',
'J8698A' => '5412zl',
'J9851A' => '5412R-zl2',
'J8719A' => '5408yl',
'J8697A' => '5406zl',
'J9850A' => '5406R-zl2',
'J8718A' => '5404yl',
'J4819A' => '5308XL',
'J4850A' => '5304XL',
@@ -148,6 +158,12 @@ $VERSION = '2.09';
'J8771A' => '4202vl-48G',
'J4865A' => '4108GL',
'J4887A' => '4104GL',
'JL074A' => '3810M-48G-PoE+',
'JL072A' => '3810M-48G',
'JL076A' => '3810M-40G-8SR-PoE+',
'JL073A' => '3810M-24G-PoE+',
'JL071A' => '3810M-24G',
'JL075A' => '3810M-16SFP+',
'J9588A' => '3800-48G-PoE+-4XG',
'J9574A' => '3800-48G-PoE+-4SFP+',
'J9586A' => '3800-48G-4XG',
@@ -167,6 +183,31 @@ $VERSION = '2.09';
'J4905A' => '3400cl-24G',
'J4815A' => '3324XL',
'J4851A' => '3124',
'JL322A' => '2930M-48G-PoE+',
'JL321A' => '2930M-48G',
'JL323A' => '2930M-40G-8SR-PoE+',
'JL320A' => '2930M-24G-PoE+',
'JL324A' => '2930M-24G-8SR-PoE+',
'JL319A' => '2930M-24G',
'JL258A' => '2930F-8G-PoE+-2SFP+',
'JL558A' => '2930F-48G-PoE+-4SFP+-740W',
'JL557A' => '2930F-48G-PoE+-4SFP-740W',
'JL256A' => '2930F-48G-PoE+-4SFP+',
'JL262A' => '2930F-48G-PoE+-4SFP',
'JL254A' => '2930F-48G-4SFP+',
'JL260A' => '2930F-48G-4SFP',
'JL255A' => '2930F-24G-PoE+-4SFP+',
'JL261A' => '2930F-24G-PoE+-4SFP',
'JL253A' => '2930F-24G-4SFP+',
'JL259A' => '2930F-24G-4SFP',
'J9729A' => '2920-48G-PoE+',
'J9729A' => '2920-48G-PoE+',
'J9728A' => '2920-48G',
'J9728A' => '2920-48G',
'J9727A' => '2920-24G-PoE+',
'J9727A' => '2920-24G-PoE+',
'J9726A' => '2920-24G',
'J9726A' => '2920-24G',
'J9562A' => '2915-8G-PoE',
'J9148A' => '2910al-48G-PoE+',
'J9147A' => '2910al-48G',
@@ -187,7 +228,7 @@ $VERSION = '2.09';
'J4900C' => '2626C',
'J4900A' => '2626',
'J9627A' => '2620-48-PoE+',
'J9624A' => '2620-48',
'J9626A' => '2620-48',
'J9624A' => '2620-24-PPoE+',
'J9625A' => '2620-24-PoE+',
'J9623A' => '2620-24',
@@ -198,6 +239,27 @@ $VERSION = '2.09';
'J9086A' => '2610-24/12PWR',
'J9085A' => '2610-24',
'J8762A' => '2600-8-PWR',
'JL357A' => '2540-48G-PoE+-4SFP+',
'JL355A' => '2540-48G-4SFP+',
'JL356A' => '2540-24G-PoE+-4SFP+',
'JL354A' => '2540-24G-4SFP+',
'JL070A' => '2530-8-PoE+ Internal PS',
'J9780A' => '2530-8-PoE+',
'J9774A' => '2530-8G-PoEP',
'J9777A' => '2530-8G',
'J9783A' => '2530-8',
'J9778A' => '2530-48-PoE+',
'J9853A' => '2530-48G-PoE+-2SFP+',
'J9772A' => '2530-48G-PoE+',
'J9855A' => '2530-48G-2SFP+',
'J9775A' => '2530-48G',
'J9781A' => '2530-48',
'J9779A' => '2530-24-PoE+',
'J9854A' => '2530-24G-PoE+-2SFP+',
'J9773A' => '2530-24G-PoE+',
'J9856A' => '2530-24G-2SFP+',
'J9776A' => '2530-24G',
'J9782A' => '2530-24',
'J4813A' => '2524',
'J9298A' => '2520G-8-PoE',
'J9299A' => '2520G-24-PoE',
@@ -213,6 +275,8 @@ $VERSION = '2.09';
'J4817A' => '2312',
'J9449A' => '1810G-8',
'J9450A' => '1810G-24',
'J9802A' => '1810-8G',
'J9803A' => '1810-24G',
'J9029A' => '1800-8G',
'J9028A' => '1800-24G',
);
@@ -251,7 +315,7 @@ sub os_ver {
return;
}
# Regular managed ProCurve switches have the serial num in entity mib,
# Regular managed ProCurve switches have the serial num in entity mib,
# the web-managed models in the semi mib (hphttpmanageable).
sub serial {
my $hp = shift;
@@ -269,7 +333,7 @@ sub model {
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
$model =~ s/^hpswitch//i;
$model =~ s/^(hp|aruba)switch//i;
return defined $MODEL_MAP{$model} ? $MODEL_MAP{$model} : $model;
}
@@ -413,108 +477,6 @@ sub _sensor {
return $result;
}
# Use CDP and/or LLDP
sub hasCDP {
my $hp = shift;
return $hp->hasLLDP() || $hp->SUPER::hasCDP();
}
sub c_ip {
my $hp = shift;
my $partial = shift;
my $cdp = $hp->SUPER::c_ip($partial) || {};
my $lldp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_if($partial) || {};
my $cdp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_port($partial) || {};
my $cdp = $hp->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 $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_id($partial) || {};
my $cdp = $hp->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 munge_hp_c_id {
my ($v) = @_;
if ( length(unpack('H*', $v)) == 12 ){
@@ -528,30 +490,6 @@ sub munge_hp_c_id {
}
}
sub c_platform {
my $hp = shift;
my $partial = shift;
my $lldp = $hp->lldp_rem_sysdesc($partial) || {};
my $cdp = $hp->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;
}
# POWER-ETHERNET-MIB doesn't define a mapping of its
# "module"/"port" index to ifIndex. Different vendors
# do this in different ways.
@@ -642,6 +580,8 @@ sub set_i_vlan_tagged {
return;
}
sub agg_ports { return agg_ports_ifstack(@_) }
1;
__END__
@@ -655,14 +595,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -670,15 +610,15 @@ Max Baker
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
HP ProCurve Switch via SNMP.
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.
after determining a more specific class using the method above.
my $hp = new SNMP::Info::Layer2::HP(...);
@@ -688,8 +628,6 @@ after determining a more specific class using the method above.
=item SNMP::Info::Layer2
=item SNMP::Info::LLDP
=item SNMP::Info::MAU
=back
@@ -716,6 +654,14 @@ Included in V2 mibs from Cisco
=item F<HP-ICF-POE-MIB>
=item F<HP-ICF-CHASSIS>
=item F<SEMI-MIB>
=item F<HP-SWITCH-PL-MIB>
=item F<BLADETYPE4-NETWORK-MIB>
=back
The last four MIBs listed are from HP and can be found at
@@ -759,7 +705,7 @@ Returns bytes of used memory
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 = (
%MODEL_MAP = (
'J8131A' => 'WAP-420-WW',
'J8130A' => 'WAP-420-NA',
'J8133A' => 'AP520WL',
@@ -828,7 +774,7 @@ number and the common model number with this map :
'J4900C' => '2626C',
'J4900A' => '2626',
'J9627A' => '2620-48-PoE+',
'J9624A' => '2620-48',
'J9626A' => '2620-48',
'J9624A' => '2620-24-PPoE+',
'J9625A' => '2620-24-PoE+',
'J9623A' => '2620-24',
@@ -856,7 +802,7 @@ number and the common model number with this map :
'J9450A' => '1810G-24',
'J9029A' => '1800-8G',
'J9028A' => '1800-24G',
);
);
=item $hp->os()
@@ -902,12 +848,12 @@ Power supply 2 status
=item $hp->peth_port_power()
Power supplied by PoE ports, in milliwatts
("hpicfPoePethPsePortPower")
(C<hpicfPoePethPsePortPower>)
=item $hp->stp_ver()
Returns what version of STP the device is running.
("hpicfBridgeRstpForceVersion" with fallback to inherited stp_ver())
(C<hpicfBridgeRstpForceVersion> with fallback to inherited stp_ver())
=back
@@ -915,10 +861,6 @@ Returns what version of STP the device is running.
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.
=head2 Globals imported from SNMP::Info::MAU
See documentation in L<SNMP::Info::MAU/"GLOBALS"> for details.
@@ -930,9 +872,9 @@ to a hash.
=head2 Overrides
=over
=over 4
=item $hp->interfaces()
=item $hp->interfaces()
Uses $hp->i_description()
@@ -946,7 +888,8 @@ 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).
Returns reference to hash of IIDs to HP specific port type
(C<hpSwitchPortType>).
=item $hp->i_name()
@@ -957,52 +900,11 @@ Crosses i_name() with $hp->e_name() using $hp->e_port() and i_alias()
Returns reference to hash of power Ethernet port table entries map back to
interface index (c<ifIndex>)
=back
=item C<agg_ports>
=head2 Topology information
Based upon the firmware version HP devices may support Cisco Discovery
Protocol (CDP), Link Layer Discovery Protocol (LLDP), or both. 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 $hp->hasCDP()
Returns true if the device is running either CDP or LLDP.
=item $hp->c_if()
Returns reference to hash. Key: iid Value: local device port (interfaces)
=item $hp->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 $hp->c_port()
Returns reference to hash. Key: iid Value: remote port (interfaces)
=item $hp->c_id()
Returns reference to hash. Key: iid Value: string value used to identify the
chassis component associated with the remote system.
=item $hp->c_platform()
Returns reference to hash. Key: iid Value: Remote Device Type
Returns a HASH reference mapping from slave to master port for each member of
a port bundle on the device. Keys are ifIndex of the slave ports, Values are
ifIndex of the corresponding master ports.
=back
@@ -1010,10 +912,6 @@ Returns reference to hash. Key: iid Value: Remote Device Type
See documentation in L<SNMP::Info::Layer2/"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::MAU
See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
@@ -1033,7 +931,7 @@ Munge for c_id which handles CDP and LLDP.
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.
operations.
=over
@@ -1041,4 +939,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

View File

@@ -32,6 +32,7 @@
package SNMP::Info::Layer2::HP4000;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer3;
use SNMP::Info::MAU;
@@ -42,14 +43,13 @@ use SNMP::Info::CDP;
SNMP::Info::CDP Exporter/;
@SNMP::Info::Layer2::HP4000::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %PORTSTAT %MODEL_MAP %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %PORTSTAT, %MODEL_MAP, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer3::MIBS,
%SNMP::Info::MAU::MIBS,
%SNMP::Info::LLDP::MIBS,
%SNMP::Info::CDP::MIBS,
'RFC1271-MIB' => 'logDescription',
'HP-ICF-OID' => 'hpSwitch4000',
@@ -376,6 +376,20 @@ sub i_vlan_membership {
return $i_vlan_membership;
}
sub i_vlan_membership_untagged {
my $hp = shift;
my $partial = shift;
my $vlans = $hp->i_vlan($partial);
my $i_vlan_membership = {};
foreach my $port (keys %$vlans) {
my $vlan = $vlans->{$port};
push( @{ $i_vlan_membership->{$port} }, $vlan );
}
return $i_vlan_membership;
}
sub set_i_vlan {
my $hp = shift;
my $rv;
@@ -413,7 +427,7 @@ sub set_i_vlan {
$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 vlan change was not successful, 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) {
@@ -468,14 +482,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -483,18 +497,13 @@ Max Baker
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
HP ProCurve Switch via SNMP.
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
@@ -569,7 +578,7 @@ Returns bytes of used memory
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 = (
%MODEL_MAP = (
'J4093A' => '2424M',
'J4110A' => '8000M',
'J4120A' => '1600M',
@@ -638,7 +647,7 @@ to a hash.
=over
=item $hp->interfaces()
=item $hp->interfaces()
Uses $hp->i_description()
@@ -652,7 +661,8 @@ 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).
Returns reference to hash of IIDs to HP specific port type
(C<hpSwitchPortType>).
=item $hp->i_name()
@@ -672,13 +682,19 @@ 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->i_vlan_membership_untagged()
Returns reference to hash of arrays: key = C<ifIndex>, value = array of VLAN
IDs. These are the VLANs which are members of the untagged egress list for
the port.
=item $hp->v_index()
Returns VLAN IDs
@@ -710,7 +726,7 @@ See documentation in L<SNMP::Info::MAU/"TABLE METHODS"> for details.
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.
operations.
=over
@@ -718,4 +734,6 @@ operations.
=item set_i_vlan_tagged()
=back
=cut

View File

@@ -31,6 +31,7 @@
package SNMP::Info::Layer2::HPVC;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@@ -38,9 +39,9 @@ use SNMP::Info::Layer2;
= qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::HPVC::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %MIBS %FUNCS %MUNGE/;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -59,7 +60,6 @@ $VERSION = '2.09';
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
);
%MUNGE = (
@@ -67,7 +67,6 @@ $VERSION = '2.09';
%SNMP::Info::Layer2::MUNGE,
);
# Method Overrides
sub os {
@@ -89,7 +88,7 @@ __END__
=head1 NAME
SNMP::Info::Layer2::HPVC - SNMP Interface to HP VirtualConnect Switches
SNMP::Info::Layer2::HPVC - SNMP Interface to HP Virtual Connect Switches
=head1 AUTHOR
@@ -97,14 +96,14 @@ Jeroen van Ingen
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# 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();
@@ -112,13 +111,8 @@ Jeroen van Ingen
=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(...);
Provides abstraction to the configuration information obtainable from a
HP Virtual Connect Switch via SNMP.
=head2 Inherited Classes
@@ -150,7 +144,7 @@ These are methods that return scalar value from SNMP
=item $hp->os()
Returns hpvc
Returns C<'hpvc'>
=item $hp->os_bin()
@@ -183,27 +177,15 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
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.
operations.
=cut

View File

@@ -28,15 +28,16 @@ package SNMP::Info::Layer2::Kentrox;
# POSSIBILITY OF SUCH DAMAGE.
use strict;
use warnings;
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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
@@ -57,36 +58,38 @@ $VERSION = '2.09';
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub os {
return 'Kentrox';
return 'kentrox';
}
sub os_ver {
my $dsver = shift;
my $descr = $dsver->description();
if ( $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
if ( defined ($descr) && $descr =~ /^\S+\s\S+\s\S+\s(\S+)/){
return $1;
}
return;
}
sub serial {
my $dsserial = shift;
my $serial = $dsserial->ds_sysinfo();
if ( $serial =~ /SERIAL\s(\S+)/){
if ( defined ($serial) && $serial =~ /SERIAL\s(\S+)/){
my $str = substr($1,8,10);
return $str;
}
return;
}
sub vendor {
return 'Kentrox';
return 'kentrox';
}
sub model {
my $dsmodel = shift;
my $descr = $dsmodel->description();
if ( $descr =~ /^(\S+\s\S+)/){
if ( defined ($descr) && $descr =~ /^(\S+\s\S+)/){
return $1;
}
return;
}
1;
@@ -108,7 +111,7 @@ phishphreek@gmail.com
Debug => 1,
DestHost => 'myrouter',
Community => 'public',
Version => 1
Version => 2
)
or die "Can't connect to DestHost.\n";
@@ -166,12 +169,6 @@ See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
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.

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::N2270
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,38 +30,42 @@
package SNMP::Info::Layer2::N2270;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
use SNMP::Info::Layer2;
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/;
= qw/SNMP::Info::Layer2 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE, $AUTOLOAD, $INIT, $DEBUG);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::MIBS, %SNMP::Info::Bridge::MIBS,
%SNMP::Info::SONMP::MIBS, %SNMP::Info::Airespace::MIBS,
%SNMP::Info::Layer2::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::Layer2::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,
%SNMP::Info::Layer2::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,
%SNMP::Info::Layer2::MUNGE,
%SNMP::Info::SONMP::MUNGE,
%SNMP::Info::Airespace::MUNGE,
);
sub os {
@@ -114,7 +117,7 @@ Eric Miller
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
@@ -123,21 +126,14 @@ Eric Miller
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
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.
my $n2270 = new SNMP::Info::Layer2::N2270(...);
=head2 Inherited Classes
=over
=item SNMP::Info
=item SNMP::Info::Bridge
=item SNMP::Info::Layer2
=item SNMP::Info::SONMP
@@ -151,9 +147,7 @@ my $n2270 = new SNMP::Info::Layer2::N2270(...);
=item Inherited Classes' MIBs
See L<SNMP::Info/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::Layer2/"Required MIBs"> for its own MIB requirements.
See L<SNMP::Info::SONMP/"Required MIBs"> for its own MIB requirements.
@@ -200,13 +194,9 @@ start at 0. Returns 0.
=back
=head2 Globals imported from SNMP::Info
=head2 Globals imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info/"GLOBALS"> for details.
=head2 Globals imported from SNMP::Info::Bridge
See documentation in L<SNMP::Info::Bridge/"GLOBALS"> for details.
See documentation in L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::SONMP
@@ -229,13 +219,9 @@ to a hash.
=back
=head2 Table Methods imported from SNMP::Info
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
See documentation in L<SNMP::Info::Bridge/"TABLE METHODS"> for details.
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::SONMP

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::NAP222x
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,6 +30,7 @@
package SNMP::Info::Layer2::NAP222x;
use strict;
use warnings;
use Exporter;
use SNMP::Info::SONMP;
use SNMP::Info::IEEE802dot11;
@@ -40,9 +40,9 @@ use SNMP::Info::Layer2;
= 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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS, %SNMP::Info::IEEE802dot11::MIBS,
@@ -375,14 +375,14 @@ Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $nap222x = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $nap222x->class();
@@ -391,12 +391,7 @@ Eric Miller
=head1 DESCRIPTION
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.
my $nap222x = new SNMP::Info::Layer2::NAP222x(...);
2220 series wireless Access Points through SNMP.
=head2 Inherited Classes
@@ -526,7 +521,7 @@ to a hash.
=item $nap222x->interfaces()
Returns reference to map of IIDs to physical ports.
Returns reference to map of IIDs to physical ports.
=item $nap222x->i_duplex()
@@ -548,7 +543,7 @@ Returns a human name based upon port description.
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.
created.
=item $nap222x->i_ssidlist()

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,263 @@
# SNMP::Info::Layer2::Netgear
#
# 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 warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Netgear::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Netgear::EXPORT_OK = qw//;
our ($VERSION, %GLOBALS, %MIBS, %FUNCS, %MUNGE);
$VERSION = '3.74';
# This will be filled in with the device's index into the EntPhysicalEntry
# table by the serial() function.
our $index = undef;
%MIBS = ( %SNMP::Info::Layer2::MIBS, );
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
ng_fsosver => '.1.3.6.1.4.1.4526.11.11.1.0',
ng_gsmserial => '.1.3.6.1.4.1.4526.10.1.1.1.4.0',
ng_gsmosver => '.1.3.6.1.4.1.4526.10.1.1.1.13.0',
);
%FUNCS = ( %SNMP::Info::Layer2::FUNCS, );
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, );
sub vendor {
return 'netgear';
}
sub os {
return 'netgear';
}
# We will attempt to use Entity-MIB if present. In that case, we will
# also set the shared variable $index, which is used by other functions
# to index within Entity-MIB tables. This assumes, of course, that there
# is only one serial number (entPhysicalSerialNum) present in the table.
sub serial {
my $netgear = shift;
my $serial = undef;
my $e_serial = $netgear->e_serial();
if (defined($e_serial)) { # This unit sports the Entity-MIB
# Find entity table entry for this unit
foreach my $e ( keys %$e_serial ) {
if (defined ($e_serial->{$e}) and $e_serial->{$e} !~ /^\s*$/) {
$index = $e;
last;
}
}
return $e_serial->{$index} if defined $index;
}
# Without Entity-MIB, we've got to work our way through a bunch of
# different locales...
return $netgear->ng_gsmserial() if defined $netgear->model and $netgear->model =~ m/[FG]SM\d/i;;
return 'none';
}
# If device supports Entity-MIB, index into that to divine model and
# hardware version, otherwise default to sysDescr.
sub model {
my $netgear = shift;
if (defined($index)) {
my $model = $netgear->e_descr();
my $e_hwver = $netgear->e_hwver();
$model = "$model->{$index} $e_hwver->{$index}";
return $model;
}
return $netgear->description();
}
# ifDescr is the same for all interfaces in a class, but the ifName is
# unique, so let's use that for port name. If all else fails,
# concatenate ifDesc and ifIndex.
sub interfaces {
my $netgear = shift;
my $partial = shift;
my $interfaces = $netgear->i_index($partial) || {};
my $i_descr = $netgear->i_description($partial) || {};
my $i_name = $netgear->i_name($partial);
my $i_isset = ();
# Replace the description with the ifName field, if set
foreach my $iid ( keys %$i_name ) {
my $name = $i_name->{$iid};
next unless defined $name;
if (defined $name and $name !~ /^\s*$/) {
$interfaces->{$iid} = $name;
$i_isset->{$iid} = 1;
}
}
# Replace the Index with the ifDescr field, appended with index
# number, to deal with devices with non-unique ifDescr.
foreach my $iid ( keys %$i_descr ) {
my $port = $i_descr->{$iid} . '-' . $iid;
next unless defined $port;
next if (defined $i_isset->{$iid} and $i_isset->{$iid} == 1);
$interfaces->{$iid} = $port;
}
return $interfaces;
}
# these seem to work for GSM/FSM models but not GS
# https://sourceforge.net/tracker/?func=detail&aid=3085413&group_id=70362&atid=527529
sub os_ver {
my $netgear = shift;
my $serial = $netgear->serial(); # Make sure that index gets primed
if (defined($index)) {
my $os_ver = $netgear->e_swver();
return $os_ver->{$index} if defined $os_ver;
}
return $netgear->ng_gsmosver() if defined $netgear->model and $netgear->model =~ m/[FG]SM\d/i;
return $netgear->ng_fsosver() if defined $netgear->model and $netgear->model =~ m/FS\d/i;
}
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
=back
=head2 Required MIBs
=over
=item Inherited Classes' MIBs
MIBs listed in L<SNMP::Info::Layer2/"Required MIBs"> and its inherited
classes.
=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 concatenation of $e_model and $e_hwver if Entity MIB present,
otherwise returns description()
=item $netgear->os_ver()
Returns OS Version.
=item $netgear->serial()
Returns Serial Number if available (older FS switches have no accessible
serial number).
=back
=head2 Global Methods 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
=item $netgear->interfaces()
Uses the i_name() field.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

View File

@@ -0,0 +1,249 @@
# SNMP::Info::Layer2::Nexans
#
# Copyright (c) 2018 Christoph Neuhaus
# 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::Nexans;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Nexans::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Nexans::EXPORT_OK = qw//;
our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
'NEXANS-MIB' => 'nexansANS',
'NEXANS-BM-MIB' => 'infoDescr',
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'mac' => 'adminAgentPhysAddress.0',
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'i_duplex' => 'portLinkState', #NEXANS-BM-MIB
'i_duplex_admin' => 'portSpeedDuplexSetup', #NEXANS-BM-MIB
'nexans_i_name' => 'ifAlias',
);
%MUNGE = (
%SNMP::Info::Layer2::MUNGE,
'i_duplex' => \&munge_i_duplex,
'i_duplex_admin' => \&munge_i_duplex_admin,
);
sub munge_i_duplex {
my $duplex = shift;
return unless defined $duplex;
$duplex = 'half' if $duplex =~/Hdx/;
$duplex = 'full' if $duplex =~/Fdx/;
return $duplex;
}
sub munge_i_duplex_admin {
my $duplex_admin = shift;
return unless defined $duplex_admin;
$duplex_admin = 'full' if $duplex_admin =~/Fdx/;
$duplex_admin = 'half' if $duplex_admin =~/Hdx/;
$duplex_admin = 'auto' if $duplex_admin =~/autoneg/;
return $duplex_admin;
}
sub vendor {
return 'nexans';
}
sub model {
my $nexans = shift;
my $id = $nexans->id() || '';
my $model = &SNMP::translateObj($id);
return $id unless defined $model;
return $model;
}
sub os {
return 'nexanos';
}
sub os_ver {
my $nexans = shift;
my $ver = $nexans->infoMgmtFirmwareVersion() || '';
return $ver;
}
sub serial {
my $nexans = shift;
return $nexans->infoSeriesNo();
}
sub i_name {
my $nexans = shift;
my $return = $nexans->nexans_i_name();
# replace i_name where possible
foreach my $iid ( keys %$return ) {
next unless $return->{$iid} eq "";
$return->{$iid} = $iid;
}
return \%$return;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Nexans - SNMP Interface to Nexans network devices.
=head1 AUTHOR
Christoph Neuhaus
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $nexans = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $nexans->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Abstraction subclass for Nexans network devices.
tested devices:
fiberSwitch100BmPlus version 3.61
gigaSwitch641DeskSfpTp version 3.68, 4.14W
gigaSwitchV3d2SfpSfp version 3.68, 4.02, 4.02B, 4.10C, 4,14W
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<NEXANS>
=item F<NEXANS-BM>
=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
=over
=item $nexans->vendor()
Returns 'nexans'
=item $nexans->model()
Returns the chassis model.
=item $nexans->os()
Returns 'nexanos'
=item $nexans->os_ver()
Returns the software version.
=item $nexans->serial()
Returns the chassis serial number.
(C<infoSeriesNo>)
=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.
=over
=item $nexans->i_name()
Returns reference to map of IIDs to human-set port name.
=back
=head2 Table Methods imported from SNMP::Info::Layer2
See documentation in L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=head1 Data Munging Callback Subroutines
=over
=item munge_i_duplex()
Converts duplex returned by C<portLinkState> to either 'full' or 'half'.
=item munge_i_duplex_admin()
Converts duplex returned by C<portSpeedDuplexSetup> to either 'full', 'half',
or 'auto'.
=back
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::Orinoco
# $Id$
#
# Copyright (c) 2008 Eric Miller
# All rights reserved.
@@ -31,6 +30,7 @@
package SNMP::Info::Layer2::Orinoco;
use strict;
use warnings;
use Exporter;
use SNMP::Info::IEEE802dot11;
use SNMP::Info::Layer2;
@@ -39,15 +39,13 @@ use SNMP::Info::Layer2;
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Orinoco::EXPORT_OK = qw//;
use vars qw/$VERSION %FUNCS %GLOBALS %MIBS %MUNGE/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::IEEE802dot11::MIBS,
#'ORiNOCO-MIB' => 'orinoco',
);
%GLOBALS
@@ -56,12 +54,6 @@ $VERSION = '2.09';
%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, );
@@ -165,22 +157,6 @@ sub interfaces {
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__
@@ -194,14 +170,14 @@ Eric Miller
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $orinoco = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $orinoco->class();
@@ -213,11 +189,6 @@ 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.
my $orinoco = new SNMP::Info::Layer2::Orinoco(...);
=head2 Inherited Classes
=over
@@ -258,7 +229,7 @@ Returns the model extracted from C<sysDescr>.
=item $orinoco->os()
Returns 'Orinoco'
Returns 'orinoco'
=item $orinoco->os_ver()
@@ -293,7 +264,7 @@ to a hash.
=item $orinoco->interfaces()
Returns reference to map of IIDs to physical ports.
Returns reference to map of IIDs to physical ports.
=item $orinoco->i_ignore()

View File

@@ -0,0 +1,178 @@
# SNMP::Info::Layer2::Sixnet
#
# Copyright (c) 2018 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::Layer2::Sixnet;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@SNMP::Info::Layer2::Sixnet::ISA = qw/SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Sixnet::EXPORT_OK = qw//;
our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = (%SNMP::Info::Layer2::MIBS, 'SIXNET-MIB' => 'sxid',);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
'os_ver' => 'firmwareRevision',
's_model' => 'sxid',
'ps1_status' => 'p1status',
'ps2_status' => 'p2status',
);
%FUNCS = (%SNMP::Info::Layer2::FUNCS,);
%MUNGE = (%SNMP::Info::Layer2::MUNGE,);
sub vendor {
return 'sixnet';
}
sub os {
return 'sixnet';
}
sub model {
my $sixnet = shift;
my $s_model = $sixnet->s_model();
return $s_model if defined $s_model;
my $id = $sixnet->id();
return unless defined $id;
my $model = SNMP::translateObj($id);
return $model ? $model : $id;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Sixnet - SNMP Interface to Sixnet industrial switches
=head1 AUTHOR
Eric Miller
=head1 SYNOPSIS
my $sixnet = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $sixnet->class();
print " Using device sub class : $class\n";
=head1 DESCRIPTION
SNMP::Info::Layer2::Sixnet is a subclass of SNMP::Info that provides an
interface to Sixnet industrial switches.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=back
=head2 Required MIBs
=over
=item F<SIXNET-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
=over
=item $sixnet->vendor()
Returns 'sixnet'
=item $sixnet->os()
Returns 'sixnet'
=item $sixnet->os_ver()
Returns the software version returned by C<firmwareRevision>
=item $sixnet->model()
Returns model type. Returns C<sxid> if it exists, otherwise cross references
$sixnet->id() with the F<SIXNET-MIB>.
=item $sixnet->ps1_status()
(C<p1status>)
=item $sixnet->ps2_status()
(C<p2status>)
=back
=head2 Globals imported from SNMP::Info::Layer2
See 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 L<SNMP::Info::Layer2/"TABLE METHODS"> for details.
=cut

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,418 @@
# SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Devices
#
# Copyright (c) 2019 by The Netdisco Developer Team.
#
# 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::Ubiquiti;
use strict;
use warnings;
use Exporter;
use SNMP::Info::IEEE802dot11;
use SNMP::Info::Layer2;
use SNMP::Info::Layer3; # only used in sub mac()
@SNMP::Info::Layer2::Ubiquiti::ISA
= qw/SNMP::Info::IEEE802dot11 SNMP::Info::Layer2 Exporter/;
@SNMP::Info::Layer2::Ubiquiti::EXPORT_OK = qw//;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::Layer2::MIBS,
%SNMP::Info::IEEE802dot11::MIBS,
);
%GLOBALS = (
%SNMP::Info::Layer2::GLOBALS,
%SNMP::Info::IEEE802dot11::GLOBALS,
);
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
%SNMP::Info::IEEE802dot11::FUNCS,
);
%MUNGE = ( %SNMP::Info::Layer2::MUNGE, %SNMP::Info::IEEE802dot11::MUNGE, );
sub os {
my $ubnt = shift;
my $names = $ubnt->dot11_prod_name();
foreach my $iid ( keys %$names ) {
my $prod = $names->{$iid};
next unless defined $prod;
# Product names that match AirOS products
if((lc $prod) =~ /station/ or (lc $prod) =~ /beam/ or (lc $prod) =~ /grid/){
return 'AirOS';
# Product names that match UAP
}elsif((lc $prod) =~ /uap/){
return 'UniFi';
}else{
# Continue below to find OS name
}
}
## EdgeMAX OS (EdgeSwitch and EdgeRouter) name is first field split by space
my $ver = $ubnt->description() || '';
my @myver = split(/ /, $ver);
return $myver[0];
}
sub os_ver {
my $ubnt = shift;
my $versions = $ubnt->dot11_prod_ver();
foreach my $iid ( keys %$versions ) {
my $ver = $versions->{$iid};
next unless defined $ver;
my $os = $ubnt->os;
if($os == 'AirOS'){
## pretty up the version reporting for AirOS to include hardware (XW, XM, etc) and three major groups of firmware
my @firmware = split(/v/, $ver);
my @firmwareSplit = split(/\./, $firmware[1]);
my @prefix = split(/\./, $ver);
$ver = $prefix[0] . '-v' . join('.', @firmwareSplit[0,1,2]);
}
return $ver;
## Not sure what this function does, it seems to be extraneous being in the same code block after a return statement?
#if ( $ver =~ /([\d\.]+)/ ) {
# return $1;
#}
}
my $ver = $ubnt->description() || '';
if((lc $ver) =~ /^edgeswitch/){
## EdgeSwitch OS version is second field split by comma and bootcode version is last
my @myver = split(/, /, $ver);
my @firmware = split(/\./, $myver[1]);
my @bootcode = split(/\./, $myver[-1]);
## Return only three major version groupings and include bootcode version
return join('.', @firmware[0,1,2]) . '.-b' . join('.', @bootcode[0,1,2]);
}
## EdgeRouter OS version is second field split by space
my @myver = split(/ /, $ver);
my @firmware = split(/\./, $myver[1]);
if($firmware[2] =~ /hotfix$/){
# edge case where EdgeOS has hotfix versions in format "EdgeOS v1.9.7+hotfix.4.5024004.171005.0403"
$firmware[2] = $firmware[2] . '.' . $firmware[3]
}
## Return only three major version groupings
return join('.', @firmware[0,1,2]);
}
sub vendor {
return 'ubiquiti';
}
sub model {
my $ubnt = shift;
my $names = $ubnt->dot11_prod_name();
foreach my $iid ( keys %$names ) {
my $prod = $names->{$iid};
next unless defined $prod;
return $prod;
}
my $desc = $ubnt->description() || '';
## Pull Model from beginning of description, separated by comma (EdgeSwitch)
if((lc $desc) =~ /^edgeswitch/){
my @mydesc = split(/, /, $desc);
return $mydesc[0];
}
if(!((lc $desc) =~ /edgeos/)){
# Not sure what type of device this is to get Model
# Wireless devices report dot11_prod_name
# EdgeSwitch includes model directly and edgeos logic is in else statement
return ;
}else{
## do some logic to determine ER model based on tech specs from ubnt:
## https://help.ubnt.com/hc/en-us/articles/219652227--EdgeRouter-Which-EdgeRouter-Should-I-Use-#tech%20specs
## Would be nice if UBNT simply adds the model string to their SNMP daemon directly
my $ethCount = 0;
my $switchCount = 0;
#my $sfpCount = 0;
#my $poeCount = 0;
my $memTotalReal = $ubnt->memTotalReal;
my $cpuLoad = $ubnt->hrProcessorLoad;
my $cpuCount = 0;
## My perl is lacking. Not sure if there's a more efficient way to find the cpu count
foreach my $iid ( keys %$cpuLoad ) {
$cpuCount++;
}
my $ifDescs = $ubnt->ifDescr;
foreach my $iid ( keys %$ifDescs ) {
my $ifDesc = $ifDescs->{$iid};
next unless defined $ifDesc;
if((lc $ifDesc) =~ /^eth\d+$/){ # exclude vlan interfaces. Ex: eth1.5
$ethCount++;
}elsif((lc $ifDesc) =~ /^switch/){
$switchCount++;
}
}
## If people have other models to further fine-tune this logic that would be great.
if($ethCount eq 9){
## Should be ER Infinity
return "EdgeRouter Infinity"
}if($ethCount eq 8){
## Could be ER-8 Pro, ER-8, or EP-R8
return "EdgeRouter 8-Port"
}if($ethCount eq 12){
## ER-12
return "EdgeRouter 12-Port"
}elsif($ethCount eq 5 and $cpuCount eq 4){
## Could be ER-X or ER-X-SFP
return "EdgeRouter X 5-Port"
}elsif($ethCount eq 5){
return "EdgeRouter PoE 5-Port"
}elsif($ethCount eq 3 and $cpuCount eq 2){
return "EdgeRouter LITE 3-Port"
}else{
## failback string
return "EdgeRouter eth-$ethCount switch-$switchCount mem-$memTotalReal cpuNum-$cpuCount";
}
}
}
## simply take the MAC and clean it up
sub serial {
my $ubnt = shift;
my $serial = $ubnt->mac();
if($serial){
$serial =~ s/://g;
return uc $serial;
}
return ;
}
## UBNT doesn't put the primary-mac interface at index 1
sub mac {
my $ubnt = shift;
my $ifDescs = $ubnt->ifDescr;
my $erModel = $ubnt->model;
foreach my $iid ( keys %$ifDescs ) {
my $ifDesc = $ifDescs->{$iid};
next unless defined $ifDesc;
## CPU Interface will have the primary MAC for EdgeSwitch
## eth0 will have primary MAC for linux-based UBNT devices, except ER-12 which is eth11
if($ifDesc =~ /CPU/ or ($ifDesc eq 'eth0' and !($erModel =~ /EdgeRouter 12/)) or ($ifDesc eq 'eth11' and ($erModel =~ /EdgeRouter 12/))){
my $mac = $ubnt->ifPhysAddress->{$iid};
# syntax stolen from sub munge_mac in SNMP::Info
$mac = lc join( ':', map { sprintf "%02x", $_ } unpack( 'C*', $mac ) );
return $mac if $mac =~ /^([0-9A-F][0-9A-F]:){5}[0-9A-F][0-9A-F]$/i;
}
}
# MAC malformed or missing
return;
}
sub interfaces {
my $ubnt = shift;
my $partial = shift;
my $interfaces = $ubnt->i_index($partial) || {};
my $i_descr = $ubnt->i_description($partial) || {};
my $return = {};
foreach my $iid ( keys %$i_descr ) {
# Slot: 0 Port: 4 Gigabit - Level
if ($i_descr->{$iid} =~ m/([0-9]+)[^0-9]+([0-9]+)/) {
$return->{$iid} = $1 .'/'. $2;
next;
}
# Link Aggregate 4
if ($i_descr->{$iid} =~ m/Link Aggregate (\d+)/) {
$return->{$iid} = '3/'. $1;
next;
}
# else
$return->{$iid} = $i_descr->{$iid};
}
return $return;
}
sub i_ignore {
my $l2 = shift;
my $partial = shift;
my $interfaces = $l2->interfaces($partial) || {};
my $i_descr = $l2->i_description($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# CPU Interface
if ( $i_descr->{$if} =~ /CPU Interface/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
1;
__END__
=head1 NAME
SNMP::Info::Layer2::Ubiquiti - SNMP Interface to Ubiquiti Access Points
=head1 AUTHOR
Max Kosmach
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
my $ubnt = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $ubnt->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from
Ubiquiti Access Point through SNMP.
=head2 Inherited Classes
=over
=item SNMP::Info::Layer2
=item SNMP::Info::IEEE802dot11
=back
=head2 Required MIBs
None.
=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
=over
=item $ubnt->vendor()
Returns 'ubiquiti'
=item $ubnt->model()
Returns the model extracted from C<dot11manufacturerProductName>, with fallback to some complex logic for EdgeMax devices
=item $ubnt->serial()
Serial Number.
=item $ubnt->mac()
Bridge MAC address.
=item $ubnt->os()
Returns C<AirOS>, C<UniFi> or C<EdgeOS> depending on model.
=item $ubnt->os_ver()
Returns the software version extracted from C<dot11manufacturerProductVersion>, with fallback to description splitting for EdgeMax devices
=back
=head2 Global Methods imported from SNMP::Info::Layer2
See L<SNMP::Info::Layer2/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"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 $ubnt->interfaces()
Uses the i_name() field.
=item $ubnt->i_ignore()
Ignores interfaces with "CPU Interface" in them.
=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::IEEE802dot11
See L<SNMP::Info::IEEE802dot11/"TABLE METHODS"> for details.
=cut

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer2::ZyXEL_DSLAM
# $Id$
#
# Copyright (c) 2008 Max Baker
# All rights reserved.
@@ -31,22 +30,23 @@
package SNMP::Info::Layer2::ZyXEL_DSLAM;
use strict;
use warnings;
use Exporter;
use SNMP::Info::Layer2;
@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/;
our ($VERSION, %FUNCS, %GLOBALS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
# Set for No CDP
%GLOBALS = ( %SNMP::Info::Layer2::GLOBALS );
%FUNCS = (
%SNMP::Info::Layer2::FUNCS,
'ip_adresses' => 'ipAdEntAddr',
'ip_addresses' => 'ipAdEntAddr',
'i_name' => 'ifDescr',
'i_description' => 'adslLineConfProfile',
);
@@ -58,7 +58,7 @@ $VERSION = '2.09';
sub layers {
my $zyxel = shift;
my $layers = $zyxel->layers();
my $layers = $zyxel->SUPER::layers();
return $layers if defined $layers;
# If these don't claim to have any layers, so we'll give them 1+2
@@ -77,7 +77,7 @@ sub os_ver {
my $zyxel = shift;
my $descr = $zyxel->description();
if ( $descr =~ m/version (\S+) / ) {
if ( defined ($descr) && $descr =~ m/version (\S+) / ) {
return $1;
}
return;
@@ -88,11 +88,13 @@ sub model {
my $desc = $zyxel->description();
if ( $desc =~ /8-port ADSL Module\(Annex A\)/ ) {
if (defined $desc) {
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;
}
@@ -102,7 +104,9 @@ sub ip {
my $ip_hash = $zyxel->ip_addresses();
my $found_ip;
foreach my $ip ( keys %{$ip_hash} ) {
# Since hashes are random add sort so we get the same address each time
# if there happens to be more than one. Will return highest numbered address
foreach my $ip ( sort keys %{$ip_hash} ) {
$found_ip = $ip
if ( defined $ip
and $ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ );
@@ -122,23 +126,23 @@ Dmitry Sergienko (C<dmitry@trifle.net>)
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $zyxel = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myhub',
Community => 'public',
Version => 1
)
Version => 2
)
or die "Can't connect to DestHost.\n";
my $class = $l2->class();
my $class = $zyxel->class();
print "SNMP::Info determined this device to fall under subclass : $class\n";
=head1 DESCRIPTION
Provides abstraction to the configuration information obtainable from a
ZyXEL device through SNMP. See inherited classes' documentation for
Provides abstraction to the configuration information obtainable from a
ZyXEL device through SNMP. See inherited classes' documentation for
inherited methods.
=head2 Inherited Classes
@@ -172,11 +176,11 @@ These are methods that return scalar value from SNMP
=item $zyxel->vendor()
Returns 'ZyXEL' :)
Returns 'zyxel'
=item $zyxel->os()
Returns 'ZyXEL'
Returns 'zyxel'
=item $zyxel->os_ver()

View File

@@ -1,5 +1,4 @@
# SNMP::Info::Layer3 - SNMP Interface to Layer3 devices
# $Id$
#
# Copyright (c) 2008 Max Baker -- All changes from Version 0.7 on
#
@@ -33,6 +32,7 @@
package SNMP::Info::Layer3;
use strict;
use warnings;
use Exporter;
use SNMP::Info;
use SNMP::Info::Bridge;
@@ -41,28 +41,34 @@ use SNMP::Info::Entity;
use SNMP::Info::PowerEthernet;
use SNMP::Info::IPv6;
use SNMP::Info::AdslLine;
use SNMP::Info::LLDP;
use SNMP::Info::DocsisHE;
@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::LLDP SNMP::Info::DocsisHE
SNMP::Info Exporter/;
@SNMP::Info::Layer3::EXPORT_OK = qw//;
use vars qw/$VERSION %GLOBALS %FUNCS %MIBS %MUNGE/;
our ($VERSION, %GLOBALS, %FUNCS, %MIBS, %MUNGE);
$VERSION = '2.09';
$VERSION = '3.74';
%MIBS = (
%SNMP::Info::MIBS,
%SNMP::Info::AdslLine::MIBS,
%SNMP::Info::Bridge::MIBS,
%SNMP::Info::DocsisHE::MIBS,
%SNMP::Info::EtherLike::MIBS,
%SNMP::Info::Entity::MIBS,
%SNMP::Info::PowerEthernet::MIBS,
%SNMP::Info::IPv6::MIBS,
%SNMP::Info::LLDP::MIBS,
'IP-MIB' => 'ipNetToMediaIfIndex',
'OSPF-MIB' => 'ospfRouterId',
'ISIS-MIB' => 'isisSysID',
'BGP4-MIB' => 'bgpIdentifier',
);
@@ -72,10 +78,12 @@ $VERSION = '2.09';
%SNMP::Info::GLOBALS,
%SNMP::Info::AdslLine::GLOBALS,
%SNMP::Info::Bridge::GLOBALS,
%SNMP::Info::DocsisHE::GLOBALS,
%SNMP::Info::EtherLike::GLOBALS,
%SNMP::Info::Entity::GLOBALS,
%SNMP::Info::PowerEthernet::GLOBALS,
%SNMP::Info::IPv6::GLOBALS,
%SNMP::Info::LLDP::GLOBALS,
'mac' => 'ifPhysAddress.1',
'serial1' =>
'.1.3.6.1.4.1.9.3.6.3.0', # OLD-CISCO-CHASSIS-MIB::chassisId.0
@@ -88,10 +96,12 @@ $VERSION = '2.09';
%SNMP::Info::FUNCS,
%SNMP::Info::AdslLine::FUNCS,
%SNMP::Info::Bridge::FUNCS,
%SNMP::Info::DocsisHE::FUNCS,
%SNMP::Info::EtherLike::FUNCS,
%SNMP::Info::Entity::FUNCS,
%SNMP::Info::PowerEthernet::FUNCS,
%SNMP::Info::IPv6::FUNCS,
%SNMP::Info::LLDP::FUNCS,
# Obsolete Address Translation Table (ARP Cache)
'old_at_index' => 'atIfIndex',
@@ -118,6 +128,20 @@ $VERSION = '2.09';
'ospf_peer_id' => 'ospfNbrRtrId',
'ospf_peer_state' => 'ospfNbrState',
# ISIS-MIB::isisCircTable
'isis_circ_if_idx' => 'isisCircIfIndex' ,
'isis_circ_admin' => 'isisCircAdminState',
'isis_circ_type' => 'isisCircType',
'isis_circ_level_type' => 'isisCircLevelType',
# ISIS-MIB::isisISAdjTable
'isis_adj_state' => 'isisISAdjState',
'isis_adj_type' => 'isisISAdjNeighSysType',
'isis_adj_usage' => 'isisISAdjUsage',
'isis_adj_id' => 'isisISAdjNeighSysID',
'isis_adj_ip_type' => 'isisISAdjIPAddrType',
'isis_adj' => 'isisISAdjIPAddrAddress',
# BGP4-MIB::bgpPeerTable
'bgp_peers' => 'bgpPeerLocalAddr',
'bgp_peer_id' => 'bgpPeerIdentifier',
@@ -132,11 +156,11 @@ $VERSION = '2.09';
'bgp_peer_out_upd' => 'bgpPeerOutUpdates',
# IP-MIB Net to Physical Table (ARP Cache)
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
'n2p_paddr' => 'ipNetToPhysicalPhysAddress',
'n2p_lastupdate' => 'ipNetToPhysicalLastUpdated',
'n2p_ptype' => 'ipNetToPhysicalType',
'n2p_pstate' => 'ipNetToPhysicalState',
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
'n2p_ptype' => 'ipNetToPhysicalType',
'n2p_pstate' => 'ipNetToPhysicalState',
'n2p_pstatus' => 'ipNetToPhysicalRowStatus',
);
@@ -147,14 +171,42 @@ $VERSION = '2.09';
%SNMP::Info::AdslLine::MUNGE,
%SNMP::Info::Bridge::MUNGE,
%SNMP::Info::EtherLike::MUNGE,
%SNMP::Info::DocsisHE::MUNGE,
%SNMP::Info::Entity::MUNGE,
%SNMP::Info::PowerEthernet::MUNGE,
%SNMP::Info::IPv6::MUNGE,
%SNMP::Info::LLDP::MUNGE,
'old_at_paddr' => \&SNMP::Info::munge_mac,
'at_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
'n2p_paddr' => \&SNMP::Info::munge_mac,
);
sub isis_peers {
my $l3 = shift;
my $isis_peers = {};
# Returns hexstrings. Need to convert to IPv4 dotted or IPv6 hex notation
my $adjacencies = $l3->isis_adj();
foreach my $key (keys %$adjacencies) {
my $hexstr = $adjacencies->{$key};
my $l = length $hexstr;
my $ip;
# 4 bytes = IPv4
if ($l == 4) {
$ip = join(".", unpack("C*", $hexstr));
$isis_peers->{$key} = $ip;
}
# 16 bytes = IPv6
elsif ($l == 16) {
$ip = unpack("H*", $hexstr);
$ip =~ s/....(?=.)\K/:/sg ;
$isis_peers->{$key} = $ip;
}
}
return $isis_peers;
}
# Method OverRides
sub root_ip {
@@ -163,12 +215,12 @@ sub root_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
# 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 ( 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)
@@ -185,41 +237,21 @@ sub root_ip {
return;
}
sub i_ignore {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->interfaces($partial) || {};
my %i_ignore;
foreach my $if ( keys %$interfaces ) {
# lo -> cisco aironet 350 loopback
if ( $interfaces->{$if} =~ /(tunnel|loopback|\blo\b|null)/i ) {
$i_ignore{$if}++;
}
}
return \%i_ignore;
}
sub serial {
my $l3 = shift;
my $serial1 = $l3->serial1();
my $e_descr = $l3->e_descr() || {};
my $e_serial = $l3->e_serial() || {};
my $entity_serial = $l3->entity_derived_serial();
if ( defined $entity_serial and $entity_serial !~ /^\s*$/ ){
return $entity_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*$/ );
my $serial1 = $l3->serial1();
if ( defined $serial1 and $serial1 !~ /^\s*$/ ) {
return $serial1;
}
return;
}
# $l3->model() - the sysObjectID returns an IID to an entry in
@@ -293,32 +325,47 @@ sub interfaces {
my $l3 = shift;
my $partial = shift;
my $interfaces = $l3->i_index($partial);
my $descriptions = $l3->i_description($partial);
my $interfaces = $l3->i_index($partial);
my $i_descr = $l3->i_description($partial);
my %interfaces = ();
foreach my $iid ( keys %$interfaces ) {
my $desc = $descriptions->{$iid};
next unless defined $desc;
# Check for duplicates in ifDescr, if so uniquely identify by adding
# ifIndex to repeated values
my (%seen, %first_seen_as);
foreach my $iid ( sort keys %$i_descr ) {
my $port = $i_descr->{$iid};
next unless defined $port;
$interfaces{$iid} = $desc;
$port = SNMP::Info::munge_null($port);
$port =~ s/^\s+//; $port =~ s/\s+$//;
next unless length $port;
if ( $seen{$port}++ ) {
# (#320) also fixup the port this is a duplicate of
$interfaces->{ $first_seen_as{$port} }
= sprintf( "%s (%d)", $port, $first_seen_as{$port} );
$interfaces->{$iid} = sprintf( "%s (%d)", $port, $iid );
}
else {
$interfaces->{$iid} = $port;
$first_seen_as{$port} = $iid;
}
}
return \%interfaces;
return $interfaces;
}
sub vendor {
my $l3 = shift;
my $descr = $l3->description();
my $id = $l3->id();
my $id = $l3->id();
# .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 $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 'brocade' if ( $descr =~ /foundry/i );
return 'unknown';
@@ -360,14 +407,14 @@ Max Baker
=head1 SYNOPSIS
# Let SNMP::Info determine the correct subclass for you.
# Let SNMP::Info determine the correct subclass for you.
my $l3 = new SNMP::Info(
AutoSpecify => 1,
Debug => 1,
DestHost => 'myswitch',
Community => 'public',
Version => 2
)
)
or die "Can't connect to DestHost.\n";
my $class = $l3->class();
@@ -390,11 +437,11 @@ 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.
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.
after determining a more specific class using the method above.
my $l3 = new SNMP::Info::Layer3(...);
@@ -414,6 +461,12 @@ after determining a more specific class using the method above.
=item SNMP::Info::IPv6
=item SNMP::Info::LLDP
=item SNMP::Info::DocsisHE
=item SNMP::Info::AdslLine
=back
=head2 Required MIBs
@@ -422,6 +475,8 @@ after determining a more specific class using the method above.
=item F<IP-MIB>
=item F<ISIS-MIB>
=item F<OSPF-MIB>
=item F<BGP4-MIB>
@@ -430,7 +485,7 @@ after determining a more specific class using the method above.
=head2 Inherited MIBs
See L<SNMP::Info/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info/"REQUIREMENTS"> for its MIB requirements.
See L<SNMP::Info::Bridge/"Required MIBs"> for its MIB requirements.
@@ -442,6 +497,12 @@ See L<SNMP::Info::PowerEthernet/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::IPv6/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::LLDP/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::DocsisHE/"Required MIBs"> for its MIB requirements.
See L<SNMP::Info::AdslLine/"Required MIBs"> for its MIB requirements.
=head1 GLOBALS
These are methods that return scalar value from SNMP
@@ -466,7 +527,7 @@ Returns the BGP identifier of the local system
=item $l3->bgp_local_as()
Returns the local autonomous system number
Returns the local autonomous system number
(C<bgpLocalAs.0>)
@@ -484,8 +545,7 @@ Removes 'cisco' from cisco devices for readability.
=item $l3->serial()
Tries to cull a serial number from F<ENTITY-MIB>, description, and
F<OLD-CISCO->... MIB.
Returns a serial number if found from F<ENTITY-MIB> and F<OLD-CISCO->... MIB.
=item $l3->vendor()
@@ -501,7 +561,7 @@ found: OSPF Router ID (C<ospfRouterId>) or any OSPF Host IP Address
=head2 Globals imported from SNMP::Info
See L<SNMP::Info/"GLOBALS"> for details.
See L<SNMP::Info/"USAGE"> for details.
=head2 Global Methods imported from SNMP::Info::Bridge
@@ -515,6 +575,26 @@ See L<SNMP::Info::EtherLike/"GLOBALS"> for details.
See L<SNMP::Info::Entity/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info:PowerEthernet
See L<SNMP::Info::PowerEthernet/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::IPv6
See L<SNMP::Info::IPv6/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::LLDP
See L<SNMP::Info::LLDP/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::DocsisHE
See L<SNMP::Info::DocsisHE/"GLOBALS"> for details.
=head2 Global Methods imported from SNMP::Info::AdslLine
See L<SNMP::Info::AdslLine/"GLOBALS"> for details.
=head1 TABLE METHODS
These are methods that return tables of information in the form of a reference
@@ -527,19 +607,13 @@ to a hash.
=item $l3->interfaces()
Returns the map between SNMP Interface Identifier (iid) and physical port
name.
name.
Only returns those iids that have a description listed in $l3->i_description()
=item $l3->i_ignore()
Returns reference to hash. Creates a key for each IID that should be ignored.
Currently looks for tunnel,loopback,lo,null from $l3->interfaces()
=item $l3->i_name()
Returns reference to hash of iid to human set name.
Returns reference to hash of iid to human set name.
Defaults to C<ifName>, but checks for an C<ifAlias>
@@ -547,10 +621,10 @@ Defaults to C<ifName>, but checks for an C<ifAlias>
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.
Maps $l3->el_index() to $l3->el_duplex, then culls out
full,half, or auto and sets the map to that value.
See L<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
@@ -560,7 +634,7 @@ See L<SNMP::Info::Etherlike> for the el_index() and el_duplex() methods.
=item $l3->at_index()
Returns reference to hash. Maps ARP table entries to Interface IIDs
Returns reference to hash. Maps ARP table entries to Interface IIDs
(C<ipNetToMediaIfIndex>)
@@ -569,7 +643,7 @@ the deprecated C<atIfIndex>.
=item $l3->at_paddr()
Returns reference to hash. Maps ARP table entries to MAC addresses.
Returns reference to hash. Maps ARP table entries to MAC addresses.
(C<ipNetToMediaPhysAddress>)
@@ -578,7 +652,7 @@ the deprecated C<atPhysAddress>.
=item $l3->at_netaddr()
Returns reference to hash. Maps ARP table entries to IP addresses.
Returns reference to hash. Maps ARP table entries to IP addresses.
(C<ipNetToMediaNetAddress>)
@@ -766,9 +840,85 @@ routers
=back
=head2 IS-IS Circuit Table
=over
=item $l3->isis_circ_if_idx()
Returns reference to hash of the interface index associated with the IS-IS
circuit
(C<isisCircIfIndex>)
=item $l3->isis_circ_admin()
Returns reference to hash of the IS-IS circuit's admin status
(C<isisCircAdminState>)
=item $l3->isis_circ_type()
Returns reference to hash of the IS-IS circuit's type
(C<isisCircType>)
=item $l3->isis_circ_level_type()
Returns reference to hash of the IS-IS circuit's level
(C<isisCircLevelType>)
=back
=head2 IS-IS Adjacency Table
=over
=item $l3->isis_adj_id()
Returns reference to hash of the peer id of adjacencies.
(C<isisISAdjNeighSysID>)
=item $l3->isis_adj_type()
Returns reference to hash of the type of adjacencies (Level 1
Intermediate System, Level 2 Intermediate System, Level 1+2
Intermediate System, unknown)
(C<isisISAdjNeighSysType>)
=item $l3->isis_adj_usage()
Returns reference to hash of the type of adjacencies in use
(undefined, Level 1, Level 2, Level1+2)
(C<isisISAdjNeighUsage>)
=item $l3->isis_adj_ip_type()
Returns reference to hash of type of address (IPv4, IPv6, etc) on adjacencies.
(C<isisISAdjIPAddrType>)
=item $l3->isis_adj()
Returns reference to hash of addresses (IPv4, IPv6, etc) on adjacencies.
Note this returns hash-strings, for IPs, use $l3->isis_peers()
(C<isisISAdjIPAddrAddress>)
=item $l3->isis_peers()
Returns reference to hash of addresses (IPv4, IPv6) on adjacencies.
Convert hash strings from isis_adj to proper
IP (v4 and v6) formatting.
=back
=head2 Table Methods imported from SNMP::Info
See L<SNMP::Info/"TABLE METHODS"> for details.
See L<SNMP::Info/"USAGE"> for details.
=head2 Table Methods imported from SNMP::Info::Bridge
@@ -790,4 +940,16 @@ See L<SNMP::Info::PowerEthernet/"TABLE METHODS"> for details.
See L<SNMP::Info::IPv6/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::LLDP
See L<SNMP::Info::LLDP/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::DocsisHE
See L<SNMP::Info::DocsisHE/"TABLE METHODS"> for details.
=head2 Table Methods imported from SNMP::Info::AdslLine
See L<SNMP::Info::AdslLine/"TABLE METHODS"> for details.
=cut

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