snmp 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +179 -0
- data/Rakefile +34 -39
- data/data/ruby/snmp/mibs/ACCOUNTING-CONTROL-MIB.yaml +33 -32
- data/data/ruby/snmp/mibs/ADSL-LINE-EXT-MIB.yaml +57 -56
- data/data/ruby/snmp/mibs/ADSL-LINE-MIB.yaml +224 -223
- data/data/ruby/snmp/mibs/ADSL-TC-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/ADSL2-LINE-MIB.yaml +321 -0
- data/data/ruby/snmp/mibs/ADSL2-LINE-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/AGENTX-MIB.yaml +25 -24
- data/data/ruby/snmp/mibs/AGGREGATE-MIB.yaml +28 -0
- data/data/ruby/snmp/mibs/ALARM-MIB.yaml +77 -0
- data/data/ruby/snmp/mibs/APM-MIB.yaml +75 -74
- data/data/ruby/snmp/mibs/APPC-MIB.yaml +261 -260
- data/data/ruby/snmp/mibs/APPLETALK-MIB.yaml +255 -254
- data/data/ruby/snmp/mibs/APPLICATION-MIB.yaml +138 -137
- data/data/ruby/snmp/mibs/APPN-DLUR-MIB.yaml +30 -29
- data/data/ruby/snmp/mibs/APPN-MIB.yaml +325 -324
- data/data/ruby/snmp/mibs/APPN-TRAP-MIB.yaml +10 -9
- data/data/ruby/snmp/mibs/APS-MIB.yaml +50 -49
- data/data/ruby/snmp/mibs/ARC-MIB.yaml +19 -0
- data/data/ruby/snmp/mibs/ATM-ACCOUNTING-INFORMATION-MIB.yaml +22 -21
- data/data/ruby/snmp/mibs/ATM-MIB.yaml +94 -93
- data/data/ruby/snmp/mibs/ATM-TC-MIB.yaml +12 -11
- data/data/ruby/snmp/mibs/ATM2-MIB.yaml +156 -155
- data/data/ruby/snmp/mibs/BGP4-MIB.yaml +48 -41
- data/data/ruby/snmp/mibs/BLDG-HVAC-MIB.yaml +25 -24
- data/data/ruby/snmp/mibs/BRIDGE-MIB.yaml +50 -44
- data/data/ruby/snmp/mibs/CHARACTER-MIB.yaml +35 -34
- data/data/ruby/snmp/mibs/CIRCUIT-IF-MIB.yaml +13 -12
- data/data/ruby/snmp/mibs/CLNS-MIB.yaml +98 -97
- data/data/ruby/snmp/mibs/COFFEE-POT-MIB.yaml +8 -7
- data/data/ruby/snmp/mibs/COPS-CLIENT-MIB.yaml +38 -37
- data/data/ruby/snmp/mibs/DECNET-PHIV-MIB.yaml +209 -208
- data/data/ruby/snmp/mibs/DIAL-CONTROL-MIB.yaml +72 -71
- data/data/ruby/snmp/mibs/DIFFSERV-CONFIG-MIB.yaml +11 -10
- data/data/ruby/snmp/mibs/DIFFSERV-DSCP-TC.yaml +1 -0
- data/data/ruby/snmp/mibs/DIFFSERV-MIB.yaml +151 -150
- data/data/ruby/snmp/mibs/DIRECTORY-SERVER-MIB.yaml +35 -34
- data/data/ruby/snmp/mibs/DISMAN-EVENT-MIB.yaml +95 -94
- data/data/ruby/snmp/mibs/DISMAN-EXPRESSION-MIB.yaml +37 -36
- data/data/ruby/snmp/mibs/DISMAN-NSLOOKUP-MIB.yaml +15 -14
- data/data/ruby/snmp/mibs/DISMAN-PING-MIB.yaml +43 -42
- data/data/ruby/snmp/mibs/DISMAN-SCHEDULE-MIB.yaml +22 -21
- data/data/ruby/snmp/mibs/DISMAN-SCRIPT-MIB.yaml +64 -63
- data/data/ruby/snmp/mibs/DISMAN-TRACEROUTE-MIB.yaml +59 -58
- data/data/ruby/snmp/mibs/DLSW-MIB.yaml +172 -171
- data/data/ruby/snmp/mibs/DNS-RESOLVER-MIB.yaml +70 -69
- data/data/ruby/snmp/mibs/DNS-SERVER-MIB.yaml +57 -56
- data/data/ruby/snmp/mibs/DOCS-BPI-MIB.yaml +81 -80
- data/data/ruby/snmp/mibs/DOCS-CABLE-DEVICE-MIB.yaml +114 -89
- data/data/ruby/snmp/mibs/DOCS-IETF-BPI2-MIB.yaml +187 -0
- data/data/ruby/snmp/mibs/DOCS-IETF-CABLE-DEVICE-NOTIFICATION-MIB.yaml +39 -0
- data/data/ruby/snmp/mibs/DOCS-IETF-QOS-MIB.yaml +166 -0
- data/data/ruby/snmp/mibs/DOCS-IETF-SUBMGT-MIB.yaml +32 -0
- data/data/ruby/snmp/mibs/DOCS-IF-MIB.yaml +208 -119
- data/data/ruby/snmp/mibs/DOT12-IF-MIB.yaml +21 -20
- data/data/ruby/snmp/mibs/DOT3-EPON-MIB.yaml +101 -0
- data/data/ruby/snmp/mibs/DOT3-OAM-MIB.yaml +82 -0
- data/data/ruby/snmp/mibs/DS0-MIB.yaml +11 -10
- data/data/ruby/snmp/mibs/DS0BUNDLE-MIB.yaml +9 -8
- data/data/ruby/snmp/mibs/DS1-MIB.yaml +102 -98
- data/data/ruby/snmp/mibs/DS3-MIB.yaml +84 -83
- data/data/ruby/snmp/mibs/DSA-MIB.yaml +31 -30
- data/data/ruby/snmp/mibs/DSMON-MIB.yaml +193 -192
- data/data/ruby/snmp/mibs/EBN-MIB.yaml +32 -31
- data/data/ruby/snmp/mibs/EFM-CU-MIB.yaml +113 -0
- data/data/ruby/snmp/mibs/ENTITY-MIB.yaml +41 -38
- data/data/ruby/snmp/mibs/ENTITY-SENSOR-MIB.yaml +8 -7
- data/data/ruby/snmp/mibs/ENTITY-STATE-MIB.yaml +18 -0
- data/data/ruby/snmp/mibs/ENTITY-STATE-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/ETHER-CHIPSET-MIB.yaml +61 -60
- data/data/ruby/snmp/mibs/ETHER-WIS.yaml +16 -15
- data/data/ruby/snmp/mibs/EtherLike-MIB.yaml +43 -42
- data/data/ruby/snmp/mibs/FC-MGMT-MIB.yaml +154 -0
- data/data/ruby/snmp/mibs/FCIP-MGMT-MIB.yaml +68 -0
- data/data/ruby/snmp/mibs/FDDI-SMT73-MIB.yaml +107 -106
- data/data/ruby/snmp/mibs/FIBRE-CHANNEL-FE-MIB.yaml +100 -99
- data/data/ruby/snmp/mibs/FLOW-METER-MIB.yaml +92 -91
- data/data/ruby/snmp/mibs/FR-ATM-PVC-SERVICE-IWF-MIB.yaml +33 -32
- data/data/ruby/snmp/mibs/FR-MFR-MIB.yaml +38 -37
- data/data/ruby/snmp/mibs/FRAME-RELAY-DTE-MIB.yaml +41 -40
- data/data/ruby/snmp/mibs/FRNETSERV-MIB.yaml +92 -91
- data/data/ruby/snmp/mibs/FRSLD-MIB.yaml +66 -65
- data/data/ruby/snmp/mibs/Finisher-MIB.yaml +38 -37
- data/data/ruby/snmp/mibs/GMPLS-LABEL-STD-MIB.yaml +27 -0
- data/data/ruby/snmp/mibs/GMPLS-LSR-STD-MIB.yaml +20 -0
- data/data/ruby/snmp/mibs/GMPLS-TC-STD-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/GMPLS-TE-STD-MIB.yaml +72 -0
- data/data/ruby/snmp/mibs/GSMP-MIB.yaml +75 -74
- data/data/ruby/snmp/mibs/HC-ALARM-MIB.yaml +26 -25
- data/data/ruby/snmp/mibs/HC-PerfHist-TC-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/HC-RMON-MIB.yaml +164 -163
- data/data/ruby/snmp/mibs/HCNUM-TC.yaml +1 -0
- data/data/ruby/snmp/mibs/HDSL2-SHDSL-LINE-MIB.yaml +117 -112
- data/data/ruby/snmp/mibs/HOST-RESOURCES-MIB.yaml +82 -81
- data/data/ruby/snmp/mibs/HOST-RESOURCES-TYPES.yaml +40 -39
- data/data/ruby/snmp/mibs/HPR-IP-MIB.yaml +17 -16
- data/data/ruby/snmp/mibs/HPR-MIB.yaml +64 -63
- data/data/ruby/snmp/mibs/IANA-ITU-ALARM-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/IF-CAP-STACK-MIB.yaml +13 -0
- data/data/ruby/snmp/mibs/IF-INVERTED-STACK-MIB.yaml +6 -5
- data/data/ruby/snmp/mibs/IF-MIB.yaml +57 -56
- data/data/ruby/snmp/mibs/IFCP-MGMT-MIB.yaml +65 -0
- data/data/ruby/snmp/mibs/IGMP-STD-MIB.yaml +24 -23
- data/data/ruby/snmp/mibs/INET-ADDRESS-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/INTEGRATED-SERVICES-GUARANTEED-MIB.yaml +6 -5
- data/data/ruby/snmp/mibs/INTEGRATED-SERVICES-MIB.yaml +29 -28
- data/data/ruby/snmp/mibs/INTERFACETOPN-MIB.yaml +21 -20
- data/data/ruby/snmp/mibs/IP-FORWARD-MIB.yaml +49 -27
- data/data/ruby/snmp/mibs/IP-MIB.yaml +243 -40
- data/data/ruby/snmp/mibs/IPATM-IPMC-MIB.yaml +179 -178
- data/data/ruby/snmp/mibs/IPMCAST-MIB.yaml +105 -0
- data/data/ruby/snmp/mibs/IPMROUTE-STD-MIB.yaml +49 -48
- data/data/ruby/snmp/mibs/IPOA-MIB.yaml +74 -73
- data/data/ruby/snmp/mibs/IPS-AUTH-MIB.yaml +68 -0
- data/data/ruby/snmp/mibs/IPSEC-SPD-MIB.yaml +121 -0
- data/data/ruby/snmp/mibs/IPV6-FLOW-LABEL-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/IPV6-ICMP-MIB.yaml +27 -26
- data/data/ruby/snmp/mibs/IPV6-MIB.yaml +70 -69
- data/data/ruby/snmp/mibs/IPV6-MLD-MIB.yaml +18 -17
- data/data/ruby/snmp/mibs/IPV6-TCP-MIB.yaml +7 -6
- data/data/ruby/snmp/mibs/IPV6-UDP-MIB.yaml +6 -5
- data/data/ruby/snmp/mibs/ISCSI-MIB.yaml +199 -0
- data/data/ruby/snmp/mibs/ISDN-MIB.yaml +57 -56
- data/data/ruby/snmp/mibs/ISIS-MIB.yaml +247 -0
- data/data/ruby/snmp/mibs/ISNS-MIB.yaml +179 -0
- data/data/ruby/snmp/mibs/ITU-ALARM-MIB.yaml +34 -0
- data/data/ruby/snmp/mibs/ITU-ALARM-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/Job-Monitoring-MIB.yaml +26 -27
- data/data/ruby/snmp/mibs/L2TP-MIB.yaml +138 -137
- data/data/ruby/snmp/mibs/LANGTAG-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/LMP-MIB.yaml +202 -0
- data/data/ruby/snmp/mibs/MALLOC-MIB.yaml +66 -65
- data/data/ruby/snmp/mibs/MAU-MIB.yaml +55 -95
- data/data/ruby/snmp/mibs/MIDCOM-MIB.yaml +83 -0
- data/data/ruby/snmp/mibs/MIOX25-MIB.yaml +28 -27
- data/data/ruby/snmp/mibs/MIP-MIB.yaml +157 -156
- data/data/ruby/snmp/mibs/MOBILEIPV6-MIB.yaml +189 -0
- data/data/ruby/snmp/mibs/MPLS-FTN-STD-MIB.yaml +29 -28
- data/data/ruby/snmp/mibs/MPLS-L3VPN-STD-MIB.yaml +88 -0
- data/data/ruby/snmp/mibs/MPLS-LC-ATM-STD-MIB.yaml +19 -0
- data/data/ruby/snmp/mibs/MPLS-LC-FR-STD-MIB.yaml +16 -0
- data/data/ruby/snmp/mibs/MPLS-LDP-ATM-STD-MIB.yaml +23 -22
- data/data/ruby/snmp/mibs/MPLS-LDP-FRAME-RELAY-STD-MIB.yaml +17 -16
- data/data/ruby/snmp/mibs/MPLS-LDP-GENERIC-STD-MIB.yaml +9 -8
- data/data/ruby/snmp/mibs/MPLS-LDP-STD-MIB.yaml +103 -102
- data/data/ruby/snmp/mibs/MPLS-LSR-STD-MIB.yaml +85 -84
- data/data/ruby/snmp/mibs/MPLS-TC-STD-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/MPLS-TE-STD-MIB.yaml +106 -105
- data/data/ruby/snmp/mibs/MSDP-MIB.yaml +71 -0
- data/data/ruby/snmp/mibs/MTA-MIB.yaml +42 -41
- data/data/ruby/snmp/mibs/Modem-MIB.yaml +87 -86
- data/data/ruby/snmp/mibs/NAT-MIB.yaml +116 -0
- data/data/ruby/snmp/mibs/NETWORK-SERVICES-MIB.yaml +18 -17
- data/data/ruby/snmp/mibs/NHRP-MIB.yaml +140 -139
- data/data/ruby/snmp/mibs/NOTIFICATION-LOG-MIB.yaml +37 -36
- data/data/ruby/snmp/mibs/OPT-IF-MIB.yaml +394 -393
- data/data/ruby/snmp/mibs/OSPF-MIB.yaml +192 -123
- data/data/ruby/snmp/mibs/OSPF-TRAP-MIB.yaml +24 -19
- data/data/ruby/snmp/mibs/P-BRIDGE-MIB.yaml +37 -35
- data/data/ruby/snmp/mibs/PARALLEL-MIB.yaml +16 -15
- data/data/ruby/snmp/mibs/PIM-MIB.yaml +47 -46
- data/data/ruby/snmp/mibs/PIM-STD-MIB.yaml +235 -0
- data/data/ruby/snmp/mibs/PINT-MIB.yaml +38 -37
- data/data/ruby/snmp/mibs/PKTC-IETF-MTA-MIB.yaml +81 -0
- data/data/ruby/snmp/mibs/PKTC-IETF-SIG-MIB.yaml +128 -0
- data/data/ruby/snmp/mibs/POLICY-BASED-MANAGEMENT-MIB.yaml +94 -0
- data/data/ruby/snmp/mibs/POWER-ETHERNET-MIB.yaml +27 -26
- data/data/ruby/snmp/mibs/PPP-BRIDGE-NCP-MIB.yaml +16 -15
- data/data/ruby/snmp/mibs/PPP-IP-NCP-MIB.yaml +7 -6
- data/data/ruby/snmp/mibs/PPP-LCP-MIB.yaml +33 -32
- data/data/ruby/snmp/mibs/PPP-SEC-MIB.yaml +13 -12
- data/data/ruby/snmp/mibs/PTOPO-MIB.yaml +29 -28
- data/data/ruby/snmp/mibs/PerfHist-TC-MIB.yaml +1 -0
- data/data/ruby/snmp/mibs/Printer-MIB.yaml +185 -184
- data/data/ruby/snmp/mibs/Q-BRIDGE-MIB.yaml +96 -82
- data/data/ruby/snmp/mibs/RADIUS-ACC-CLIENT-MIB.yaml +34 -16
- data/data/ruby/snmp/mibs/RADIUS-ACC-SERVER-MIB.yaml +40 -24
- data/data/ruby/snmp/mibs/RADIUS-AUTH-CLIENT-MIB.yaml +38 -18
- data/data/ruby/snmp/mibs/RADIUS-AUTH-SERVER-MIB.yaml +40 -23
- data/data/ruby/snmp/mibs/RADIUS-DYNAUTH-CLIENT-MIB.yaml +44 -0
- data/data/ruby/snmp/mibs/RADIUS-DYNAUTH-SERVER-MIB.yaml +40 -0
- data/data/ruby/snmp/mibs/RAQMON-MIB.yaml +90 -0
- data/data/ruby/snmp/mibs/RDBMS-MIB.yaml +69 -68
- data/data/ruby/snmp/mibs/RFC1065-SMI.yaml +4 -5
- data/data/ruby/snmp/mibs/RFC1155-SMI.yaml +4 -5
- data/data/ruby/snmp/mibs/RFC1158-MIB.yaml +174 -173
- data/data/ruby/snmp/mibs/RFC1213-MIB.yaml +173 -172
- data/data/ruby/snmp/mibs/RFC1269-MIB.yaml +20 -19
- data/data/ruby/snmp/mibs/RFC1271-MIB.yaml +185 -184
- data/data/ruby/snmp/mibs/RFC1285-MIB.yaml +85 -84
- data/data/ruby/snmp/mibs/RFC1316-MIB.yaml +30 -29
- data/data/ruby/snmp/mibs/RFC1381-MIB.yaml +40 -39
- data/data/ruby/snmp/mibs/RFC1382-MIB.yaml +149 -148
- data/data/ruby/snmp/mibs/RFC1414-MIB.yaml +4 -3
- data/data/ruby/snmp/mibs/RIPv2-MIB.yaml +25 -24
- data/data/ruby/snmp/mibs/RMON-MIB.yaml +192 -191
- data/data/ruby/snmp/mibs/RMON2-MIB.yaml +253 -252
- data/data/ruby/snmp/mibs/ROHC-MIB.yaml +49 -48
- data/data/ruby/snmp/mibs/ROHC-RTP-MIB.yaml +19 -18
- data/data/ruby/snmp/mibs/ROHC-UNCOMPRESSED-MIB.yaml +6 -5
- data/data/ruby/snmp/mibs/RS-232-MIB.yaml +36 -35
- data/data/ruby/snmp/mibs/RSTP-MIB.yaml +18 -0
- data/data/ruby/snmp/mibs/RSVP-MIB.yaml +137 -136
- data/data/ruby/snmp/mibs/RTP-MIB.yaml +42 -41
- data/data/ruby/snmp/mibs/SCSI-MIB.yaml +160 -0
- data/data/ruby/snmp/mibs/SCTP-MIB.yaml +83 -0
- data/data/ruby/snmp/mibs/SFLOW-MIB.yaml +15 -14
- data/data/ruby/snmp/mibs/SIP-COMMON-MIB.yaml +112 -0
- data/data/ruby/snmp/mibs/SIP-MIB.yaml +56 -55
- data/data/ruby/snmp/mibs/SIP-SERVER-MIB.yaml +52 -0
- data/data/ruby/snmp/mibs/SIP-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/SIP-UA-MIB.yaml +14 -0
- data/data/ruby/snmp/mibs/SLAPM-MIB.yaml +134 -133
- data/data/ruby/snmp/mibs/SMON-MIB.yaml +47 -46
- data/data/ruby/snmp/mibs/SNA-NAU-MIB.yaml +117 -116
- data/data/ruby/snmp/mibs/SNA-SDLC-MIB.yaml +126 -125
- data/data/ruby/snmp/mibs/SNMP-COMMUNITY-MIB.yaml +12 -11
- data/data/ruby/snmp/mibs/SNMP-FRAMEWORK-MIB.yaml +8 -7
- data/data/ruby/snmp/mibs/SNMP-MPD-MIB.yaml +6 -5
- data/data/ruby/snmp/mibs/SNMP-NOTIFICATION-MIB.yaml +16 -15
- data/data/ruby/snmp/mibs/SNMP-PROXY-MIB.yaml +10 -9
- data/data/ruby/snmp/mibs/SNMP-REPEATER-MIB.yaml +120 -119
- data/data/ruby/snmp/mibs/SNMP-TARGET-MIB.yaml +19 -18
- data/data/ruby/snmp/mibs/SNMP-USER-BASED-SM-MIB.yaml +26 -25
- data/data/ruby/snmp/mibs/SNMP-USM-AES-MIB.yaml +4 -0
- data/data/ruby/snmp/mibs/SNMP-USM-DH-OBJECTS-MIB.yaml +10 -9
- data/data/ruby/snmp/mibs/SNMP-VIEW-BASED-ACM-MIB.yaml +26 -25
- data/data/ruby/snmp/mibs/SNMPv2-MIB.yaml +46 -45
- data/data/ruby/snmp/mibs/SNMPv2-SMI.yaml +12 -11
- data/data/ruby/snmp/mibs/SNMPv2-TM.yaml +5 -4
- data/data/ruby/snmp/mibs/SNMPv2-USEC-MIB.yaml +10 -9
- data/data/ruby/snmp/mibs/SONET-MIB.yaml +110 -109
- data/data/ruby/snmp/mibs/SOURCE-ROUTING-MIB.yaml +18 -17
- data/data/ruby/snmp/mibs/SSPM-MIB.yaml +67 -0
- data/data/ruby/snmp/mibs/SYSAPPL-MIB.yaml +65 -64
- data/data/ruby/snmp/mibs/T11-FC-FABRIC-ADDR-MGR-MIB.yaml +63 -0
- data/data/ruby/snmp/mibs/T11-FC-FABRIC-CONFIG-SERVER-MIB.yaml +100 -0
- data/data/ruby/snmp/mibs/T11-FC-FABRIC-LOCK-MIB.yaml +22 -0
- data/data/ruby/snmp/mibs/T11-FC-FSPF-MIB.yaml +70 -0
- data/data/ruby/snmp/mibs/T11-FC-NAME-SERVER-MIB.yaml +56 -0
- data/data/ruby/snmp/mibs/T11-FC-ROUTE-MIB.yaml +27 -0
- data/data/ruby/snmp/mibs/T11-FC-RSCN-MIB.yaml +47 -0
- data/data/ruby/snmp/mibs/T11-FC-VIRTUAL-FABRIC-MIB.yaml +31 -0
- data/data/ruby/snmp/mibs/T11-FC-ZONE-SERVER-MIB.yaml +124 -0
- data/data/ruby/snmp/mibs/T11-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/TCP-ESTATS-MIB.yaml +167 -0
- data/data/ruby/snmp/mibs/TCP-MIB.yaml +37 -18
- data/data/ruby/snmp/mibs/TCPIPX-MIB.yaml +16 -15
- data/data/ruby/snmp/mibs/TE-LINK-STD-MIB.yaml +82 -0
- data/data/ruby/snmp/mibs/TE-MIB.yaml +81 -0
- data/data/ruby/snmp/mibs/TIME-AGGREGATE-MIB.yaml +22 -0
- data/data/ruby/snmp/mibs/TN3270E-MIB.yaml +85 -84
- data/data/ruby/snmp/mibs/TN3270E-RT-MIB.yaml +33 -32
- data/data/ruby/snmp/mibs/TOKEN-RING-RMON-MIB.yaml +159 -158
- data/data/ruby/snmp/mibs/TOKENRING-MIB.yaml +42 -41
- data/data/ruby/snmp/mibs/TOKENRING-STATION-SR-MIB.yaml +8 -7
- data/data/ruby/snmp/mibs/TRANSPORT-ADDRESS-MIB.yaml +13 -12
- data/data/ruby/snmp/mibs/TRIP-MIB.yaml +118 -0
- data/data/ruby/snmp/mibs/TRIP-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/TUNNEL-MIB.yaml +29 -13
- data/data/ruby/snmp/mibs/UDP-MIB.yaml +19 -6
- data/data/ruby/snmp/mibs/UDPLITE-MIB.yaml +26 -0
- data/data/ruby/snmp/mibs/UPS-MIB.yaml +100 -99
- data/data/ruby/snmp/mibs/URI-TC-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/VDSL-LINE-EXT-MCM-MIB.yaml +42 -0
- data/data/ruby/snmp/mibs/VDSL-LINE-EXT-SCM-MIB.yaml +27 -0
- data/data/ruby/snmp/mibs/VDSL-LINE-MIB.yaml +162 -161
- data/data/ruby/snmp/mibs/VPN-TC-STD-MIB.yaml +3 -0
- data/data/ruby/snmp/mibs/VRRP-MIB.yaml +39 -38
- data/data/ruby/snmp/mibs/WWW-MIB.yaml +75 -74
- data/examples/dump.rb +5 -5
- data/examples/iftable.rb +4 -4
- data/examples/link_down.rb +18 -18
- data/examples/log_traps.rb +9 -9
- data/examples/walk.rb +4 -4
- data/lib/snmp/agent.rb +42 -43
- data/lib/snmp/ber.rb +155 -156
- data/lib/snmp/manager.rb +412 -372
- data/lib/snmp/mib.rb +172 -182
- data/lib/snmp/options.rb +64 -0
- data/lib/snmp/pdu.rb +245 -245
- data/lib/snmp/varbind.rb +346 -341
- data/lib/snmp/version.rb +3 -0
- data/test/test_ber.rb +232 -233
- data/test/test_manager.rb +277 -238
- data/test/test_mib.rb +57 -57
- data/test/test_pdu.rb +172 -172
- data/test/test_retry.rb +54 -54
- data/test/test_smi.rb +10 -10
- data/test/test_varbind.rb +342 -331
- data/test/test_walk.rb +150 -150
- metadata +103 -45
- data/README +0 -252
- data/setup.rb +0 -1360
data/lib/snmp/manager.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (c) 2004 David R. Halliday
|
|
2
|
+
# Copyright (c) 2004-2010 David R. Halliday
|
|
3
3
|
# All rights reserved.
|
|
4
4
|
#
|
|
5
5
|
# This SNMP library is free software. Redistribution is permitted under the
|
|
@@ -9,191 +9,216 @@
|
|
|
9
9
|
|
|
10
10
|
require 'snmp/pdu'
|
|
11
11
|
require 'snmp/mib'
|
|
12
|
+
require 'snmp/options'
|
|
12
13
|
require 'socket'
|
|
13
14
|
require 'timeout'
|
|
14
15
|
require 'thread'
|
|
15
16
|
|
|
16
17
|
module SNMP
|
|
17
18
|
|
|
18
|
-
class RequestTimeout < RuntimeError; end
|
|
19
|
+
class RequestTimeout < RuntimeError; end
|
|
19
20
|
|
|
20
|
-
##
|
|
21
|
-
# Wrap socket so that it can be easily substituted for testing or for
|
|
22
|
-
# using other transport types (e.g. TCP)
|
|
23
|
-
#
|
|
24
|
-
class UDPTransport
|
|
25
|
-
def initialize
|
|
26
|
-
|
|
21
|
+
##
|
|
22
|
+
# Wrap socket so that it can be easily substituted for testing or for
|
|
23
|
+
# using other transport types (e.g. TCP)
|
|
24
|
+
#
|
|
25
|
+
class UDPTransport
|
|
26
|
+
def initialize(address_family)
|
|
27
|
+
@socket = UDPSocket.open(address_family)
|
|
27
28
|
end
|
|
28
29
|
|
|
29
30
|
def close
|
|
30
|
-
|
|
31
|
+
@socket.close
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
def send(data, host, port)
|
|
34
|
-
|
|
35
|
+
@socket.send(data, 0, host, port)
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
def recv(max_bytes)
|
|
38
|
-
|
|
39
|
+
@socket.recv(max_bytes)
|
|
39
40
|
end
|
|
40
|
-
end
|
|
41
|
+
end
|
|
41
42
|
|
|
42
|
-
##
|
|
43
|
-
# Manage a request-id in the range 1..2**31-1
|
|
44
|
-
#
|
|
45
|
-
class RequestId
|
|
43
|
+
##
|
|
44
|
+
# Manage a request-id in the range 1..2**31-1
|
|
45
|
+
#
|
|
46
|
+
class RequestId
|
|
46
47
|
MAX_REQUEST_ID = 2**31
|
|
47
|
-
|
|
48
|
+
|
|
48
49
|
def initialize
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
@lock = Mutex.new
|
|
51
|
+
@request_id = rand(MAX_REQUEST_ID)
|
|
51
52
|
end
|
|
52
53
|
|
|
53
54
|
def next
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
@lock.synchronize do
|
|
56
|
+
@request_id += 1
|
|
57
|
+
@request_id = 1 if @request_id == MAX_REQUEST_ID
|
|
58
|
+
return @request_id
|
|
59
|
+
end
|
|
59
60
|
end
|
|
60
|
-
|
|
61
|
+
|
|
61
62
|
def force_next(next_id)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
##
|
|
74
|
-
# == SNMP Manager
|
|
75
|
-
#
|
|
76
|
-
# This class provides a manager for interacting with a single SNMP agent.
|
|
77
|
-
#
|
|
78
|
-
# = Example
|
|
79
|
-
#
|
|
80
|
-
# require 'snmp'
|
|
81
|
-
#
|
|
82
|
-
# manager = SNMP::Manager.new(:Host => 'localhost', :Port => 1061)
|
|
83
|
-
# response = manager.get(["1.3.6.1.2.1.1.1.0", "1.3.6.1.2.1.1.2.0"])
|
|
84
|
-
# response.each_varbind {|vb| puts vb.inspect}
|
|
85
|
-
# manager.close
|
|
86
|
-
#
|
|
87
|
-
# == Symbolic Object Names
|
|
88
|
-
#
|
|
89
|
-
# Symbolic names for SNMP object IDs can be used as parameters to the
|
|
90
|
-
# APIs in this class if the MIB modules are imported and the names of the
|
|
91
|
-
# MIBs are included in the MibModules configuration parameter.
|
|
92
|
-
#
|
|
93
|
-
# See MIB.varbind_list for a description of valid parameter formats.
|
|
94
|
-
#
|
|
95
|
-
# The following modules are loaded by default: "SNMPv2-SMI", "SNMPv2-MIB",
|
|
96
|
-
# "IF-MIB", "IP-MIB", "TCP-MIB", "UDP-MIB". All of the current IETF MIBs
|
|
97
|
-
# have been imported and are available for loading.
|
|
98
|
-
#
|
|
99
|
-
# Additional modules may be imported using the MIB class. The
|
|
100
|
-
# current implementation of the importing code requires that the
|
|
101
|
-
# external 'smidump' tool is available in your PATH. This tool can be
|
|
102
|
-
# obtained from the libsmi website at
|
|
103
|
-
# http://www.ibr.cs.tu-bs.de/projects/libsmi/ .
|
|
104
|
-
#
|
|
105
|
-
# = Example
|
|
106
|
-
#
|
|
107
|
-
# Do this once:
|
|
108
|
-
#
|
|
109
|
-
# SNMP::MIB.import_module(MY_MODULE_FILENAME, MIB_OUTPUT_DIR)
|
|
110
|
-
#
|
|
111
|
-
# Include your module in MibModules each time you create a Manager:
|
|
112
|
-
#
|
|
113
|
-
# SNMP::Manager.new(:Host => 'localhost', :MibDir => MIB_OUTPUT_DIR,
|
|
114
|
-
# :MibModules => ["MY-MODULE-MIB", "SNMPv2-MIB", ...])
|
|
115
|
-
#
|
|
63
|
+
new_request_id = next_id.to_i
|
|
64
|
+
if new_request_id < 1 || new_request_id >= MAX_REQUEST_ID
|
|
65
|
+
raise "Invalid request id: #{new_request_id}"
|
|
66
|
+
end
|
|
67
|
+
new_request_id = MAX_REQUEST_ID if new_request_id == 1
|
|
68
|
+
@lock.synchronize do
|
|
69
|
+
@request_id = new_request_id - 1
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
116
73
|
|
|
117
|
-
class Manager
|
|
118
74
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
75
|
+
##
|
|
76
|
+
# This class provides a manager for interacting with a single SNMP agent.
|
|
77
|
+
#
|
|
78
|
+
# == Example
|
|
79
|
+
#
|
|
80
|
+
# require 'snmp'
|
|
81
|
+
#
|
|
82
|
+
# manager = SNMP::Manager.new(:host => 'localhost', :port => 1061)
|
|
83
|
+
# response = manager.get(["1.3.6.1.2.1.1.1.0", "1.3.6.1.2.1.1.2.0"])
|
|
84
|
+
# response.each_varbind {|vb| puts vb.inspect}
|
|
85
|
+
# manager.close
|
|
86
|
+
#
|
|
87
|
+
# == Symbolic Object Names
|
|
88
|
+
#
|
|
89
|
+
# Symbolic names for SNMP object IDs can be used as parameters to the
|
|
90
|
+
# APIs in this class if the MIB modules are imported and the names of the
|
|
91
|
+
# MIBs are included in the MibModules configuration parameter.
|
|
92
|
+
#
|
|
93
|
+
# See MIB.varbind_list for a description of valid parameter formats.
|
|
94
|
+
#
|
|
95
|
+
# The following modules are loaded by default: "SNMPv2-SMI", "SNMPv2-MIB",
|
|
96
|
+
# "IF-MIB", "IP-MIB", "TCP-MIB", "UDP-MIB". All of the current IETF MIBs
|
|
97
|
+
# have been imported and are available for loading.
|
|
98
|
+
#
|
|
99
|
+
# Additional modules may be imported using the MIB class. The
|
|
100
|
+
# current implementation of the importing code requires that the
|
|
101
|
+
# external 'smidump' tool is available in your PATH. This tool can be
|
|
102
|
+
# obtained from the libsmi website at
|
|
103
|
+
# http://www.ibr.cs.tu-bs.de/projects/libsmi/ .
|
|
104
|
+
#
|
|
105
|
+
# == Example
|
|
106
|
+
#
|
|
107
|
+
# Do this once:
|
|
108
|
+
#
|
|
109
|
+
# SNMP::MIB.import_module(MY_MODULE_FILENAME, MIB_OUTPUT_DIR)
|
|
110
|
+
#
|
|
111
|
+
# Include your module in MibModules each time you create a Manager:
|
|
112
|
+
#
|
|
113
|
+
# SNMP::Manager.new(:host => 'localhost', :mib_dir => MIB_OUTPUT_DIR,
|
|
114
|
+
# :mib_modules => ["MY-MODULE-MIB", "SNMPv2-MIB", ...])
|
|
115
|
+
#
|
|
116
|
+
|
|
117
|
+
class Manager
|
|
118
|
+
|
|
119
|
+
class Config < Options
|
|
120
|
+
option :host, :Host, 'localhost'
|
|
121
|
+
option :port, :Port, 161
|
|
122
|
+
option :trap_port, :TrapPort, 162
|
|
123
|
+
option :community, :Community, 'public'
|
|
124
|
+
option :write_community, :WriteCommunity, lambda { |c| c.community }
|
|
125
|
+
option :version, :Version, :SNMPv2c
|
|
126
|
+
option :timeout, :Timeout, 1
|
|
127
|
+
option :retries, :Retries, 5
|
|
128
|
+
option :transport, :Transport, UDPTransport
|
|
129
|
+
option :max_recv_bytes, :MaxReceiveBytes, 8000
|
|
130
|
+
option :mib_dir, :MibDir, MIB::DEFAULT_MIB_PATH
|
|
131
|
+
option :mib_modules, :MibModules, default_modules
|
|
132
|
+
option :use_IPv6, :use_IPv6, lambda { |c| ipv6_address?(c) }
|
|
133
|
+
|
|
134
|
+
def create_transport
|
|
135
|
+
transport.respond_to?(:new) ? transport.new(socket_address_family) : transport
|
|
136
|
+
end
|
|
137
|
+
end
|
|
136
138
|
|
|
137
139
|
@@request_id = RequestId.new
|
|
138
|
-
|
|
140
|
+
|
|
139
141
|
##
|
|
140
142
|
# Retrieves the current configuration of this Manager.
|
|
141
143
|
#
|
|
142
144
|
attr_reader :config
|
|
143
|
-
|
|
145
|
+
|
|
144
146
|
##
|
|
145
147
|
# Retrieves the MIB for this Manager.
|
|
146
148
|
#
|
|
147
149
|
attr_reader :mib
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# Creates a Manager. The following are valid options and their default values.
|
|
153
|
+
#
|
|
154
|
+
# <b>Note: The upper-case options supported in previous versions of this library are
|
|
155
|
+
# deprecated, but still supported for now. Use at your own risk.</b>
|
|
156
|
+
#
|
|
157
|
+
# Option Default Value
|
|
158
|
+
# --------------------------------------
|
|
159
|
+
# :host 'localhost'
|
|
160
|
+
# :port 161
|
|
161
|
+
# :trap_port 162
|
|
162
|
+
# :community 'public'
|
|
163
|
+
# :write_community Same as :community
|
|
164
|
+
# :version :SNMPv2c
|
|
165
|
+
# :timeout 1 (timeout units are seconds)
|
|
166
|
+
# :retries 5
|
|
167
|
+
# :transport UDPTransport
|
|
168
|
+
# :max_recv_bytes 8000 bytes
|
|
169
|
+
# :mib_dir MIB::DEFAULT_MIB_PATH
|
|
170
|
+
# :mib_modules SNMPv2-SMI, SNMPv2-MIB, IF-MIB, IP-MIB, TCP-MIB, UDP-MIB
|
|
171
|
+
# :use_IPv6 false, unless :host is formatted like an IPv6 address
|
|
172
|
+
#
|
|
173
|
+
# Use {:version => :SNMPv1} for SNMP v1. SNMP v3 is not supported.
|
|
174
|
+
#
|
|
175
|
+
def initialize(options = {})
|
|
176
|
+
if block_given?
|
|
177
|
+
warn "SNMP::Manager.new() does not take block; use SNMP::Manager.open() instead"
|
|
178
|
+
end
|
|
179
|
+
config = Config.new(options)
|
|
180
|
+
@host = config.host
|
|
181
|
+
@port = config.port
|
|
182
|
+
@trap_port = config.trap_port
|
|
183
|
+
@community = config.community
|
|
184
|
+
@write_community = config.write_community
|
|
185
|
+
@snmp_version = config.version
|
|
186
|
+
@timeout = config.timeout
|
|
187
|
+
@retries = config.retries
|
|
188
|
+
@transport = config.create_transport
|
|
189
|
+
@max_bytes = config.max_recv_bytes
|
|
190
|
+
@mib = MIB.new
|
|
191
|
+
load_modules(config.mib_modules, config.mib_dir)
|
|
192
|
+
@config = config.applied_config
|
|
193
|
+
end
|
|
194
|
+
|
|
170
195
|
##
|
|
171
196
|
# Creates a Manager but also takes an optional block and automatically
|
|
172
197
|
# closes the transport connection used by this manager after the block
|
|
173
198
|
# completes.
|
|
174
199
|
#
|
|
175
200
|
def self.open(config = {})
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
end
|
|
201
|
+
manager = Manager.new(config)
|
|
202
|
+
if block_given?
|
|
203
|
+
begin
|
|
204
|
+
yield manager
|
|
205
|
+
ensure
|
|
206
|
+
manager.close
|
|
183
207
|
end
|
|
208
|
+
end
|
|
184
209
|
end
|
|
185
|
-
|
|
210
|
+
|
|
186
211
|
##
|
|
187
212
|
# Close the transport connection for this manager.
|
|
188
213
|
#
|
|
189
214
|
def close
|
|
190
|
-
|
|
215
|
+
@transport.close
|
|
191
216
|
end
|
|
192
|
-
|
|
217
|
+
|
|
193
218
|
def load_module(name)
|
|
194
|
-
|
|
219
|
+
@mib.load_module(name)
|
|
195
220
|
end
|
|
196
|
-
|
|
221
|
+
|
|
197
222
|
##
|
|
198
223
|
# Sends a get request for the supplied list of ObjectId or VarBind
|
|
199
224
|
# objects.
|
|
@@ -201,9 +226,9 @@ class Manager
|
|
|
201
226
|
# Returns a Response PDU with the results of the request.
|
|
202
227
|
#
|
|
203
228
|
def get(object_list)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
229
|
+
varbind_list = @mib.varbind_list(object_list, :NullValue)
|
|
230
|
+
request = GetRequest.new(@@request_id.next, varbind_list)
|
|
231
|
+
try_request(request)
|
|
207
232
|
end
|
|
208
233
|
|
|
209
234
|
##
|
|
@@ -216,18 +241,18 @@ class Manager
|
|
|
216
241
|
#
|
|
217
242
|
# For example:
|
|
218
243
|
#
|
|
219
|
-
# SNMP::Manager.open(:
|
|
244
|
+
# SNMP::Manager.open(:host => "localhost") do |manager|
|
|
220
245
|
# puts manager.get_value("sysDescr.0")
|
|
221
246
|
# end
|
|
222
247
|
#
|
|
223
248
|
def get_value(object_list)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
249
|
+
if object_list.respond_to? :to_ary
|
|
250
|
+
get(object_list).vb_list.collect { |vb| vb.value }
|
|
251
|
+
else
|
|
252
|
+
get(object_list).vb_list.first.value
|
|
253
|
+
end
|
|
229
254
|
end
|
|
230
|
-
|
|
255
|
+
|
|
231
256
|
##
|
|
232
257
|
# Sends a get-next request for the supplied list of ObjectId or VarBind
|
|
233
258
|
# objects.
|
|
@@ -235,11 +260,11 @@ class Manager
|
|
|
235
260
|
# Returns a Response PDU with the results of the request.
|
|
236
261
|
#
|
|
237
262
|
def get_next(object_list)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
263
|
+
varbind_list = @mib.varbind_list(object_list, :NullValue)
|
|
264
|
+
request = GetNextRequest.new(@@request_id.next, varbind_list)
|
|
265
|
+
try_request(request)
|
|
241
266
|
end
|
|
242
|
-
|
|
267
|
+
|
|
243
268
|
##
|
|
244
269
|
# Sends a get-bulk request. The non_repeaters parameter specifies
|
|
245
270
|
# the number of objects in the object_list to be retrieved once. The
|
|
@@ -247,24 +272,24 @@ class Manager
|
|
|
247
272
|
# times specified by max_repetitions.
|
|
248
273
|
#
|
|
249
274
|
def get_bulk(non_repeaters, max_repetitions, object_list)
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
end
|
|
258
|
-
|
|
275
|
+
varbind_list = @mib.varbind_list(object_list, :NullValue)
|
|
276
|
+
request = GetBulkRequest.new(
|
|
277
|
+
@@request_id.next,
|
|
278
|
+
varbind_list,
|
|
279
|
+
non_repeaters,
|
|
280
|
+
max_repetitions)
|
|
281
|
+
try_request(request)
|
|
282
|
+
end
|
|
283
|
+
|
|
259
284
|
##
|
|
260
285
|
# Sends a set request using the supplied list of VarBind objects.
|
|
261
286
|
#
|
|
262
287
|
# Returns a Response PDU with the results of the request.
|
|
263
288
|
#
|
|
264
289
|
def set(object_list)
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
290
|
+
varbind_list = @mib.varbind_list(object_list, :KeepValue)
|
|
291
|
+
request = SetRequest.new(@@request_id.next, varbind_list)
|
|
292
|
+
try_request(request, @write_community)
|
|
268
293
|
end
|
|
269
294
|
|
|
270
295
|
##
|
|
@@ -278,7 +303,7 @@ class Manager
|
|
|
278
303
|
#
|
|
279
304
|
# generic_trap: The generic trap identifier. One of :coldStart,
|
|
280
305
|
# :warmStart, :linkDown, :linkUp, :authenticationFailure,
|
|
281
|
-
# :egpNeighborLoss, or :enterpriseSpecific
|
|
306
|
+
# :egpNeighborLoss, or :enterpriseSpecific
|
|
282
307
|
#
|
|
283
308
|
# specific_trap: An integer representing the specific trap type for
|
|
284
309
|
# an enterprise-specific trap.
|
|
@@ -286,7 +311,7 @@ class Manager
|
|
|
286
311
|
# timestamp: An integer respresenting the number of hundredths of
|
|
287
312
|
# a second that this system has been up.
|
|
288
313
|
#
|
|
289
|
-
# object_list: A list of additional varbinds to send with the trap.
|
|
314
|
+
# object_list: A list of additional varbinds to send with the trap.
|
|
290
315
|
#
|
|
291
316
|
# For example:
|
|
292
317
|
#
|
|
@@ -301,15 +326,15 @@ class Manager
|
|
|
301
326
|
# end
|
|
302
327
|
#
|
|
303
328
|
def trap_v1(enterprise, agent_addr, generic_trap, specific_trap, timestamp, object_list=[])
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
end
|
|
312
|
-
|
|
329
|
+
vb_list = @mib.varbind_list(object_list, :KeepValue)
|
|
330
|
+
ent_oid = @mib.oid(enterprise)
|
|
331
|
+
agent_ip = IpAddress.new(agent_addr)
|
|
332
|
+
specific_int = Integer(specific_trap)
|
|
333
|
+
ticks = TimeTicks.new(timestamp)
|
|
334
|
+
trap = SNMPv1_Trap.new(ent_oid, agent_ip, generic_trap, specific_int, ticks, vb_list)
|
|
335
|
+
send_request(trap, @community, @host, @trap_port)
|
|
336
|
+
end
|
|
337
|
+
|
|
313
338
|
##
|
|
314
339
|
# Sends an SNMPv2c style trap.
|
|
315
340
|
#
|
|
@@ -319,16 +344,16 @@ class Manager
|
|
|
319
344
|
# trap_oid: An ObjectId or String with the OID identifier for this
|
|
320
345
|
# trap.
|
|
321
346
|
#
|
|
322
|
-
# object_list: A list of additional varbinds to send with the trap.
|
|
347
|
+
# object_list: A list of additional varbinds to send with the trap.
|
|
323
348
|
#
|
|
324
349
|
def trap_v2(sys_up_time, trap_oid, object_list=[])
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
350
|
+
vb_list = create_trap_vb_list(sys_up_time, trap_oid, object_list)
|
|
351
|
+
trap = SNMPv2_Trap.new(@@request_id.next, vb_list)
|
|
352
|
+
send_request(trap, @community, @host, @trap_port)
|
|
328
353
|
end
|
|
329
|
-
|
|
354
|
+
|
|
330
355
|
##
|
|
331
|
-
# Sends an inform request using the supplied varbind list.
|
|
356
|
+
# Sends an inform request using the supplied varbind list.
|
|
332
357
|
#
|
|
333
358
|
# sys_up_time: An integer respresenting the number of hundredths of
|
|
334
359
|
# a second that this system has been up.
|
|
@@ -336,24 +361,24 @@ class Manager
|
|
|
336
361
|
# trap_oid: An ObjectId or String with the OID identifier for this
|
|
337
362
|
# inform request.
|
|
338
363
|
#
|
|
339
|
-
# object_list: A list of additional varbinds to send with the inform.
|
|
364
|
+
# object_list: A list of additional varbinds to send with the inform.
|
|
340
365
|
#
|
|
341
366
|
def inform(sys_up_time, trap_oid, object_list=[])
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
367
|
+
vb_list = create_trap_vb_list(sys_up_time, trap_oid, object_list)
|
|
368
|
+
request = InformRequest.new(@@request_id.next, vb_list)
|
|
369
|
+
try_request(request, @community, @host, @trap_port)
|
|
345
370
|
end
|
|
346
|
-
|
|
371
|
+
|
|
347
372
|
##
|
|
348
373
|
# Helper method for building VarBindList for trap and inform requests.
|
|
349
374
|
#
|
|
350
375
|
def create_trap_vb_list(sys_up_time, trap_oid, object_list)
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
376
|
+
vb_args = @mib.varbind_list(object_list, :KeepValue)
|
|
377
|
+
uptime_vb = VarBind.new(SNMP::SYS_UP_TIME_OID, TimeTicks.new(sys_up_time.to_int))
|
|
378
|
+
trap_vb = VarBind.new(SNMP::SNMP_TRAP_OID_OID, @mib.oid(trap_oid))
|
|
379
|
+
VarBindList.new([uptime_vb, trap_vb, *vb_args])
|
|
355
380
|
end
|
|
356
|
-
|
|
381
|
+
|
|
357
382
|
##
|
|
358
383
|
# Walks a list of ObjectId or VarBind objects using get_next until
|
|
359
384
|
# the response to the first OID in the list reaches the end of its
|
|
@@ -368,12 +393,12 @@ class Manager
|
|
|
368
393
|
#
|
|
369
394
|
# For example:
|
|
370
395
|
#
|
|
371
|
-
# SNMP::Manager.open(:
|
|
396
|
+
# SNMP::Manager.open(:host => "localhost") do |manager|
|
|
372
397
|
# manager.walk("ifTable") { |vb| puts vb }
|
|
373
398
|
# end
|
|
374
399
|
#
|
|
375
|
-
# SNMP::Manager.open(:
|
|
376
|
-
# manager.walk(["ifIndex", "ifDescr"]) do |index, descr|
|
|
400
|
+
# SNMP::Manager.open(:host => "localhost") do |manager|
|
|
401
|
+
# manager.walk(["ifIndex", "ifDescr"]) do |index, descr|
|
|
377
402
|
# puts "#{index.value} #{descr.value}"
|
|
378
403
|
# end
|
|
379
404
|
# end
|
|
@@ -386,36 +411,36 @@ class Manager
|
|
|
386
411
|
# Note: If you are getting back rows where all columns have a value of
|
|
387
412
|
# NoSuchInstance then your index column is probably missing one of the
|
|
388
413
|
# rows. Choose an index column that includes all indexes for the table.
|
|
389
|
-
#
|
|
414
|
+
#
|
|
390
415
|
def walk(object_list, index_column=0)
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
end
|
|
408
|
-
break unless stop_oid.subtree_of?(start_oid)
|
|
409
|
-
last_oid = stop_oid
|
|
410
|
-
if is_single_vb
|
|
411
|
-
yield index_vb
|
|
412
|
-
else
|
|
413
|
-
vb_list = validate_row(vb_list, start_list, index_column)
|
|
414
|
-
yield vb_list
|
|
415
|
-
end
|
|
416
|
+
raise ArgumentError, "expected a block to be given" unless block_given?
|
|
417
|
+
vb_list = @mib.varbind_list(object_list, :NullValue)
|
|
418
|
+
raise ArgumentError, "index_column is past end of varbind list" if index_column >= vb_list.length
|
|
419
|
+
is_single_vb = object_list.respond_to?(:to_str) ||
|
|
420
|
+
object_list.respond_to?(:to_varbind)
|
|
421
|
+
start_list = vb_list
|
|
422
|
+
start_oid = vb_list[index_column].name
|
|
423
|
+
last_oid = start_oid
|
|
424
|
+
loop do
|
|
425
|
+
vb_list = get_next(vb_list).vb_list
|
|
426
|
+
index_vb = vb_list[index_column]
|
|
427
|
+
break if EndOfMibView == index_vb.value
|
|
428
|
+
stop_oid = index_vb.name
|
|
429
|
+
if stop_oid <= last_oid
|
|
430
|
+
warn "OIDs are not increasing, #{last_oid} followed by #{stop_oid}"
|
|
431
|
+
break
|
|
416
432
|
end
|
|
433
|
+
break unless stop_oid.subtree_of?(start_oid)
|
|
434
|
+
last_oid = stop_oid
|
|
435
|
+
if is_single_vb
|
|
436
|
+
yield index_vb
|
|
437
|
+
else
|
|
438
|
+
vb_list = validate_row(vb_list, start_list, index_column)
|
|
439
|
+
yield vb_list
|
|
440
|
+
end
|
|
441
|
+
end
|
|
417
442
|
end
|
|
418
|
-
|
|
443
|
+
|
|
419
444
|
##
|
|
420
445
|
# Helper method for walk. Checks all of the VarBinds in vb_list to
|
|
421
446
|
# make sure that the row indices match. If the row index does not
|
|
@@ -423,123 +448,135 @@ class Manager
|
|
|
423
448
|
# with a value of NoSuchInstance.
|
|
424
449
|
#
|
|
425
450
|
def validate_row(vb_list, start_list, index_column)
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
end
|
|
451
|
+
start_vb = start_list[index_column]
|
|
452
|
+
index_vb = vb_list[index_column]
|
|
453
|
+
row_index = index_vb.name.index(start_vb.name)
|
|
454
|
+
vb_list.each_index do |i|
|
|
455
|
+
if i != index_column
|
|
456
|
+
expected_oid = start_list[i].name + row_index
|
|
457
|
+
if vb_list[i].name != expected_oid
|
|
458
|
+
vb_list[i] = VarBind.new(expected_oid, NoSuchInstance)
|
|
459
|
+
end
|
|
436
460
|
end
|
|
437
|
-
|
|
461
|
+
end
|
|
462
|
+
vb_list
|
|
438
463
|
end
|
|
439
464
|
private :validate_row
|
|
440
|
-
|
|
465
|
+
|
|
441
466
|
##
|
|
442
467
|
# Set the next request-id instead of letting it be generated
|
|
443
468
|
# automatically. This method is useful for testing and debugging.
|
|
444
469
|
#
|
|
445
470
|
def next_request_id=(request_id)
|
|
446
|
-
|
|
471
|
+
@@request_id.force_next(request_id)
|
|
447
472
|
end
|
|
448
|
-
|
|
473
|
+
|
|
449
474
|
private
|
|
450
475
|
|
|
451
|
-
|
|
476
|
+
def warn(message)
|
|
452
477
|
trace = caller(2)
|
|
453
478
|
location = trace[0].sub(/:in.*/,'')
|
|
454
479
|
Kernel::warn "#{location}: warning: #{message}"
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def load_modules(module_list, mib_dir)
|
|
458
483
|
module_list.each { |m| @mib.load_module(m, mib_dir) }
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
def try_request(request, community=@community, host=@host, port=@port)
|
|
462
487
|
(@retries + 1).times do |n|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
end
|
|
468
|
-
rescue Timeout::Error
|
|
469
|
-
# no action - try again
|
|
470
|
-
rescue => e
|
|
471
|
-
warn e.to_s
|
|
488
|
+
send_request(request, community, host, port)
|
|
489
|
+
begin
|
|
490
|
+
Timeout.timeout(@timeout) do
|
|
491
|
+
return get_response(request)
|
|
472
492
|
end
|
|
493
|
+
rescue Timeout::Error
|
|
494
|
+
# no action - try again
|
|
495
|
+
rescue => e
|
|
496
|
+
warn e.to_s
|
|
497
|
+
end
|
|
473
498
|
end
|
|
474
|
-
raise RequestTimeout, "host #{
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
499
|
+
raise RequestTimeout, "host #{config[:host]} not responding", caller
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
def send_request(request, community, host, port)
|
|
478
503
|
message = Message.new(@snmp_version, community, request)
|
|
479
504
|
@transport.send(message.encode, host, port)
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
##
|
|
508
|
+
# Wait until response arrives. Ignore responses with mismatched IDs;
|
|
509
|
+
# these responses are typically from previous requests that timed out
|
|
510
|
+
# or almost timed out.
|
|
511
|
+
#
|
|
512
|
+
def get_response(request)
|
|
488
513
|
begin
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
514
|
+
data = @transport.recv(@max_bytes)
|
|
515
|
+
message = Message.decode(data)
|
|
516
|
+
response = message.pdu
|
|
492
517
|
end until request.request_id == response.request_id
|
|
493
518
|
response
|
|
494
|
-
|
|
495
|
-
end
|
|
519
|
+
end
|
|
520
|
+
end
|
|
496
521
|
|
|
497
|
-
class UDPServerTransport
|
|
498
|
-
def initialize(host, port)
|
|
499
|
-
|
|
500
|
-
|
|
522
|
+
class UDPServerTransport
|
|
523
|
+
def initialize(host, port, address_family)
|
|
524
|
+
@socket = UDPSocket.open(address_family)
|
|
525
|
+
@socket.bind(host, port)
|
|
501
526
|
end
|
|
502
|
-
|
|
527
|
+
|
|
503
528
|
def close
|
|
504
|
-
|
|
529
|
+
@socket.close
|
|
505
530
|
end
|
|
506
531
|
|
|
507
532
|
def send(data, host, port)
|
|
508
|
-
|
|
533
|
+
@socket.send(data, 0, host, port)
|
|
509
534
|
end
|
|
510
|
-
|
|
535
|
+
|
|
511
536
|
def recvfrom(max_bytes)
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
537
|
+
data, host_info = @socket.recvfrom(max_bytes)
|
|
538
|
+
flags, host_port, host_name, host_ip = host_info
|
|
539
|
+
return data, host_ip, host_port
|
|
515
540
|
end
|
|
516
|
-
end
|
|
541
|
+
end
|
|
517
542
|
|
|
518
|
-
##
|
|
519
|
-
# == SNMP Trap Listener
|
|
520
|
-
#
|
|
521
|
-
# Listens to a socket and processes received traps and informs in a separate
|
|
522
|
-
# thread.
|
|
523
|
-
#
|
|
524
|
-
# === Example
|
|
525
|
-
#
|
|
526
|
-
# require 'snmp'
|
|
527
|
-
#
|
|
528
|
-
# m = SNMP::TrapListener.new(:Port => 1062, :Community => 'public') do |manager|
|
|
529
|
-
# manager.on_trap_default { |trap| p trap }
|
|
530
|
-
# end
|
|
531
|
-
# m.join
|
|
532
|
-
#
|
|
533
|
-
class TrapListener
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
543
|
+
##
|
|
544
|
+
# == SNMP Trap Listener
|
|
545
|
+
#
|
|
546
|
+
# Listens to a socket and processes received traps and informs in a separate
|
|
547
|
+
# thread.
|
|
548
|
+
#
|
|
549
|
+
# === Example
|
|
550
|
+
#
|
|
551
|
+
# require 'snmp'
|
|
552
|
+
#
|
|
553
|
+
# m = SNMP::TrapListener.new(:Port => 1062, :Community => 'public') do |manager|
|
|
554
|
+
# manager.on_trap_default { |trap| p trap }
|
|
555
|
+
# end
|
|
556
|
+
# m.join
|
|
557
|
+
#
|
|
558
|
+
class TrapListener
|
|
559
|
+
class Config < Options
|
|
560
|
+
option :host, :Host, 'localhost'
|
|
561
|
+
option :port, :Port, 162
|
|
562
|
+
option :community, :Community, 'public'
|
|
563
|
+
option :server_transport, :ServerTransport, UDPServerTransport
|
|
564
|
+
option :max_recv_bytes, :MaxReceiveBytes, 8000
|
|
565
|
+
option :use_IPv6, :use_IPv6, false
|
|
566
|
+
|
|
567
|
+
def create_transport
|
|
568
|
+
server_transport.respond_to?(:new) ?
|
|
569
|
+
server_transport.new(host, port, socket_address_family) : server_transport
|
|
570
|
+
end
|
|
571
|
+
end
|
|
540
572
|
|
|
541
573
|
NULL_HANDLER = Proc.new {}
|
|
542
|
-
|
|
574
|
+
|
|
575
|
+
##
|
|
576
|
+
# Retrieves the current configuration of this TrapListener.
|
|
577
|
+
#
|
|
578
|
+
attr_reader :config
|
|
579
|
+
|
|
543
580
|
##
|
|
544
581
|
# Start a trap handler thread. If a block is provided then the block
|
|
545
582
|
# is executed before trap handling begins. This block is typically used
|
|
@@ -554,37 +591,40 @@ class TrapListener
|
|
|
554
591
|
# 2. handler for a specific SNMP version
|
|
555
592
|
# 3. default handler
|
|
556
593
|
#
|
|
557
|
-
def initialize(
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
594
|
+
def initialize(options={}, &block)
|
|
595
|
+
config = Config.new(options)
|
|
596
|
+
@transport = config.create_transport
|
|
597
|
+
@community = config.community
|
|
598
|
+
@max_bytes = config.max_recv_bytes
|
|
599
|
+
@config = config.applied_config
|
|
600
|
+
|
|
601
|
+
@handler_init = block
|
|
602
|
+
@oid_handler = {}
|
|
603
|
+
@v1_handler = nil
|
|
604
|
+
@v2c_handler = nil
|
|
605
|
+
@default_handler = nil
|
|
606
|
+
@lock = Mutex.new
|
|
607
|
+
@handler_thread = Thread.new(self) { |m| process_traps(m) }
|
|
608
|
+
end
|
|
609
|
+
|
|
570
610
|
##
|
|
571
611
|
# Define the default trap handler. The default trap handler block is
|
|
572
612
|
# executed only if no other block is applicable. This handler should
|
|
573
613
|
# expect to receive both SNMPv1_Trap and SNMPv2_Trap objects.
|
|
574
614
|
#
|
|
575
615
|
def on_trap_default(&block)
|
|
576
|
-
|
|
577
|
-
|
|
616
|
+
raise ArgumentError, "a block must be provided" unless block
|
|
617
|
+
@lock.synchronize { @default_handler = block }
|
|
578
618
|
end
|
|
579
|
-
|
|
619
|
+
|
|
580
620
|
##
|
|
581
621
|
# Define a trap handler block for a specific trap ObjectId. This handler
|
|
582
622
|
# only applies to SNMPv2 traps. Note that symbolic OIDs are not
|
|
583
623
|
# supported by this method (like in the SNMP.Manager class).
|
|
584
624
|
#
|
|
585
625
|
def on_trap(object_id, &block)
|
|
586
|
-
|
|
587
|
-
|
|
626
|
+
raise ArgumentError, "a block must be provided" unless block
|
|
627
|
+
@lock.synchronize { @oid_handler[ObjectId.new(object_id)] = block }
|
|
588
628
|
end
|
|
589
629
|
|
|
590
630
|
##
|
|
@@ -592,10 +632,10 @@ class TrapListener
|
|
|
592
632
|
# to the block will always be an SNMPv1_Trap.
|
|
593
633
|
#
|
|
594
634
|
def on_trap_v1(&block)
|
|
595
|
-
|
|
596
|
-
|
|
635
|
+
raise ArgumentError, "a block must be provided" unless block
|
|
636
|
+
@lock.synchronize { @v1_handler = block }
|
|
597
637
|
end
|
|
598
|
-
|
|
638
|
+
|
|
599
639
|
##
|
|
600
640
|
# Define a trap handler block for all SNMPv2c traps. The trap yielded
|
|
601
641
|
# to the block will always be an SNMPv2_Trap. Note that InformRequest
|
|
@@ -603,83 +643,83 @@ class TrapListener
|
|
|
603
643
|
# this handler.
|
|
604
644
|
#
|
|
605
645
|
def on_trap_v2c(&block)
|
|
606
|
-
|
|
607
|
-
|
|
646
|
+
raise ArgumentError, "a block must be provided" unless block
|
|
647
|
+
@lock.synchronize { @v2c_handler = block }
|
|
608
648
|
end
|
|
609
|
-
|
|
649
|
+
|
|
610
650
|
##
|
|
611
651
|
# Joins the current thread to the trap handler thread.
|
|
612
652
|
#
|
|
613
653
|
# See also Thread#join.
|
|
614
654
|
#
|
|
615
655
|
def join
|
|
616
|
-
|
|
656
|
+
@handler_thread.join
|
|
617
657
|
end
|
|
618
|
-
|
|
658
|
+
|
|
619
659
|
##
|
|
620
660
|
# Stops the trap handler thread and releases the socket.
|
|
621
661
|
#
|
|
622
662
|
# See also Thread#exit.
|
|
623
663
|
#
|
|
624
664
|
def exit
|
|
625
|
-
|
|
626
|
-
|
|
665
|
+
@handler_thread.exit
|
|
666
|
+
@transport.close
|
|
627
667
|
end
|
|
628
|
-
|
|
668
|
+
|
|
629
669
|
alias kill exit
|
|
630
670
|
alias terminate exit
|
|
631
|
-
|
|
671
|
+
|
|
632
672
|
private
|
|
633
|
-
|
|
634
|
-
|
|
673
|
+
|
|
674
|
+
def process_traps(trap_listener)
|
|
635
675
|
@handler_init.call(trap_listener) if @handler_init
|
|
636
676
|
loop do
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
end
|
|
648
|
-
rescue => e
|
|
649
|
-
puts "Error handling trap: #{e}"
|
|
650
|
-
puts e.backtrace.join("\n")
|
|
651
|
-
puts "Received data:"
|
|
652
|
-
p data
|
|
677
|
+
data, source_ip, source_port = @transport.recvfrom(@max_bytes)
|
|
678
|
+
begin
|
|
679
|
+
message = Message.decode(data)
|
|
680
|
+
if @community == message.community
|
|
681
|
+
trap = message.pdu
|
|
682
|
+
if trap.kind_of?(InformRequest)
|
|
683
|
+
@transport.send(message.response.encode, source_ip, source_port)
|
|
684
|
+
end
|
|
685
|
+
trap.source_ip = source_ip
|
|
686
|
+
select_handler(trap).call(trap)
|
|
653
687
|
end
|
|
688
|
+
rescue => e
|
|
689
|
+
puts "Error handling trap: #{e}"
|
|
690
|
+
puts e.backtrace.join("\n")
|
|
691
|
+
puts "Received data:"
|
|
692
|
+
p data
|
|
693
|
+
end
|
|
654
694
|
end
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
def select_handler(trap)
|
|
658
698
|
@lock.synchronize do
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
else
|
|
668
|
-
return NULL_HANDLER
|
|
669
|
-
end
|
|
670
|
-
elsif trap.kind_of?(SNMPv1_Trap)
|
|
671
|
-
if @v1_handler
|
|
672
|
-
return @v1_handler
|
|
673
|
-
elsif @default_handler
|
|
674
|
-
return @default_handler
|
|
675
|
-
else
|
|
676
|
-
return NULL_HANDLER
|
|
677
|
-
end
|
|
699
|
+
if trap.kind_of?(SNMPv2_Trap)
|
|
700
|
+
oid = trap.trap_oid
|
|
701
|
+
if @oid_handler[oid]
|
|
702
|
+
return @oid_handler[oid]
|
|
703
|
+
elsif @v2c_handler
|
|
704
|
+
return @v2c_handler
|
|
705
|
+
elsif @default_handler
|
|
706
|
+
return @default_handler
|
|
678
707
|
else
|
|
679
|
-
|
|
708
|
+
return NULL_HANDLER
|
|
680
709
|
end
|
|
710
|
+
elsif trap.kind_of?(SNMPv1_Trap)
|
|
711
|
+
if @v1_handler
|
|
712
|
+
return @v1_handler
|
|
713
|
+
elsif @default_handler
|
|
714
|
+
return @default_handler
|
|
715
|
+
else
|
|
716
|
+
return NULL_HANDLER
|
|
717
|
+
end
|
|
718
|
+
else
|
|
719
|
+
return NULL_HANDLER
|
|
720
|
+
end
|
|
681
721
|
end
|
|
682
|
-
|
|
683
|
-
end
|
|
722
|
+
end
|
|
723
|
+
end
|
|
684
724
|
|
|
685
725
|
end
|