snmp 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +15 -7
- data/Rakefile +2 -3
- data/examples/datetime.rb +22 -0
- data/examples/link_down.rb +49 -0
- data/lib/snmp/ber.rb +25 -13
- data/lib/snmp/varbind.rb +11 -5
- data/test/test_mib.rb +6 -0
- metadata +43 -33
data/README
CHANGED
@@ -9,7 +9,7 @@ that Ruby can run.
|
|
9
9
|
|
10
10
|
See snmplib.rubyforge.org[http://snmplib.rubyforge.org/] for more info.
|
11
11
|
|
12
|
-
Version 1.0.
|
12
|
+
Version 1.0.2 of this software supports the following:
|
13
13
|
|
14
14
|
* The GetRequest, GetNextRequest, GetBulkRequest, SetRequest, Response
|
15
15
|
SNMPv1_Trap, SNMPv2_Trap, and Inform PDUs
|
@@ -18,13 +18,20 @@ Version 1.0.0 of this software supports the following:
|
|
18
18
|
* Trap handling for informs and v1 and v2 traps
|
19
19
|
* Symbolic OID values (ie. "ifTable" instead of "1.3.6.1.2.1.2.2") as
|
20
20
|
parameters to the SNMP.Manager API
|
21
|
-
* Includes symbol data files for all current IETF MIBs
|
21
|
+
* Includes symbol data files for all current IETF MIBs
|
22
|
+
* Compatibility with both Ruby 1.8 and Ruby 1.9
|
22
23
|
|
23
24
|
See the SNMP.Manager, SNMP.TrapListener, and SNMP.MIB classes and the
|
24
25
|
examples below for more details.
|
25
26
|
|
26
27
|
== Changes
|
27
28
|
|
29
|
+
Changes for version 1.0.2:
|
30
|
+
|
31
|
+
* Internal code changes to make this library compatible with both Ruby 1.8
|
32
|
+
and Ruby 1.9. Note that an ord() method is now added to the Fixnum class
|
33
|
+
for Ruby 1.8. See the ber.rb file for details.
|
34
|
+
|
28
35
|
Changes for version 1.0.1:
|
29
36
|
|
30
37
|
* Made the host configurable for the TrapListener. Previously defaulted
|
@@ -114,25 +121,26 @@ formats.
|
|
114
121
|
From the .gem file you can install using
|
115
122
|
RubyGems[http://rubyforge.org/projects/rubygems].
|
116
123
|
|
117
|
-
gem install snmp-1.0.
|
124
|
+
gem install snmp-1.0.2.gem
|
118
125
|
|
119
126
|
From the .tgz or .zip file you can install using
|
120
127
|
setup.rb[http://i.loveruby.net/en/prog/setup.html]. Uncompress the archive
|
121
128
|
and then run setup.
|
122
129
|
|
123
|
-
cd snmp-1.0.
|
130
|
+
cd snmp-1.0.2
|
124
131
|
ruby setup.rb (may require root privilege)
|
125
132
|
|
126
133
|
== Testing
|
127
134
|
|
128
135
|
This library has received limited testing:
|
129
|
-
* The unit tests have been executed with Ruby 1.8.
|
136
|
+
* The unit tests have been executed with both Ruby 1.8.6 and Ruby 1.9.0 on
|
137
|
+
Mac OS X 10.5.
|
130
138
|
* Basic interoperability testing has been done with the
|
131
139
|
net-snmp[http://www.net-snmp.org/] tools.
|
132
140
|
|
133
141
|
I'm very interested in hearing about successes or failures on other platforms.
|
134
142
|
|
135
|
-
Send me an email at
|
143
|
+
Send me an email at hallidave at gmail.com.
|
136
144
|
|
137
145
|
== Examples
|
138
146
|
|
@@ -230,7 +238,7 @@ Log traps to STDOUT.
|
|
230
238
|
|
231
239
|
== License
|
232
240
|
|
233
|
-
This SNMP Library is Copyright (c) 2004
|
241
|
+
This SNMP Library is Copyright (c) 2004-2007 by David R. Halliday. It is free
|
234
242
|
software. Redistribution is permitted under the same terms and conditions as
|
235
243
|
the standard Ruby distribution. See the COPYING file in the Ruby distribution
|
236
244
|
for details.
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ Rake::TestTask.new do |test|
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# package target
|
13
|
-
PKG_VERSION = '1.0.
|
13
|
+
PKG_VERSION = '1.0.2'
|
14
14
|
PKG_FILES = FileList[
|
15
15
|
'Rakefile',
|
16
16
|
'README',
|
@@ -30,7 +30,6 @@ spec = Gem::Specification.new do |s|
|
|
30
30
|
s.summary = "A Ruby implementation of SNMP (the Simple Network Management Protocol)."
|
31
31
|
s.name = 'snmp'
|
32
32
|
s.version = PKG_VERSION
|
33
|
-
s.autorequire = 'snmp'
|
34
33
|
s.files = PKG_FILES.to_a
|
35
34
|
s.has_rdoc = true
|
36
35
|
s.extra_rdoc_files = ['README']
|
@@ -38,7 +37,7 @@ spec = Gem::Specification.new do |s|
|
|
38
37
|
'--title' << 'SNMP Library for Ruby'
|
39
38
|
s.description = "A Ruby implementation of SNMP (the Simple Network Management Protocol)."
|
40
39
|
s.author = 'Dave Halliday'
|
41
|
-
s.email = '
|
40
|
+
s.email = 'hallidave@gmail.com'
|
42
41
|
s.rubyforge_project = 'snmplib'
|
43
42
|
s.homepage = 'http://snmplib.rubyforge.org'
|
44
43
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'snmp'
|
2
|
+
|
3
|
+
module SNMP
|
4
|
+
class OctetString
|
5
|
+
def to_date_time
|
6
|
+
raise ArgumentError, "not DateAndTime format" if size != 8 and size != 11
|
7
|
+
year = self[0].ord * 256 + self[1].ord
|
8
|
+
month = self[2].ord
|
9
|
+
day = self[3].ord
|
10
|
+
hour = self[4].ord
|
11
|
+
minutes = self[5].ord
|
12
|
+
seconds = self[6].ord
|
13
|
+
tenths = self[7].ord
|
14
|
+
sprintf("%d-%d-%d,%02d:%02d:%02d.%d", year, month, day, hour, minutes, seconds, tenths)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
SNMP::Manager.open(:Host => 'localhost', :MibModules => ["HOST-RESOURCES-MIB"]) do |snmp|
|
20
|
+
response = snmp.get_value("hrSystemDate.0")
|
21
|
+
puts response.to_date_time
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'snmp'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
log = Logger.new($stdout)
|
6
|
+
|
7
|
+
mib = SNMP::MIB.new
|
8
|
+
mib.load_module("IF-MIB")
|
9
|
+
linkDown_OID = mib.oid("linkDown")
|
10
|
+
|
11
|
+
# 1 is "up" and 2 is "down" in the MIB
|
12
|
+
ADMIN_UP = 1
|
13
|
+
ADMIN_DOWN = 2
|
14
|
+
|
15
|
+
listener = SNMP::TrapListener.new(:Port => 1062, :Community => 'public') do |listener|
|
16
|
+
log.info "Listening for linkDown traps"
|
17
|
+
listener.on_trap(linkDown_OID) do |trap|
|
18
|
+
vb_list = trap.vb_list
|
19
|
+
up_time = vb_list[0].value # standard varbind - always in v2c trap
|
20
|
+
trap_oid = vb_list[1].value # standard varbind - always in v2c trap
|
21
|
+
|
22
|
+
# extract trap info - order determined by IF-MIB
|
23
|
+
ifIndex = vb_list[2].value
|
24
|
+
adminStatus = vb_list[3].value
|
25
|
+
operStatus = vb_list[4].value
|
26
|
+
|
27
|
+
# log stuff based on interface status
|
28
|
+
if adminStatus == ADMIN_DOWN
|
29
|
+
log.info "Interface #{ifIndex} turned down"
|
30
|
+
else
|
31
|
+
log.error "Problem on interface #{ifIndex}! Link unintentionally down"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
listener.on_trap_v1 do |trap|
|
36
|
+
log.warn "Unexpected v1 trap: #{trap.generic_trap}"
|
37
|
+
end
|
38
|
+
|
39
|
+
listener.on_trap_v2c do |trap|
|
40
|
+
log.warn "Unexpected v2c trap: #{trap.trap_oid}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
trap("INT") do
|
45
|
+
puts "\nShutting down"
|
46
|
+
listener.kill
|
47
|
+
end
|
48
|
+
|
49
|
+
listener.join
|
data/lib/snmp/ber.rb
CHANGED
@@ -7,6 +7,17 @@
|
|
7
7
|
# COPYING file in the Ruby distribution for details.
|
8
8
|
#
|
9
9
|
|
10
|
+
#
|
11
|
+
# Add ord method to Fixnum for forward compatibility with Ruby 1.9
|
12
|
+
#
|
13
|
+
if "a"[0].kind_of? Fixnum
|
14
|
+
unless Fixnum.methods.include? :ord
|
15
|
+
class Fixnum
|
16
|
+
def ord; self; end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
#
|
11
22
|
# This module implements methods for encoding and decoding SNMP packets
|
12
23
|
# using the ASN.1 BER (Basic Encoding Rules).
|
@@ -84,9 +95,9 @@ module BER #:nodoc:all
|
|
84
95
|
# multi-byte).
|
85
96
|
#
|
86
97
|
def decode_tlv(data)
|
87
|
-
raise OutOfData if (data.length == 2 && data[1] != 0) || data.length < 2
|
88
|
-
tag = data[0]
|
89
|
-
length = data[1]
|
98
|
+
raise OutOfData if (data.length == 2 && data[1].ord != 0) || data.length < 2
|
99
|
+
tag = data[0].ord
|
100
|
+
length = data[1].ord
|
90
101
|
if length < 0x80
|
91
102
|
value = data[2, length]
|
92
103
|
remainder = data[length+2..-1]
|
@@ -122,7 +133,7 @@ module BER #:nodoc:all
|
|
122
133
|
|
123
134
|
def decode_integer_value(value)
|
124
135
|
result = build_integer(value, 0, value.length)
|
125
|
-
if value[0][7] == 1
|
136
|
+
if value[0].ord[7] == 1
|
126
137
|
result -= (1 << (8 * value.length))
|
127
138
|
end
|
128
139
|
result
|
@@ -139,7 +150,7 @@ module BER #:nodoc:all
|
|
139
150
|
|
140
151
|
def build_integer(data, start, num_octets)
|
141
152
|
number = 0
|
142
|
-
num_octets.times { |i| number = number<<8 | data[start+i] }
|
153
|
+
num_octets.times { |i| number = number<<8 | data[start+i].ord }
|
143
154
|
return number
|
144
155
|
end
|
145
156
|
|
@@ -197,18 +208,19 @@ module BER #:nodoc:all
|
|
197
208
|
if value.length == 0
|
198
209
|
object_id = []
|
199
210
|
else
|
200
|
-
|
211
|
+
value0 = value[0].ord
|
212
|
+
if value0 == 0x2b
|
201
213
|
object_id = [1,3]
|
202
214
|
else
|
203
|
-
second =
|
204
|
-
first = (
|
215
|
+
second = value0 % 40
|
216
|
+
first = (value0 - second) / 40
|
205
217
|
raise InvalidObjectId, value.to_s if first > 2
|
206
218
|
object_id = [first, second]
|
207
219
|
end
|
208
220
|
n = 0
|
209
221
|
for i in 1...value.length
|
210
|
-
n = (n<<7) + (value[i] & 0x7f)
|
211
|
-
if value[i] < 0x80
|
222
|
+
n = (n<<7) + (value[i].ord & 0x7f)
|
223
|
+
if value[i].ord < 0x80
|
212
224
|
object_id << n
|
213
225
|
n = 0
|
214
226
|
end
|
@@ -243,9 +255,9 @@ module BER #:nodoc:all
|
|
243
255
|
data = value.chr
|
244
256
|
else
|
245
257
|
data = integer_to_octets(value)
|
246
|
-
if value > 0 && data[0] > 0x7f
|
258
|
+
if value > 0 && data[0].ord > 0x7f
|
247
259
|
data = "\000" << data
|
248
|
-
elsif value < 0 && data[0] < 0x80
|
260
|
+
elsif value < 0 && data[0].ord < 0x80
|
249
261
|
data = "\377" << data
|
250
262
|
end
|
251
263
|
end
|
@@ -326,7 +338,7 @@ module BER #:nodoc:all
|
|
326
338
|
octets = (n & 0x7f | 0x80).chr << octets
|
327
339
|
n = n >> 7
|
328
340
|
end until n == 0
|
329
|
-
octets[-1]
|
341
|
+
octets[-1] = (octets[-1].ord & 0x7f).chr
|
330
342
|
data << octets
|
331
343
|
end
|
332
344
|
end
|
data/lib/snmp/varbind.rb
CHANGED
@@ -29,11 +29,17 @@ class VarBindList < Array
|
|
29
29
|
|
30
30
|
def initialize(varbind_list=[])
|
31
31
|
super()
|
32
|
-
varbind_list.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
if varbind_list.respond_to? :to_str
|
33
|
+
self << ObjectId.new(varbind_list.to_str).to_varbind
|
34
|
+
elsif varbind_list.respond_to? :to_varbind
|
35
|
+
self << varbind_list.to_varbind
|
36
|
+
else
|
37
|
+
varbind_list.each do |item|
|
38
|
+
if item.respond_to? :to_str
|
39
|
+
self << ObjectId.new(item.to_str).to_varbind
|
40
|
+
else
|
41
|
+
self << item.to_varbind
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end
|
39
45
|
end
|
data/test/test_mib.rb
CHANGED
@@ -33,7 +33,13 @@ class TestMib < Test::Unit::TestCase
|
|
33
33
|
|
34
34
|
assert_raise(ArgumentError) {
|
35
35
|
@mib.oid("IF-MIB::")
|
36
|
+
}
|
37
|
+
|
38
|
+
assert_raise(ArgumentError) {
|
39
|
+
MIB.new.oid("sysDescr.0")
|
36
40
|
}
|
41
|
+
|
42
|
+
assert_equal("1.2.3.4", MIB.new.oid("1.2.3.4").to_s)
|
37
43
|
end
|
38
44
|
|
39
45
|
def test_varbind_list
|
metadata
CHANGED
@@ -1,43 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.11
|
3
|
-
specification_version: 1
|
4
2
|
name: snmp
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date: 2006-05-04 00:00:00 -04:00
|
8
|
-
summary: A Ruby implementation of SNMP (the Simple Network Management Protocol).
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: snmp@halliday.ca
|
12
|
-
homepage: http://snmplib.rubyforge.org
|
13
|
-
rubyforge_project: snmplib
|
14
|
-
description: A Ruby implementation of SNMP (the Simple Network Management Protocol).
|
15
|
-
autorequire: snmp
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.0.2
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
6
|
authors:
|
29
7
|
- Dave Halliday
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2007-12-29 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A Ruby implementation of SNMP (the Simple Network Management Protocol).
|
17
|
+
email: hallidave@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
30
24
|
files:
|
31
25
|
- Rakefile
|
32
26
|
- README
|
33
27
|
- setup.rb
|
34
|
-
- lib/snmp.rb
|
35
28
|
- lib/snmp/agent.rb
|
36
29
|
- lib/snmp/ber.rb
|
37
30
|
- lib/snmp/manager.rb
|
38
31
|
- lib/snmp/mib.rb
|
39
32
|
- lib/snmp/pdu.rb
|
40
33
|
- lib/snmp/varbind.rb
|
34
|
+
- lib/snmp.rb
|
41
35
|
- test/test_ber.rb
|
42
36
|
- test/test_manager.rb
|
43
37
|
- test/test_mib.rb
|
@@ -48,9 +42,11 @@ files:
|
|
48
42
|
- test/test_walk.rb
|
49
43
|
- test/if_table1.yaml
|
50
44
|
- test/if_table6.yaml
|
45
|
+
- examples/datetime.rb
|
51
46
|
- examples/dump.rb
|
52
47
|
- examples/get.rb
|
53
48
|
- examples/iftable.rb
|
49
|
+
- examples/link_down.rb
|
54
50
|
- examples/log_traps.rb
|
55
51
|
- examples/set.rb
|
56
52
|
- examples/walk.rb
|
@@ -246,20 +242,34 @@ files:
|
|
246
242
|
- data/ruby/snmp/mibs/VDSL-LINE-MIB.yaml
|
247
243
|
- data/ruby/snmp/mibs/VRRP-MIB.yaml
|
248
244
|
- data/ruby/snmp/mibs/WWW-MIB.yaml
|
249
|
-
|
250
|
-
|
245
|
+
has_rdoc: true
|
246
|
+
homepage: http://snmplib.rubyforge.org
|
247
|
+
post_install_message:
|
251
248
|
rdoc_options:
|
252
249
|
- --main
|
253
250
|
- README
|
254
251
|
- --title
|
255
252
|
- SNMP Library for Ruby
|
256
|
-
|
257
|
-
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
253
|
+
require_paths:
|
254
|
+
- lib
|
255
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - ">="
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: "0"
|
260
|
+
version:
|
261
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
262
|
+
requirements:
|
263
|
+
- - ">="
|
264
|
+
- !ruby/object:Gem::Version
|
265
|
+
version: "0"
|
266
|
+
version:
|
262
267
|
requirements: []
|
263
268
|
|
264
|
-
|
269
|
+
rubyforge_project: snmplib
|
270
|
+
rubygems_version: 1.0.1
|
271
|
+
signing_key:
|
272
|
+
specification_version: 2
|
273
|
+
summary: A Ruby implementation of SNMP (the Simple Network Management Protocol).
|
274
|
+
test_files: []
|
265
275
|
|