net-snmp2 0.3.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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +20 -0
  6. data/README.md +28 -0
  7. data/Rakefile +24 -0
  8. data/TODO.md +6 -0
  9. data/bin/mib2rb +129 -0
  10. data/bin/net-snmp2 +64 -0
  11. data/examples/agent.rb +104 -0
  12. data/examples/manager.rb +11 -0
  13. data/examples/trap_handler.rb +46 -0
  14. data/examples/v1_trap_session.rb +24 -0
  15. data/examples/v2_trap_session.rb +21 -0
  16. data/lib/net-snmp2.rb +85 -0
  17. data/lib/net/snmp.rb +27 -0
  18. data/lib/net/snmp/agent/agent.rb +48 -0
  19. data/lib/net/snmp/agent/provider.rb +51 -0
  20. data/lib/net/snmp/agent/provider_dsl.rb +124 -0
  21. data/lib/net/snmp/agent/request_dispatcher.rb +38 -0
  22. data/lib/net/snmp/constants.rb +287 -0
  23. data/lib/net/snmp/debug.rb +54 -0
  24. data/lib/net/snmp/dispatcher.rb +108 -0
  25. data/lib/net/snmp/error.rb +29 -0
  26. data/lib/net/snmp/listener.rb +76 -0
  27. data/lib/net/snmp/message.rb +142 -0
  28. data/lib/net/snmp/mib/mib.rb +67 -0
  29. data/lib/net/snmp/mib/module.rb +39 -0
  30. data/lib/net/snmp/mib/node.rb +122 -0
  31. data/lib/net/snmp/mib/templates.rb +48 -0
  32. data/lib/net/snmp/oid.rb +134 -0
  33. data/lib/net/snmp/pdu.rb +235 -0
  34. data/lib/net/snmp/repl/manager_repl.rb +243 -0
  35. data/lib/net/snmp/session.rb +560 -0
  36. data/lib/net/snmp/trap_handler/trap_handler.rb +42 -0
  37. data/lib/net/snmp/trap_handler/v1_trap_dsl.rb +44 -0
  38. data/lib/net/snmp/trap_handler/v2_trap_dsl.rb +38 -0
  39. data/lib/net/snmp/trap_session.rb +92 -0
  40. data/lib/net/snmp/utility.rb +10 -0
  41. data/lib/net/snmp/varbind.rb +57 -0
  42. data/lib/net/snmp/version.rb +5 -0
  43. data/lib/net/snmp/wrapper.rb +450 -0
  44. data/net-snmp2.gemspec +30 -0
  45. data/spec/README.md +105 -0
  46. data/spec/async_spec.rb +123 -0
  47. data/spec/em_spec.rb +23 -0
  48. data/spec/error_spec.rb +34 -0
  49. data/spec/fiber_spec.rb +41 -0
  50. data/spec/mib_spec.rb +68 -0
  51. data/spec/net-snmp_spec.rb +18 -0
  52. data/spec/oid_spec.rb +21 -0
  53. data/spec/spec_helper.rb +10 -0
  54. data/spec/sync_spec.rb +132 -0
  55. data/spec/thread_spec.rb +19 -0
  56. data/spec/trap_spec.rb +45 -0
  57. data/spec/utility_spec.rb +10 -0
  58. data/spec/wrapper_spec.rb +69 -0
  59. metadata +166 -0
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Net::SNMP::OID do
4
+ it "should instantiate valid oid with numeric" do
5
+ oid = Net::SNMP::OID.new("1.3.6.1.2.1.2.1.0")
6
+ oid.to_s.should eql("1.3.6.1.2.1.2.1.0")
7
+ oid.label.should eql("ifNumber.0")
8
+ end
9
+
10
+ it "should instantiate valid oid with string" do
11
+ oid = Net::SNMP::OID.new("ifNumber.0")
12
+ oid.to_s.should eql("1.3.6.1.2.1.2.1.0")
13
+ oid.label.should eql("ifNumber.0")
14
+ end
15
+
16
+ it "should to_s correctly" do
17
+ oid_str = "1.3.6.1.2.1.2.1.0"
18
+ oid = Net::SNMP::OID.new(oid_str)
19
+ oid.to_s.should eq(oid_str)
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'net-snmp2'
5
+ require 'rspec'
6
+
7
+ # Trap tests fail randomly due to race conditions,
8
+ # setting thread_safe should fix this
9
+ Net::SNMP::thread_safe = true
10
+ Net::SNMP.init
@@ -0,0 +1,132 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "synchronous calls" do
4
+ context "version 1" do
5
+ it "get should succeed" do
6
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
7
+ result = sess.get("sysDescr.0")
8
+ result.varbinds.first.value.should eql("test.net-snmp.org")
9
+ end
10
+ end
11
+
12
+ it "multiple calls within session should succeed" do
13
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
14
+ result = sess.get("sysDescr.0")
15
+ result.varbinds.first.value.should eql("test.net-snmp.org")
16
+ second = sess.get("sysName.0")
17
+ second.varbinds.first.value.should eql("test.net-snmp.org")
18
+ end
19
+ end
20
+
21
+ it "get should succeed with multiple oids" do
22
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => 'demopublic' ) do |sess|
23
+ result = sess.get(["sysDescr.0", "sysName.0"])
24
+ result.varbinds[0].value.should eql("test.net-snmp.org")
25
+ result.varbinds[1].value.should eql("test.net-snmp.org")
26
+ end
27
+ end
28
+
29
+ it "set should succeed" do
30
+ Net::SNMP::Session.open(:peername => 'localhost', :version => 1, :community => 'private') do |sess|
31
+ result = sess.set([['sysContact.0', Net::SNMP::Constants::ASN_OCTET_STR, 'newContact']])
32
+ result.varbinds.first.value.should match(/newContact/)
33
+ end
34
+ end
35
+
36
+ it "getnext should succeed" do
37
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
38
+ result = sess.get_next(["sysUpTimeInstance.0"])
39
+ result.varbinds.first.oid.oid.should eql("1.3.6.1.2.1.1.4.0")
40
+ result.varbinds.first.value.should match(/Net-SNMP Coders/)
41
+ end
42
+ end
43
+
44
+ it "getbulk should succeed" do
45
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org" , :version => '2c', :community => 'demopublic') do |sess|
46
+ result = sess.get_bulk(["sysContact.0"], :max_repetitions => 10)
47
+ result.varbinds.first.oid.name.should eql("1.3.6.1.2.1.1.5.0")
48
+ result.varbinds.first.value.should eql("test.net-snmp.org")
49
+ end
50
+ end
51
+
52
+ it "getbulk should succeed with multiple oids" do
53
+ Net::SNMP::Session.open(:peername => "localhost" , :version => '2c', :community => 'public') do |sess|
54
+ result = sess.get_bulk(["ifIndex", "ifType"], :max_repetitions =>3)
55
+ result.varbinds.size.should eql(6)
56
+ end
57
+ end
58
+
59
+ it "rasises an when a non-existant MIB variable is requested" do
60
+ Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" ) do |sess|
61
+ expect { sess.get(["XXXsysDescr.0"]) }.to raise_error
62
+ end
63
+ end
64
+
65
+ it "get_table should work" do
66
+ session = Net::SNMP::Session.open(:peername => "localhost", :version => '1')
67
+ table = session.table("ifEntry")
68
+ table['1']['ifIndex'].should eql(1)
69
+ table['2']['ifIndex'].should eql(2)
70
+ end
71
+
72
+ it "walk should work" do
73
+ session = Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :version => 1, :community => 'demopublic')
74
+ results = session.walk("system")
75
+ results['1.3.6.1.2.1.1.1.0'].should match(/test.net-snmp.org/)
76
+ end
77
+
78
+ it "walk should work with multiple oids" do
79
+ Net::SNMP::Session.open(:peername => 'localhost', :version => 1) do |sess|
80
+ sess.walk(['system', 'ifTable']) do |results|
81
+ # Set earlier. Yes, I know, tests shouldn't depend on eachother...
82
+ results['1.3.6.1.2.1.1.4.0'].should match(/newContact/)
83
+ # ifIndex (Should just be returning the same number as the instance requested)
84
+ results['1.3.6.1.2.1.2.2.1.1.2'].should eql(2)
85
+ end
86
+ end
87
+ end
88
+
89
+ it "get_columns should work" do
90
+ Net::SNMP::Session.open(:peername => 'localhost') do |sess|
91
+ table = sess.columns(['ifIndex', 'ifDescr', 'ifType'])
92
+ table['1']['ifIndex'].should eql(1)
93
+ table['2']['ifDescr'].should match(/[a-zA-Z]{3}[0-9]/)
94
+ end
95
+ end
96
+
97
+ it "get a value with oid type should work" do
98
+ Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |sess|
99
+ res = sess.get("sysObjectID.0")
100
+ res.varbinds.first.value.to_s.should eql('1.3.6.1.4.1.8072.3.2.10')
101
+ end
102
+ end
103
+ end
104
+
105
+ context "version 2" do
106
+
107
+ end
108
+
109
+ context "version 3" do
110
+ it "should get using snmpv3" do
111
+ 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|
112
+ result = sess.get("sysDescr.0")
113
+ result.varbinds.first.value.should eql('test.net-snmp.org')
114
+ end
115
+ end
116
+ it "should set using snmpv3" do
117
+ pending
118
+ Net::SNMP::Session.open(:peername => 'localhost', :version => 3, :username => 'myuser', :auth_protocol => :sha1, :password => '0x1234') do |sess|
119
+ result = sess.set([["sysDescr.0", Net::SNMP::Constants::ASN_OCTET_STR, 'yomama']])
120
+ result.varbinds.first.value.should match(/Darwin/)
121
+ end
122
+ end
123
+
124
+ it "should get using authpriv" do
125
+ pending
126
+ Net::SNMP::Session.open(:peername => 'localhost', :version => 3, :username => 'mixtli', :security_level => Net::SNMP::Constants::SNMP_SEC_LEVEL_AUTHPRIV, :auth_protocol => :md5, :priv_protocol => :des, :auth_password => 'testauth', :priv_password => 'testpass') do |sess|
127
+ result = sess.get("sysDescr.0")
128
+ result.varbinds.first.value.should match(/xenu/)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "in a thread" do
4
+ it "should get an oid asynchronously in a thread" do
5
+ did_callback = false
6
+ dispatch_thread = Net::SNMP::Dispatcher.thread_loop
7
+ Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |s|
8
+ s.get(["sysDescr.0", "sysContact.0"]) do |op, result|
9
+ did_callback = true
10
+ result.varbinds[0].value.should eql("test.net-snmp.org")
11
+ result.varbinds[1].value.should match(/Coders/)
12
+ end
13
+ end
14
+ sleep 3
15
+ did_callback.should be(true)
16
+
17
+ Thread.kill(dispatch_thread)
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ # NOTE: Run a trap receiver on port 163 for these tests to pass.
4
+ # (I'm using MIB Browser's builtin receiver)
5
+ # This is just because I'm using the veraxsystem SNMP simulator for other tests,
6
+ # and it occupies port 162 but doesn't respond to the informs
7
+
8
+ describe Net::SNMP::TrapSession do
9
+ it "should send a v1 trap" do
10
+ Net::SNMP::TrapSession.open(:peername => 'localhost:163', :version => '1', :community => 'public') do |sess|
11
+ res = sess.trap(
12
+ enterprise: '1.3.1',
13
+ trap_type: 6,
14
+ specific_type: 1,
15
+ uptime: 1000,
16
+ agent_addr: '127.0.0.1'
17
+ )
18
+ res.should eq(:success)
19
+ end
20
+ end
21
+
22
+ it "should send v2 trap" do
23
+ Net::SNMP::TrapSession.open(:peername => 'localhost:163', :version => '2c') do |sess|
24
+ res = sess.trap_v2(:oid => 'sysContact.0', :uptime => 1000)
25
+ res.should eq(:success)
26
+ end
27
+ end
28
+
29
+ it "should send a v2 inform" do
30
+ did_callback = false
31
+ Net::SNMP::TrapSession.open(:peername => 'localhost:163', :version => '2c') do |sess|
32
+ resp = sess.inform(:oid => 'coldStart.0')
33
+ has_cold_start_oid = false
34
+ # Got some weird segfaults when using rspec's ".should include {...}"
35
+ # matcher, so I did this manually.
36
+ resp.varbinds.each do |vb|
37
+ if (vb.oid.to_s == Net::SNMP::MIB.translate('snmpTrapOID.0')) &&
38
+ (vb.value.to_s == Net::SNMP::MIB.translate('coldStart.0'))
39
+ has_cold_start_oid = true
40
+ end
41
+ end
42
+ has_cold_start_oid.should eq(true)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Net::SNMP::Utility do
4
+ it "should compare oids" do
5
+ Net::SNMP::Utility.oid_lex_cmp('1.3.5', '1.3.7').should eql(-1)
6
+ Net::SNMP::Utility.oid_lex_cmp('1.3.7', '1.3.5').should eql(1)
7
+ Net::SNMP::Utility.oid_lex_cmp('1.3.7', '1.3.7.1').should eql(-1)
8
+ Net::SNMP::Utility.oid_lex_cmp('1.3.5', '1.3.5').should eql(0)
9
+ end
10
+ end
@@ -0,0 +1,69 @@
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
+ @session = Net::SNMP::Wrapper::SnmpSession.new(nil)
9
+ Net::SNMP::Wrapper.snmp_sess_init(@session.pointer)
10
+ @session.community = FFI::MemoryPointer.from_string(community)
11
+ @session.community_len = community.length
12
+ @session.peername = FFI::MemoryPointer.from_string(peername)
13
+ @session.version = Net::SNMP::Constants::SNMP_VERSION_1
14
+
15
+ @handle = Net::SNMP::Wrapper.snmp_sess_open(@session.pointer)
16
+ @session_struct = Net::SNMP::Wrapper.snmp_sess_session(@handle)
17
+ end
18
+
19
+ def make_pdu
20
+ @pdu = Net::SNMP::Wrapper.snmp_pdu_create(Net::SNMP::Constants::SNMP_MSG_GET)
21
+ @oid_ptr = FFI::MemoryPointer.new(:ulong, Net::SNMP::Constants::MAX_OID_LEN)
22
+ @oid_len_ptr = FFI::MemoryPointer.new(:size_t)
23
+ @oid_len_ptr.write_int(Net::SNMP::Constants::MAX_OID_LEN)
24
+
25
+ Net::SNMP::Wrapper.get_node("sysDescr.0", @oid_ptr, @oid_len_ptr)
26
+ Net::SNMP::Wrapper.snmp_pdu_add_variable(@pdu.pointer, @oid_ptr, @oid_len_ptr.read_int, Net::SNMP::Constants::ASN_NULL, nil, 0)
27
+ end
28
+
29
+ it "wrapper should snmpget synchronously" do
30
+ init_session
31
+
32
+ make_pdu
33
+
34
+ response_ptr = FFI::MemoryPointer.new(:pointer)
35
+ status = Net::SNMP::Wrapper.snmp_sess_synch_response(@handle, @pdu.pointer, response_ptr)
36
+ status.should eql(0)
37
+
38
+ response = Net::SNMP::Wrapper::SnmpPdu.new(response_ptr.read_pointer)
39
+ value = response.variables.val[:string].read_string(response.variables.val_len)
40
+ value.should eql('test.net-snmp.org')
41
+ end
42
+
43
+ it "wrapper should snmpget asynchronously" do
44
+ init_session
45
+ make_pdu
46
+ did_callback = 0
47
+ result = nil
48
+ @session.callback = lambda do |operation, session, reqid, pdu_ptr, magic|
49
+ did_callback = 1
50
+ pdu = Net::SNMP::Wrapper::SnmpPdu.new(pdu_ptr)
51
+ variables = Net::SNMP::Wrapper::VariableList.new(pdu.variables)
52
+ result = variables.val[:string].read_string(variables.val_len)
53
+ 0
54
+ end
55
+ sess = Net::SNMP::Wrapper.snmp_open(@session.pointer)
56
+ Net::SNMP::Wrapper.snmp_send(sess.pointer, @pdu)
57
+ sleep 1
58
+ fdset = FFI::MemoryPointer.new(1024 * 8)
59
+ fds = FFI::MemoryPointer.new(:int)
60
+ tval = Net::SNMP::Wrapper::TimeVal.new
61
+ block = FFI::MemoryPointer.new(:int)
62
+ block.write_int(1)
63
+ Net::SNMP::Wrapper.snmp_select_info(fds, fdset, tval.pointer, block )
64
+ FFI::LibC.select(fds.read_int, fdset, nil, nil, nil)
65
+ Net::SNMP::Wrapper.snmp_read(fdset)
66
+ did_callback.should be(1)
67
+ result.should eql('test.net-snmp.org')
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: net-snmp2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Ron McClain
8
+ - Jared Breeden
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nice-ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: pry
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: eventmachine
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description: Cross platform net-snmp wrapper for Ruby, building on the original net-snmp
71
+ gem
72
+ email:
73
+ - jared.breeden@gmail.com
74
+ executables:
75
+ - mib2rb
76
+ - net-snmp2
77
+ extensions: []
78
+ extra_rdoc_files:
79
+ - README.md
80
+ files:
81
+ - .gitignore
82
+ - .rspec
83
+ - Gemfile
84
+ - LICENSE
85
+ - README.md
86
+ - Rakefile
87
+ - TODO.md
88
+ - bin/mib2rb
89
+ - bin/net-snmp2
90
+ - examples/agent.rb
91
+ - examples/manager.rb
92
+ - examples/trap_handler.rb
93
+ - examples/v1_trap_session.rb
94
+ - examples/v2_trap_session.rb
95
+ - lib/net-snmp2.rb
96
+ - lib/net/snmp.rb
97
+ - lib/net/snmp/agent/agent.rb
98
+ - lib/net/snmp/agent/provider.rb
99
+ - lib/net/snmp/agent/provider_dsl.rb
100
+ - lib/net/snmp/agent/request_dispatcher.rb
101
+ - lib/net/snmp/constants.rb
102
+ - lib/net/snmp/debug.rb
103
+ - lib/net/snmp/dispatcher.rb
104
+ - lib/net/snmp/error.rb
105
+ - lib/net/snmp/listener.rb
106
+ - lib/net/snmp/message.rb
107
+ - lib/net/snmp/mib/mib.rb
108
+ - lib/net/snmp/mib/module.rb
109
+ - lib/net/snmp/mib/node.rb
110
+ - lib/net/snmp/mib/templates.rb
111
+ - lib/net/snmp/oid.rb
112
+ - lib/net/snmp/pdu.rb
113
+ - lib/net/snmp/repl/manager_repl.rb
114
+ - lib/net/snmp/session.rb
115
+ - lib/net/snmp/trap_handler/trap_handler.rb
116
+ - lib/net/snmp/trap_handler/v1_trap_dsl.rb
117
+ - lib/net/snmp/trap_handler/v2_trap_dsl.rb
118
+ - lib/net/snmp/trap_session.rb
119
+ - lib/net/snmp/utility.rb
120
+ - lib/net/snmp/varbind.rb
121
+ - lib/net/snmp/version.rb
122
+ - lib/net/snmp/wrapper.rb
123
+ - net-snmp2.gemspec
124
+ - spec/README.md
125
+ - spec/async_spec.rb
126
+ - spec/em_spec.rb
127
+ - spec/error_spec.rb
128
+ - spec/fiber_spec.rb
129
+ - spec/mib_spec.rb
130
+ - spec/net-snmp_spec.rb
131
+ - spec/oid_spec.rb
132
+ - spec/spec_helper.rb
133
+ - spec/sync_spec.rb
134
+ - spec/thread_spec.rb
135
+ - spec/trap_spec.rb
136
+ - spec/utility_spec.rb
137
+ - spec/wrapper_spec.rb
138
+ homepage: https://github.com/jbreeden/net-snmp2
139
+ licenses: []
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options:
143
+ - --main=README.md
144
+ - --line-numbers
145
+ - --inline-source
146
+ - --title=net-snmp2-0.3.0 Documentation
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project:
161
+ rubygems_version: 2.0.14
162
+ signing_key:
163
+ specification_version: 4
164
+ summary: Object oriented wrapper around C net-snmp libraries
165
+ test_files: []
166
+ has_rdoc: true