net-snmp2 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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