snmp 1.3.0 → 1.3.1
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.
- checksums.yaml +4 -4
- data/README.rdoc +54 -65
- data/lib/snmp/ber.rb +244 -237
- data/lib/snmp/pdu.rb +36 -22
- data/lib/snmp/varbind.rb +44 -25
- data/lib/snmp/version.rb +1 -1
- data/test/test_ber.rb +16 -15
- data/test/test_pdu.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7fcd45a1214475ca6b4994e449366998484949d4fbe46b580074fa7412a3d18
|
4
|
+
data.tar.gz: 4892233da93ed593ff4dad03eedf21d482c3bdc92ea586435452c085902077ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d4589d39c3fc90acc39bdf5867961a55ce71922b59531ad734ef424876b2d973c65e387dc23a00f603504fbecf68edd43e0e00086f7ae49156c3b536ab5cb61
|
7
|
+
data.tar.gz: f92df29abd8eda6c7110444d46a2404a94f025903132ee4400255337cacfa67ed415a2f9a3135c3ce9045f007290b984f9cc5760838595f06c6e1948bb3bfc31
|
data/README.rdoc
CHANGED
@@ -25,75 +25,13 @@ This release supports the following:
|
|
25
25
|
See the SNMP::Manager, SNMP::TrapListener, and SNMP::MIB classes and the
|
26
26
|
examples below for more details.
|
27
27
|
|
28
|
-
== Changes
|
29
|
-
|
30
|
-
Changes for version 1.3.0:
|
31
|
-
* Cleaned up deprecation warnings
|
32
|
-
* Fixed SNMP::Integer#<=> method for Ruby 2.3.0 and later
|
33
|
-
|
34
|
-
Changes for version 1.2.0:
|
35
|
-
* Removed support for Ruby 1.8
|
36
|
-
* Changed license to MIT License
|
37
|
-
|
38
|
-
Changes for version 1.1.1:
|
39
|
-
|
40
|
-
* Incorporate various small pull requests
|
41
|
-
|
42
|
-
Changes for version 1.1.0:
|
43
|
-
|
44
|
-
* Added MIB support to ObjectId and Varbind, so that to_s can return symbolic information
|
45
|
-
* Added to_str method to ObjectId to return a numeric OID string (old to_s behavior)
|
46
|
-
* TrapListener can now support multiple community strings
|
47
|
-
|
48
|
-
Changes for version 1.0.4:
|
49
|
-
|
50
|
-
* New option handling and added lower-case versions of all options
|
51
|
-
* Added SNMP::VERSION constant
|
52
|
-
* Experimental support for IPv6
|
53
|
-
* Removed support for installation with setup.rb
|
54
|
-
|
55
|
-
Changes for version 1.0.3:
|
56
|
-
|
57
|
-
* Minor changes to Manager class. The :Transport option may now be an
|
58
|
-
object or a class. Explicity call Timeout.timeout so that a timeout
|
59
|
-
method may be defined in subclasses. Thanks to Eric Monti.
|
60
|
-
|
61
|
-
Changes for version 1.0.2:
|
62
|
-
|
63
|
-
* Internal code changes to make this library compatible with both Ruby 1.8
|
64
|
-
and Ruby 1.9. Note that an ord() method is now added to the Fixnum class
|
65
|
-
for Ruby 1.8. See the ber.rb file for details.
|
66
|
-
|
67
|
-
Changes for version 1.0.1:
|
68
|
-
|
69
|
-
* Made the host configurable for the TrapListener. Previously defaulted
|
70
|
-
to 'localhost'.
|
71
|
-
|
72
|
-
Changes for version 1.0.0:
|
73
|
-
|
74
|
-
* Added to_s method to TimeTicks. Displays time in human-readable form
|
75
|
-
instead of just a number. The to_i method can still be used to get the
|
76
|
-
number of ticks.
|
77
|
-
|
78
28
|
== Installation
|
79
29
|
|
80
|
-
You can use RubyGems
|
30
|
+
You can use RubyGems[http://rubygems.org/] to
|
81
31
|
install the latest version of the SNMP library.
|
82
32
|
|
83
33
|
gem install snmp
|
84
34
|
|
85
|
-
== Testing
|
86
|
-
|
87
|
-
This library has received limited testing:
|
88
|
-
* The unit tests have been executed with both Ruby 1.9.3 and Ruby 2.1.2 on
|
89
|
-
Mac OS X 10.9.
|
90
|
-
* Basic interoperability testing has been done with the
|
91
|
-
net-snmp[http://www.net-snmp.org/] tools.
|
92
|
-
|
93
|
-
I'm very interested in hearing about successes or failures on other platforms.
|
94
|
-
|
95
|
-
Send me an email at hallidave at gmail.com.
|
96
|
-
|
97
35
|
== Examples
|
98
36
|
|
99
37
|
=== Get Request
|
@@ -187,7 +125,59 @@ Log traps to STDOUT.
|
|
187
125
|
end
|
188
126
|
end
|
189
127
|
m.join
|
190
|
-
|
128
|
+
|
129
|
+
== Changes
|
130
|
+
|
131
|
+
Changes for version 1.3.1:
|
132
|
+
* Cleaned up deprecation warnings
|
133
|
+
* Fixed SNMP::Integer#<=> method for Ruby 2.3.0 and later
|
134
|
+
* Removed artificial limit on number of non-repeaters for GetBulkRequest
|
135
|
+
* SNMP::BER module no longer pollutes global namespace
|
136
|
+
|
137
|
+
Changes for version 1.2.0:
|
138
|
+
* Removed support for Ruby 1.8
|
139
|
+
* Changed license to MIT License
|
140
|
+
|
141
|
+
Changes for version 1.1.1:
|
142
|
+
|
143
|
+
* Incorporate various small pull requests
|
144
|
+
|
145
|
+
Changes for version 1.1.0:
|
146
|
+
|
147
|
+
* Added MIB support to ObjectId and Varbind, so that to_s can return symbolic information
|
148
|
+
* Added to_str method to ObjectId to return a numeric OID string (old to_s behavior)
|
149
|
+
* TrapListener can now support multiple community strings
|
150
|
+
|
151
|
+
Changes for version 1.0.4:
|
152
|
+
|
153
|
+
* New option handling and added lower-case versions of all options
|
154
|
+
* Added SNMP::VERSION constant
|
155
|
+
* Experimental support for IPv6
|
156
|
+
* Removed support for installation with setup.rb
|
157
|
+
|
158
|
+
Changes for version 1.0.3:
|
159
|
+
|
160
|
+
* Minor changes to Manager class. The :Transport option may now be an
|
161
|
+
object or a class. Explicity call Timeout.timeout so that a timeout
|
162
|
+
method may be defined in subclasses. Thanks to Eric Monti.
|
163
|
+
|
164
|
+
Changes for version 1.0.2:
|
165
|
+
|
166
|
+
* Internal code changes to make this library compatible with both Ruby 1.8
|
167
|
+
and Ruby 1.9. Note that an ord() method is now added to the Fixnum class
|
168
|
+
for Ruby 1.8. See the ber.rb file for details.
|
169
|
+
|
170
|
+
Changes for version 1.0.1:
|
171
|
+
|
172
|
+
* Made the host configurable for the TrapListener. Previously defaulted
|
173
|
+
to 'localhost'.
|
174
|
+
|
175
|
+
Changes for version 1.0.0:
|
176
|
+
|
177
|
+
* Added to_s method to TimeTicks. Displays time in human-readable form
|
178
|
+
instead of just a number. The to_i method can still be used to get the
|
179
|
+
number of ticks.
|
180
|
+
|
191
181
|
== License
|
192
182
|
|
193
183
|
This SNMP Library is released under the MIT License.
|
@@ -211,4 +201,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
211
201
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
212
202
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
213
203
|
THE SOFTWARE.
|
214
|
-
|
data/lib/snmp/ber.rb
CHANGED
@@ -78,278 +78,285 @@ module SNMP
|
|
78
78
|
class InvalidObjectId < RuntimeError; end
|
79
79
|
class InvalidLength < RuntimeError; end
|
80
80
|
|
81
|
-
|
82
|
-
raise ParseError, remainder.inspect if remainder != ""
|
83
|
-
end
|
81
|
+
module Decode
|
84
82
|
|
85
|
-
|
86
|
-
|
87
|
-
# bytes in network byte order. This format is returned by Socket#recv.
|
88
|
-
#
|
89
|
-
# Returns a tuple containing the tag, the value, and any remaining
|
90
|
-
# unprocessed data.
|
91
|
-
#
|
92
|
-
# The data is not interpretted by this method. Use one of the other
|
93
|
-
# decoding methods to interpret the data.
|
94
|
-
#
|
95
|
-
# Note that ASN.1 supports an indefinite length format where the end of
|
96
|
-
# content is marked by a pair of 0 octets. SNMP does not support this
|
97
|
-
# format, so only the two definite forms are implemented (single byte and
|
98
|
-
# multi-byte).
|
99
|
-
#
|
100
|
-
def decode_tlv(data)
|
101
|
-
raise OutOfData if (data.length == 2 && data[1].ord != 0) || data.length < 2
|
102
|
-
tag = data[0].ord
|
103
|
-
length = data[1].ord
|
104
|
-
if length < 0x80
|
105
|
-
value = data[2, length]
|
106
|
-
remainder = data[length+2..-1]
|
107
|
-
else
|
108
|
-
# ASN.1 says this octet can't be 0xff
|
109
|
-
raise InvalidLength, length.to_s if length == 0xff
|
110
|
-
num_octets = length & 0x7f
|
111
|
-
length = build_integer(data, 2, num_octets)
|
112
|
-
value = data[num_octets+2, length]
|
113
|
-
remainder = data[num_octets+2+length..-1]
|
83
|
+
def assert_no_remainder(remainder)
|
84
|
+
raise ParseError, remainder.inspect if remainder != ""
|
114
85
|
end
|
115
|
-
return tag, value, remainder
|
116
|
-
end
|
117
86
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
87
|
+
#
|
88
|
+
# Decode tag-length-value data. The data is assumed to be a string of
|
89
|
+
# bytes in network byte order. This format is returned by Socket#recv.
|
90
|
+
#
|
91
|
+
# Returns a tuple containing the tag, the value, and any remaining
|
92
|
+
# unprocessed data.
|
93
|
+
#
|
94
|
+
# The data is not interpretted by this method. Use one of the other
|
95
|
+
# decoding methods to interpret the data.
|
96
|
+
#
|
97
|
+
# Note that ASN.1 supports an indefinite length format where the end of
|
98
|
+
# content is marked by a pair of 0 octets. SNMP does not support this
|
99
|
+
# format, so only the two definite forms are implemented (single byte and
|
100
|
+
# multi-byte).
|
101
|
+
#
|
102
|
+
def decode_tlv(data)
|
103
|
+
raise OutOfData if (data.length == 2 && data[1].ord != 0) || data.length < 2
|
104
|
+
tag = data[0].ord
|
105
|
+
length = data[1].ord
|
106
|
+
if length < 0x80
|
107
|
+
value = data[2, length]
|
108
|
+
remainder = data[length+2..-1]
|
109
|
+
else
|
110
|
+
# ASN.1 says this octet can't be 0xff
|
111
|
+
raise InvalidLength, length.to_s if length == 0xff
|
112
|
+
num_octets = length & 0x7f
|
113
|
+
length = build_integer(data, 2, num_octets)
|
114
|
+
value = data[num_octets+2, length]
|
115
|
+
remainder = data[num_octets+2+length..-1]
|
116
|
+
end
|
117
|
+
return tag, value, remainder
|
118
|
+
end
|
130
119
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
120
|
+
#
|
121
|
+
# Decode TLV data for an ASN.1 integer.
|
122
|
+
#
|
123
|
+
# Throws an InvalidTag exception if the tag is incorrect.
|
124
|
+
#
|
125
|
+
# Returns a tuple containing an integer and any remaining unprocessed data.
|
126
|
+
#
|
127
|
+
def decode_integer(data)
|
128
|
+
tag, value, remainder = decode_tlv(data)
|
129
|
+
raise InvalidTag, tag.to_s if tag != INTEGER_TAG
|
130
|
+
return decode_integer_value(value), remainder
|
131
|
+
end
|
136
132
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
133
|
+
def decode_timeticks(data)
|
134
|
+
tag, value, remainder = decode_tlv(data)
|
135
|
+
raise InvalidTag, tag.to_s if tag != TimeTicks_TAG
|
136
|
+
return decode_uinteger_value(value), remainder
|
141
137
|
end
|
142
|
-
result
|
143
|
-
end
|
144
138
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
end
|
139
|
+
def decode_integer_value(value)
|
140
|
+
result = build_integer(value, 0, value.length)
|
141
|
+
if value[0].ord[7] == 1
|
142
|
+
result -= (1 << (8 * value.length))
|
143
|
+
end
|
144
|
+
result
|
145
|
+
end
|
153
146
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
147
|
+
##
|
148
|
+
# Decode an integer, ignoring the sign bit. Some agents insist on
|
149
|
+
# encoding 32 bit unsigned integers with four bytes even though it
|
150
|
+
# should be 5 bytes (at least the way I read it).
|
151
|
+
#
|
152
|
+
def decode_uinteger_value(value)
|
153
|
+
build_integer(value, 0, value.length)
|
154
|
+
end
|
159
155
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
# Returns a tuple containing a string and any remaining unprocessed data.
|
166
|
-
#
|
167
|
-
def decode_octet_string(data)
|
168
|
-
tag, value, remainder = decode_tlv(data)
|
169
|
-
raise InvalidTag, tag.to_s if tag != OCTET_STRING_TAG
|
170
|
-
return value, remainder
|
171
|
-
end
|
156
|
+
def build_integer(data, start, num_octets)
|
157
|
+
number = 0
|
158
|
+
num_octets.times { |i| number = number<<8 | data[start+i].ord }
|
159
|
+
return number
|
160
|
+
end
|
172
161
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
162
|
+
#
|
163
|
+
# Decode TLV data for an ASN.1 octet string.
|
164
|
+
#
|
165
|
+
# Throws an InvalidTag exception if the tag is incorrect.
|
166
|
+
#
|
167
|
+
# Returns a tuple containing a string and any remaining unprocessed data.
|
168
|
+
#
|
169
|
+
def decode_octet_string(data)
|
170
|
+
tag, value, remainder = decode_tlv(data)
|
171
|
+
raise InvalidTag, tag.to_s if tag != OCTET_STRING_TAG
|
172
|
+
return value, remainder
|
173
|
+
end
|
179
174
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
# unprocessed data that follows the sequence.
|
187
|
-
#
|
188
|
-
def decode_sequence(data)
|
189
|
-
tag, value, remainder = decode_tlv(data)
|
190
|
-
raise InvalidTag, tag.to_s if tag != SEQUENCE_TAG
|
191
|
-
return value, remainder
|
192
|
-
end
|
175
|
+
def decode_ip_address(data)
|
176
|
+
tag, value, remainder = decode_tlv(data)
|
177
|
+
raise InvalidTag, tag.to_s if tag != IpAddress_TAG
|
178
|
+
raise InvalidLength, tag.to_s if value.length != 4
|
179
|
+
return value, remainder
|
180
|
+
end
|
193
181
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
182
|
+
#
|
183
|
+
# Decode TLV data for an ASN.1 sequence.
|
184
|
+
#
|
185
|
+
# Throws an InvalidTag exception if the tag is incorrect.
|
186
|
+
#
|
187
|
+
# Returns a tuple containing the sequence data and any remaining
|
188
|
+
# unprocessed data that follows the sequence.
|
189
|
+
#
|
190
|
+
def decode_sequence(data)
|
191
|
+
tag, value, remainder = decode_tlv(data)
|
192
|
+
raise InvalidTag, tag.to_s if tag != SEQUENCE_TAG
|
193
|
+
return value, remainder
|
194
|
+
end
|
195
|
+
|
196
|
+
#
|
197
|
+
# Unwrap TLV data for an ASN.1 object identifier. This method extracts
|
198
|
+
# the OID value as a character string but does not decode it further.
|
199
|
+
#
|
200
|
+
# Throws an InvalidTag exception if the tag is incorrect.
|
201
|
+
#
|
202
|
+
# Returns a tuple containing the object identifier (OID) and any
|
203
|
+
# remaining unprocessed data. The OID is represented as an array
|
204
|
+
# of integers.
|
205
|
+
#
|
206
|
+
def decode_object_id(data)
|
207
|
+
tag, value, remainder = decode_tlv(data)
|
208
|
+
raise InvalidTag, tag.to_s if tag != OBJECT_IDENTIFIER_TAG
|
209
|
+
return decode_object_id_value(value), remainder
|
210
|
+
end
|
209
211
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
else
|
214
|
-
value0 = value[0].ord
|
215
|
-
if value0 == 0x2b
|
216
|
-
object_id = [1,3]
|
212
|
+
def decode_object_id_value(value)
|
213
|
+
if value.length == 0
|
214
|
+
object_id = []
|
217
215
|
else
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
216
|
+
value0 = value[0].ord
|
217
|
+
if value0 == 0x2b
|
218
|
+
object_id = [1,3]
|
219
|
+
else
|
220
|
+
second = value0 % 40
|
221
|
+
first = (value0 - second) / 40
|
222
|
+
raise InvalidObjectId, value.to_s if first > 2
|
223
|
+
object_id = [first, second]
|
224
|
+
end
|
225
|
+
n = 0
|
226
|
+
for i in 1...value.length
|
227
|
+
n = (n<<7) + (value[i].ord & 0x7f)
|
228
|
+
if value[i].ord < 0x80
|
229
|
+
object_id << n
|
230
|
+
n = 0
|
231
|
+
end
|
229
232
|
end
|
230
233
|
end
|
234
|
+
return object_id
|
231
235
|
end
|
232
|
-
|
236
|
+
|
233
237
|
end
|
234
238
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
length.
|
243
|
-
|
244
|
-
|
245
|
-
|
239
|
+
module Encode
|
240
|
+
|
241
|
+
#
|
242
|
+
# Encode the length field for TLV data. Returns the length octets
|
243
|
+
# as a string.
|
244
|
+
#
|
245
|
+
def encode_length(length)
|
246
|
+
raise InvalidLength, length.to_s if length < 0
|
247
|
+
if length < 0x80
|
248
|
+
length.chr
|
249
|
+
else
|
250
|
+
data = integer_to_octets(length)
|
251
|
+
(data.size | 0x80).chr << data
|
252
|
+
end
|
246
253
|
end
|
247
|
-
end
|
248
254
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
+
#
|
256
|
+
# Encode integer
|
257
|
+
#
|
258
|
+
def encode_integer(value)
|
259
|
+
encode_tagged_integer(INTEGER_TAG, value)
|
260
|
+
end
|
255
261
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
262
|
+
def encode_tagged_integer(tag, value)
|
263
|
+
if value > 0 && value < 0x80
|
264
|
+
data = value.chr
|
265
|
+
else
|
266
|
+
data = integer_to_octets(value)
|
267
|
+
if value > 0 && data[0].ord > 0x7f
|
268
|
+
data = "\000" << data
|
269
|
+
elsif value < 0 && data[0].ord < 0x80
|
270
|
+
data = "\377" << data
|
271
|
+
end
|
265
272
|
end
|
273
|
+
encode_tlv(tag, data)
|
266
274
|
end
|
267
|
-
encode_tlv(tag, data)
|
268
|
-
end
|
269
275
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
276
|
+
#
|
277
|
+
# Helper method for encoding integer-like things.
|
278
|
+
#
|
279
|
+
def integer_to_octets(i)
|
280
|
+
if i >= 0
|
281
|
+
done = 0
|
282
|
+
else
|
283
|
+
done = -1
|
284
|
+
end
|
285
|
+
octets = ""
|
286
|
+
begin
|
287
|
+
octets = (i & 0xff).chr << octets
|
288
|
+
i = i >> 8
|
289
|
+
end until i == done
|
290
|
+
octets
|
278
291
|
end
|
279
|
-
octets = ""
|
280
|
-
begin
|
281
|
-
octets = (i & 0xff).chr << octets
|
282
|
-
i = i >> 8
|
283
|
-
end until i == done
|
284
|
-
octets
|
285
|
-
end
|
286
292
|
|
287
|
-
|
288
|
-
|
289
|
-
|
293
|
+
def encode_null
|
294
|
+
NULL_TAG.chr << "\000"
|
295
|
+
end
|
290
296
|
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
297
|
+
#
|
298
|
+
# Encode an exception. The encoding is simply the exception tag with
|
299
|
+
# no data, similar to NULL.
|
300
|
+
#
|
301
|
+
def encode_exception(tag)
|
302
|
+
tag.chr << "\000"
|
303
|
+
end
|
298
304
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
305
|
+
#
|
306
|
+
# Wraps value in a tag and length. This method expects an
|
307
|
+
# integer tag and a string value.
|
308
|
+
#
|
309
|
+
def encode_tlv(tag, value)
|
310
|
+
data = tag.chr << encode_length(value.length)
|
311
|
+
data = data << value if value.length > 0
|
312
|
+
data
|
313
|
+
end
|
308
314
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
+
#
|
316
|
+
# Wrap string in a octet string tag and length.
|
317
|
+
#
|
318
|
+
def encode_octet_string(value)
|
319
|
+
encode_tlv(OCTET_STRING_TAG, value)
|
320
|
+
end
|
315
321
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
+
#
|
323
|
+
# Wrap value in a sequence tag and length.
|
324
|
+
#
|
325
|
+
def encode_sequence(value)
|
326
|
+
encode_tlv(SEQUENCE_TAG, value)
|
327
|
+
end
|
322
328
|
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
329
|
+
#
|
330
|
+
# Encode an object id. The input is assumed to be an array of integers
|
331
|
+
# representing the object id.
|
332
|
+
#
|
333
|
+
def encode_object_id(value)
|
334
|
+
raise InvalidObjectId, value.to_s if value.length < 1
|
335
|
+
raise InvalidObjectId, value.to_s if value[0] > 2
|
336
|
+
data = ""
|
337
|
+
if (value.length > 1)
|
338
|
+
raise InvalidObjectId if value[0] < 2 && value[1] > 40
|
339
|
+
data << (40 * value[0] + value[1]).chr
|
340
|
+
for i in 2...value.length
|
341
|
+
if value[i] < 0x80
|
342
|
+
data << value[i].chr
|
343
|
+
else
|
344
|
+
octets = ""
|
345
|
+
n = value[i]
|
346
|
+
begin
|
347
|
+
octets = (n & 0x7f | 0x80).chr << octets
|
348
|
+
n = n >> 7
|
349
|
+
end until n == 0
|
350
|
+
octets[-1] = (octets[-1].ord & 0x7f).chr
|
351
|
+
data << octets
|
352
|
+
end
|
346
353
|
end
|
354
|
+
elsif (value.length == 1)
|
355
|
+
data << (40 * value[0]).chr
|
347
356
|
end
|
348
|
-
|
349
|
-
data << (40 * value[0]).chr
|
357
|
+
encode_tlv(OBJECT_IDENTIFIER_TAG, data)
|
350
358
|
end
|
351
|
-
encode_tlv(OBJECT_IDENTIFIER_TAG, data)
|
352
|
-
end
|
353
359
|
|
360
|
+
end
|
354
361
|
end
|
355
362
|
end
|
data/lib/snmp/pdu.rb
CHANGED
@@ -23,8 +23,6 @@
|
|
23
23
|
require 'snmp/ber'
|
24
24
|
require 'snmp/varbind'
|
25
25
|
|
26
|
-
include SNMP::BER
|
27
|
-
|
28
26
|
module SNMP
|
29
27
|
|
30
28
|
# Exceptions thrown during message/pdu decoding
|
@@ -40,6 +38,9 @@ module SNMP
|
|
40
38
|
SNMP_TRAP_OID_OID = ObjectId.new("1.3.6.1.6.3.1.1.4.1.0")
|
41
39
|
|
42
40
|
class Message
|
41
|
+
include SNMP::BER::Encode
|
42
|
+
extend SNMP::BER::Decode
|
43
|
+
|
43
44
|
attr_reader :version
|
44
45
|
attr_reader :community
|
45
46
|
attr_reader :pdu
|
@@ -57,9 +58,9 @@ module SNMP
|
|
57
58
|
|
58
59
|
def decode_version(data)
|
59
60
|
version_data, remainder = decode_integer(data)
|
60
|
-
if version_data == SNMP_V1
|
61
|
+
if version_data == BER::SNMP_V1
|
61
62
|
version = :SNMPv1
|
62
|
-
elsif version_data == SNMP_V2C
|
63
|
+
elsif version_data == BER::SNMP_V2C
|
63
64
|
version = :SNMPv2c
|
64
65
|
else
|
65
66
|
raise UnsupportedVersion, version_data.to_s
|
@@ -70,24 +71,24 @@ module SNMP
|
|
70
71
|
def decode_pdu(version, data, mib=nil)
|
71
72
|
pdu_tag, pdu_data, remainder = decode_tlv(data)
|
72
73
|
case pdu_tag
|
73
|
-
when GetRequest_PDU_TAG
|
74
|
+
when BER::GetRequest_PDU_TAG
|
74
75
|
pdu = PDU.decode(GetRequest, pdu_data, mib)
|
75
|
-
when GetNextRequest_PDU_TAG
|
76
|
+
when BER::GetNextRequest_PDU_TAG
|
76
77
|
pdu = PDU.decode(GetNextRequest, pdu_data, mib)
|
77
|
-
when Response_PDU_TAG
|
78
|
+
when BER::Response_PDU_TAG
|
78
79
|
pdu = PDU.decode(Response, pdu_data, mib)
|
79
|
-
when SetRequest_PDU_TAG
|
80
|
+
when BER::SetRequest_PDU_TAG
|
80
81
|
pdu = PDU.decode(SetRequest, pdu_data, mib)
|
81
|
-
when SNMPv1_Trap_PDU_TAG
|
82
|
+
when BER::SNMPv1_Trap_PDU_TAG
|
82
83
|
raise InvalidPduTag, "SNMPv1-trap not valid for #{version.to_s}" if version != :SNMPv1
|
83
84
|
pdu = SNMPv1_Trap.decode(pdu_data, mib)
|
84
|
-
when GetBulkRequest_PDU_TAG
|
85
|
+
when BER::GetBulkRequest_PDU_TAG
|
85
86
|
raise InvalidPduTag, "get-bulk not valid for #{version.to_s}" if version != :SNMPv2c
|
86
87
|
pdu = PDU.decode(GetBulkRequest, pdu_data, mib)
|
87
|
-
when InformRequest_PDU_TAG
|
88
|
+
when BER::InformRequest_PDU_TAG
|
88
89
|
raise InvalidPduTag, "inform not valid for #{version.to_s}" if version != :SNMPv2c
|
89
90
|
pdu = PDU.decode(InformRequest, pdu_data, mib)
|
90
|
-
when SNMPv2_Trap_PDU_TAG
|
91
|
+
when BER::SNMPv2_Trap_PDU_TAG
|
91
92
|
raise InvalidPduTag, "SNMPv2c-trap not valid for #{version.to_s}" if version != :SNMPv2c
|
92
93
|
pdu = PDU.decode(SNMPv2_Trap, pdu_data, mib)
|
93
94
|
else
|
@@ -109,9 +110,9 @@ module SNMP
|
|
109
110
|
|
110
111
|
def encode_version(version)
|
111
112
|
if version == :SNMPv1
|
112
|
-
encode_integer(SNMP_V1)
|
113
|
+
encode_integer(BER::SNMP_V1)
|
113
114
|
elsif version == :SNMPv2c
|
114
|
-
encode_integer(SNMP_V2C)
|
115
|
+
encode_integer(BER::SNMP_V2C)
|
115
116
|
else
|
116
117
|
raise UnsupportedVersion, version.to_s
|
117
118
|
end
|
@@ -126,6 +127,9 @@ module SNMP
|
|
126
127
|
end
|
127
128
|
|
128
129
|
class PDU
|
130
|
+
include SNMP::BER::Encode
|
131
|
+
extend SNMP::BER::Decode
|
132
|
+
|
129
133
|
attr_accessor :request_id
|
130
134
|
attr_accessor :error_index
|
131
135
|
attr_accessor :varbind_list
|
@@ -202,19 +206,19 @@ module SNMP
|
|
202
206
|
|
203
207
|
class GetRequest < PDU
|
204
208
|
def encode
|
205
|
-
encode_pdu(GetRequest_PDU_TAG)
|
209
|
+
encode_pdu(BER::GetRequest_PDU_TAG)
|
206
210
|
end
|
207
211
|
end
|
208
212
|
|
209
213
|
class GetNextRequest < PDU
|
210
214
|
def encode
|
211
|
-
encode_pdu(GetNextRequest_PDU_TAG)
|
215
|
+
encode_pdu(BER::GetNextRequest_PDU_TAG)
|
212
216
|
end
|
213
217
|
end
|
214
218
|
|
215
219
|
class SetRequest < PDU
|
216
220
|
def encode
|
217
|
-
encode_pdu(SetRequest_PDU_TAG)
|
221
|
+
encode_pdu(BER::SetRequest_PDU_TAG)
|
218
222
|
end
|
219
223
|
end
|
220
224
|
|
@@ -222,8 +226,15 @@ module SNMP
|
|
222
226
|
alias max_repetitions error_index
|
223
227
|
alias max_repetitions= error_index=
|
224
228
|
|
229
|
+
def initialize(request_id, varbind_list, non_repeaters, max_repetitions)
|
230
|
+
super(request_id, varbind_list)
|
231
|
+
# Reuse attributes of superclass - same encoding
|
232
|
+
@error_status = non_repeaters
|
233
|
+
@error_index = max_repetitions
|
234
|
+
end
|
235
|
+
|
225
236
|
def encode
|
226
|
-
encode_pdu(GetBulkRequest_PDU_TAG)
|
237
|
+
encode_pdu(BER::GetBulkRequest_PDU_TAG)
|
227
238
|
end
|
228
239
|
|
229
240
|
def non_repeaters=(number)
|
@@ -244,7 +255,7 @@ module SNMP
|
|
244
255
|
end
|
245
256
|
|
246
257
|
def encode
|
247
|
-
encode_pdu(Response_PDU_TAG)
|
258
|
+
encode_pdu(BER::Response_PDU_TAG)
|
248
259
|
end
|
249
260
|
end
|
250
261
|
|
@@ -257,7 +268,7 @@ module SNMP
|
|
257
268
|
#
|
258
269
|
class SNMPv2_Trap < PDU
|
259
270
|
def encode
|
260
|
-
encode_pdu(SNMPv2_Trap_PDU_TAG)
|
271
|
+
encode_pdu(BER::SNMPv2_Trap_PDU_TAG)
|
261
272
|
end
|
262
273
|
|
263
274
|
##
|
@@ -301,7 +312,7 @@ module SNMP
|
|
301
312
|
#
|
302
313
|
class InformRequest < SNMPv2_Trap
|
303
314
|
def encode
|
304
|
-
encode_pdu(InformRequest_PDU_TAG)
|
315
|
+
encode_pdu(BER::InformRequest_PDU_TAG)
|
305
316
|
end
|
306
317
|
end
|
307
318
|
|
@@ -309,6 +320,9 @@ module SNMP
|
|
309
320
|
# The PDU class for traps in SNMPv1.
|
310
321
|
#
|
311
322
|
class SNMPv1_Trap
|
323
|
+
include SNMP::BER::Encode
|
324
|
+
extend SNMP::BER::Decode
|
325
|
+
|
312
326
|
##
|
313
327
|
# Returns the source IP address for the trap, usually derived from the
|
314
328
|
# source IP address of the packet that delivered the trap.
|
@@ -383,7 +397,7 @@ module SNMP
|
|
383
397
|
encode_integer(@specific_trap) <<
|
384
398
|
@timestamp.encode <<
|
385
399
|
@varbind_list.encode
|
386
|
-
encode_tlv(SNMPv1_Trap_PDU_TAG, pdu_data)
|
400
|
+
encode_tlv(BER::SNMPv1_Trap_PDU_TAG, pdu_data)
|
387
401
|
end
|
388
402
|
|
389
403
|
def each_varbind(&block)
|
data/lib/snmp/varbind.rb
CHANGED
@@ -22,14 +22,15 @@
|
|
22
22
|
|
23
23
|
require 'snmp/ber'
|
24
24
|
|
25
|
-
include SNMP::BER
|
26
|
-
|
27
25
|
module SNMP
|
28
26
|
|
29
27
|
class UnsupportedValueTag < RuntimeError; end
|
30
28
|
class InvalidIpAddress < ArgumentError; end
|
31
29
|
|
32
30
|
class VarBindList < Array
|
31
|
+
include SNMP::BER::Encode
|
32
|
+
extend SNMP::BER::Decode
|
33
|
+
|
33
34
|
def self.decode(data, mib=nil)
|
34
35
|
list = VarBindList.new
|
35
36
|
varbind_data, remainder = decode_sequence(data)
|
@@ -71,6 +72,8 @@ module SNMP
|
|
71
72
|
end
|
72
73
|
|
73
74
|
class Integer
|
75
|
+
include SNMP::BER::Encode
|
76
|
+
extend SNMP::BER::Decode
|
74
77
|
include Comparable
|
75
78
|
|
76
79
|
def self.decode(value_data)
|
@@ -129,6 +132,7 @@ module SNMP
|
|
129
132
|
end
|
130
133
|
|
131
134
|
class OctetString < String
|
135
|
+
include SNMP::BER::Encode
|
132
136
|
def self.decode(value_data)
|
133
137
|
OctetString.new(value_data)
|
134
138
|
end
|
@@ -149,6 +153,8 @@ module SNMP
|
|
149
153
|
end
|
150
154
|
|
151
155
|
class ObjectId < Array
|
156
|
+
include SNMP::BER::Encode
|
157
|
+
extend SNMP::BER::Decode
|
152
158
|
include Comparable
|
153
159
|
|
154
160
|
def self.decode(value_data, mib=nil)
|
@@ -259,6 +265,8 @@ module SNMP
|
|
259
265
|
end
|
260
266
|
|
261
267
|
class IpAddress
|
268
|
+
include SNMP::BER::Encode
|
269
|
+
|
262
270
|
class << self
|
263
271
|
def decode(value_data)
|
264
272
|
IpAddress.new(value_data, false)
|
@@ -326,7 +334,7 @@ module SNMP
|
|
326
334
|
end
|
327
335
|
|
328
336
|
def encode
|
329
|
-
encode_tlv(IpAddress_TAG, @value)
|
337
|
+
encode_tlv(BER::IpAddress_TAG, @value)
|
330
338
|
end
|
331
339
|
|
332
340
|
private
|
@@ -365,7 +373,7 @@ module SNMP
|
|
365
373
|
end
|
366
374
|
|
367
375
|
def encode
|
368
|
-
encode_tagged_integer(Counter32_TAG, @value)
|
376
|
+
encode_tagged_integer(BER::Counter32_TAG, @value)
|
369
377
|
end
|
370
378
|
end
|
371
379
|
|
@@ -375,7 +383,7 @@ module SNMP
|
|
375
383
|
end
|
376
384
|
|
377
385
|
def encode
|
378
|
-
encode_tagged_integer(Gauge32_TAG, @value)
|
386
|
+
encode_tagged_integer(BER::Gauge32_TAG, @value)
|
379
387
|
end
|
380
388
|
end
|
381
389
|
|
@@ -385,7 +393,7 @@ module SNMP
|
|
385
393
|
end
|
386
394
|
|
387
395
|
def encode
|
388
|
-
encode_tagged_integer(Unsigned32_TAG, @value)
|
396
|
+
encode_tagged_integer(BER::Unsigned32_TAG, @value)
|
389
397
|
end
|
390
398
|
end
|
391
399
|
|
@@ -395,7 +403,7 @@ module SNMP
|
|
395
403
|
end
|
396
404
|
|
397
405
|
def encode
|
398
|
-
encode_tagged_integer(TimeTicks_TAG, @value)
|
406
|
+
encode_tagged_integer(BER::TimeTicks_TAG, @value)
|
399
407
|
end
|
400
408
|
|
401
409
|
def to_s
|
@@ -427,7 +435,7 @@ module SNMP
|
|
427
435
|
end
|
428
436
|
|
429
437
|
def encode
|
430
|
-
encode_tlv(Opaque_TAG, self)
|
438
|
+
encode_tlv(BER::Opaque_TAG, self)
|
431
439
|
end
|
432
440
|
end
|
433
441
|
|
@@ -447,11 +455,13 @@ module SNMP
|
|
447
455
|
end
|
448
456
|
|
449
457
|
def encode
|
450
|
-
encode_tagged_integer(Counter64_TAG, @value)
|
458
|
+
encode_tagged_integer(BER::Counter64_TAG, @value)
|
451
459
|
end
|
452
460
|
end
|
453
461
|
|
454
462
|
class Null
|
463
|
+
extend SNMP::BER::Encode
|
464
|
+
|
455
465
|
class << self
|
456
466
|
def decode(value_data)
|
457
467
|
Null
|
@@ -472,13 +482,15 @@ module SNMP
|
|
472
482
|
end
|
473
483
|
|
474
484
|
class NoSuchObject
|
485
|
+
extend SNMP::BER::Encode
|
486
|
+
|
475
487
|
class << self
|
476
488
|
def decode(value_data)
|
477
489
|
NoSuchObject
|
478
490
|
end
|
479
491
|
|
480
492
|
def encode
|
481
|
-
encode_exception(NoSuchObject_TAG)
|
493
|
+
encode_exception(BER::NoSuchObject_TAG)
|
482
494
|
end
|
483
495
|
|
484
496
|
def asn1_type
|
@@ -492,13 +504,15 @@ module SNMP
|
|
492
504
|
end
|
493
505
|
|
494
506
|
class NoSuchInstance
|
507
|
+
extend SNMP::BER::Encode
|
508
|
+
|
495
509
|
class << self
|
496
510
|
def decode(value_data)
|
497
511
|
NoSuchInstance
|
498
512
|
end
|
499
513
|
|
500
514
|
def encode
|
501
|
-
encode_exception(NoSuchInstance_TAG)
|
515
|
+
encode_exception(BER::NoSuchInstance_TAG)
|
502
516
|
end
|
503
517
|
|
504
518
|
def asn1_type
|
@@ -512,13 +526,15 @@ module SNMP
|
|
512
526
|
end
|
513
527
|
|
514
528
|
class EndOfMibView
|
529
|
+
extend SNMP::BER::Encode
|
530
|
+
|
515
531
|
class << self
|
516
532
|
def decode(value_data)
|
517
533
|
EndOfMibView
|
518
534
|
end
|
519
535
|
|
520
536
|
def encode
|
521
|
-
encode_exception(EndOfMibView_TAG)
|
537
|
+
encode_exception(BER::EndOfMibView_TAG)
|
522
538
|
end
|
523
539
|
|
524
540
|
def asn1_type
|
@@ -532,6 +548,9 @@ module SNMP
|
|
532
548
|
end
|
533
549
|
|
534
550
|
class VarBind
|
551
|
+
include SNMP::BER::Encode
|
552
|
+
extend SNMP::BER::Decode
|
553
|
+
|
535
554
|
attr_accessor :name
|
536
555
|
attr_accessor :value
|
537
556
|
|
@@ -547,20 +566,20 @@ module SNMP
|
|
547
566
|
end
|
548
567
|
|
549
568
|
ValueDecoderMap = {
|
550
|
-
INTEGER_TAG => Integer,
|
551
|
-
OCTET_STRING_TAG => OctetString,
|
552
|
-
NULL_TAG => Null,
|
553
|
-
OBJECT_IDENTIFIER_TAG => ObjectId,
|
554
|
-
IpAddress_TAG => IpAddress,
|
555
|
-
Counter32_TAG => Counter32,
|
556
|
-
Gauge32_TAG => Gauge32,
|
569
|
+
BER::INTEGER_TAG => Integer,
|
570
|
+
BER::OCTET_STRING_TAG => OctetString,
|
571
|
+
BER::NULL_TAG => Null,
|
572
|
+
BER::OBJECT_IDENTIFIER_TAG => ObjectId,
|
573
|
+
BER::IpAddress_TAG => IpAddress,
|
574
|
+
BER::Counter32_TAG => Counter32,
|
575
|
+
BER::Gauge32_TAG => Gauge32,
|
557
576
|
# note Gauge32 tag same as Unsigned32
|
558
|
-
TimeTicks_TAG => TimeTicks,
|
559
|
-
Opaque_TAG => Opaque,
|
560
|
-
Counter64_TAG => Counter64,
|
561
|
-
NoSuchObject_TAG => NoSuchObject,
|
562
|
-
NoSuchInstance_TAG => NoSuchInstance,
|
563
|
-
EndOfMibView_TAG => EndOfMibView
|
577
|
+
BER::TimeTicks_TAG => TimeTicks,
|
578
|
+
BER::Opaque_TAG => Opaque,
|
579
|
+
BER::Counter64_TAG => Counter64,
|
580
|
+
BER::NoSuchObject_TAG => NoSuchObject,
|
581
|
+
BER::NoSuchInstance_TAG => NoSuchInstance,
|
582
|
+
BER::EndOfMibView_TAG => EndOfMibView
|
564
583
|
}
|
565
584
|
|
566
585
|
def decode_value(data)
|
data/lib/snmp/version.rb
CHANGED
data/test/test_ber.rb
CHANGED
@@ -6,7 +6,8 @@ require 'snmp/ber'
|
|
6
6
|
|
7
7
|
class ASN1_Test < Minitest::Test
|
8
8
|
|
9
|
-
include SNMP::BER
|
9
|
+
include SNMP::BER::Encode
|
10
|
+
include SNMP::BER::Decode
|
10
11
|
|
11
12
|
def test_decode_tlv_empty
|
12
13
|
tag, value, data = decode_tlv("\001\000")
|
@@ -56,20 +57,20 @@ class ASN1_Test < Minitest::Test
|
|
56
57
|
|
57
58
|
# Check invalid length - ASN.1 says that first length octet can't be 255.
|
58
59
|
def test_bad_length
|
59
|
-
assert_raises(InvalidLength) {
|
60
|
+
assert_raises(BER::InvalidLength) {
|
60
61
|
decode_tlv("\001\377\001")
|
61
62
|
}
|
62
63
|
end
|
63
64
|
|
64
65
|
# Check if input data is too short
|
65
66
|
def test_out_of_data
|
66
|
-
assert_raises(OutOfData) {
|
67
|
+
assert_raises(BER::OutOfData) {
|
67
68
|
decode_tlv("\001\001")
|
68
69
|
}
|
69
|
-
assert_raises(OutOfData) {
|
70
|
+
assert_raises(BER::OutOfData) {
|
70
71
|
decode_tlv("\001")
|
71
72
|
}
|
72
|
-
assert_raises(OutOfData) {
|
73
|
+
assert_raises(BER::OutOfData) {
|
73
74
|
decode_tlv("")
|
74
75
|
}
|
75
76
|
end
|
@@ -103,7 +104,7 @@ class ASN1_Test < Minitest::Test
|
|
103
104
|
assert_equal(255, i)
|
104
105
|
assert_equal("", data)
|
105
106
|
|
106
|
-
assert_raises(InvalidTag) {
|
107
|
+
assert_raises(BER::InvalidTag) {
|
107
108
|
decode_integer("\001\004\001\002\003\004")
|
108
109
|
}
|
109
110
|
end
|
@@ -113,7 +114,7 @@ class ASN1_Test < Minitest::Test
|
|
113
114
|
assert_equal(16909060, i)
|
114
115
|
assert_equal("", data)
|
115
116
|
|
116
|
-
assert_raises(InvalidTag) {
|
117
|
+
assert_raises(BER::InvalidTag) {
|
117
118
|
decode_timeticks("\002\004\001\002\003\004")
|
118
119
|
}
|
119
120
|
end
|
@@ -122,7 +123,7 @@ class ASN1_Test < Minitest::Test
|
|
122
123
|
def test_decode_octet_string
|
123
124
|
s, _ = decode_octet_string("\004\202\000\005hello")
|
124
125
|
assert_equal("hello",s)
|
125
|
-
assert_raises(InvalidTag) {
|
126
|
+
assert_raises(BER::InvalidTag) {
|
126
127
|
decode_octet_string("\005\202\000\005hello")
|
127
128
|
}
|
128
129
|
end
|
@@ -130,10 +131,10 @@ class ASN1_Test < Minitest::Test
|
|
130
131
|
def test_decode_ip_address
|
131
132
|
ip, _ = decode_ip_address("@\004\001\002\003\004")
|
132
133
|
assert_equal(ip, "\001\002\003\004")
|
133
|
-
assert_raises(InvalidTag) {
|
134
|
+
assert_raises(BER::InvalidTag) {
|
134
135
|
decode_ip_address("\004\004\001\002\003\004")
|
135
136
|
}
|
136
|
-
assert_raises(InvalidLength) {
|
137
|
+
assert_raises(BER::InvalidLength) {
|
137
138
|
decode_ip_address("@\005\001\002\003\004\005")
|
138
139
|
}
|
139
140
|
end
|
@@ -148,7 +149,7 @@ class ASN1_Test < Minitest::Test
|
|
148
149
|
assert_equal("\002\001\077", seq)
|
149
150
|
assert_equal("\002\001\001", data)
|
150
151
|
|
151
|
-
assert_raises(InvalidTag) {
|
152
|
+
assert_raises(BER::InvalidTag) {
|
152
153
|
decode_sequence("\061\003\002\001\077")
|
153
154
|
}
|
154
155
|
end
|
@@ -180,7 +181,7 @@ class ASN1_Test < Minitest::Test
|
|
180
181
|
assert_equal([0,0], object_id);
|
181
182
|
assert_equal("", remainder)
|
182
183
|
|
183
|
-
assert_raises(InvalidTag) do
|
184
|
+
assert_raises(BER::InvalidTag) do
|
184
185
|
decode_object_id("\007\001+")
|
185
186
|
end
|
186
187
|
end
|
@@ -191,7 +192,7 @@ class ASN1_Test < Minitest::Test
|
|
191
192
|
assert_equal("\177", encode_length(127))
|
192
193
|
assert_equal("\201\200", encode_length(128))
|
193
194
|
assert_equal("\202\002\001", encode_length(513))
|
194
|
-
assert_raises(InvalidLength) { encode_length(-1) }
|
195
|
+
assert_raises(BER::InvalidLength) { encode_length(-1) }
|
195
196
|
end
|
196
197
|
|
197
198
|
def test_encode_integer
|
@@ -232,8 +233,8 @@ class ASN1_Test < Minitest::Test
|
|
232
233
|
assert_equal("\006\002+\006", encode_object_id([1,3,6]))
|
233
234
|
assert_equal("\006\003+\202\001", encode_object_id([1,3,257]))
|
234
235
|
assert_equal("\006\003" << 82.chr << "\202\001", encode_object_id([2,2,257]))
|
235
|
-
assert_raises(InvalidObjectId) { encode_object_id([3,2,257]) }
|
236
|
-
assert_raises(InvalidObjectId) { encode_object_id([]) }
|
236
|
+
assert_raises(BER::InvalidObjectId) { encode_object_id([3,2,257]) }
|
237
|
+
assert_raises(BER::InvalidObjectId) { encode_object_id([]) }
|
237
238
|
|
238
239
|
assert_equal("\006\a+\203\377\177\203\377\177",
|
239
240
|
encode_object_id(SNMP::ObjectId.new("1.3.65535.65535")))
|
data/test/test_pdu.rb
CHANGED
@@ -94,9 +94,9 @@ class TestProtocol < Minitest::Test
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def test_get_bulk_create
|
97
|
-
request = SNMP::GetBulkRequest.new(1234, VarBindList.new("1.3.6.2"),
|
97
|
+
request = SNMP::GetBulkRequest.new(1234, VarBindList.new("1.3.6.2"), 20, 10)
|
98
98
|
assert_equal(1234, request.request_id)
|
99
|
-
assert_equal(
|
99
|
+
assert_equal(20, request.non_repeaters)
|
100
100
|
assert_equal(10, request.max_repetitions)
|
101
101
|
assert_equal(1, request.varbind_list.length)
|
102
102
|
assert_equal("1.3.6.2", request.varbind_list.first.name.to_s)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Halliday
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A Ruby implementation of SNMP (the Simple Network Management Protocol).
|
14
14
|
email: hallidave@gmail.com
|