net-snmp 0.1.2 → 0.1.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 CHANGED
@@ -3,6 +3,7 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in net-snmp.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'nice-ffi'
6
7
  #group :development, :test do
7
8
  # gem 'eventmachine', '1.0.0.beta.3'
8
9
  #end
data/README.rdoc CHANGED
@@ -40,6 +40,10 @@ This library uses ruby-ffi to access the net-snmp libraries. If you want to use
40
40
  functions are defined in Net::SNMP::Wrapper. You can call them like so:
41
41
  Net::SNMP::Wrapper.snmp_perror("some_error")
42
42
 
43
+ == NOTES
44
+ For now, you have to free the pdu when you're done with it in sync calls or you'll leak memory.
45
+ It's not necessary in async calls because the library automatically frees the pdu after the callback fires.
46
+ This is where destructors would be handy.
43
47
 
44
48
 
45
49
  == EXAMPLES
@@ -50,7 +54,8 @@ A simple synchronous SNMP-GET
50
54
  session = Net::SNMP::Session.open(:peername => "test.net-snmp.org", :community => "demopublic" )
51
55
  result = session.get("sysDescr.0")
52
56
  puts result.varbinds.first.value
53
-
57
+ result.free # you have to manually free the memory in sync calls for now.
58
+
54
59
  An asynchronous SNMP-GET
55
60
 
56
61
  Net::SNMP::Session.open(:peername => 'test.net-snmp.org', :community => 'demopublic') do |session|
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../lib")
4
+
5
+ require 'net-snmp'
6
+
7
+ Net::SNMP::Session.open do |sess|
8
+ loop do
9
+ 200.times {
10
+ pdu = sess.get('ifIndex.1')
11
+ puts pdu.varbinds.first.value
12
+ pdu.free
13
+ }
14
+ sleep 1
15
+ end
16
+ end
data/lib/net-snmp.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'forwardable'
2
2
  require 'nice-ffi'
3
3
  require 'fiber'
4
+
4
5
  %w(snmp snmp/version snmp/constants snmp/oid snmp/error snmp/pdu snmp/wrapper snmp/session snmp/varbind snmp/mib snmp/mib/node).each do |f|
5
6
  require "#{File.dirname(__FILE__)}/net/#{f}"
6
7
  end
data/lib/net/snmp.rb CHANGED
@@ -21,13 +21,21 @@ module Net
21
21
  else
22
22
  block.write_int(1)
23
23
  end
24
-
24
+ #puts "calling snmp_select_info"
25
25
  Net::SNMP::Wrapper.snmp_select_info(num_fds, fdset, tval.pointer, block )
26
+ #puts "done snmp_select_info."
26
27
  num_ready = 0
28
+ #puts "block = #{block.read_int}"
29
+
30
+ #puts "numready = #{num_fds.read_int}"
31
+ #puts "tv = #{tval[:tv_sec]} #{tval[:tv_usec]}"
27
32
  if num_fds.read_int > 0
28
33
  tv = timeout == false ? nil : tval
34
+ #puts "calling select"
29
35
  num_ready = Net::SNMP::Wrapper.select(num_fds.read_int, fdset, nil, nil, tv)
36
+ #puts "done select. num_ready = #{num_ready}"
30
37
  Net::SNMP::Wrapper.snmp_read(fdset)
38
+ else
31
39
  end
32
40
  num_ready
33
41
  end
data/lib/net/snmp/pdu.rb CHANGED
@@ -1,4 +1,4 @@
1
- module Net
1
+ module Net
2
2
  module SNMP
3
3
  class PDU
4
4
  extend Forwardable
@@ -75,6 +75,9 @@ module Net
75
75
  Wrapper::snmp_errstring(errstat)
76
76
  end
77
77
 
78
+ def free
79
+ Wrapper.snmp_free_pdu(@struct.pointer)
80
+ end
78
81
  end
79
82
  end
80
83
  end
@@ -6,11 +6,11 @@ module Net
6
6
  extend Forwardable
7
7
  attr_accessor :struct, :callback
8
8
  def_delegator :@struct, :pointer
9
- @sessions = []
9
+ #@sessions = []
10
10
  @requests = {}
11
11
  class << self
12
- attr_accessor :sessions, :requests
13
- def open(options)
12
+ attr_accessor :requests
13
+ def open(options = {})
14
14
  session = new(options)
15
15
  if block_given?
16
16
  yield session
@@ -19,13 +19,13 @@ module Net
19
19
  end
20
20
  end
21
21
 
22
- def initialize(options)
22
+ def initialize(options = {})
23
+ options[:peername] ||= 'localhost'
23
24
  options[:community] ||= "public"
24
25
  options[:community_len] = options[:community].length
25
26
  options[:version] ||= Constants::SNMP_VERSION_1
26
27
  @callback = options[:callback]
27
- @requests = {}
28
- self.class.sessions << self
28
+ #self.class.sessions << self
29
29
  @sess = Wrapper::SnmpSession.new(nil)
30
30
  Wrapper.snmp_sess_init(@sess.pointer)
31
31
  #options.each_pair {|k,v| ptr.send("#{k}=", v)}
@@ -87,7 +87,7 @@ module Net
87
87
 
88
88
  end
89
89
 
90
-
90
+ # General callback just takes the pdu, calls the session callback if any, then the request specific callback.
91
91
  @sess.callback = lambda do |operation, session, reqid, pdu_ptr, magic|
92
92
  pdu = Net::SNMP::PDU.new(pdu_ptr)
93
93
  run_callbacks(operation, reqid, pdu, magic)
@@ -110,10 +110,6 @@ module Net
110
110
  end
111
111
 
112
112
 
113
-
114
-
115
- #
116
-
117
113
  def get(oidlist, options = {}, &block)
118
114
  pdu = Net::SNMP::PDU.new(Constants::SNMP_MSG_GET)
119
115
  oidlist = [oidlist] unless oidlist.kind_of?(Array)
@@ -161,37 +157,37 @@ module Net
161
157
  # Maybe return a hash with index as key?
162
158
  def get_table(table_name, options = {})
163
159
  column_names = options[:columns] || Net::SNMP::MIB::Node.get_node(table_name).children.collect {|c| c.label }
164
- puts "got column names #{column_names.inspect}"
165
160
  results = []
166
- oidlist = column_names
167
- done = false
168
- catch :break_outer_loop do
169
- first_loop = true
170
161
 
162
+ first_result = get_next(column_names)
163
+ oidlist = []
164
+ good_column_names = []
165
+ row = {}
166
+
167
+ first_result.varbinds.each_with_index do |vb, idx|
168
+ oid = vb.oid
169
+ if oid.label[0..column_names[idx].length - 1] == column_names[idx]
170
+ oidlist << oid.label
171
+ good_column_names << column_names[idx]
172
+ row[column_names[idx]] = vb.value
173
+ end
174
+ end
175
+ results << row
176
+
177
+ catch :break_main_loop do
171
178
  while(result = get_next(oidlist))
172
- puts "got result #{result.inspect}"
179
+ #puts "got result #{result.inspect}"
173
180
  oidlist = []
174
181
  row = {}
175
182
  result.varbinds.each_with_index do |vb, idx|
176
- puts "got vb #{vb.value.inspect}"
177
- oid = vb.oid
178
- row[column_names[idx]] = vb.value
179
- oidlist << oid.label
180
- if oid.label[0..column_names[idx].length - 1] != column_names[idx]
181
- puts "breaking"
182
- if first_loop
183
- puts "deleting #{oid.label}"
184
- oidlist.delete(oid.label)
185
- column_names.delete_at(idx)
186
- puts "columns now #{column_names.inspect}"
187
- else
188
- throw :break_outer_loop
189
-
190
- end
183
+ #puts "got #{vb.oid.label} #{vb.value.inspect}, type = #{vb.object_type}"
184
+ row[good_column_names[idx]] = vb.value
185
+ oidlist << vb.oid.label
186
+ if vb.oid.label[0..good_column_names[idx].length - 1] != good_column_names[idx]
187
+ throw :break_main_loop
191
188
  end
192
189
  end
193
190
  results << row
194
- first_loop = false
195
191
  end
196
192
  end
197
193
  results
@@ -233,10 +229,6 @@ module Net
233
229
  send_pdu pdu do | response |
234
230
  f.resume(response)
235
231
  end
236
-
237
-
238
-
239
-
240
232
  Fiber.yield
241
233
  else
242
234
  if block
@@ -244,14 +236,14 @@ module Net
244
236
  if (status = Net::SNMP::Wrapper.snmp_send(@struct, pdu.pointer)) == 0
245
237
  error("snmp_get async failed")
246
238
  end
239
+ pdu.free
247
240
  nil
248
241
  else
249
242
  response_ptr = FFI::MemoryPointer.new(:pointer)
250
-
251
243
  #Net::SNMP::Wrapper.print_session(@struct)
252
244
  #Net::SNMP::Wrapper.print_pdu(pdu.struct)
253
245
  status = Wrapper.snmp_synch_response(@struct, pdu.pointer, response_ptr)
254
-
246
+ #pdu.free
255
247
  if status != 0
256
248
  error("snmp_get failed #{status}")
257
249
  else
@@ -25,15 +25,10 @@ module Net
25
25
  case object_type
26
26
  when Constants::ASN_OCTET_STR
27
27
  struct.val[:string].read_string(struct.val_len)
28
- when Constants::ASN_INTEGER, Constants::ASN_COUNTER
28
+ when Constants::ASN_INTEGER, Constants::ASN_COUNTER, Constants::ASN_GAUGE
29
29
  struct.val[:integer].read_int
30
30
  when Constants::ASN_IPADDRESS
31
31
  struct.val[:objid].read_string(struct.val_len).unpack('CCCC').join(".")
32
- #puts "here #{arr.to_s}"
33
- #puts arr[0]
34
- #puts arr[1]
35
- #puts arr[2]
36
- #puts arr[3]
37
32
  end
38
33
  end
39
34
  end
@@ -1,5 +1,5 @@
1
1
  module Net
2
2
  module SNMP
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
data/net-snmp.gemspec CHANGED
@@ -1,10 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "net/snmp/version"
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $:.unshift lib
4
+ #require 'net/snmp/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
7
  s.name = "net-snmp"
7
- s.version = Net::SNMP::VERSION
8
+ s.version = '0.1.3'
8
9
  s.platform = Gem::Platform::RUBY
9
10
  s.authors = ["Ron McClain"]
10
11
  s.email = ["mixtli@github.com"]
@@ -20,5 +21,5 @@ Gem::Specification.new do |s|
20
21
  s.require_paths = ["lib"]
21
22
  s.add_development_dependency "rspec"
22
23
  s.add_development_dependency "eventmachine"
23
- s.add_dependency "nice-ffi"
24
+ #s.add_dependency "nice-ffi"
24
25
  end
@@ -134,7 +134,16 @@ describe "NetSnmp" do
134
134
  table[0]['ipAdEntAddr'].should eql('127.0.0.1')
135
135
  table[1]['ipAdEntNetMask'].should eql('255.255.255.0')
136
136
  end
137
-
137
+
138
+ it "should get a table of values ifXEntry" do
139
+ puts Net::SNMP::Constants::ASN_IPADDRESS
140
+ session = Net::SNMP::Session.open(:peername => "localhost", :version => '2c')
141
+ table = session.get_table("ifXEntry")
142
+ puts table.inspect
143
+ table[0]['ifName'].should eql('lo0')
144
+ table[3]['ifHighSpeed'].should eql(1000)
145
+ end
146
+
138
147
  it "should translate an oid" do
139
148
 
140
149
  oid = Net::SNMP::OID.new("ifDescr.1")
metadata CHANGED
@@ -1,8 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-snmp
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 3
9
+ version: 0.1.3
6
10
  platform: ruby
7
11
  authors:
8
12
  - Ron McClain
@@ -10,47 +14,41 @@ autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
16
 
13
- date: 2011-03-28 00:00:00 -05:00
17
+ date: 2011-04-21 00:00:00 -05:00
14
18
  default_executable:
15
19
  dependencies:
16
20
  - !ruby/object:Gem::Dependency
17
21
  name: rspec
22
+ prerelease: false
18
23
  requirement: &id001 !ruby/object:Gem::Requirement
19
24
  none: false
20
25
  requirements:
21
26
  - - ">="
22
27
  - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
23
30
  version: "0"
24
31
  type: :development
25
- prerelease: false
26
32
  version_requirements: *id001
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: eventmachine
35
+ prerelease: false
29
36
  requirement: &id002 !ruby/object:Gem::Requirement
30
37
  none: false
31
38
  requirements:
32
39
  - - ">="
33
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
34
43
  version: "0"
35
44
  type: :development
36
- prerelease: false
37
45
  version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: nice-ffi
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
46
- type: :runtime
47
- prerelease: false
48
- version_requirements: *id003
49
46
  description: Uses ffi to create an object oriented wrapper around C net-snmp libraries
50
47
  email:
51
48
  - mixtli@github.com
52
49
  executables:
53
50
  - snmpget.rb
51
+ - stress_test.rb
54
52
  extensions: []
55
53
 
56
54
  extra_rdoc_files: []
@@ -63,8 +61,8 @@ files:
63
61
  - LICENSE
64
62
  - README.rdoc
65
63
  - Rakefile
66
- - VERSION
67
64
  - bin/snmpget.rb
65
+ - bin/stress_test.rb
68
66
  - interface/snmp_api.h
69
67
  - interface/snmp_api.i
70
68
  - interface/snmp_api_wrap.xml
@@ -100,7 +98,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
98
  requirements:
101
99
  - - ">="
102
100
  - !ruby/object:Gem::Version
103
- hash: -4066083609341364486
104
101
  segments:
105
102
  - 0
106
103
  version: "0"
@@ -109,14 +106,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
106
  requirements:
110
107
  - - ">="
111
108
  - !ruby/object:Gem::Version
112
- hash: -4066083609341364486
113
109
  segments:
114
110
  - 0
115
111
  version: "0"
116
112
  requirements: []
117
113
 
118
114
  rubyforge_project: net-snmp
119
- rubygems_version: 1.6.2
115
+ rubygems_version: 1.3.7
120
116
  signing_key:
121
117
  specification_version: 3
122
118
  summary: Object oriented wrapper around C net-snmp libraries
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.0