snmp 0.4.0

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.
Files changed (214) hide show
  1. data/README +193 -0
  2. data/Rakefile +52 -0
  3. data/data/ruby/snmp/mibs/ACCOUNTING-CONTROL-MIB.yaml +44 -0
  4. data/data/ruby/snmp/mibs/ADSL-LINE-EXT-MIB.yaml +66 -0
  5. data/data/ruby/snmp/mibs/ADSL-LINE-MIB.yaml +238 -0
  6. data/data/ruby/snmp/mibs/ADSL-TC-MIB.yaml +2 -0
  7. data/data/ruby/snmp/mibs/AGENTX-MIB.yaml +40 -0
  8. data/data/ruby/snmp/mibs/APM-MIB.yaml +98 -0
  9. data/data/ruby/snmp/mibs/APPC-MIB.yaml +295 -0
  10. data/data/ruby/snmp/mibs/APPLETALK-MIB.yaml +284 -0
  11. data/data/ruby/snmp/mibs/APPLICATION-MIB.yaml +161 -0
  12. data/data/ruby/snmp/mibs/APPN-DLUR-MIB.yaml +41 -0
  13. data/data/ruby/snmp/mibs/APPN-MIB.yaml +356 -0
  14. data/data/ruby/snmp/mibs/APPN-TRAP-MIB.yaml +8 -0
  15. data/data/ruby/snmp/mibs/APS-MIB.yaml +62 -0
  16. data/data/ruby/snmp/mibs/ATM-ACCOUNTING-INFORMATION-MIB.yaml +37 -0
  17. data/data/ruby/snmp/mibs/ATM-MIB.yaml +112 -0
  18. data/data/ruby/snmp/mibs/ATM-TC-MIB.yaml +19 -0
  19. data/data/ruby/snmp/mibs/ATM2-MIB.yaml +182 -0
  20. data/data/ruby/snmp/mibs/BGP4-MIB.yaml +56 -0
  21. data/data/ruby/snmp/mibs/BLDG-HVAC-MIB.yaml +35 -0
  22. data/data/ruby/snmp/mibs/BRIDGE-MIB.yaml +63 -0
  23. data/data/ruby/snmp/mibs/CHARACTER-MIB.yaml +48 -0
  24. data/data/ruby/snmp/mibs/CIRCUIT-IF-MIB.yaml +21 -0
  25. data/data/ruby/snmp/mibs/CLNS-MIB.yaml +116 -0
  26. data/data/ruby/snmp/mibs/COFFEE-POT-MIB.yaml +13 -0
  27. data/data/ruby/snmp/mibs/COPS-CLIENT-MIB.yaml +54 -0
  28. data/data/ruby/snmp/mibs/DECNET-PHIV-MIB.yaml +237 -0
  29. data/data/ruby/snmp/mibs/DIAL-CONTROL-MIB.yaml +84 -0
  30. data/data/ruby/snmp/mibs/DIFFSERV-CONFIG-MIB.yaml +15 -0
  31. data/data/ruby/snmp/mibs/DIFFSERV-DSCP-TC.yaml +2 -0
  32. data/data/ruby/snmp/mibs/DIFFSERV-MIB.yaml +171 -0
  33. data/data/ruby/snmp/mibs/DIRECTORY-SERVER-MIB.yaml +52 -0
  34. data/data/ruby/snmp/mibs/DISMAN-EVENT-MIB.yaml +110 -0
  35. data/data/ruby/snmp/mibs/DISMAN-EXPRESSION-MIB.yaml +55 -0
  36. data/data/ruby/snmp/mibs/DISMAN-NSLOOKUP-MIB.yaml +23 -0
  37. data/data/ruby/snmp/mibs/DISMAN-PING-MIB.yaml +57 -0
  38. data/data/ruby/snmp/mibs/DISMAN-SCHEDULE-MIB.yaml +32 -0
  39. data/data/ruby/snmp/mibs/DISMAN-SCRIPT-MIB.yaml +80 -0
  40. data/data/ruby/snmp/mibs/DISMAN-TRACEROUTE-MIB.yaml +72 -0
  41. data/data/ruby/snmp/mibs/DLSW-MIB.yaml +193 -0
  42. data/data/ruby/snmp/mibs/DNS-RESOLVER-MIB.yaml +87 -0
  43. data/data/ruby/snmp/mibs/DNS-SERVER-MIB.yaml +73 -0
  44. data/data/ruby/snmp/mibs/DOCS-BPI-MIB.yaml +101 -0
  45. data/data/ruby/snmp/mibs/DOCS-CABLE-DEVICE-MIB.yaml +107 -0
  46. data/data/ruby/snmp/mibs/DOCS-IF-MIB.yaml +143 -0
  47. data/data/ruby/snmp/mibs/DOT12-IF-MIB.yaml +33 -0
  48. data/data/ruby/snmp/mibs/DS0-MIB.yaml +18 -0
  49. data/data/ruby/snmp/mibs/DS0BUNDLE-MIB.yaml +17 -0
  50. data/data/ruby/snmp/mibs/DS1-MIB.yaml +118 -0
  51. data/data/ruby/snmp/mibs/DS3-MIB.yaml +106 -0
  52. data/data/ruby/snmp/mibs/DSA-MIB.yaml +44 -0
  53. data/data/ruby/snmp/mibs/DSMON-MIB.yaml +219 -0
  54. data/data/ruby/snmp/mibs/EBN-MIB.yaml +47 -0
  55. data/data/ruby/snmp/mibs/ENTITY-MIB.yaml +51 -0
  56. data/data/ruby/snmp/mibs/ENTITY-SENSOR-MIB.yaml +16 -0
  57. data/data/ruby/snmp/mibs/ETHER-CHIPSET-MIB.yaml +79 -0
  58. data/data/ruby/snmp/mibs/ETHER-WIS.yaml +28 -0
  59. data/data/ruby/snmp/mibs/EtherLike-MIB.yaml +58 -0
  60. data/data/ruby/snmp/mibs/FDDI-SMT73-MIB.yaml +128 -0
  61. data/data/ruby/snmp/mibs/FIBRE-CHANNEL-FE-MIB.yaml +122 -0
  62. data/data/ruby/snmp/mibs/FLOW-METER-MIB.yaml +112 -0
  63. data/data/ruby/snmp/mibs/FR-ATM-PVC-SERVICE-IWF-MIB.yaml +45 -0
  64. data/data/ruby/snmp/mibs/FR-MFR-MIB.yaml +52 -0
  65. data/data/ruby/snmp/mibs/FRAME-RELAY-DTE-MIB.yaml +54 -0
  66. data/data/ruby/snmp/mibs/FRNETSERV-MIB.yaml +109 -0
  67. data/data/ruby/snmp/mibs/FRSLD-MIB.yaml +82 -0
  68. data/data/ruby/snmp/mibs/Finisher-MIB.yaml +53 -0
  69. data/data/ruby/snmp/mibs/GSMP-MIB.yaml +82 -0
  70. data/data/ruby/snmp/mibs/HC-ALARM-MIB.yaml +32 -0
  71. data/data/ruby/snmp/mibs/HC-PerfHist-TC-MIB.yaml +2 -0
  72. data/data/ruby/snmp/mibs/HC-RMON-MIB.yaml +193 -0
  73. data/data/ruby/snmp/mibs/HCNUM-TC.yaml +2 -0
  74. data/data/ruby/snmp/mibs/HDSL2-SHDSL-LINE-MIB.yaml +115 -0
  75. data/data/ruby/snmp/mibs/HOST-RESOURCES-MIB.yaml +98 -0
  76. data/data/ruby/snmp/mibs/HOST-RESOURCES-TYPES.yaml +56 -0
  77. data/data/ruby/snmp/mibs/HPR-IP-MIB.yaml +24 -0
  78. data/data/ruby/snmp/mibs/HPR-MIB.yaml +81 -0
  79. data/data/ruby/snmp/mibs/IF-INVERTED-STACK-MIB.yaml +9 -0
  80. data/data/ruby/snmp/mibs/IF-MIB.yaml +73 -0
  81. data/data/ruby/snmp/mibs/IGMP-STD-MIB.yaml +33 -0
  82. data/data/ruby/snmp/mibs/INET-ADDRESS-MIB.yaml +2 -0
  83. data/data/ruby/snmp/mibs/INTEGRATED-SERVICES-GUARANTEED-MIB.yaml +13 -0
  84. data/data/ruby/snmp/mibs/INTEGRATED-SERVICES-MIB.yaml +44 -0
  85. data/data/ruby/snmp/mibs/INTERFACETOPN-MIB.yaml +29 -0
  86. data/data/ruby/snmp/mibs/IP-FORWARD-MIB.yaml +42 -0
  87. data/data/ruby/snmp/mibs/IP-MIB.yaml +66 -0
  88. data/data/ruby/snmp/mibs/IPATM-IPMC-MIB.yaml +203 -0
  89. data/data/ruby/snmp/mibs/IPMROUTE-STD-MIB.yaml +64 -0
  90. data/data/ruby/snmp/mibs/IPOA-MIB.yaml +85 -0
  91. data/data/ruby/snmp/mibs/IPV6-FLOW-LABEL-MIB.yaml +2 -0
  92. data/data/ruby/snmp/mibs/IPV6-ICMP-MIB.yaml +42 -0
  93. data/data/ruby/snmp/mibs/IPV6-MIB.yaml +88 -0
  94. data/data/ruby/snmp/mibs/IPV6-MLD-MIB.yaml +30 -0
  95. data/data/ruby/snmp/mibs/IPV6-TCP-MIB.yaml +14 -0
  96. data/data/ruby/snmp/mibs/IPV6-UDP-MIB.yaml +11 -0
  97. data/data/ruby/snmp/mibs/ISDN-MIB.yaml +71 -0
  98. data/data/ruby/snmp/mibs/Job-Monitoring-MIB.yaml +43 -0
  99. data/data/ruby/snmp/mibs/L2TP-MIB.yaml +156 -0
  100. data/data/ruby/snmp/mibs/MALLOC-MIB.yaml +83 -0
  101. data/data/ruby/snmp/mibs/MAU-MIB.yaml +110 -0
  102. data/data/ruby/snmp/mibs/MIOX25-MIB.yaml +38 -0
  103. data/data/ruby/snmp/mibs/MIP-MIB.yaml +180 -0
  104. data/data/ruby/snmp/mibs/MPLS-FTN-STD-MIB.yaml +44 -0
  105. data/data/ruby/snmp/mibs/MPLS-LDP-ATM-STD-MIB.yaml +35 -0
  106. data/data/ruby/snmp/mibs/MPLS-LDP-FRAME-RELAY-STD-MIB.yaml +28 -0
  107. data/data/ruby/snmp/mibs/MPLS-LDP-GENERIC-STD-MIB.yaml +15 -0
  108. data/data/ruby/snmp/mibs/MPLS-LDP-STD-MIB.yaml +118 -0
  109. data/data/ruby/snmp/mibs/MPLS-LSR-STD-MIB.yaml +98 -0
  110. data/data/ruby/snmp/mibs/MPLS-TC-STD-MIB.yaml +3 -0
  111. data/data/ruby/snmp/mibs/MPLS-TE-STD-MIB.yaml +120 -0
  112. data/data/ruby/snmp/mibs/MTA-MIB.yaml +64 -0
  113. data/data/ruby/snmp/mibs/Modem-MIB.yaml +106 -0
  114. data/data/ruby/snmp/mibs/NETWORK-SERVICES-MIB.yaml +33 -0
  115. data/data/ruby/snmp/mibs/NHRP-MIB.yaml +163 -0
  116. data/data/ruby/snmp/mibs/NOTIFICATION-LOG-MIB.yaml +51 -0
  117. data/data/ruby/snmp/mibs/OPT-IF-MIB.yaml +431 -0
  118. data/data/ruby/snmp/mibs/OSPF-MIB.yaml +150 -0
  119. data/data/ruby/snmp/mibs/OSPF-TRAP-MIB.yaml +11 -0
  120. data/data/ruby/snmp/mibs/P-BRIDGE-MIB.yaml +51 -0
  121. data/data/ruby/snmp/mibs/PARALLEL-MIB.yaml +24 -0
  122. data/data/ruby/snmp/mibs/PIM-MIB.yaml +66 -0
  123. data/data/ruby/snmp/mibs/PINT-MIB.yaml +51 -0
  124. data/data/ruby/snmp/mibs/POWER-ETHERNET-MIB.yaml +36 -0
  125. data/data/ruby/snmp/mibs/PPP-BRIDGE-NCP-MIB.yaml +25 -0
  126. data/data/ruby/snmp/mibs/PPP-IP-NCP-MIB.yaml +13 -0
  127. data/data/ruby/snmp/mibs/PPP-LCP-MIB.yaml +47 -0
  128. data/data/ruby/snmp/mibs/PPP-SEC-MIB.yaml +20 -0
  129. data/data/ruby/snmp/mibs/PTOPO-MIB.yaml +39 -0
  130. data/data/ruby/snmp/mibs/PerfHist-TC-MIB.yaml +2 -0
  131. data/data/ruby/snmp/mibs/Printer-MIB.yaml +209 -0
  132. data/data/ruby/snmp/mibs/Q-BRIDGE-MIB.yaml +99 -0
  133. data/data/ruby/snmp/mibs/RADIUS-ACC-CLIENT-MIB.yaml +26 -0
  134. data/data/ruby/snmp/mibs/RADIUS-ACC-SERVER-MIB.yaml +35 -0
  135. data/data/ruby/snmp/mibs/RADIUS-AUTH-CLIENT-MIB.yaml +28 -0
  136. data/data/ruby/snmp/mibs/RADIUS-AUTH-SERVER-MIB.yaml +37 -0
  137. data/data/ruby/snmp/mibs/RDBMS-MIB.yaml +82 -0
  138. data/data/ruby/snmp/mibs/RFC1065-SMI.yaml +9 -0
  139. data/data/ruby/snmp/mibs/RFC1155-SMI.yaml +9 -0
  140. data/data/ruby/snmp/mibs/RFC1158-MIB.yaml +202 -0
  141. data/data/ruby/snmp/mibs/RFC1213-MIB.yaml +202 -0
  142. data/data/ruby/snmp/mibs/RFC1269-MIB.yaml +29 -0
  143. data/data/ruby/snmp/mibs/RFC1271-MIB.yaml +214 -0
  144. data/data/ruby/snmp/mibs/RFC1285-MIB.yaml +104 -0
  145. data/data/ruby/snmp/mibs/RFC1316-MIB.yaml +42 -0
  146. data/data/ruby/snmp/mibs/RFC1381-MIB.yaml +60 -0
  147. data/data/ruby/snmp/mibs/RFC1382-MIB.yaml +169 -0
  148. data/data/ruby/snmp/mibs/RFC1414-MIB.yaml +10 -0
  149. data/data/ruby/snmp/mibs/RIPv2-MIB.yaml +34 -0
  150. data/data/ruby/snmp/mibs/RMON-MIB.yaml +219 -0
  151. data/data/ruby/snmp/mibs/RMON2-MIB.yaml +282 -0
  152. data/data/ruby/snmp/mibs/ROHC-MIB.yaml +64 -0
  153. data/data/ruby/snmp/mibs/ROHC-RTP-MIB.yaml +29 -0
  154. data/data/ruby/snmp/mibs/ROHC-UNCOMPRESSED-MIB.yaml +11 -0
  155. data/data/ruby/snmp/mibs/RS-232-MIB.yaml +54 -0
  156. data/data/ruby/snmp/mibs/RSVP-MIB.yaml +156 -0
  157. data/data/ruby/snmp/mibs/RTP-MIB.yaml +57 -0
  158. data/data/ruby/snmp/mibs/SFLOW-MIB.yaml +22 -0
  159. data/data/ruby/snmp/mibs/SIP-MIB.yaml +70 -0
  160. data/data/ruby/snmp/mibs/SLAPM-MIB.yaml +144 -0
  161. data/data/ruby/snmp/mibs/SMON-MIB.yaml +63 -0
  162. data/data/ruby/snmp/mibs/SNA-NAU-MIB.yaml +137 -0
  163. data/data/ruby/snmp/mibs/SNA-SDLC-MIB.yaml +147 -0
  164. data/data/ruby/snmp/mibs/SNMP-COMMUNITY-MIB.yaml +22 -0
  165. data/data/ruby/snmp/mibs/SNMP-FRAMEWORK-MIB.yaml +14 -0
  166. data/data/ruby/snmp/mibs/SNMP-MPD-MIB.yaml +11 -0
  167. data/data/ruby/snmp/mibs/SNMP-NOTIFICATION-MIB.yaml +25 -0
  168. data/data/ruby/snmp/mibs/SNMP-PROXY-MIB.yaml +17 -0
  169. data/data/ruby/snmp/mibs/SNMP-REPEATER-MIB.yaml +135 -0
  170. data/data/ruby/snmp/mibs/SNMP-TARGET-MIB.yaml +29 -0
  171. data/data/ruby/snmp/mibs/SNMP-USER-BASED-SM-MIB.yaml +35 -0
  172. data/data/ruby/snmp/mibs/SNMP-USM-DH-OBJECTS-MIB.yaml +21 -0
  173. data/data/ruby/snmp/mibs/SNMP-VIEW-BASED-ACM-MIB.yaml +37 -0
  174. data/data/ruby/snmp/mibs/SNMPv2-MIB.yaml +58 -0
  175. data/data/ruby/snmp/mibs/SNMPv2-SMI.yaml +17 -0
  176. data/data/ruby/snmp/mibs/SNMPv2-TM.yaml +9 -0
  177. data/data/ruby/snmp/mibs/SNMPv2-USEC-MIB.yaml +19 -0
  178. data/data/ruby/snmp/mibs/SONET-MIB.yaml +131 -0
  179. data/data/ruby/snmp/mibs/SOURCE-ROUTING-MIB.yaml +30 -0
  180. data/data/ruby/snmp/mibs/SYSAPPL-MIB.yaml +81 -0
  181. data/data/ruby/snmp/mibs/TCP-MIB.yaml +27 -0
  182. data/data/ruby/snmp/mibs/TCPIPX-MIB.yaml +24 -0
  183. data/data/ruby/snmp/mibs/TN3270E-MIB.yaml +105 -0
  184. data/data/ruby/snmp/mibs/TN3270E-RT-MIB.yaml +43 -0
  185. data/data/ruby/snmp/mibs/TOKEN-RING-RMON-MIB.yaml +183 -0
  186. data/data/ruby/snmp/mibs/TOKENRING-MIB.yaml +58 -0
  187. data/data/ruby/snmp/mibs/TOKENRING-STATION-SR-MIB.yaml +12 -0
  188. data/data/ruby/snmp/mibs/TRANSPORT-ADDRESS-MIB.yaml +19 -0
  189. data/data/ruby/snmp/mibs/TUNNEL-MIB.yaml +23 -0
  190. data/data/ruby/snmp/mibs/UDP-MIB.yaml +14 -0
  191. data/data/ruby/snmp/mibs/UPS-MIB.yaml +117 -0
  192. data/data/ruby/snmp/mibs/VDSL-LINE-MIB.yaml +173 -0
  193. data/data/ruby/snmp/mibs/VRRP-MIB.yaml +50 -0
  194. data/data/ruby/snmp/mibs/WWW-MIB.yaml +91 -0
  195. data/examples/dump.rb +15 -0
  196. data/examples/get.rb +7 -0
  197. data/examples/iftable.rb +14 -0
  198. data/examples/log_traps.rb +23 -0
  199. data/examples/set.rb +8 -0
  200. data/examples/walk.rb +9 -0
  201. data/lib/snmp.rb +10 -0
  202. data/lib/snmp/agent.rb +74 -0
  203. data/lib/snmp/ber.rb +332 -0
  204. data/lib/snmp/manager.rb +502 -0
  205. data/lib/snmp/mib.rb +259 -0
  206. data/lib/snmp/pdu.rb +363 -0
  207. data/lib/snmp/varbind.rb +520 -0
  208. data/setup.rb +1360 -0
  209. data/test/test_ber.rb +236 -0
  210. data/test/test_manager.rb +192 -0
  211. data/test/test_mib.rb +66 -0
  212. data/test/test_pdu.rb +184 -0
  213. data/test/test_varbind.rb +270 -0
  214. metadata +251 -0
@@ -0,0 +1,520 @@
1
+ #
2
+ # Copyright (c) 2004 David R. Halliday
3
+ # All rights reserved.
4
+ #
5
+ # This SNMP library is free software. Redistribution is permitted under the
6
+ # same terms and conditions as the standard Ruby distribution. See the
7
+ # COPYING file in the Ruby distribution for details.
8
+ #
9
+
10
+ require 'snmp/ber'
11
+
12
+ include SNMP::BER
13
+
14
+ module SNMP
15
+
16
+ class UnsupportedValueTag < RuntimeError; end
17
+ class InvalidIpAddress < ArgumentError; end
18
+
19
+ class VarBindList < Array
20
+ def self.decode(data)
21
+ list = VarBindList.new
22
+ varbind_data, remainder = decode_sequence(data)
23
+ while varbind_data != ""
24
+ varbind, varbind_data = VarBind.decode(varbind_data)
25
+ list << varbind
26
+ end
27
+ return list, remainder
28
+ end
29
+
30
+ def initialize(varbind_list=[])
31
+ super()
32
+ varbind_list.each do |item|
33
+ if item.respond_to? :to_str
34
+ self << ObjectId.new(item.to_str).to_varbind
35
+ else
36
+ self << item.to_varbind
37
+ end
38
+ end
39
+ end
40
+
41
+ def asn1_type
42
+ "VarBindList"
43
+ end
44
+
45
+ def encode
46
+ varbind_data = ""
47
+ self.each do |varbind|
48
+ varbind_data << varbind.encode
49
+ end
50
+ encode_sequence(varbind_data)
51
+ end
52
+ end
53
+
54
+ class Integer
55
+ include Comparable
56
+
57
+ def self.decode(value_data)
58
+ Integer.new(decode_integer_value(value_data))
59
+ end
60
+
61
+ def asn1_type
62
+ "INTEGER"
63
+ end
64
+
65
+ def initialize(value)
66
+ @value = value.to_i
67
+ end
68
+
69
+ def <=>(other)
70
+ @value <=> other.to_i
71
+ end
72
+
73
+ def coerce(other)
74
+ if other.kind_of? Fixnum
75
+ return [other, @value]
76
+ else
77
+ return [other.to_f, self.to_f]
78
+ end
79
+ end
80
+
81
+ def to_s
82
+ @value.to_s
83
+ end
84
+
85
+ def to_i
86
+ @value
87
+ end
88
+
89
+ def to_f
90
+ @value.to_f
91
+ end
92
+
93
+ def encode
94
+ encode_integer(@value)
95
+ end
96
+ end
97
+
98
+ class Integer32 < Integer
99
+ def initialize(value)
100
+ super(value)
101
+ raise ArgumentError, "Out of range: #{value}" if value < -2147483648
102
+ raise ArgumentError, "Out of range: #{value}" if value > 2147483647
103
+ end
104
+ end
105
+
106
+ class OctetString < String
107
+ def self.decode(value_data)
108
+ OctetString.new(value_data)
109
+ end
110
+
111
+ def asn1_type
112
+ "OCTET STRING"
113
+ end
114
+
115
+ def encode
116
+ encode_octet_string(self)
117
+ end
118
+ end
119
+
120
+ class ObjectId < Array
121
+ include Comparable
122
+
123
+ def self.decode(value_data)
124
+ ObjectId.new(decode_object_id_value(value_data))
125
+ end
126
+
127
+ def asn1_type
128
+ "OBJECT IDENTIFIER"
129
+ end
130
+
131
+ ##
132
+ # Create an object id. The input is expected to be either a string
133
+ # in the format "n.n.n.n.n.n" or an array of integers.
134
+ #
135
+ def initialize(id)
136
+ if id.respond_to? :to_str
137
+ super(make_integers(id.to_str.split(".")))
138
+ else
139
+ super(make_integers(id.to_ary))
140
+ end
141
+ rescue ArgumentError
142
+ raise ArgumentError, "'#{id}' not a valid object ID"
143
+ end
144
+
145
+ def to_varbind
146
+ VarBind.new(self, Null)
147
+ end
148
+
149
+ def to_s
150
+ self.join('.')
151
+ end
152
+
153
+ def inspect
154
+ "[#{self.to_s}]"
155
+ end
156
+
157
+ def encode
158
+ encode_object_id(self)
159
+ end
160
+
161
+ ##
162
+ # Returns true if this ObjectId is a subtree of the provided parent tree
163
+ # ObjectId. For example, "1.3.6.1.5" is a subtree of "1.3.6.1".
164
+ #
165
+ def subtree_of?(parent_tree)
166
+ unless parent_tree.kind_of? ObjectId
167
+ parent_tree = ObjectId.new(parent_tree)
168
+ end
169
+ if parent_tree.length > self.length
170
+ false
171
+ else
172
+ parent_tree.each_index do |i|
173
+ return false if parent_tree[i] != self[i]
174
+ end
175
+ true
176
+ end
177
+ end
178
+
179
+ private
180
+
181
+ def make_integers(list)
182
+ list.collect{|n| Integer(n)}
183
+ end
184
+ end
185
+
186
+ class IpAddress
187
+ class << self
188
+ def decode(value_data)
189
+ IpAddress.new(value_data)
190
+ end
191
+ end
192
+
193
+ def asn1_type
194
+ "IpAddress"
195
+ end
196
+
197
+ ##
198
+ # Create an IpAddress object. The constructor accepts either a raw
199
+ # four-octet string or a formatted string of integers separated by dots
200
+ # (i.e. "10.1.2.3").
201
+ #
202
+ def initialize(value_data)
203
+ if value_data.length > 4
204
+ value_data = parse_string(value_data)
205
+ elsif value_data.length != 4
206
+ raise InvalidIpAddress, "Expected 4 octets or formatted string, got #{value_data.inspect}"
207
+ end
208
+ @value = value_data
209
+ end
210
+
211
+ ##
212
+ # Returns a raw four-octet string representing this IpAddress.
213
+ #
214
+ def to_str
215
+ @value.dup
216
+ end
217
+
218
+ ##
219
+ # Returns a formatted, dot-separated string representing this IpAddress.
220
+ #
221
+ def to_s
222
+ octets = []
223
+ @value.each_byte { |b| octets << b.to_s }
224
+ octets.join('.')
225
+ end
226
+
227
+ def ==(other)
228
+ if other.respond_to? :to_str
229
+ return @value.eql?(other.to_str)
230
+ else
231
+ return false
232
+ end
233
+ end
234
+
235
+ def eql?(other)
236
+ self == other
237
+ end
238
+
239
+ def hash
240
+ @value.hash
241
+ end
242
+
243
+ def encode
244
+ encode_tlv(IpAddress_TAG, @value)
245
+ end
246
+
247
+ private
248
+ def parse_string(ip_string)
249
+ parts = ip_string.split(".")
250
+ raise InvalidIpAddress, ip_string.inspect if parts.length != 4
251
+ value_data = ""
252
+ parts.each do |s|
253
+ octet = s.to_i
254
+ raise InvalidIpAddress, ip_string.inspect if octet > 255
255
+ raise InvalidIpAddress, ip_string.inspect if octet < 0
256
+ value_data << octet.chr
257
+ end
258
+ value_data
259
+ end
260
+
261
+ end
262
+
263
+ class UnsignedInteger < Integer
264
+ def initialize(value)
265
+ super(value)
266
+ raise ArgumentError, "Negative integer invalid: #{value}" if value < 0
267
+ raise ArgumentError, "Out of range: #{value}" if value > 4294967295
268
+ end
269
+ end
270
+
271
+ class Counter32 < UnsignedInteger
272
+ def self.decode(value_data)
273
+ Counter32.new(decode_integer_value(value_data))
274
+ end
275
+
276
+ def asn1_type
277
+ "Counter32"
278
+ end
279
+
280
+ def encode
281
+ encode_tagged_integer(Counter32_TAG, @value)
282
+ end
283
+ end
284
+
285
+ class Gauge32 < UnsignedInteger
286
+ def self.decode(value_data)
287
+ Gauge32.new(decode_integer_value(value_data))
288
+ end
289
+
290
+ def asn1_type
291
+ "Gauge32"
292
+ end
293
+
294
+ def encode
295
+ encode_tagged_integer(Gauge32_TAG, @value)
296
+ end
297
+ end
298
+
299
+ class Unsigned32 < UnsignedInteger
300
+ def self.decode(value_data)
301
+ Unsigned32.new(decode_integer_value(value_data))
302
+ end
303
+
304
+ def asn1_type
305
+ "Unsigned32"
306
+ end
307
+
308
+ def encode
309
+ encode_tagged_integer(Unsigned32_TAG, @value)
310
+ end
311
+ end
312
+
313
+ class TimeTicks < UnsignedInteger
314
+ def self.decode(value_data)
315
+ TimeTicks.new(decode_integer_value(value_data))
316
+ end
317
+
318
+ def asn1_type
319
+ "TimeTicks"
320
+ end
321
+
322
+ def encode
323
+ encode_tagged_integer(TimeTicks_TAG, @value)
324
+ end
325
+ end
326
+
327
+ class Opaque < OctetString
328
+ def self.decode(value_data)
329
+ Opaque.new(value_data)
330
+ end
331
+
332
+ def asn1_type
333
+ "Opaque"
334
+ end
335
+
336
+ def encode
337
+ encode_tlv(Opaque_TAG, self)
338
+ end
339
+ end
340
+
341
+ class Counter64 < Integer
342
+ def self.decode(value_data)
343
+ Counter64.new(decode_integer_value(value_data))
344
+ end
345
+
346
+ def asn1_type
347
+ "Counter64"
348
+ end
349
+
350
+ def initialize(value)
351
+ super(value)
352
+ raise ArgumentError, "Negative integer invalid: #{value}" if value < 0
353
+ raise ArgumentError, "Out of range: #{value}" if value > 18446744073709551615
354
+ end
355
+
356
+ def encode
357
+ encode_tagged_integer(Counter64_TAG, @value)
358
+ end
359
+ end
360
+
361
+ class Null
362
+ class << self
363
+ def decode(value_data)
364
+ Null
365
+ end
366
+
367
+ def encode
368
+ encode_null
369
+ end
370
+
371
+ def asn1_type
372
+ 'Null'
373
+ end
374
+
375
+ def to_s
376
+ asn1_type
377
+ end
378
+ end
379
+ end
380
+
381
+ class NoSuchObject
382
+ class << self
383
+ def decode(value_data)
384
+ NoSuchObject
385
+ end
386
+
387
+ def encode
388
+ encode_exception(NoSuchObject_TAG)
389
+ end
390
+
391
+ def asn1_type
392
+ 'noSuchObject'
393
+ end
394
+
395
+ def to_s
396
+ asn1_type
397
+ end
398
+ end
399
+ end
400
+
401
+ class NoSuchInstance
402
+ class << self
403
+ def decode(value_data)
404
+ NoSuchInstance
405
+ end
406
+
407
+ def encode
408
+ encode_exception(NoSuchInstance_TAG)
409
+ end
410
+
411
+ def asn1_type
412
+ 'noSuchInstance'
413
+ end
414
+
415
+ def to_s
416
+ asn1_type
417
+ end
418
+ end
419
+ end
420
+
421
+ class EndOfMibView
422
+ class << self
423
+ def decode(value_data)
424
+ EndOfMibView
425
+ end
426
+
427
+ def encode
428
+ encode_exception(EndOfMibView_TAG)
429
+ end
430
+
431
+ def asn1_type
432
+ 'endOfMibView'
433
+ end
434
+
435
+ def to_s
436
+ asn1_type
437
+ end
438
+ end
439
+ end
440
+
441
+ class VarBind
442
+ attr_accessor :name
443
+ attr_accessor :value
444
+
445
+ class << self
446
+ def decode(data)
447
+ varbind_data, remaining_varbind_data = decode_sequence(data)
448
+ name, remainder = decode_object_id(varbind_data)
449
+ value, remainder = decode_value(remainder)
450
+ assert_no_remainder(remainder)
451
+ return VarBind.new(name, value), remaining_varbind_data
452
+ end
453
+
454
+ ValueDecoderMap = {
455
+ INTEGER_TAG => Integer,
456
+ OCTET_STRING_TAG => OctetString,
457
+ NULL_TAG => Null,
458
+ OBJECT_IDENTIFIER_TAG => ObjectId,
459
+ IpAddress_TAG => IpAddress,
460
+ Counter32_TAG => Counter32,
461
+ Gauge32_TAG => Gauge32,
462
+ # note Gauge32 tag same as Unsigned32
463
+ TimeTicks_TAG => TimeTicks,
464
+ Opaque_TAG => Opaque,
465
+ Counter64_TAG => Counter64,
466
+ NoSuchObject_TAG => NoSuchObject,
467
+ NoSuchInstance_TAG => NoSuchInstance,
468
+ EndOfMibView_TAG => EndOfMibView
469
+ }
470
+
471
+ def decode_value(data)
472
+ value_tag, value_data, remainder = decode_tlv(data)
473
+ decoder_class = ValueDecoderMap[value_tag]
474
+ if decoder_class
475
+ value = decoder_class.decode(value_data)
476
+ else
477
+ raise UnsupportedValueTag, value_tag.to_s
478
+ end
479
+ return value, remainder
480
+ end
481
+ end
482
+
483
+ def initialize(name, value=Null)
484
+ if name.kind_of? ObjectId
485
+ @name = name
486
+ else
487
+ @name = ObjectName.new(name)
488
+ end
489
+ @value = value
490
+ end
491
+
492
+ def asn1_type
493
+ "VarBind"
494
+ end
495
+
496
+ def to_varbind
497
+ self
498
+ end
499
+
500
+ def to_s
501
+ "[name=#{@name.to_s}, value=#{@value.to_s} (#{@value.asn1_type})]"
502
+ end
503
+
504
+ def each
505
+ yield self
506
+ end
507
+
508
+ def encode
509
+ data = encode_object_id(@name) << value.encode
510
+ encode_sequence(data)
511
+ end
512
+ end
513
+
514
+ class ObjectName < ObjectId
515
+ def asn1_type
516
+ "ObjectName"
517
+ end
518
+ end
519
+
520
+ end