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,42 @@
1
+ module Net::SNMP
2
+ class TrapHandler
3
+ include Net::SNMP::Debug
4
+ extend Forwardable
5
+
6
+ attr_accessor :listener, :v1_handler, :v2_handler, :message, :pdu
7
+ def_delegators :listener, :start, :run, :listen, :stop, :kill
8
+
9
+ def self.listen(port = 162, interval = 2, max_packet_size = 65_000, &block)
10
+ self.new
11
+ end
12
+
13
+ def initialize(&block)
14
+ @listener = Net::SNMP::Listener.new
15
+ @listener.on_message(&method(:process_trap))
16
+ self.instance_eval(&block)
17
+ end
18
+
19
+ private
20
+
21
+ def process_trap(message, from_address, from_port)
22
+ if message.pdu.command == Net::SNMP::Constants::SNMP_MSG_TRAP
23
+ handler = V1TrapDsl.new(message)
24
+ handler.instance_eval(&v1_handler)
25
+ elsif message.pdu.command == Net::SNMP::Constants::SNMP_MSG_TRAP2
26
+ handler = V2TrapDsl.new(message)
27
+ handler.instance_eval(&v2_handler)
28
+ else
29
+ warn "Trap handler receive invalid command: #{message.pdu.command}"
30
+ end
31
+ message.pdu.free
32
+ end
33
+
34
+ def v1(&handler)
35
+ @v1_handler = handler
36
+ end
37
+
38
+ def v2(&handler)
39
+ @v2_handler = handler
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ module Net::SNMP
2
+ class V1TrapDsl
3
+ include Debug
4
+
5
+ attr_accessor :message
6
+
7
+ def initialize(message)
8
+ @message = message
9
+ end
10
+
11
+ def pdu
12
+ message.pdu
13
+ end
14
+
15
+ def enterprise
16
+ pdu.enterprise
17
+ end
18
+ alias enterprise_oid enterprise
19
+
20
+ def trap_type
21
+ pdu.trap_type
22
+ end
23
+ alias general_trap_type trap_type
24
+
25
+ def specific_type
26
+ pdu.specific_type
27
+ end
28
+ alias specific_trap_type specific_type
29
+
30
+ def agent_addr
31
+ pdu.agent_addr
32
+ end
33
+ alias agent_address agent_addr
34
+
35
+ def uptime
36
+ pdu.uptime
37
+ end
38
+
39
+ def varbinds
40
+ pdu.varbinds
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,38 @@
1
+ module Net::SNMP
2
+ class V2TrapDsl
3
+ include Debug
4
+
5
+ attr_accessor :message
6
+
7
+ def initialize(message)
8
+ @message = message
9
+ end
10
+
11
+ def pdu
12
+ message.pdu
13
+ end
14
+
15
+ def oid
16
+ vb = varbinds.find{|vb| vb.oid.to_s == Constants::OID_SNMP_TRAP_OID}
17
+ if vb
18
+ vb.value
19
+ else
20
+ nil
21
+ end
22
+ end
23
+ alias trap_oid oid
24
+
25
+ def uptime
26
+ vb = varbinds.find{|vb| vb.oid.to_s == Constants::OID_SYS_UP_TIME_INSTANCE}
27
+ if vb
28
+ vb.value
29
+ else
30
+ nil
31
+ end
32
+ end
33
+
34
+ def varbinds
35
+ pdu.varbinds
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,92 @@
1
+ module Net
2
+ module SNMP
3
+ class TrapSession < Session
4
+ # == Represents a session for sending SNMP traps
5
+
6
+ # +options+
7
+ # * :peername The address where the trap will be sent
8
+ # * :port The port where the trap will be sent (default = 162)
9
+ def initialize(options = {})
10
+ # Unless the port was supplied in the peername...
11
+ unless options[:peername][":"]
12
+ # ...default to standard trap port
13
+ options[:port] ||= 162
14
+ end
15
+
16
+ super(options)
17
+ end
18
+
19
+ # Send an SNMPv1 trap
20
+ #
21
+ # Options
22
+ #
23
+ # - enterprise: The Oid of the enterprise
24
+ # - trap_type: The generic trap type.
25
+ # - specific_type: The specific trap type
26
+ # - uptime: The uptime for this agent
27
+ def trap(options = {})
28
+ pdu = PDU.new(Constants::SNMP_MSG_TRAP)
29
+ options[:enterprise] ||= '1.3.6.1.4.1.3.1.1'
30
+ pdu.enterprise = OID.new(options[:enterprise].to_s)
31
+ pdu.trap_type = options[:trap_type].to_i || 1 # need to check all these defaults
32
+ pdu.specific_type = options[:specific_type].to_i || 0
33
+ pdu.time = options[:uptime].to_i || 1
34
+ pdu.agent_addr = options[:agent_addr] || '127.0.0.1'
35
+ if options[:varbinds]
36
+ options[:varbinds].each do |vb|
37
+ pdu.add_varbind(vb)
38
+ end
39
+ end
40
+ result = send_pdu(pdu)
41
+ pdu.free
42
+ result
43
+ end
44
+
45
+ # Send an SNMPv2 trap
46
+ # +options
47
+ # * :oid The Oid of the trap
48
+ # * :varbinds A list of Varbind objects to send with the trap
49
+ #
50
+ # TODO: You can only send v1 traps on a v1 session, and same for v2.
51
+ # So, we could always have the client call `trap` and just do the right
52
+ # thing based on the session.
53
+ def trap_v2(options = {})
54
+ if options[:oid].kind_of?(String)
55
+ options[:oid] = Net::SNMP::OID.new(options[:oid])
56
+ end
57
+ pdu = PDU.new(Constants::SNMP_MSG_TRAP2)
58
+ build_trap_pdu(pdu, options)
59
+ result = send_pdu(pdu)
60
+ pdu.free
61
+ result
62
+ end
63
+
64
+ # Send an SNMPv2 inform. Can accept a callback to execute on confirmation of the inform
65
+ # +options
66
+ # * :oid The OID of the inform
67
+ # * :varbinds A list of Varbind objects to send with the inform
68
+ def inform(options = {}, &callback)
69
+ if options[:oid].kind_of?(String)
70
+ options[:oid] = Net::SNMP::OID.new(options[:oid])
71
+ end
72
+ pdu = PDU.new(Constants::SNMP_MSG_INFORM)
73
+ build_trap_pdu(pdu, options)
74
+ result = send_pdu(pdu, &callback)
75
+ pdu.free
76
+ result
77
+ end
78
+
79
+ private
80
+ def build_trap_pdu(pdu, options = {})
81
+ options[:uptime] ||= 1
82
+ pdu.add_varbind(:oid => OID.new('sysUpTime.0'), :type => Constants::ASN_TIMETICKS, :value => options[:uptime].to_i)
83
+ pdu.add_varbind(:oid => OID.new('snmpTrapOID.0'), :type => Constants::ASN_OBJECT_ID, :value => options[:oid])
84
+ if options[:varbinds]
85
+ options[:varbinds].each do |vb|
86
+ pdu.add_varbind(vb)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,10 @@
1
+ module Net::SNMP::Utility
2
+ def self.oid_lex_cmp(a,b)
3
+ [a,b].each do |i|
4
+ i.sub!(/^\./,'')
5
+ i.gsub!(/ /, '.0')
6
+ i.replace(i.split('.').map(&:to_i).pack('N*'))
7
+ end
8
+ a <=> b
9
+ end
10
+ end
@@ -0,0 +1,57 @@
1
+ module Net::SNMP
2
+ class Varbind
3
+ # == Represents an SNMP Variable Binding
4
+
5
+ attr_accessor :struct
6
+
7
+ def initialize(ptr = nil)
8
+ @struct = Net::SNMP::Wrapper::VariableList.new(ptr)
9
+ end
10
+
11
+ def self.from_pointer(ptr)
12
+ new(ptr)
13
+ end
14
+
15
+ # Returns the data type of the varbind
16
+ def object_type
17
+ @struct.type
18
+ end
19
+ alias type object_type
20
+
21
+ # Returns the OID associated with the varbind
22
+ def oid
23
+ @oid ||= OID.from_pointer(@struct.name, @struct.name_length)
24
+ end
25
+
26
+ # Returns the value of the varbind
27
+ def value
28
+ case object_type
29
+ when Constants::ASN_OCTET_STR, Constants::ASN_OPAQUE
30
+ struct.val[:string].read_string(struct.val_len)
31
+ when Constants::ASN_INTEGER
32
+ struct.val[:integer].read_long
33
+ when Constants::ASN_UINTEGER, Constants::ASN_TIMETICKS, Constants::ASN_COUNTER, Constants::ASN_GAUGE
34
+ struct.val[:integer].read_ulong
35
+ when Constants::ASN_IPADDRESS
36
+ struct.val[:objid].read_string(struct.val_len).unpack('CCCC').join(".")
37
+ when Constants::ASN_NULL
38
+ nil
39
+ when Constants::ASN_OBJECT_ID
40
+ Net::SNMP::OID.from_pointer(struct.val[:objid], struct.val_len / OID.oid_size)
41
+ when Constants::ASN_COUNTER64
42
+ counter = Wrapper::Counter64.new(struct.val[:counter64])
43
+ counter.high * 2^32 + counter.low
44
+ when Constants::ASN_BIT_STR
45
+ # XXX not sure what to do here. Is this obsolete?
46
+ when Constants::SNMP_ENDOFMIBVIEW
47
+ :endofmibview
48
+ when Constants::SNMP_NOSUCHOBJECT
49
+ :nosuchobject
50
+ when Constants::SNMP_NOSUCHINSTANCE
51
+ :nosuchinstance
52
+ else
53
+ raise Net::SNMP::Error.new, "Unknown value type #{object_type}"
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,5 @@
1
+ module Net
2
+ module SNMP
3
+ VERSION = "0.3.0"
4
+ end
5
+ end
@@ -0,0 +1,450 @@
1
+ module Net
2
+ module SNMP
3
+ module Wrapper
4
+ extend NiceFFI::Library
5
+ ffi_lib ["libnetsnmp", "netsnmp"]
6
+ typedef :u_long, :oid
7
+
8
+ class Counter64 < NiceFFI::Struct
9
+ layout(
10
+ :high, :u_long,
11
+ :low, :u_long
12
+ )
13
+ end
14
+
15
+ class TimeVal < NiceFFI::Struct
16
+ layout(:tv_sec, :long, :tv_usec, :long)
17
+ end
18
+
19
+ class NetsnmpVardata < FFI::Union
20
+ layout(
21
+ :integer, :pointer,
22
+ :string, :pointer,
23
+ :objid, :pointer,
24
+ :bitstring, :pointer,
25
+ :counter64, :pointer,
26
+ :float, :pointer,
27
+ :double, :pointer
28
+ )
29
+ end
30
+
31
+ def self.print_varbind(v)
32
+ puts "---------------------VARBIND------------------------"
33
+ puts %{
34
+ name_length #{v.name_length}
35
+ name #{v.name.read_array_of_long(v.name_length).join(".")}
36
+ type = #{v.type}
37
+
38
+ }
39
+ end
40
+
41
+ class VariableList < NiceFFI::Struct
42
+ layout(
43
+ :next_variable, VariableList.typed_pointer,
44
+ :name, :pointer,
45
+ :name_length, :size_t,
46
+ :type, :u_char,
47
+ :val, NetsnmpVardata,
48
+ :val_len, :size_t,
49
+ :name_loc, [:oid, Net::SNMP::MAX_OID_LEN],
50
+ :buf, [:u_char, 40],
51
+ :data, :pointer,
52
+ :dataFreeHook, callback([ :pointer ], :void),
53
+ :index, :int
54
+ )
55
+ end
56
+
57
+ def self.print_pdu(p)
58
+ puts "--------------PDU---------------"
59
+ puts %{
60
+ version = #{p.version}
61
+ command = #{p.command}
62
+ errstat = #{p.errstat}
63
+ errindex = #{p.errindex}
64
+ }
65
+ v = p.variables.pointer
66
+ puts "-----VARIABLES------"
67
+ while !v.null? do
68
+ var = VariableList.new v
69
+ print_varbind(var)
70
+ v = var.next_variable
71
+ end
72
+ end
73
+
74
+ class SnmpPdu < NiceFFI::Struct
75
+ layout(
76
+ :version, :long,
77
+ :command, :int,
78
+ :reqid, :long,
79
+ :msgid, :long,
80
+ :transid, :long,
81
+ :sessid, :long,
82
+ :errstat, :long,
83
+ :errindex, :long,
84
+ :time, :u_long,
85
+ :flags, :u_long,
86
+ :securityModel, :int,
87
+ :securityLevel, :int,
88
+ :msgParseModel, :int,
89
+ :transport_data, :pointer,
90
+ :transport_data_length, :int,
91
+ :tDomain, :pointer,
92
+ :tDomainLen, :size_t,
93
+ :variables, VariableList.typed_pointer,
94
+ :community, :pointer,
95
+ :community_len, :size_t,
96
+ :enterprise, :pointer,
97
+ :enterprise_length, :size_t,
98
+ :trap_type, :long,
99
+ :specific_type, :long,
100
+ :agent_addr, [:uchar, 4],
101
+ :contextEngineID, :pointer,
102
+ :contextEngineIDLen, :size_t,
103
+ :contextName, :pointer,
104
+ :contextNameLen, :size_t,
105
+ :securityEngineID, :pointer,
106
+ :securityEngineIDLen, :size_t,
107
+ :securityName, :pointer,
108
+ :securityNameLen, :size_t,
109
+ :priority, :int,
110
+ :range_subid, :int,
111
+ :securityStateRef, :pointer
112
+ )
113
+ end
114
+
115
+ callback(:snmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
116
+ callback(:netsnmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
117
+
118
+ def self.print_session(s)
119
+ puts "-------------------SESSION---------------------"
120
+ puts %{
121
+ peername = #{s.peername.read_string}
122
+ community = #{s.community.read_string(s.community_len)}
123
+ s_errno = #{s.s_errno}
124
+ s_snmp_errno = #{s.s_snmp_errno}
125
+ securityAuthKey = #{s.securityAuthKey.to_ptr.read_string}
126
+
127
+ }
128
+ end
129
+
130
+ class SnmpSession < NiceFFI::Struct
131
+ layout(
132
+ :version, :long,
133
+ :retries, :int,
134
+ :timeout, :long,
135
+ :flags, :u_long,
136
+ :subsession, :pointer,
137
+ :next, :pointer,
138
+ :peername, :pointer,
139
+ :remote_port, :u_short,
140
+ :localname, :pointer,
141
+ :local_port, :u_short,
142
+ :authenticator, callback([ :pointer, :pointer, :pointer, :uint ], :pointer),
143
+ :callback, :netsnmp_callback,
144
+ :callback_magic, :pointer,
145
+ :s_errno, :int,
146
+ :s_snmp_errno, :int,
147
+ :sessid, :long,
148
+ :community, :pointer,
149
+ :community_len, :size_t,
150
+ :rcvMsgMaxSize, :size_t,
151
+ :sndMsgMaxSize, :size_t,
152
+ :isAuthoritative, :u_char,
153
+ :contextEngineID, :pointer,
154
+ :contextEngineIDLen, :size_t,
155
+ :engineBoots, :u_int,
156
+ :engineTime, :u_int,
157
+ :contextName, :pointer,
158
+ :contextNameLen, :size_t,
159
+ :securityEngineID, :pointer,
160
+ :securityEngineIDLen, :size_t,
161
+ :securityName, :pointer,
162
+ :securityNameLen, :size_t,
163
+ :securityAuthProto, :pointer,
164
+ :securityAuthProtoLen, :size_t,
165
+ :securityAuthKey, [:u_char, 32],
166
+ :securityAuthKeyLen, :size_t,
167
+ :securityAuthLocalKey, :pointer,
168
+ :securityAuthLocalKeyLen, :size_t,
169
+ :securityPrivProto, :pointer,
170
+ :securityPrivProtoLen, :size_t,
171
+ :securityPrivKey, [:u_char, 32],
172
+ :securityPrivKeyLen, :size_t,
173
+ :securityPrivLocalKey, :pointer,
174
+ :securityPrivLocalKeyLen, :size_t,
175
+ :securityModel, :int,
176
+ :securityLevel, :int,
177
+ :paramName, :pointer,
178
+ :securityInfo, :pointer,
179
+ :myvoid, :pointer
180
+ )
181
+ end
182
+
183
+ class EnumList < NiceFFI::Struct
184
+ layout(
185
+ :next, EnumList.typed_pointer,
186
+ :value, :int,
187
+ :label, :pointer
188
+ )
189
+ end
190
+
191
+ class IndexList < NiceFFI::Struct
192
+ layout(
193
+ :next, :pointer,
194
+ :ilabel, :pointer,
195
+ :isimplied, :char
196
+ )
197
+ end
198
+
199
+ class ModuleImport < NiceFFI::Struct
200
+ layout(
201
+ :label, :pointer, # The descriptor being imported (pointer to string)
202
+ :modid, :int # The module id
203
+ )
204
+ end
205
+
206
+ class Module < NiceFFI::Struct
207
+ layout(
208
+ :name, :pointer, # The module's name (pointer to string)
209
+ :file, :pointer, # The file containing the module (pointer to string)
210
+ :imports, ModuleImport.typed_pointer, # List of descriptors being imported
211
+ :no_imports, :int, # The length of the imports array
212
+ :modid, :int, # The index number of this module
213
+ :next, Module.typed_pointer # Linked list pointer
214
+ )
215
+ end
216
+
217
+ class Tree < NiceFFI::Struct
218
+ layout(
219
+ :child_list, Tree.typed_pointer,
220
+ :next_peer, Tree.typed_pointer,
221
+ :next, Tree.typed_pointer,
222
+ :parent, :pointer,
223
+ :label, :string,
224
+ :subid, :u_long,
225
+ :modid, :int,
226
+ :number_modules, :int, # Length of module_list array
227
+ :module_list, :pointer, # Array of modids (pointer to int)
228
+ :tc_index, :int,
229
+ :type, :int,
230
+ :access, :int,
231
+ :status, :int,
232
+ :enums, EnumList.typed_pointer,
233
+ :ranges, :pointer,
234
+ :indexes, IndexList.typed_pointer,
235
+ :augments, :pointer,
236
+ :varbinds, :pointer,
237
+ :hint, :pointer,
238
+ :units, :pointer,
239
+ :printomat, callback([:pointer, :pointer, :pointer, :int, :pointer, :pointer, :pointer, :pointer], :int),
240
+ :printer, callback([:pointer, :pointer, :pointer, :pointer, :pointer], :void),
241
+ :description, :pointer,
242
+ :reference, :pointer,
243
+ :reported, :int,
244
+ :defaultValue, :pointer
245
+ )
246
+ end
247
+
248
+ # Some of these functions/variables are not available on windows.
249
+ # (At least with my current setup.) Simple SNMP manager example
250
+ # seems to work fine without them, so just log and ignore for now.
251
+ class << self
252
+ include Net::SNMP::Debug
253
+ alias af attach_function
254
+ def attach_function(*args)
255
+ af(*args)
256
+ rescue Exception => ex
257
+ debug ex.message
258
+ end
259
+ end
260
+
261
+ attach_function :snmp_clone_pdu, [ :pointer ], :pointer
262
+ attach_function :snmp_open, [ :pointer ], SnmpSession.typed_pointer
263
+ attach_function :snmp_errstring, [:int], :string
264
+ attach_function :snmp_close, [ :pointer ], :int
265
+ attach_function :snmp_close_sessions, [ ], :int
266
+ attach_function :snmp_send, [ :pointer, :pointer ], :int
267
+ attach_function :snmp_async_send, [ :pointer, :pointer, :netsnmp_callback, :pointer ], :int
268
+ attach_function :snmp_read, [ :pointer ], :void
269
+ attach_function :snmp_free_pdu, [ :pointer ], :void
270
+ attach_function :snmp_free_var, [ :pointer ], :void
271
+ attach_function :snmp_free_varbind, [ :pointer ], :void
272
+ attach_function :snmp_select_info, [ :pointer, :pointer, :pointer, :pointer ], :int
273
+ attach_function :snmp_timeout, [ ], :void
274
+
275
+ attach_function :snmp_get_next_msgid, [ ], :long
276
+ attach_function :snmp_get_next_reqid, [ ], :long
277
+ attach_function :snmp_get_next_sessid, [ ], :long
278
+ attach_function :snmp_get_next_transid, [ ], :long
279
+ attach_function :snmp_oid_compare, [ :pointer, :uint, :pointer, :uint ], :int
280
+ attach_function :snmp_oid_ncompare, [ :pointer, :uint, :pointer, :uint, :uint ], :int
281
+ attach_function :snmp_oidtree_compare, [ :pointer, :uint, :pointer, :uint ], :int
282
+ attach_function :snmp_oidsubtree_compare, [ :pointer, :uint, :pointer, :uint ], :int
283
+ attach_function :netsnmp_oid_compare_ll, [ :pointer, :uint, :pointer, :uint, :pointer ], :int
284
+ attach_function :netsnmp_oid_equals, [ :pointer, :uint, :pointer, :uint ], :int
285
+ attach_function :netsnmp_oid_tree_equals, [ :pointer, :uint, :pointer, :uint ], :int
286
+ attach_function :netsnmp_oid_is_subtree, [ :pointer, :uint, :pointer, :uint ], :int
287
+ attach_function :netsnmp_oid_find_prefix, [ :pointer, :uint, :pointer, :uint ], :int
288
+ attach_function :netsnmp_transport_open_client, [:string, :pointer], :pointer
289
+ attach_function :init_snmp, [ :string ], :void
290
+ attach_function :snmp_pdu_build, [ :pointer, :pointer, :pointer ], :pointer
291
+ attach_function :snmpv3_parse, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :int
292
+ attach_function :snmpv3_packet_build, [ :pointer, :pointer, :pointer, :pointer, :pointer, :uint ], :int
293
+ attach_function :snmpv3_packet_rbuild, [ :pointer, :pointer, :pointer, :pointer, :pointer, :uint ], :int
294
+ attach_function :snmpv3_make_report, [ :pointer, :int ], :int
295
+ attach_function :snmpv3_get_report_type, [ :pointer ], :int
296
+ attach_function :snmp_pdu_parse, [ :pointer, :pointer, :pointer ], :int
297
+ attach_function :snmpv3_scopedPDU_parse, [ :pointer, :pointer, :pointer ], :pointer
298
+ attach_function :snmp_store, [ :string ], :void
299
+ attach_function :snmp_shutdown, [ :string ], :void
300
+ attach_function :snmp_pdu_add_variable, [ :pointer, :pointer, :uint, :u_char, :pointer, :size_t ], :pointer
301
+ attach_function :snmp_varlist_add_variable, [ :pointer, :pointer, :uint, :u_char, :pointer, :uint ], :pointer
302
+ attach_function :snmp_add_var, [ :pointer, :pointer, :uint, :char, :string ], :int
303
+ attach_function :snmp_duplicate_objid, [ :pointer, :uint ], :pointer
304
+ attach_function :snmp_increment_statistic, [ :int ], :u_int
305
+ attach_function :snmp_increment_statistic_by, [ :int, :int ], :u_int
306
+ attach_function :snmp_get_statistic, [ :int ], :u_int
307
+ attach_function :snmp_init_statistics, [ ], :void
308
+ attach_function :create_user_from_session, [ :pointer ], :int
309
+ attach_function :snmp_get_fd_for_session, [ :pointer ], :int
310
+ attach_function :snmp_open_ex, [ :pointer, callback([ :pointer, :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :uint ], :int), callback([ :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :uint ], :int) ], :pointer
311
+ attach_function :snmp_set_do_debugging, [ :int ], :void
312
+ attach_function :snmp_get_do_debugging, [ ], :int
313
+ attach_function :snmp_error, [ :pointer, :pointer, :pointer, :pointer ], :void
314
+ attach_function :snmp_sess_init, [ :pointer ], :void
315
+ attach_function :snmp_sess_open, [ :pointer ], SnmpSession.typed_pointer
316
+ attach_function :snmp_sess_pointer, [ :pointer ], :pointer
317
+ attach_function :snmp_sess_session, [ :pointer ], SnmpSession.typed_pointer
318
+ attach_function :snmp_sess_transport, [ :pointer ], :pointer
319
+ attach_function :snmp_sess_transport_set, [ :pointer, :pointer ], :void
320
+ attach_function :snmp_sess_add_ex, [ :pointer, :pointer, callback([ :pointer, :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :uint ], :int), callback([ :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :uint ], :int), callback([ :pointer, :pointer, :uint ], :pointer) ], :pointer
321
+ attach_function :snmp_sess_add, [ :pointer, :pointer, callback([ :pointer, :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :int ], :int) ], :pointer
322
+ attach_function :snmp_add, [ :pointer, :pointer, callback([ :pointer, :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :int ], :int) ], :pointer
323
+ attach_function :snmp_add_full, [ :pointer, :pointer, callback([ :pointer, :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :uint ], :int), callback([ :pointer, :pointer, :int ], :int), callback([ :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :pointer, :pointer, :pointer, :pointer ], :int), callback([ :pointer, :uint ], :int), callback([ :pointer, :pointer, :uint ], :pointer) ], :pointer
324
+ attach_function :snmp_sess_send, [ :pointer, :pointer ], :int
325
+ attach_function :snmp_sess_async_send, [ :pointer, :pointer, :snmp_callback, :pointer ], :int
326
+ attach_function :snmp_sess_select_info, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :int
327
+ attach_function :snmp_sess_read, [ :pointer, :pointer ], :int
328
+ attach_function :snmp_sess_timeout, [ :pointer ], :void
329
+ attach_function :snmp_sess_close, [ :pointer ], :int
330
+ attach_function :snmp_sess_error, [ :pointer, :pointer, :pointer, :pointer ], :void
331
+ attach_function :netsnmp_sess_log_error, [ :int, :string, :pointer ], :void
332
+ attach_function :snmp_sess_perror, [ :string, :pointer ], :void
333
+ attach_function :snmp_pdu_type, [ :int ], :string
334
+
335
+
336
+
337
+ attach_function :asn_check_packet, [ :pointer, :uint ], :int
338
+ attach_function :asn_parse_int, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
339
+ attach_function :asn_build_int, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
340
+ attach_function :asn_parse_unsigned_int, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
341
+ attach_function :asn_build_unsigned_int, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
342
+ attach_function :asn_parse_string, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :pointer
343
+ attach_function :asn_build_string, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
344
+ attach_function :asn_parse_header, [ :pointer, :pointer, :pointer ], :pointer
345
+ attach_function :asn_parse_sequence, [ :pointer, :pointer, :pointer, :u_char, :string ], :pointer
346
+ attach_function :asn_build_header, [ :pointer, :pointer, :u_char, :uint ], :pointer
347
+ attach_function :asn_build_sequence, [ :pointer, :pointer, :u_char, :uint ], :pointer
348
+ attach_function :asn_parse_length, [ :pointer, :pointer ], :pointer
349
+ attach_function :asn_build_length, [ :pointer, :pointer, :uint ], :pointer
350
+ attach_function :asn_parse_objid, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :pointer
351
+ attach_function :asn_build_objid, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
352
+ attach_function :asn_parse_null, [ :pointer, :pointer, :pointer ], :pointer
353
+ attach_function :asn_build_null, [ :pointer, :pointer, :u_char ], :pointer
354
+ attach_function :asn_parse_bitstring, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :pointer
355
+ attach_function :asn_build_bitstring, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
356
+ attach_function :asn_parse_unsigned_int64, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
357
+ attach_function :asn_build_unsigned_int64, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
358
+ attach_function :asn_parse_signed_int64, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
359
+ attach_function :asn_build_signed_int64, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
360
+ attach_function :asn_build_float, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
361
+ attach_function :asn_parse_float, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
362
+ attach_function :asn_build_double, [ :pointer, :pointer, :u_char, :pointer, :uint ], :pointer
363
+ attach_function :asn_parse_double, [ :pointer, :pointer, :pointer, :pointer, :uint ], :pointer
364
+
365
+ attach_function :snmp_pdu_create, [:int], SnmpPdu.typed_pointer
366
+ attach_function :get_node,[:string, :pointer, :pointer], :int
367
+ attach_function :read_objid, [:string, :pointer, :pointer], :int
368
+ attach_function :snmp_add_null_var, [:pointer, :pointer, :size_t], :pointer
369
+ attach_function :snmp_sess_synch_response, [:pointer, :pointer, :pointer], :int
370
+ attach_function :snmp_synch_response, [:pointer, :pointer, :pointer], :int
371
+ attach_function :snmp_parse_oid, [:string, :pointer, :pointer], :pointer
372
+ attach_function :snmp_api_errstring, [ :int ], :string
373
+ attach_function :snmp_perror, [ :string ], :void
374
+ attach_function :snmp_set_detail, [ :string ], :void
375
+
376
+ attach_function :generate_Ku, [:pointer, :int, :string, :int, :pointer, :pointer], :int
377
+
378
+ # MIB functions
379
+ attach_function :netsnmp_init_mib, [], :void
380
+ attach_function :read_all_mibs, [], :void
381
+ attach_function :add_mibdir, [:string], :int
382
+ attach_function :read_mib, [:string], Tree.typed_pointer
383
+ attach_function :netsnmp_read_module, [:string], Tree.typed_pointer
384
+ attach_function :snmp_set_save_descriptions, [:int], :void
385
+
386
+ attach_function :get_tree_head, [], Tree.typed_pointer
387
+ attach_function :get_tree, [:pointer, :int, :pointer], Tree.typed_pointer
388
+
389
+ # struct module *find_module(int modid);
390
+ attach_function :find_module, [:int], Module.typed_pointer
391
+
392
+ # Trap functions
393
+ attach_function :send_easy_trap, [:int, :int], :void
394
+ attach_function :send_trap_vars, [:int, :int, :pointer], :void
395
+ attach_function :send_v2trap, [:pointer], :void
396
+
397
+ def self.get_fd_set
398
+ FFI::MemoryPointer.new(:pointer, 128)
399
+ end
400
+
401
+ end
402
+ end
403
+ end
404
+
405
+ module FFI
406
+ module LibC
407
+ extend FFI::Library
408
+ ffi_lib 'c'
409
+
410
+ typedef :pointer, :FILE
411
+ typedef :uint32, :in_addr_t
412
+ typedef :uint16, :in_port_t
413
+
414
+ class Timeval < FFI::Struct
415
+ layout :tv_sec, :time_t,
416
+ :tv_usec, :suseconds_t
417
+ end
418
+
419
+ # Some of these functions/variables are not available on windows.
420
+ # (At least with my current setup.) Simple SNMP manager example
421
+ # seems to work fine without them, so just log and ignore for now.
422
+ class << self
423
+ include Net::SNMP::Debug
424
+ alias af attach_function
425
+ def attach_function(*args)
426
+ af(*args)
427
+ rescue Exception => ex
428
+ debug ex.message
429
+ end
430
+
431
+ alias av attach_variable
432
+ def attach_variable(*args)
433
+ av(*args)
434
+ rescue Exception => ex
435
+ debug ex.message
436
+ end
437
+ end
438
+
439
+ # Standard IO functions
440
+ #@blocking = true # some undocumented voodoo that tells the next attach_function to release the GIL
441
+ attach_function :malloc, [:size_t], :pointer
442
+ attach_function :calloc, [:size_t, :size_t], :pointer
443
+ attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
444
+ attach_function :free, [:pointer], :void
445
+ #attach_variable :errno, :int
446
+
447
+ ffi_lib ['Ws2_32.dll'] if (ENV['OS'] =~ /windows/i)
448
+ attach_function :select, [:int, :pointer, :pointer, :pointer, :pointer], :int
449
+ end
450
+ end