snmp4em 0.2.1 → 0.3
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/Gemfile +7 -0
- data/Manifest +19 -6
- data/{README → README.rdoc} +40 -37
- data/Rakefile +17 -0
- data/lib/snmp4em/{snmp_v1.rb → common_requests.rb} +6 -32
- data/lib/snmp4em/extensions/snmp/integer.rb +7 -0
- data/lib/snmp4em/extensions/snmp/ip_address.rb +7 -0
- data/lib/snmp4em/extensions/snmp/null.rb +11 -0
- data/lib/snmp4em/extensions/snmp/object_id.rb +7 -0
- data/lib/snmp4em/extensions/snmp/octet_string.rb +7 -0
- data/lib/snmp4em/extensions/snmp/response_error.rb +17 -0
- data/lib/snmp4em/extensions.rb +6 -0
- data/lib/snmp4em/handler.rb +14 -5
- data/lib/snmp4em/manager.rb +69 -0
- data/lib/snmp4em/requests/snmp_get_request.rb +13 -36
- data/lib/snmp4em/requests/snmp_getbulk_request.rb +7 -21
- data/lib/snmp4em/requests/snmp_getnext_request.rb +11 -39
- data/lib/snmp4em/requests/snmp_set_request.rb +10 -6
- data/lib/snmp4em/requests/snmp_walk_request.rb +51 -67
- data/lib/snmp4em/snmp_request.rb +24 -13
- data/lib/snmp4em/snmp_v2c_requests.rb +25 -0
- data/lib/snmp4em.rb +10 -6
- data/snmp4em.gemspec +15 -22
- data/spec/models/test_message.rb +7 -0
- data/spec/models/test_request.rb +10 -0
- data/spec/models/test_response.rb +7 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/unit/handler_spec.rb +34 -0
- data/spec/unit/manager_spec.rb +82 -0
- metadata +77 -51
- data/lib/snmp4em/common.rb +0 -39
- data/lib/snmp4em/snmp_connection.rb +0 -43
- data/lib/snmp4em/snmp_v2.rb +0 -104
data/Gemfile
ADDED
data/Manifest
CHANGED
@@ -1,16 +1,29 @@
|
|
1
|
-
|
1
|
+
Gemfile
|
2
|
+
README.rdoc
|
2
3
|
Rakefile
|
3
4
|
lib/snmp4em.rb
|
4
|
-
lib/snmp4em/
|
5
|
+
lib/snmp4em/common_requests.rb
|
6
|
+
lib/snmp4em/extensions.rb
|
7
|
+
lib/snmp4em/extensions/snmp/integer.rb
|
8
|
+
lib/snmp4em/extensions/snmp/ip_address.rb
|
9
|
+
lib/snmp4em/extensions/snmp/null.rb
|
10
|
+
lib/snmp4em/extensions/snmp/object_id.rb
|
11
|
+
lib/snmp4em/extensions/snmp/octet_string.rb
|
12
|
+
lib/snmp4em/extensions/snmp/response_error.rb
|
5
13
|
lib/snmp4em/handler.rb
|
14
|
+
lib/snmp4em/manager.rb
|
6
15
|
lib/snmp4em/requests/snmp_get_request.rb
|
7
16
|
lib/snmp4em/requests/snmp_getbulk_request.rb
|
8
17
|
lib/snmp4em/requests/snmp_getnext_request.rb
|
9
18
|
lib/snmp4em/requests/snmp_set_request.rb
|
10
19
|
lib/snmp4em/requests/snmp_walk_request.rb
|
11
|
-
lib/snmp4em/snmp_connection.rb
|
12
20
|
lib/snmp4em/snmp_request.rb
|
13
|
-
lib/snmp4em/
|
14
|
-
|
15
|
-
|
21
|
+
lib/snmp4em/snmp_v2c_requests.rb
|
22
|
+
spec/models/test_message.rb
|
23
|
+
spec/models/test_request.rb
|
24
|
+
spec/models/test_response.rb
|
25
|
+
spec/spec.opts
|
26
|
+
spec/spec_helper.rb
|
27
|
+
spec/unit/handler_spec.rb
|
28
|
+
spec/unit/manager_spec.rb
|
16
29
|
Manifest
|
data/{README → README.rdoc}
RENAMED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
== Summary
|
4
4
|
|
5
|
-
This
|
5
|
+
This gem extends Ruby-SNMP[http://snmplib.rubyforge.org] to use the asynchronous EventMachine[http://rubyeventmachine.com] library for added performance and scalability. This allows code to scale monitoring applications to access a very high number of devices without the need for complex asynchronous I/O handling.
|
6
6
|
|
7
7
|
|
8
8
|
== Features
|
9
9
|
|
10
|
-
|
10
|
+
Version 0.2.1 supports:
|
11
11
|
|
12
12
|
* SNMP v1 and v2 only
|
13
13
|
* SNMP Get, GetNext, GetBulk (v2 only), Set, and Walk requests.
|
@@ -38,27 +38,27 @@ A few definitions:
|
|
38
38
|
|
39
39
|
A simple SNMP-GET:
|
40
40
|
|
41
|
-
EM
|
42
|
-
|
41
|
+
EM.run {
|
42
|
+
snmp = SNMP4EM::Manager.new(:host => "192.168.1.1", :version => :SNMPv1)
|
43
43
|
|
44
|
-
|
44
|
+
request = snmp.get([OID_SYSNAME, OID_SYSLOCATION])
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
request.callback do |response|
|
47
|
+
puts "System name = #{response[OID_SYSNAME]}"
|
48
|
+
puts "System location = #{response[OID_SYSLOCATION]}"
|
49
|
+
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
request.errback do |error|
|
52
|
+
puts "GET got error #{error}"
|
53
|
+
end
|
54
|
+
}
|
55
55
|
|
56
56
|
A simple SNMP-GETNEXT:
|
57
57
|
|
58
|
-
EM
|
59
|
-
snmp = SNMP4EM::
|
58
|
+
EM.run {
|
59
|
+
snmp = SNMP4EM::Manager.new(:host => "192.168.1.1")
|
60
60
|
|
61
|
-
request = snmp.getnext(
|
61
|
+
request = snmp.getnext(OID_SYSNAME)
|
62
62
|
|
63
63
|
request.callback do |response|
|
64
64
|
r = response[OID_SYSNAME]
|
@@ -66,14 +66,14 @@ A simple SNMP-GETNEXT:
|
|
66
66
|
end
|
67
67
|
|
68
68
|
request.errback do |error|
|
69
|
-
puts "
|
69
|
+
puts "GETNEXT got error #{error}"
|
70
70
|
end
|
71
|
-
|
71
|
+
}
|
72
72
|
|
73
73
|
A simple SNMP-SET:
|
74
74
|
|
75
|
-
EM
|
76
|
-
snmp = SNMP4EM::
|
75
|
+
EM.run {
|
76
|
+
snmp = SNMP4EM::Manager.new(:host => "192.168.1.1")
|
77
77
|
|
78
78
|
request = snmp.set({OID_SYSNAME => "My System Name", OID_SYSLOCATION => "My System Location"})
|
79
79
|
|
@@ -92,16 +92,16 @@ A simple SNMP-SET:
|
|
92
92
|
end
|
93
93
|
|
94
94
|
request.errback do |error|
|
95
|
-
puts "
|
95
|
+
puts "SET got error #{error}"
|
96
96
|
end
|
97
|
-
|
97
|
+
}
|
98
98
|
|
99
99
|
A simple SNMP-WALK:
|
100
100
|
|
101
|
-
EM
|
102
|
-
snmp = SNMP4EM::
|
101
|
+
EM.run {
|
102
|
+
snmp = SNMP4EM::Manager.new(:host => "192.168.1.1")
|
103
103
|
|
104
|
-
request = snmp.walk(
|
104
|
+
request = snmp.walk(OID_SYSTEM)
|
105
105
|
|
106
106
|
request.callback do |response|
|
107
107
|
if (response[OID_SYSTEM].is_a? Array)
|
@@ -114,16 +114,16 @@ A simple SNMP-WALK:
|
|
114
114
|
end
|
115
115
|
|
116
116
|
request.errback do |error|
|
117
|
-
puts "
|
117
|
+
puts "WALK got error #{error}"
|
118
118
|
end
|
119
|
-
|
119
|
+
}
|
120
120
|
|
121
121
|
A simple SNMP-GET-BULK:
|
122
122
|
|
123
|
-
EM
|
124
|
-
snmp = SNMP4EM::
|
123
|
+
EM.run {
|
124
|
+
snmp = SNMP4EM::Manager.new(:host => "192.168.1.1")
|
125
125
|
|
126
|
-
request = snmp.getbulk(
|
126
|
+
request = snmp.getbulk(OID_SYSTEM)
|
127
127
|
|
128
128
|
request.callback do |response|
|
129
129
|
if (response[OID_SYSTEM].is_a? Array)
|
@@ -136,21 +136,24 @@ A simple SNMP-GET-BULK:
|
|
136
136
|
end
|
137
137
|
|
138
138
|
request.errback do |error|
|
139
|
-
puts "GET got error #{error}"
|
139
|
+
puts "GET-BULK got error #{error}"
|
140
140
|
end
|
141
|
-
|
141
|
+
}
|
142
142
|
|
143
143
|
== Change Log
|
144
144
|
|
145
|
-
Version 0.1
|
145
|
+
Version 0.2.1:
|
146
146
|
|
147
|
-
*
|
147
|
+
* Code cleanups, speed boosts
|
148
148
|
|
149
149
|
Version 0.2.0:
|
150
150
|
|
151
151
|
* Added support for SNMPv2, including GET-BULK operations
|
152
152
|
|
153
|
-
|
153
|
+
Version 0.1.0:
|
154
|
+
|
155
|
+
* Initial deployment, ability to run get/getnext/set/walk requests in parallel
|
156
|
+
|
157
|
+
== Credits
|
154
158
|
|
155
|
-
Norman Elton
|
156
|
-
normelton@gmail.com
|
159
|
+
Author: Norman Elton normelton@gmail.com
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake"
|
3
|
+
require "echoe"
|
4
|
+
|
5
|
+
gem "rspec", "1.3.0"
|
6
|
+
|
7
|
+
require "spec/rake/spectask"
|
8
|
+
|
9
|
+
Echoe.new("snmp4em", "0.2.1") do |p|
|
10
|
+
p.description = "A high-performance SNMP engine built on EventMachine and Ruby-SNMP"
|
11
|
+
p.url = "http://github.com/normelton/snmp4em"
|
12
|
+
p.author = "Norman Elton"
|
13
|
+
p.email = "normelton@gmail.com"
|
14
|
+
p.development_dependencies = []
|
15
|
+
p.rdoc_pattern = ["lib", "README.rdoc"]
|
16
|
+
p.dependencies = ["snmp"]
|
17
|
+
end
|
@@ -1,25 +1,7 @@
|
|
1
1
|
# The SNMP4EM library
|
2
2
|
|
3
3
|
module SNMP4EM
|
4
|
-
|
5
|
-
attr_reader :community_ro, :community_rw
|
6
|
-
|
7
|
-
# Creates a new object to communicate with SNMPv1 agents. Optionally pass in the following parameters:
|
8
|
-
# * _host_ - IP/hostname of remote agent (default: 127.0.0.1)
|
9
|
-
# * _port_ - UDP port on remote agent (default: 161)
|
10
|
-
# * _community_ - Community string to use (default: public)
|
11
|
-
# * _community_ro_ - Read-only community string to use for get/getnext/walk operations (default: public)
|
12
|
-
# * _community_rw_ - Read-write community string to use for set operations (default: public)
|
13
|
-
# * _timeout_ - Number of seconds to wait before a request times out (default: 1)
|
14
|
-
# * _retries_ - Number of retries before failing (default: 3)
|
15
|
-
|
16
|
-
def initialize(args = {})
|
17
|
-
super(args)
|
18
|
-
|
19
|
-
@community_ro = args[:community_ro] || args[:community] || "public"
|
20
|
-
@community_rw = args[:community_rw] || args[:community] || "public"
|
21
|
-
end
|
22
|
-
|
4
|
+
module CommonRequests
|
23
5
|
# Sends an SNMP-GET request to the remote agent for all OIDs specified in the _oids_ array. Returns a SnmpGetRequest object,
|
24
6
|
# which implements EM::Deferrable. From there, implement a callback/errback to fetch the result. On success, the result will be
|
25
7
|
# a hash, mapping requested OID values to results.
|
@@ -28,9 +10,7 @@ module SNMP4EM
|
|
28
10
|
# * _return_raw_ - Return objects and errors as their raw SNMP types, such as SNMP::Integer instead of native Ruby integers, SNMP::OctetString instead of native Ruby strings, etc. (default: false)
|
29
11
|
|
30
12
|
def get(oids, args = {})
|
31
|
-
|
32
|
-
SnmpConnection.pending_requests << request
|
33
|
-
return request
|
13
|
+
SnmpGetRequest.new(self, oids, args.merge(:version => @version))
|
34
14
|
end
|
35
15
|
|
36
16
|
# Sends an SNMP-GETNEXT request to the remote agent for all OIDs specified in the _oids_ array. Returns a SnmpGetRequest object,
|
@@ -42,9 +22,7 @@ module SNMP4EM
|
|
42
22
|
# * _return_raw_ - Return objects and errors as their raw SNMP types, such as SNMP::Integer instead of native Ruby integers, SNMP::OctetString instead of native Ruby strings, etc. (default: false)
|
43
23
|
|
44
24
|
def getnext(oids, args = {})
|
45
|
-
|
46
|
-
SnmpConnection.pending_requests << request
|
47
|
-
return request
|
25
|
+
SnmpGetNextRequest.new(self, oids, args.merge(:version => @version))
|
48
26
|
end
|
49
27
|
|
50
28
|
# Sends an SNMP-SET request to the remote agent for all OIDs specified in the _oids_ hash. The hash must map OID values to requested
|
@@ -57,9 +35,7 @@ module SNMP4EM
|
|
57
35
|
# * _return_raw_ - Return error objects as SNMP::ResponseError instead of a symbol
|
58
36
|
|
59
37
|
def set(oids, args = {})
|
60
|
-
|
61
|
-
SnmpConnection.pending_requests << request
|
62
|
-
return request
|
38
|
+
SnmpSetRequest.new(self, oids, args.merge(:version => @version))
|
63
39
|
end
|
64
40
|
|
65
41
|
# Sends a series of SNMP-GETNEXT requests to simulate an SNMP "walk" operation. Given an OID prefix, the library will keep requesting the
|
@@ -74,9 +50,7 @@ module SNMP4EM
|
|
74
50
|
# * _max_results_ - Maximum number of results to be returned for any single OID prefix (default: nil = unlimited)
|
75
51
|
|
76
52
|
def walk(oids, args = {})
|
77
|
-
|
78
|
-
SnmpConnection.pending_requests << request
|
79
|
-
return request
|
53
|
+
SnmpWalkRequest.new(self, oids, args.merge(:version => @version))
|
80
54
|
end
|
81
55
|
end
|
82
|
-
end
|
56
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SNMP #:nodoc:
|
2
|
+
|
3
|
+
class ResponseError
|
4
|
+
attr_reader :error_status
|
5
|
+
alias :rubify :error_status #:nodoc:
|
6
|
+
|
7
|
+
def initialize(error_status) #:nodoc:
|
8
|
+
@error_status = error_status
|
9
|
+
end
|
10
|
+
|
11
|
+
# String representation of this error
|
12
|
+
def to_s
|
13
|
+
@error_status.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require "snmp4em/extensions/snmp/integer.rb"
|
2
|
+
require "snmp4em/extensions/snmp/ip_address.rb"
|
3
|
+
require "snmp4em/extensions/snmp/null.rb"
|
4
|
+
require "snmp4em/extensions/snmp/object_id.rb"
|
5
|
+
require "snmp4em/extensions/snmp/octet_string.rb"
|
6
|
+
require "snmp4em/extensions/snmp/response_error.rb"
|
data/lib/snmp4em/handler.rb
CHANGED
@@ -1,18 +1,27 @@
|
|
1
1
|
module SNMP4EM
|
2
|
-
|
2
|
+
class Handler < EventMachine::Connection #:nodoc:
|
3
3
|
def receive_data(data)
|
4
4
|
begin
|
5
5
|
message = SNMP::Message.decode(data)
|
6
6
|
rescue Exception => err
|
7
|
+
# the request that this malformed response corresponds to
|
8
|
+
# will timeout and retry
|
7
9
|
return
|
8
10
|
end
|
9
11
|
|
10
12
|
response = message.pdu
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
request = Manager.pending_requests[response.request_id]
|
14
|
+
|
15
|
+
#
|
16
|
+
# in the event of a timeout retry, the request will have been
|
17
|
+
# pruned from the Manager, so the response is to an expired
|
18
|
+
# request, ignore it.
|
19
|
+
#
|
20
|
+
|
21
|
+
if request
|
22
|
+
request.timeout_timer.cancel
|
14
23
|
request.handle_response(response)
|
15
24
|
end
|
16
25
|
end
|
17
26
|
end
|
18
|
-
end
|
27
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# The SNMP4EM library
|
2
|
+
|
3
|
+
module SNMP4EM
|
4
|
+
class Manager
|
5
|
+
include SNMP4EM::CommonRequests
|
6
|
+
|
7
|
+
#
|
8
|
+
# @pending_requests maps a request's id to its SnmpRequest
|
9
|
+
#
|
10
|
+
@pending_requests = {}
|
11
|
+
@socket = nil
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_reader :pending_requests
|
15
|
+
attr_reader :socket
|
16
|
+
|
17
|
+
def init_socket #:nodoc:
|
18
|
+
# When the socket is in error state, close the socket and re-open a new one.
|
19
|
+
if !@socket.nil? && @socket.error?
|
20
|
+
@socket.close_connection
|
21
|
+
@socket = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
@socket ||= EM::open_datagram_socket("0.0.0.0", 0, Handler)
|
25
|
+
end
|
26
|
+
|
27
|
+
def track_request(request)
|
28
|
+
@pending_requests.delete(request.snmp_id)
|
29
|
+
|
30
|
+
begin
|
31
|
+
request.snmp_id = rand(2**31) # Largest SNMP Signed INTEGER
|
32
|
+
end while @pending_requests[request.snmp_id]
|
33
|
+
|
34
|
+
@pending_requests[request.snmp_id] = request
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :host, :port, :timeout, :retries, :version, :community_ro, :community_rw
|
39
|
+
|
40
|
+
# Creates a new object to communicate with SNMPv1 agents. Optionally pass in the following parameters:
|
41
|
+
# * _host_ - IP/hostname of remote agent (default: 127.0.0.1)
|
42
|
+
# * _port_ - UDP port on remote agent (default: 161)
|
43
|
+
# * _community_ - Community string to use (default: public)
|
44
|
+
# * _community_ro_ - Read-only community string to use for get/getnext/walk operations (default: public)
|
45
|
+
# * _community_rw_ - Read-write community string to use for set operations (default: public)
|
46
|
+
# * _timeout_ - Number of seconds to wait before a request times out (default: 1)
|
47
|
+
# * _retries_ - Number of retries before failing (default: 3)
|
48
|
+
|
49
|
+
def initialize(args = {})
|
50
|
+
@host = args[:host] || "127.0.0.1"
|
51
|
+
@port = args[:port] || 161
|
52
|
+
@timeout = args[:timeout] || 1
|
53
|
+
@retries = args[:retries] || 3
|
54
|
+
@version = args[:version] || :SNMPv2c
|
55
|
+
|
56
|
+
self.extend SNMPv2cRequests if @version == :SNMPv2c
|
57
|
+
|
58
|
+
@community_ro = args[:community_ro] || args[:community] || "public"
|
59
|
+
@community_rw = args[:community_rw] || args[:community] || "public"
|
60
|
+
|
61
|
+
self.class.init_socket
|
62
|
+
end
|
63
|
+
|
64
|
+
def send(message) #:nodoc:
|
65
|
+
self.class.socket.send_datagram message.encode, @host, @port
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -1,38 +1,22 @@
|
|
1
1
|
module SNMP4EM
|
2
2
|
|
3
|
-
#
|
4
|
-
# or errback() to retrieve the results.
|
3
|
+
# This implements EM::Deferrable, so you can hang a callback() or errback() to retrieve the results.
|
5
4
|
|
6
5
|
class SnmpGetRequest < SnmpRequest
|
7
|
-
|
6
|
+
attr_accessor :snmp_id
|
8
7
|
|
9
8
|
# For an SNMP-GET request, @pending_oids will be a ruby array of SNMP::ObjectNames that need to be fetched. As
|
10
9
|
# responses come back from the agent, this array will be pruned of any error-producing OIDs. Once no errors
|
11
10
|
# are returned, the @responses hash will be populated and returned.
|
12
11
|
|
13
|
-
def initialize(sender, oids, args = {}) #:nodoc:
|
14
|
-
@sender = sender
|
15
|
-
|
16
|
-
@timeout_timer = nil
|
17
|
-
@timeout_retries = @sender.retries
|
18
|
-
@error_retries = oids.size
|
19
|
-
|
20
|
-
@version = args[:version] || :SNMPv1
|
21
|
-
@return_raw = args[:return_raw] || false
|
22
|
-
|
23
|
-
@responses = Hash.new
|
24
|
-
@pending_oids = SNMP::VarBindList.new(oids).collect{|r| r.name}
|
25
|
-
|
26
|
-
init_callbacks
|
27
|
-
send
|
28
|
-
end
|
29
|
-
|
30
12
|
def handle_response(response) #:nodoc:
|
31
|
-
if
|
13
|
+
if response.error_status == :noError
|
32
14
|
# No errors, populate the @responses object so it can be returned
|
33
15
|
response.each_varbind do |vb|
|
34
16
|
request_oid = @pending_oids.shift
|
35
|
-
@
|
17
|
+
value = @return_raw || !vb.value.respond_to?(:rubify) ? vb.value : vb.value.rubify
|
18
|
+
|
19
|
+
@responses[request_oid.to_s] = value
|
36
20
|
end
|
37
21
|
|
38
22
|
else
|
@@ -40,17 +24,10 @@ module SNMP4EM
|
|
40
24
|
error_oid = @pending_oids.delete_at(response.error_index - 1)
|
41
25
|
@responses[error_oid.to_s] = SNMP::ResponseError.new(response.error_status)
|
42
26
|
end
|
43
|
-
|
44
|
-
if
|
45
|
-
|
46
|
-
|
47
|
-
@responses[error_oid.to_s] = SNMP::ResponseError.new(:genErr)
|
48
|
-
end
|
49
|
-
|
50
|
-
@responses.each_pair do |oid, value|
|
51
|
-
@responses[oid] = value.rubify if (!@return_raw && value.respond_to?(:rubify))
|
52
|
-
end
|
53
|
-
|
27
|
+
|
28
|
+
if @error_retries < 0
|
29
|
+
fail "exhausted all retries"
|
30
|
+
elsif @pending_oids.empty?
|
54
31
|
# Send the @responses back to the requester, we're done!
|
55
32
|
succeed @responses
|
56
33
|
else
|
@@ -62,13 +39,13 @@ module SNMP4EM
|
|
62
39
|
private
|
63
40
|
|
64
41
|
def send
|
65
|
-
|
42
|
+
Manager.track_request(self)
|
66
43
|
|
67
|
-
|
44
|
+
# Send the contents of @pending_oids
|
68
45
|
|
69
46
|
vb_list = SNMP::VarBindList.new(@pending_oids)
|
70
47
|
request = SNMP::GetRequest.new(@snmp_id, vb_list)
|
71
|
-
message = SNMP::Message.new(@version, @sender.community_ro, request)
|
48
|
+
message = SNMP::Message.new(@sender.version, @sender.community_ro, request)
|
72
49
|
|
73
50
|
super(message)
|
74
51
|
end
|
@@ -1,37 +1,23 @@
|
|
1
1
|
module SNMP4EM
|
2
2
|
|
3
|
-
#
|
4
|
-
# or errback() to retrieve the results.
|
3
|
+
# This implements EM::Deferrable, so you can hang a callback() or errback() to retrieve the results.
|
5
4
|
|
6
5
|
class SnmpGetBulkRequest < SnmpRequest
|
7
|
-
|
6
|
+
attr_accessor :snmp_id
|
8
7
|
|
9
8
|
# For an SNMP-GETBULK request, @pending_oids will be a ruby array of SNMP::ObjectNames that need to be fetched. As
|
10
9
|
# responses come back from the agent, this array will be pruned of any error-producing OIDs. Once no errors
|
11
10
|
# are returned, the @responses hash will be populated and returned.
|
12
11
|
|
13
12
|
def initialize(sender, oids, args = {}) #:nodoc:
|
14
|
-
@sender = sender
|
15
|
-
|
16
|
-
@timeout_timer = nil
|
17
|
-
@timeout_retries = @sender.retries
|
18
|
-
@error_retries = oids.size
|
19
|
-
|
20
|
-
@version = args[:version] || :SNMPv2c
|
21
|
-
@return_raw = args[:return_raw] || false
|
22
|
-
|
23
13
|
@nonrepeaters = args[:nonrepeaters] || 0
|
24
14
|
@maxrepetitions = args[:maxrepetitions] || 10
|
25
15
|
|
26
|
-
|
27
|
-
@pending_oids = SNMP::VarBindList.new(oids).collect{|r| r.name}
|
28
|
-
|
29
|
-
init_callbacks
|
30
|
-
send
|
16
|
+
super
|
31
17
|
end
|
32
18
|
|
33
19
|
def handle_response(response) #:nodoc:
|
34
|
-
if
|
20
|
+
if response.error_status == :noError
|
35
21
|
# No errors, populate the @responses object so it can be returned
|
36
22
|
|
37
23
|
@nonrepeaters.times do |i|
|
@@ -85,9 +71,9 @@ module SNMP4EM
|
|
85
71
|
private
|
86
72
|
|
87
73
|
def send
|
88
|
-
|
74
|
+
Manager.track_request(self)
|
89
75
|
|
90
|
-
|
76
|
+
# Send the contents of @pending_oids
|
91
77
|
|
92
78
|
vb_list = SNMP::VarBindList.new(@pending_oids)
|
93
79
|
request = SNMP::GetBulkRequest.new(@snmp_id, vb_list)
|
@@ -95,7 +81,7 @@ module SNMP4EM
|
|
95
81
|
request.max_repetitions = @maxrepetitions
|
96
82
|
request.non_repeaters = @nonrepeaters
|
97
83
|
|
98
|
-
message = SNMP::Message.new(@version, @sender.community_ro, request)
|
84
|
+
message = SNMP::Message.new(@sender.version, @sender.community_ro, request)
|
99
85
|
|
100
86
|
super(message)
|
101
87
|
end
|