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/.document +5 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +8 -0
- data/LICENSE +20 -0
- data/README.rdoc +146 -0
- data/Rakefile +2 -0
- data/VERSION +1 -0
- data/bin/snmpget.rb +30 -0
- data/c/Makefile +3 -0
- data/c/test +0 -0
- data/c/test.c +137 -0
- data/interface/snmp_api.h +1086 -0
- data/interface/snmp_api.i +16 -0
- data/interface/snmp_api_wrap.xml +6747 -0
- data/lib/net-snmp.rb +57 -0
- data/lib/net/snmp.rb +54 -0
- data/lib/net/snmp/constants.rb +239 -0
- data/lib/net/snmp/error.rb +23 -0
- data/lib/net/snmp/inline.rb +39 -0
- data/lib/net/snmp/mib.rb +20 -0
- data/lib/net/snmp/mib/node.rb +58 -0
- data/lib/net/snmp/oid.rb +39 -0
- data/lib/net/snmp/pdu.rb +80 -0
- data/lib/net/snmp/session.rb +223 -0
- data/lib/net/snmp/varbind.rb +36 -0
- data/lib/net/snmp/version.rb +5 -0
- data/lib/net/snmp/wrapper.rb +382 -0
- data/net-snmp.gemspec +24 -0
- data/spec/mib_spec.rb +45 -0
- data/spec/net-snmp_spec.rb +202 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/wrapper_spec.rb +83 -0
- metadata +138 -0
data/lib/net-snmp.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'nice-ffi'
|
3
|
+
require 'fiber'
|
4
|
+
%w(snmp snmp/constants snmp/oid snmp/error snmp/pdu snmp/wrapper snmp/session snmp/varbind snmp/mib snmp/mib/node).each do |f|
|
5
|
+
require "#{File.dirname(__FILE__)}/net/#{f}"
|
6
|
+
end
|
7
|
+
Net::SNMP::MIB.init
|
8
|
+
Net::SNMP::MIB.read_all_mibs
|
9
|
+
Net::SNMP.init
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
# XXX
|
14
|
+
# I just monkeypatched this to take a nil first argument. Seems to work
|
15
|
+
# Should probably submit this as a patch
|
16
|
+
|
17
|
+
class NiceFFI::Struct < FFI::Struct
|
18
|
+
def initialize( val = nil, options={} )
|
19
|
+
# Stores certain kinds of member values so that we don't need
|
20
|
+
# to create a new object every time they are read.
|
21
|
+
@member_cache = {}
|
22
|
+
|
23
|
+
options = {:autorelease => true}.merge!( options )
|
24
|
+
|
25
|
+
case val
|
26
|
+
|
27
|
+
when Hash
|
28
|
+
super(FFI::Buffer.new(size))
|
29
|
+
init_from_hash( val ) # Read the values from a Hash.
|
30
|
+
|
31
|
+
# Note: plain "Array" would mean FFI::Struct::Array in this scope.
|
32
|
+
when ::Array
|
33
|
+
super(FFI::Buffer.new(size))
|
34
|
+
init_from_array( val ) # Read the values from an Array.
|
35
|
+
|
36
|
+
when String
|
37
|
+
super(FFI::Buffer.new(size))
|
38
|
+
init_from_bytes( val ) # Read the values from a bytestring.
|
39
|
+
|
40
|
+
when self.class
|
41
|
+
super(FFI::Buffer.new(size))
|
42
|
+
init_from_bytes( val.to_bytes ) # Read the values from another instance.
|
43
|
+
|
44
|
+
when FFI::Pointer, FFI::Buffer
|
45
|
+
val = _make_autopointer( val, options[:autorelease] )
|
46
|
+
|
47
|
+
# Normal FFI::Struct behavior to wrap the pointer.
|
48
|
+
super( val )
|
49
|
+
|
50
|
+
when nil
|
51
|
+
super(val)
|
52
|
+
else
|
53
|
+
raise TypeError, "cannot create new #{self.class} from #{val.inspect}"
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/net/snmp.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'net/snmp/constants'
|
2
|
+
module Net
|
3
|
+
module SNMP
|
4
|
+
include Net::SNMP::Constants
|
5
|
+
|
6
|
+
|
7
|
+
def self.init(tag="snmp")
|
8
|
+
Wrapper.init_snmp(tag)
|
9
|
+
end
|
10
|
+
|
11
|
+
# timeout = nil no block(poll), timeout = false block forever, timeout = int, block int seconds
|
12
|
+
def self.dispatcher(timeout = nil)
|
13
|
+
fdset = Net::SNMP::Wrapper.get_fd_set
|
14
|
+
num_fds = FFI::MemoryPointer.new(:int)
|
15
|
+
tv_sec = timeout || 0
|
16
|
+
tval = Net::SNMP::Wrapper::TimeVal.new(:tv_sec => tv_sec, :tv_usec => 0)
|
17
|
+
block = FFI::MemoryPointer.new(:int)
|
18
|
+
|
19
|
+
if timeout.nil?
|
20
|
+
block.write_int(0)
|
21
|
+
else
|
22
|
+
block.write_int(1)
|
23
|
+
end
|
24
|
+
|
25
|
+
Net::SNMP::Wrapper.snmp_select_info(num_fds, fdset, tval.pointer, block )
|
26
|
+
num_ready = 0
|
27
|
+
if num_fds.read_int > 0
|
28
|
+
tv = timeout == false ? nil : tval
|
29
|
+
num_ready = Net::SNMP::Wrapper.select(num_fds.read_int, fdset, nil, nil, tv)
|
30
|
+
Net::SNMP::Wrapper.snmp_read(fdset)
|
31
|
+
end
|
32
|
+
num_ready
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def self._get_oid(name)
|
37
|
+
oid_ptr = FFI::MemoryPointer.new(:ulong, Constants::MAX_OID_LEN)
|
38
|
+
oid_len_ptr = FFI::MemoryPointer.new(:size_t)
|
39
|
+
oid_len_ptr.write_int(Constants::MAX_OID_LEN)
|
40
|
+
|
41
|
+
if !Wrapper.snmp_parse_oid(name, oid_ptr, oid_len_ptr)
|
42
|
+
Wrapper.snmp_perror(name)
|
43
|
+
end
|
44
|
+
[oid_ptr, oid_len_ptr]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.get_oid(name)
|
48
|
+
oid_ptr, oid_len_ptr = _get_oid(name)
|
49
|
+
oid_ptr.read_array_of_long(oid_len_ptr.read_int).join(".")
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,239 @@
|
|
1
|
+
module Net
|
2
|
+
module SNMP
|
3
|
+
module Constants
|
4
|
+
MAX_OID_LEN = 128
|
5
|
+
SNMP_VERSION_1 = 0
|
6
|
+
SNMP_VERSION_2c = 1
|
7
|
+
SNMP_VERSION_3 = 3
|
8
|
+
|
9
|
+
ASN_BOOLEAN = 0x01
|
10
|
+
ASN_INTEGER = 0x02
|
11
|
+
ASN_BIT_STR = 0x03
|
12
|
+
ASN_OCTET_STR = 0x04
|
13
|
+
ASN_NULL = 0x05
|
14
|
+
ASN_OBJECT_ID = 0x06
|
15
|
+
ASN_SEQUENCE = 0x10
|
16
|
+
ASN_SET = 0x11
|
17
|
+
|
18
|
+
ASN_UNIVERSAL = 0x00
|
19
|
+
ASN_APPLICATION = 0x40
|
20
|
+
ASN_CONTEXT = 0x80
|
21
|
+
ASN_PRIVATE = 0xC0
|
22
|
+
|
23
|
+
ASN_PRIMITIVE = 0x00
|
24
|
+
ASN_CONSTRUCTOR = 0x20
|
25
|
+
|
26
|
+
ASN_LONG_LEN = 0x80
|
27
|
+
ASN_EXTENSION_ID = 0x1F
|
28
|
+
ASN_BIT8 = 0x80
|
29
|
+
|
30
|
+
|
31
|
+
ASN_IPADDRESS = (ASN_APPLICATION | 0)
|
32
|
+
ASN_COUNTER = (ASN_APPLICATION | 1)
|
33
|
+
ASN_GAUGE = (ASN_APPLICATION | 2)
|
34
|
+
ASN_UNSIGNED = (ASN_APPLICATION | 2) # RFC 1902 - same as GAUGE
|
35
|
+
ASN_TIMETICKS = (ASN_APPLICATION | 3)
|
36
|
+
ASN_OPAQUE = (ASN_APPLICATION | 4)
|
37
|
+
|
38
|
+
#define ASN_NSAP (ASN_APPLICATION | 5) /* historic - don't use */
|
39
|
+
#define ASN_COUNTER64 (ASN_APPLICATION | 6)
|
40
|
+
#define ASN_UINTEGER (ASN_APPLICATION | 7) /* historic - don't use */
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
SNMP_MSG_GET = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x0)
|
45
|
+
SNMP_MSG_GETNEXT = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x1)
|
46
|
+
SNMP_MSG_RESPONSE = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x2)
|
47
|
+
SNMP_MSG_SET = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x3)
|
48
|
+
SNMP_MSG_TRAP = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x4)
|
49
|
+
SNMP_MSG_GETBULK = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x5)
|
50
|
+
SNMP_MSG_INFORM = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x6)
|
51
|
+
SNMP_MSG_TRAP2 = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x7)
|
52
|
+
SNMP_MSG_REPORT = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x8)
|
53
|
+
|
54
|
+
NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE = 1
|
55
|
+
NETSNMP_CALLBACK_OP_TIMED_OUT = 2
|
56
|
+
NETSNMP_CALLBACK_OP_SEND_FAILED = 3
|
57
|
+
NETSNMP_CALLBACK_OP_CONNECT = 4
|
58
|
+
NETSNMP_CALLBACK_OP_DISCONNECT = 5
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
USM_AUTH_KU_LEN = 32
|
63
|
+
USM_PRIV_KU_LEN = 32
|
64
|
+
|
65
|
+
SNMP_SEC_LEVEL_NOAUTH = 1
|
66
|
+
SNMP_SEC_LEVEL_AUTHNOPRIV = 2
|
67
|
+
SNMP_SEC_LEVEL_AUTHPRIV = 3
|
68
|
+
|
69
|
+
SNMP_DEFAULT_COMMUNITY_LEN = 0
|
70
|
+
SNMP_DEFAULT_RETRIES = -1
|
71
|
+
SNMP_DEFAULT_TIMEOUT = -1
|
72
|
+
SNMP_DEFAULT_REMPORT = 0
|
73
|
+
SNMP_DEFAULT_REQID = -1
|
74
|
+
SNMP_DEFAULT_MSGID = -1
|
75
|
+
SNMP_DEFAULT_ERRSTAT = -1
|
76
|
+
SNMP_DEFAULT_ERRINDEX = -1
|
77
|
+
SNMP_DEFAULT_ADDRESS = 0
|
78
|
+
SNMP_DEFAULT_ENTERPRISE_LENGTH = 0
|
79
|
+
SNMP_DEFAULT_TIME = 0
|
80
|
+
SNMP_DEFAULT_VERSION = -1
|
81
|
+
SNMP_DEFAULT_SECMODEL = -1
|
82
|
+
SNMP_DEFAULT_CONTEXT =
|
83
|
+
|
84
|
+
SNMP_MAX_MSG_SIZE = 1472
|
85
|
+
SNMP_MAX_MSG_V3_HDRS = (4+3+4+7+7+3+7+16)
|
86
|
+
SNMP_MAX_ENG_SIZE = 32
|
87
|
+
SNMP_MAX_SEC_NAME_SIZE = 256
|
88
|
+
SNMP_MAX_CONTEXT_SIZE = 256
|
89
|
+
SNMP_SEC_PARAM_BUF_SIZE = 256
|
90
|
+
SNMPV3_IGNORE_UNAUTH_REPORTS = 0
|
91
|
+
SNMP_SESS_NONAUTHORITATIVE = 0
|
92
|
+
SNMP_SESS_AUTHORITATIVE = 1
|
93
|
+
SNMP_SESS_UNKNOWNAUTH = 2
|
94
|
+
REPORT_STATS_LEN = 9
|
95
|
+
REPORT_snmpUnknownSecurityModels_NUM = 1
|
96
|
+
REPORT_snmpInvalidMsgs_NUM = 2
|
97
|
+
REPORT_usmStatsUnsupportedSecLevels_NUM = 1
|
98
|
+
REPORT_usmStatsNotInTimeWindows_NUM = 2
|
99
|
+
REPORT_usmStatsUnknownUserNames_NUM = 3
|
100
|
+
REPORT_usmStatsUnknownEngineIDs_NUM = 4
|
101
|
+
REPORT_usmStatsWrongDigests_NUM = 5
|
102
|
+
REPORT_usmStatsDecryptionErrors_NUM = 6
|
103
|
+
SNMP_DETAIL_SIZE = 512
|
104
|
+
SNMP_FLAGS_RESP_CALLBACK = 0x400
|
105
|
+
SNMP_FLAGS_USER_CREATED = 0x200
|
106
|
+
SNMP_FLAGS_DONT_PROBE = 0x100
|
107
|
+
SNMP_FLAGS_STREAM_SOCKET = 0x80
|
108
|
+
SNMP_FLAGS_LISTENING = 0x40
|
109
|
+
SNMP_FLAGS_SUBSESSION = 0x20
|
110
|
+
SNMP_FLAGS_STRIKE2 = 0x02
|
111
|
+
SNMP_FLAGS_STRIKE1 = 0x01
|
112
|
+
SNMPERR_SUCCESS = (0)
|
113
|
+
SNMPERR_GENERR = (-1)
|
114
|
+
SNMPERR_BAD_LOCPORT = (-2)
|
115
|
+
SNMPERR_BAD_ADDRESS = (-3)
|
116
|
+
SNMPERR_BAD_SESSION = (-4)
|
117
|
+
SNMPERR_TOO_LONG = (-5)
|
118
|
+
SNMPERR_NO_SOCKET = (-6)
|
119
|
+
SNMPERR_V2_IN_V1 = (-7)
|
120
|
+
SNMPERR_V1_IN_V2 = (-8)
|
121
|
+
SNMPERR_BAD_REPEATERS = (-9)
|
122
|
+
SNMPERR_BAD_REPETITIONS = (-10)
|
123
|
+
SNMPERR_BAD_ASN1_BUILD = (-11)
|
124
|
+
SNMPERR_BAD_SENDTO = (-12)
|
125
|
+
SNMPERR_BAD_PARSE = (-13)
|
126
|
+
SNMPERR_BAD_VERSION = (-14)
|
127
|
+
SNMPERR_BAD_SRC_PARTY = (-15)
|
128
|
+
SNMPERR_BAD_DST_PARTY = (-16)
|
129
|
+
SNMPERR_BAD_CONTEXT = (-17)
|
130
|
+
SNMPERR_BAD_COMMUNITY = (-18)
|
131
|
+
SNMPERR_NOAUTH_DESPRIV = (-19)
|
132
|
+
SNMPERR_BAD_ACL = (-20)
|
133
|
+
SNMPERR_BAD_PARTY = (-21)
|
134
|
+
SNMPERR_ABORT = (-22)
|
135
|
+
SNMPERR_UNKNOWN_PDU = (-23)
|
136
|
+
SNMPERR_TIMEOUT = (-24)
|
137
|
+
SNMPERR_BAD_RECVFROM = (-25)
|
138
|
+
SNMPERR_BAD_ENG_ID = (-26)
|
139
|
+
SNMPERR_BAD_SEC_NAME = (-27)
|
140
|
+
SNMPERR_BAD_SEC_LEVEL = (-28)
|
141
|
+
SNMPERR_ASN_PARSE_ERR = (-29)
|
142
|
+
SNMPERR_UNKNOWN_SEC_MODEL = (-30)
|
143
|
+
SNMPERR_INVALID_MSG = (-31)
|
144
|
+
SNMPERR_UNKNOWN_ENG_ID = (-32)
|
145
|
+
SNMPERR_UNKNOWN_USER_NAME = (-33)
|
146
|
+
SNMPERR_UNSUPPORTED_SEC_LEVEL = (-34)
|
147
|
+
SNMPERR_AUTHENTICATION_FAILURE = (-35)
|
148
|
+
SNMPERR_NOT_IN_TIME_WINDOW = (-36)
|
149
|
+
SNMPERR_DECRYPTION_ERR = (-37)
|
150
|
+
SNMPERR_SC_GENERAL_FAILURE = (-38)
|
151
|
+
SNMPERR_SC_NOT_CONFIGURED = (-39)
|
152
|
+
SNMPERR_KT_NOT_AVAILABLE = (-40)
|
153
|
+
SNMPERR_UNKNOWN_REPORT = (-41)
|
154
|
+
SNMPERR_USM_GENERICERROR = (-42)
|
155
|
+
SNMPERR_USM_UNKNOWNSECURITYNAME = (-43)
|
156
|
+
SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL = (-44)
|
157
|
+
SNMPERR_USM_ENCRYPTIONERROR = (-45)
|
158
|
+
SNMPERR_USM_AUTHENTICATIONFAILURE = (-46)
|
159
|
+
SNMPERR_USM_PARSEERROR = (-47)
|
160
|
+
SNMPERR_USM_UNKNOWNENGINEID = (-48)
|
161
|
+
SNMPERR_USM_NOTINTIMEWINDOW = (-49)
|
162
|
+
SNMPERR_USM_DECRYPTIONERROR = (-50)
|
163
|
+
SNMPERR_NOMIB = (-51)
|
164
|
+
SNMPERR_RANGE = (-52)
|
165
|
+
SNMPERR_MAX_SUBID = (-53)
|
166
|
+
SNMPERR_BAD_SUBID = (-54)
|
167
|
+
SNMPERR_LONG_OID = (-55)
|
168
|
+
SNMPERR_BAD_NAME = (-56)
|
169
|
+
SNMPERR_VALUE = (-57)
|
170
|
+
SNMPERR_UNKNOWN_OBJID = (-58)
|
171
|
+
SNMPERR_NULL_PDU = (-59)
|
172
|
+
SNMPERR_NO_VARS = (-60)
|
173
|
+
SNMPERR_VAR_TYPE = (-61)
|
174
|
+
SNMPERR_MALLOC = (-62)
|
175
|
+
SNMPERR_KRB5 = (-63)
|
176
|
+
SNMPERR_PROTOCOL = (-64)
|
177
|
+
SNMPERR_OID_NONINCREASING = (-65)
|
178
|
+
SNMPERR_MAX = (-65)
|
179
|
+
|
180
|
+
|
181
|
+
STAT_SNMPUNKNOWNSECURITYMODELS = 0
|
182
|
+
STAT_SNMPINVALIDMSGS = 1
|
183
|
+
STAT_SNMPUNKNOWNPDUHANDLERS = 2
|
184
|
+
STAT_MPD_STATS_START = 0
|
185
|
+
STAT_MPD_STATS_END = 2
|
186
|
+
STAT_USMSTATSUNSUPPORTEDSECLEVELS = 3
|
187
|
+
STAT_USMSTATSNOTINTIMEWINDOWS = 4
|
188
|
+
STAT_USMSTATSUNKNOWNUSERNAMES = 5
|
189
|
+
STAT_USMSTATSUNKNOWNENGINEIDS = 6
|
190
|
+
STAT_USMSTATSWRONGDIGESTS = 7
|
191
|
+
STAT_USMSTATSDECRYPTIONERRORS = 8
|
192
|
+
STAT_USM_STATS_START = 3
|
193
|
+
STAT_USM_STATS_END = 8
|
194
|
+
STAT_SNMPINPKTS = 9
|
195
|
+
STAT_SNMPOUTPKTS = 10
|
196
|
+
STAT_SNMPINBADVERSIONS = 11
|
197
|
+
STAT_SNMPINBADCOMMUNITYNAMES = 12
|
198
|
+
STAT_SNMPINBADCOMMUNITYUSES = 13
|
199
|
+
STAT_SNMPINASNPARSEERRS = 14
|
200
|
+
STAT_SNMPINTOOBIGS = 16
|
201
|
+
STAT_SNMPINNOSUCHNAMES = 17
|
202
|
+
STAT_SNMPINBADVALUES = 18
|
203
|
+
STAT_SNMPINREADONLYS = 19
|
204
|
+
STAT_SNMPINGENERRS = 20
|
205
|
+
STAT_SNMPINTOTALREQVARS = 21
|
206
|
+
STAT_SNMPINTOTALSETVARS = 22
|
207
|
+
STAT_SNMPINGETREQUESTS = 23
|
208
|
+
STAT_SNMPINGETNEXTS = 24
|
209
|
+
STAT_SNMPINSETREQUESTS = 25
|
210
|
+
STAT_SNMPINGETRESPONSES = 26
|
211
|
+
STAT_SNMPINTRAPS = 27
|
212
|
+
STAT_SNMPOUTTOOBIGS = 28
|
213
|
+
STAT_SNMPOUTNOSUCHNAMES = 29
|
214
|
+
STAT_SNMPOUTBADVALUES = 30
|
215
|
+
STAT_SNMPOUTGENERRS = 32
|
216
|
+
STAT_SNMPOUTGETREQUESTS = 33
|
217
|
+
STAT_SNMPOUTGETNEXTS = 34
|
218
|
+
STAT_SNMPOUTSETREQUESTS = 35
|
219
|
+
STAT_SNMPOUTGETRESPONSES = 36
|
220
|
+
STAT_SNMPOUTTRAPS = 37
|
221
|
+
STAT_SNMPSILENTDROPS = 39
|
222
|
+
STAT_SNMPPROXYDROPS = 40
|
223
|
+
STAT_SNMP_STATS_START = 9
|
224
|
+
STAT_SNMP_STATS_END = 40
|
225
|
+
STAT_SNMPUNAVAILABLECONTEXTS = 41
|
226
|
+
STAT_SNMPUNKNOWNCONTEXTS = 42
|
227
|
+
STAT_TARGET_STATS_START = 41
|
228
|
+
STAT_TARGET_STATS_END = 42
|
229
|
+
MAX_STATS = 43
|
230
|
+
PARSE_PACKET = 0
|
231
|
+
DUMP_PACKET = 1
|
232
|
+
MAX_SUBID = 0xFFFFFFFF
|
233
|
+
MIN_OID_LEN = 2
|
234
|
+
|
235
|
+
MAX_NAME_LEN = 128
|
236
|
+
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Net
|
2
|
+
module SNMP
|
3
|
+
class Error < RuntimeError
|
4
|
+
#attr :status, :errno, :snmp_err, :snmp_msg
|
5
|
+
|
6
|
+
def initialize(opts = {})
|
7
|
+
@status = opts[:status]
|
8
|
+
if opts[:session]
|
9
|
+
errno_ptr = FFI::MemoryPointer.new(:int)
|
10
|
+
snmp_err_ptr = FFI::MemoryPointer.new(:int)
|
11
|
+
msg_ptr = FFI::MemoryPointer.new(:pointer)
|
12
|
+
Wrapper.snmp_error(opts[:session].pointer, errno_ptr, snmp_err_ptr, msg_ptr)
|
13
|
+
|
14
|
+
@errno = errno_ptr.read_int
|
15
|
+
@snmp_err = snmp_err_ptr.read_int
|
16
|
+
@snmp_msg = msg_ptr.read_pointer.read_string
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Net
|
2
|
+
module SNMP
|
3
|
+
module Inline
|
4
|
+
extend Inliner
|
5
|
+
|
6
|
+
#module LibC
|
7
|
+
# extend FFI::Library
|
8
|
+
# ffi_lib 'C'
|
9
|
+
# attach_function :malloc, [ :uint ], :pointer
|
10
|
+
# attach_function :free, [ :pointer ], :void
|
11
|
+
#end
|
12
|
+
|
13
|
+
inline do |builder|
|
14
|
+
builder.include "sys/select.h"
|
15
|
+
builder.include "stdio.h"
|
16
|
+
builder.library "netsnmp"
|
17
|
+
builder.c %q{
|
18
|
+
int snmp_process_callbacks() {
|
19
|
+
int fds = 0, block = 1;
|
20
|
+
fd_set fdset;
|
21
|
+
struct timeval timeout;
|
22
|
+
FD_ZERO(&fdset);
|
23
|
+
snmp_select_info(&fds, &fdset, &timeout, &block);
|
24
|
+
fds = select(fds, &fdset, 0,0, block ? 0 : &timeout);
|
25
|
+
if(fds) {
|
26
|
+
snmp_read(&fdset);
|
27
|
+
} else {
|
28
|
+
snmp_timeout();
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/net/snmp/mib.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
module Net::SNMP
|
3
|
+
module MIB
|
4
|
+
class Node
|
5
|
+
extend Forwardable
|
6
|
+
attr_accessor :struct
|
7
|
+
def_delegators :struct, :label, :type, :access, :status
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def get_node(oid)
|
11
|
+
oid_ptr, oid_len_ptr = Net::SNMP._get_oid(oid)
|
12
|
+
struct = Wrapper.get_tree(oid_ptr, oid_len_ptr.read_int, Wrapper.get_tree_head().pointer)
|
13
|
+
new(struct.pointer)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(arg)
|
18
|
+
case arg
|
19
|
+
when FFI::Pointer
|
20
|
+
@struct = Wrapper::Tree.new(arg)
|
21
|
+
else
|
22
|
+
raise "invalid type"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def oid
|
27
|
+
return @oid if @oid
|
28
|
+
@oid = Net::SNMP.get_oid(label)
|
29
|
+
end
|
30
|
+
|
31
|
+
# actually seems like list is linked backward, so this will retrieve the previous oid numerically
|
32
|
+
def next
|
33
|
+
return nil unless @struct.next_peer
|
34
|
+
self.class.new(@struct.next_peer)
|
35
|
+
end
|
36
|
+
|
37
|
+
def parent
|
38
|
+
return nil unless @struct.parent
|
39
|
+
self.class.new(@struct.parent)
|
40
|
+
end
|
41
|
+
|
42
|
+
def children
|
43
|
+
return nil unless @struct.child_list
|
44
|
+
child = self.class.new(@struct.child_list)
|
45
|
+
children = [child]
|
46
|
+
while child = child.next
|
47
|
+
children << child
|
48
|
+
end
|
49
|
+
children.reverse # For some reason, net-snmp returns everything backwards
|
50
|
+
end
|
51
|
+
|
52
|
+
def siblings
|
53
|
+
parent.children
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|