net-snmp 0.1.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.
data/net-snmp.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "net/snmp/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "net-snmp"
7
+ s.version = Net::Snmp::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ron McClain"]
10
+ s.email = ["mixtli@github.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Object oriented wrapper around C net-snmp libraries}
13
+ s.description = %q{Uses ffi to create an object oriented wrapper around C net-snmp libraries}
14
+
15
+ s.rubyforge_project = "net-snmp"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "eventmachine"
23
+ s.add_dependency "nice-ffi"
24
+ end
data/spec/mib_spec.rb ADDED
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Net::SNMP::MIB::Node do
4
+ it "should get info for sysDescr" do
5
+ node = Net::SNMP::MIB::Node.get_node("sysDescr")
6
+ node.label.should eq("sysDescr")
7
+ end
8
+
9
+ it "should get parent" do
10
+ node = Net::SNMP::MIB::Node.get_node("sysDescr")
11
+ node.parent.label.should eq("system")
12
+ # puts node.parent.inspect
13
+ end
14
+
15
+ it "should get children" do
16
+ node = Net::SNMP::MIB::Node.get_node("system")
17
+ node.children.each do |c|
18
+ # puts c.inspect
19
+ end
20
+ end
21
+
22
+ it "should get siblings" do
23
+ node = Net::SNMP::MIB::Node.get_node("sysDescr")
24
+ node.siblings.should include{|n| n.label == "sysName"}
25
+ puts node.siblings.map(&:label)
26
+ end
27
+
28
+ it "should get oid" do
29
+ node = Net::SNMP::MIB::Node.get_node("sysDescr")
30
+ puts node.struct.inspect
31
+ node.oid.should eq("1.3.6.1.2.1.1.1")
32
+ end
33
+
34
+ it "should get by oid" do
35
+ node = Net::SNMP::MIB::Node.get_node("1.3.6.1.2.1.1.1")
36
+ node.label.should eq("sysDescr")
37
+ end
38
+
39
+ it "should do stuff" do
40
+ node = Net::SNMP::MIB::Node.get_node("ipAdEntIfIndex")
41
+ puts node.inspect
42
+ puts node.struct.inspect
43
+ end
44
+
45
+ end
@@ -0,0 +1,202 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "NetSnmp" do
4
+ it "should get single oid" do
5
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
6
+ result = sess.get("sysDescr.0")
7
+ result.varbinds.first.value.should eql("test.net-snmp.org")
8
+ end
9
+ end
10
+
11
+ it "should get multiple oids" do
12
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => 'demopublic' ) do |sess|
13
+ result = sess.get(["sysDescr.0", "sysName.0"])
14
+ result.varbinds[0].value.should eql("test.net-snmp.org")
15
+ result.varbinds[1].value.should eql("test.net-snmp.org")
16
+ end
17
+ end
18
+
19
+ it "should get multiple requests asynchronously" do
20
+ did_callback = false
21
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |s|
22
+ s.get(["sysDescr.0", "sysContact.0"]) do |result|
23
+ puts "in callback"
24
+ did_callback = true
25
+ result.varbinds[0].value.should eql("test.net-snmp.org")
26
+ result.varbinds[1].value.should match(/Coders/)
27
+ end
28
+ end
29
+ Net::SNMP.dispatcher(false)
30
+ did_callback.should be(true)
31
+ end
32
+
33
+
34
+
35
+
36
+ it "should get an oid asynchronously in a thread" do
37
+ did_callback = false
38
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |s|
39
+ s.get(["sysDescr.0", "sysContact.0"]) do |result|
40
+ puts "in callback"
41
+ did_callback = true
42
+ result.varbinds[0].value.should eql("test.net-snmp.org")
43
+ result.varbinds[1].value.should match(/Coders/)
44
+ end
45
+ end
46
+ Thread.new do
47
+ while Net::SNMP.dispatcher == 0
48
+ sleep 1
49
+ end
50
+ end.join
51
+ did_callback.should be(true)
52
+ end
53
+
54
+
55
+ it "invalid oid should return error" do
56
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
57
+ result = sess.get(["XXXsysDescr.0"]) #misspelled
58
+ result.should be_error
59
+ end
60
+ end
61
+
62
+ it "should get using snmpv3" do
63
+ Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :version => 3, :username => 'MD5User', :security_level => Net::SNMP::Constants::SNMP_SEC_LEVEL_AUTHNOPRIV, :auth_protocol => :md5, :password => 'The Net-SNMP Demo Password') do |sess|
64
+ result = sess.get("sysDescr.0")
65
+ result.varbinds.first.value.should eql('test.net-snmp.org')
66
+ end
67
+ end
68
+
69
+ it "should get async using snmpv3" do
70
+ did_callback = false
71
+ Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :version => 3, :username => 'MD5User',:security_level => Net::SNMP::Constants::SNMP_SEC_LEVEL_AUTHNOPRIV, :auth_protocol => :md5, :password => 'The Net-SNMP Demo Password') do |sess|
72
+ sess.get(["sysDescr.0", "sysName.0"]) do |result|
73
+ did_callback = true
74
+ result.varbinds[0].value.should eql('test.net-snmp.org')
75
+ result.varbinds[1].value.should eql('test.net-snmp.org')
76
+ 0
77
+ end
78
+ sleep(1)
79
+ Net::SNMP.dispatcher()
80
+ did_callback.should be(true)
81
+ end
82
+ end
83
+
84
+
85
+ # To test sets, you have to have a local snmpd running with write permissions
86
+ it "should set a value" do
87
+ Net::SNMP::Session.open(:peername => '127.0.0.1', :version => 1) do |sess|
88
+ result = sess.set([['sysContact.0', Net::SNMP::Constants::ASN_OCTET_STR, 'yomama']])
89
+ result.varbinds.first.value.should match(/yomama/)
90
+ result.should_not be_error
91
+ end
92
+ end
93
+
94
+ #it "should set using snmpv3" do
95
+ # pending
96
+ # Net::SNMP::Session.open(:peername => '127.0.0.1', :version => 3, :username => 'myuser', :authprotocol => :sha1, :authkey => '0x1234', :privprotocol => :des, :privkey => '0x25252') do |sess|
97
+ # result = sess.set([["sysDescr.0", Net::SNMP::Constants::ASN_OCTET_STR, 'yomama']])
98
+ # result.varbinds.first.value.should match(/Darwin/)
99
+ # end
100
+ #end
101
+
102
+ it "should get next an array of oids" do
103
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
104
+ result = sess.get_next(["sysUpTimeInstance.0"])
105
+ result.varbinds.first.name.should eql("1.3.6.1.2.1.1.4.0")
106
+ result.varbinds.first.value.should match(/Net-SNMP Coders/)
107
+ end
108
+ end
109
+
110
+
111
+ it "should get_bulk_request" do
112
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org" , :version => '2c', :community => 'demopublic') do |sess|
113
+ result = sess.get_bulk(["sysContact.0"], :max_repetitions => 10)
114
+ result.varbinds.first.oid.should eql("1.3.6.1.2.1.1.5.0")
115
+ result.varbinds.first.value.should eql("test.net-snmp.org")
116
+ end
117
+ end
118
+
119
+ it "should get a table of values"
120
+
121
+ it "should work in event_machine" do
122
+ require 'eventmachine'
123
+ did_callback = false
124
+ EM.run do
125
+ tickloop = EM.tick_loop do
126
+ Net::SNMP.dispatcher
127
+ end
128
+
129
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |s|
130
+ s.get("sysDescr.0") do |result|
131
+ did_callback = true
132
+ result.varbinds[0].value.should eql("test.net-snmp.org")
133
+ end
134
+
135
+ end
136
+
137
+ EM.add_timer(2) do
138
+ puts "in timer"
139
+ did_callback.should be_true
140
+ EM.stop
141
+ end
142
+ end
143
+ end
144
+
145
+ it "should work in a fiber" do
146
+ require 'eventmachine'
147
+ did_callback = false
148
+ EM.run do
149
+ tickloop = EM.tick_loop do
150
+ Net::SNMP.dispatcher
151
+ end
152
+
153
+ Fiber.new {
154
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |s|
155
+ s.get("sysDescr.0") do |result|
156
+ did_callback = true
157
+ puts "INHERERERERERERE"
158
+ puts result.inspect
159
+ result.varbinds[0].value.should eql("test.net-snmp.org")
160
+ end
161
+
162
+ end
163
+
164
+ EM.add_timer(2) do
165
+ puts "in timer"
166
+ did_callback.should eql(true)
167
+ EM.stop
168
+ end
169
+ }.resume
170
+ end
171
+ end
172
+
173
+
174
+
175
+ it "get should work in a fiber with synchronous calling style" do
176
+ require 'eventmachine'
177
+ did_callback = false
178
+ EM.run do
179
+ puts "em fiber = #{Fiber.current.inspect}"
180
+ Fiber.new {
181
+ puts "inner fiber = #{Fiber.current.inspect}"
182
+
183
+ EM.tick_loop do
184
+ #puts "tick_fiber = #{Fiber.current.inspect}"
185
+
186
+ Net::SNMP.dispatcher
187
+ end
188
+ sleep 1
189
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic')
190
+ puts "calling aget"
191
+ result = session.get("sysDescr.0")
192
+ result.varbinds[0].value.should eql("test.net-snmp.org")
193
+
194
+
195
+ }.resume
196
+ EM.stop
197
+ end
198
+
199
+ end
200
+
201
+
202
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'net-snmp'
4
+ require 'rspec'
5
+ require 'rspec/autorun'
6
+
7
+ #Spec::Runner.configure do |config|
8
+
9
+ #end
@@ -0,0 +1,83 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Net::SNMP::Wrapper" do
4
+ def init_session
5
+ community = "demopublic"
6
+ peername = "test.net-snmp.org"
7
+
8
+ sess = Net::SNMP::Wrapper::SnmpSession.new
9
+ Net::SNMP::Wrapper.snmp_sess_init(sess.pointer)
10
+ sess.community = FFI::MemoryPointer.new(:pointer, community.length + 1)
11
+ #sess.community.autorelease = false
12
+ sess.community.write_string(community)
13
+ sess.community_len = community.length
14
+ sess.peername = FFI::MemoryPointer.new(:pointer, peername.length + 1)
15
+ #sess.peername.autorelease = false
16
+ sess.peername.write_string(peername)
17
+ sess.version = Net::SNMP::SNMP_VERSION_1
18
+
19
+ @handle = Net::SNMP::Wrapper.snmp_sess_open(sess.pointer)
20
+ Net::SNMP::Wrapper.snmp_sess_session(@handle)
21
+
22
+ sess
23
+ end
24
+
25
+ def make_pdu
26
+ pdu_ptr = Net::SNMP::Wrapper.snmp_pdu_create(Net::SNMP::SNMP_MSG_GET)
27
+ pdu = Net::SNMP::Wrapper::SnmpPdu.new(pdu_ptr)
28
+ anOID = FFI::MemoryPointer.new(:ulong, Net::SNMP::MAX_OID_LEN)
29
+ anOIDLen = FFI::MemoryPointer.new(:size_t)
30
+ anOIDLen.write_int(Net::SNMP::MAX_OID_LEN)
31
+ Net::SNMP::Wrapper.snmp_parse_oid("sysDescr.0", anOID, anOIDLen)
32
+ Net::SNMP::Wrapper.snmp_add_null_var(pdu.pointer, anOID, anOIDLen.read_int)
33
+ pdu
34
+ end
35
+
36
+ it "wrapper should snmpget synchronously" do
37
+ #pending
38
+ sess = init_session
39
+ sess = Net::SNMP::Wrapper.snmp_open(sess.pointer)
40
+
41
+ pdu = make_pdu
42
+
43
+ response_ptr = FFI::MemoryPointer.new(:pointer)
44
+ #response_ptr.autorelease = false
45
+ status = Net::SNMP::Wrapper.snmp_sess_synch_response(@handle, pdu.pointer, response_ptr)
46
+ status.should eql(0)
47
+
48
+ response = Net::SNMP::Wrapper::SnmpPdu.new(response_ptr.read_pointer)
49
+ value = response.variables.val[:string].read_string
50
+ puts "val_len = #{response.variables.val_len}"
51
+ value.should eql('test.net-snmp.org')
52
+ end
53
+
54
+ it "wrapper should snmpget asynchronously" do
55
+ pending
56
+ sess = init_session
57
+ pdu = make_pdu
58
+ did_callback = 0
59
+ result = nil
60
+ sess.callback = lambda do |operation, session, reqid, pdu_ptr, magic|
61
+ did_callback = 1
62
+ pdu = Net::SNMP::Wrapper::SnmpPdu.new(pdu_ptr)
63
+ variables = Net::SNMP::Wrapper::VariableList.new(pdu.variables)
64
+ result = variables.val[:string].read_string
65
+ 0
66
+ end
67
+ sess = Net::SNMP::Wrapper.snmp_open(sess.pointer)
68
+ Net::SNMP::Wrapper.snmp_send(sess.pointer, pdu)
69
+
70
+ fdset = Net::SNMP::Wrapper.get_fd_set
71
+ fds = FFI::MemoryPointer.new(:int)
72
+ #fds.autorelease = false
73
+ tval = Net::SNMP::Wrapper::TimeVal.new
74
+ block = FFI::MemoryPointer.new(:int)
75
+ #block.autorelease = false
76
+ block.write_int(1)
77
+ Net::SNMP::Wrapper.snmp_select_info(fds, fdset, tval.pointer, block )
78
+ Net::SNMP::Wrapper.select(fds.read_int, fdset, nil, nil, nil)
79
+ Net::SNMP::Wrapper.snmp_read(fdset)
80
+ did_callback.should be(1)
81
+ result.should eql('test.net-snmp.org')
82
+ end
83
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: net-snmp
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Ron McClain
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-03-24 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: eventmachine
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: nice-ffi
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :runtime
58
+ version_requirements: *id003
59
+ description: Uses ffi to create an object oriented wrapper around C net-snmp libraries
60
+ email:
61
+ - mixtli@github.com
62
+ executables:
63
+ - snmpget.rb
64
+ extensions: []
65
+
66
+ extra_rdoc_files: []
67
+
68
+ files:
69
+ - .document
70
+ - .gitignore
71
+ - .rspec
72
+ - Gemfile
73
+ - LICENSE
74
+ - README.rdoc
75
+ - Rakefile
76
+ - VERSION
77
+ - bin/snmpget.rb
78
+ - c/Makefile
79
+ - c/test
80
+ - c/test.c
81
+ - interface/snmp_api.h
82
+ - interface/snmp_api.i
83
+ - interface/snmp_api_wrap.xml
84
+ - lib/net-snmp.rb
85
+ - lib/net/snmp.rb
86
+ - lib/net/snmp/constants.rb
87
+ - lib/net/snmp/error.rb
88
+ - lib/net/snmp/inline.rb
89
+ - lib/net/snmp/mib.rb
90
+ - lib/net/snmp/mib/node.rb
91
+ - lib/net/snmp/oid.rb
92
+ - lib/net/snmp/pdu.rb
93
+ - lib/net/snmp/session.rb
94
+ - lib/net/snmp/varbind.rb
95
+ - lib/net/snmp/version.rb
96
+ - lib/net/snmp/wrapper.rb
97
+ - net-snmp.gemspec
98
+ - spec/mib_spec.rb
99
+ - spec/net-snmp_spec.rb
100
+ - spec/spec_helper.rb
101
+ - spec/wrapper_spec.rb
102
+ has_rdoc: true
103
+ homepage: ""
104
+ licenses: []
105
+
106
+ post_install_message:
107
+ rdoc_options: []
108
+
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ segments:
125
+ - 0
126
+ version: "0"
127
+ requirements: []
128
+
129
+ rubyforge_project: net-snmp
130
+ rubygems_version: 1.3.7
131
+ signing_key:
132
+ specification_version: 3
133
+ summary: Object oriented wrapper around C net-snmp libraries
134
+ test_files:
135
+ - spec/mib_spec.rb
136
+ - spec/net-snmp_spec.rb
137
+ - spec/spec_helper.rb
138
+ - spec/wrapper_spec.rb