snmp 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|