netsnmp 0.0.2 → 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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.travis.yml +4 -4
  4. data/Gemfile +5 -1
  5. data/README.md +124 -63
  6. data/lib/netsnmp.rb +66 -10
  7. data/lib/netsnmp/client.rb +93 -75
  8. data/lib/netsnmp/encryption/aes.rb +84 -0
  9. data/lib/netsnmp/encryption/des.rb +80 -0
  10. data/lib/netsnmp/encryption/none.rb +17 -0
  11. data/lib/netsnmp/errors.rb +1 -3
  12. data/lib/netsnmp/message.rb +81 -0
  13. data/lib/netsnmp/oid.rb +18 -137
  14. data/lib/netsnmp/pdu.rb +106 -64
  15. data/lib/netsnmp/scoped_pdu.rb +23 -0
  16. data/lib/netsnmp/security_parameters.rb +198 -0
  17. data/lib/netsnmp/session.rb +84 -275
  18. data/lib/netsnmp/v3_session.rb +81 -0
  19. data/lib/netsnmp/varbind.rb +65 -156
  20. data/lib/netsnmp/version.rb +2 -1
  21. data/netsnmp.gemspec +2 -8
  22. data/spec/client_spec.rb +147 -99
  23. data/spec/handlers/celluloid_spec.rb +33 -20
  24. data/spec/oid_spec.rb +11 -5
  25. data/spec/pdu_spec.rb +22 -22
  26. data/spec/security_parameters_spec.rb +40 -0
  27. data/spec/session_spec.rb +0 -23
  28. data/spec/support/celluloid.rb +24 -0
  29. data/spec/support/request_examples.rb +36 -0
  30. data/spec/support/start_docker.sh +15 -1
  31. data/spec/v3_session_spec.rb +21 -0
  32. data/spec/varbind_spec.rb +2 -51
  33. metadata +30 -76
  34. data/lib/netsnmp/core.rb +0 -12
  35. data/lib/netsnmp/core/client.rb +0 -15
  36. data/lib/netsnmp/core/constants.rb +0 -153
  37. data/lib/netsnmp/core/inline.rb +0 -20
  38. data/lib/netsnmp/core/libc.rb +0 -48
  39. data/lib/netsnmp/core/libsnmp.rb +0 -44
  40. data/lib/netsnmp/core/structures.rb +0 -167
  41. data/lib/netsnmp/core/utilities.rb +0 -13
  42. data/lib/netsnmp/handlers/celluloid.rb +0 -27
  43. data/lib/netsnmp/handlers/em.rb +0 -56
  44. data/spec/core/libc_spec.rb +0 -2
  45. data/spec/core/libsnmp_spec.rb +0 -32
  46. data/spec/core/structures_spec.rb +0 -54
  47. data/spec/handlers/em_client_spec.rb +0 -34
data/lib/netsnmp/core.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'ffi'
2
-
3
- require 'netsnmp/core/libc'
4
- require 'netsnmp/core/constants'
5
- require 'netsnmp/core/structures'
6
- require 'netsnmp/core/libsnmp'
7
- require 'netsnmp/core/inline'
8
- require 'netsnmp/core/utilities'
9
-
10
- module NETSNMP::Core
11
- LibSNMP.init_snmp("snmp")
12
- end
@@ -1,15 +0,0 @@
1
- require 'socket'
2
- module SNMP
3
- module Client
4
- # RFC 2571
5
-
6
- def bang(options={})
7
- hostname, port = options.values_at(:hostname, :port)
8
-
9
- sock = UDPSocket.new
10
- sock.bind(hostname, port)
11
-
12
- end
13
-
14
- end
15
- end
@@ -1,153 +0,0 @@
1
- module NETSNMP::Core
2
- # Sets all the constants necessary to recognize from the structures
3
- module Constants
4
- MAX_OID_LEN = 128
5
-
6
- # Return values of various send functions
7
- STAT_SUCCESS = 0
8
- STAT_ERROR = 1
9
- STAT_TIMEOUT = 2
10
-
11
- SNMP_VERSION_1 = 0
12
- SNMP_VERSION_2c = 1
13
- SNMP_VERSION_3 = 3
14
-
15
-
16
- USM_AUTH_KU_LEN = 32
17
- USM_PRIV_KU_LEN = 32
18
-
19
- # SNMPv3 Security Levels
20
- SNMP_SEC_LEVEL_NOAUTH = 1
21
- SNMP_SEC_LEVEL_AUTHNOPRIV = 2
22
- SNMP_SEC_LEVEL_AUTHPRIV = 3
23
-
24
- # SNMP Errors
25
- SNMPERR_SUCCESS = (0)
26
- SNMPERR_GENERR = (-1)
27
- SNMPERR_BAD_LOCPORT = (-2)
28
- SNMPERR_BAD_ADDRESS = (-3)
29
- SNMPERR_BAD_SESSION = (-4)
30
- SNMPERR_TOO_LONG = (-5)
31
- SNMPERR_NO_SOCKET = (-6)
32
- SNMPERR_V2_IN_V1 = (-7)
33
- SNMPERR_V1_IN_V2 = (-8)
34
- SNMPERR_BAD_REPEATERS = (-9)
35
- SNMPERR_BAD_REPETITIONS = (-10)
36
- SNMPERR_BAD_ASN1_BUILD = (-11)
37
- SNMPERR_BAD_SENDTO = (-12)
38
- SNMPERR_BAD_PARSE = (-13)
39
- SNMPERR_BAD_VERSION = (-14)
40
- SNMPERR_BAD_SRC_PARTY = (-15)
41
- SNMPERR_BAD_DST_PARTY = (-16)
42
- SNMPERR_BAD_CONTEXT = (-17)
43
- SNMPERR_BAD_COMMUNITY = (-18)
44
- SNMPERR_NOAUTH_DESPRIV = (-19)
45
- SNMPERR_BAD_ACL = (-20)
46
- SNMPERR_BAD_PARTY = (-21)
47
- SNMPERR_ABORT = (-22)
48
- SNMPERR_UNKNOWN_PDU = (-23)
49
- SNMPERR_TIMEOUT = (-24)
50
- SNMPERR_BAD_RECVFROM = (-25)
51
- SNMPERR_BAD_ENG_ID = (-26)
52
- SNMPERR_BAD_SEC_NAME = (-27)
53
- SNMPERR_BAD_SEC_LEVEL = (-28)
54
- SNMPERR_ASN_PARSE_ERR = (-29)
55
- SNMPERR_UNKNOWN_SEC_MODEL = (-30)
56
- SNMPERR_INVALID_MSG = (-31)
57
- SNMPERR_UNKNOWN_ENG_ID = (-32)
58
- SNMPERR_UNKNOWN_USER_NAME = (-33)
59
- SNMPERR_UNSUPPORTED_SEC_LEVEL = (-34)
60
- SNMPERR_AUTHENTICATION_FAILURE = (-35)
61
- SNMPERR_NOT_IN_TIME_WINDOW = (-36)
62
- SNMPERR_DECRYPTION_ERR = (-37)
63
- SNMPERR_SC_GENERAL_FAILURE = (-38)
64
- SNMPERR_SC_NOT_CONFIGURED = (-39)
65
- SNMPERR_KT_NOT_AVAILABLE = (-40)
66
- SNMPERR_UNKNOWN_REPORT = (-41)
67
- SNMPERR_USM_GENERICERROR = (-42)
68
- SNMPERR_USM_UNKNOWNSECURITYNAME = (-43)
69
- SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL = (-44)
70
- SNMPERR_USM_ENCRYPTIONERROR = (-45)
71
- SNMPERR_USM_AUTHENTICATIONFAILURE = (-46)
72
- SNMPERR_USM_PARSEERROR = (-47)
73
- SNMPERR_USM_UNKNOWNENGINEID = (-48)
74
- SNMPERR_USM_NOTINTIMEWINDOW = (-49)
75
- SNMPERR_USM_DECRYPTIONERROR = (-50)
76
- SNMPERR_NOMIB = (-51)
77
- SNMPERR_RANGE = (-52)
78
- SNMPERR_MAX_SUBID = (-53)
79
- SNMPERR_BAD_SUBID = (-54)
80
- SNMPERR_LONG_OID = (-55)
81
- SNMPERR_BAD_NAME = (-56)
82
- SNMPERR_VALUE = (-57)
83
- SNMPERR_UNKNOWN_OBJID = (-58)
84
- SNMPERR_NULL_PDU = (-59)
85
- SNMPERR_NO_VARS = (-60)
86
- SNMPERR_VAR_TYPE = (-61)
87
- SNMPERR_MALLOC = (-62)
88
- SNMPERR_KRB5 = (-63)
89
- SNMPERR_PROTOCOL = (-64)
90
- SNMPERR_OID_NONINCREASING = (-65)
91
- SNMPERR_MAX = (-65)
92
-
93
- # PDU variable types
94
- ASN_BOOLEAN = 0x01
95
- ASN_INTEGER = 0x02
96
- ASN_BIT_STR = 0x03
97
- ASN_OCTET_STR = 0x04
98
- ASN_NULL = 0x05
99
- ASN_OBJECT_ID = 0x06
100
- ASN_SEQUENCE = 0x10
101
- ASN_SET = 0x11
102
-
103
- ASN_UNIVERSAL = 0x00
104
- ASN_APPLICATION = 0x40
105
- ASN_CONTEXT = 0x80
106
- ASN_PRIVATE = 0xC0
107
-
108
- ASN_PRIMITIVE = 0x00
109
- ASN_CONSTRUCTOR = 0x20
110
-
111
- ASN_LONG_LEN = 0x80
112
- ASN_EXTENSION_ID = 0x1F
113
- ASN_BIT8 = 0x80
114
-
115
-
116
- ASN_IPADDRESS = (ASN_APPLICATION | 0)
117
- ASN_COUNTER = (ASN_APPLICATION | 1)
118
- ASN_GAUGE = (ASN_APPLICATION | 2)
119
- ASN_UNSIGNED = (ASN_APPLICATION | 2) # RFC 1902 - same as GAUGE
120
- ASN_TIMETICKS = (ASN_APPLICATION | 3)
121
- ASN_OPAQUE = (ASN_APPLICATION | 4)
122
- ASN_NSAP = (ASN_APPLICATION | 5) # historic - don't use
123
- ASN_COUNTER64 = (ASN_APPLICATION | 6)
124
- ASN_UINTEGER = (ASN_APPLICATION | 7) # historic - don't use
125
-
126
- # Exception types for SNMPv2 and SNMPv3 (no value needed)
127
- SNMP_NOSUCHOBJECT = (ASN_CONTEXT | ASN_PRIMITIVE | 0x0)
128
- SNMP_NOSUCHINSTANCE = (ASN_CONTEXT | ASN_PRIMITIVE | 0x1)
129
- SNMP_ENDOFMIBVIEW = (ASN_CONTEXT | ASN_PRIMITIVE | 0x2)
130
-
131
-
132
- # PDU types
133
- SNMP_MSG_GET = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x0)
134
- SNMP_MSG_GETNEXT = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x1)
135
- SNMP_MSG_RESPONSE = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x2)
136
- SNMP_MSG_SET = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x3)
137
- SNMP_MSG_TRAP = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x4)
138
- SNMP_MSG_GETBULK = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x5)
139
- SNMP_MSG_INFORM = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x6)
140
- SNMP_MSG_TRAP2 = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x7)
141
- SNMP_MSG_REPORT = (ASN_CONTEXT | ASN_CONSTRUCTOR | 0x8)
142
-
143
-
144
- # Callback status codes
145
- NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE = 1
146
- NETSNMP_CALLBACK_OP_TIMED_OUT = 2
147
- NETSNMP_CALLBACK_OP_SEND_FAILED = 3
148
- NETSNMP_CALLBACK_OP_CONNECT = 4
149
- NETSNMP_CALLBACK_OP_DISCONNECT = 5
150
-
151
- end
152
- end
153
-
@@ -1,20 +0,0 @@
1
- module NETSNMP::Core
2
- module Inline
3
- if RUBY_PLATFORM == "java"
4
- def self.oid_size ; FFI::Pointer.size ; end
5
- else
6
- require 'inline'
7
- inline do |builder|
8
- # builder.include "sys/select.h"
9
- builder.include "<net-snmp/net-snmp-config.h>"
10
- builder.include "<net-snmp/types.h>"
11
- #builder.include "stdio.h"
12
- builder.c_singleton %q{
13
- int oid_size() {
14
- return sizeof(oid);
15
- }
16
- }
17
- end
18
- end
19
- end
20
- end
@@ -1,48 +0,0 @@
1
- module NETSNMP::Core
2
- module C
3
- extend FFI::Library
4
- ffi_lib(FFI::Library::LIBC).first
5
-
6
- typedef :pointer, :FILE
7
- typedef :uint32, :in_addr_t
8
- typedef :uint16, :in_port_t
9
-
10
- unless FFI::Platform::IS_WINDOWS
11
- attach_function :getdtablesize, [], :int
12
- end
13
-
14
- class Timeval < FFI::Struct
15
- if FFI::Platform::IS_WINDOWS
16
- layout(
17
- :sec, :long,
18
- :usec, :long
19
- )
20
- else
21
- layout(
22
- :tv_sec, :time_t,
23
- :tv_usec, :suseconds_t
24
- )
25
- end
26
- end
27
-
28
- class FDSet < ::FFI::Struct
29
- if FFI::Platform::IS_WINDOWS
30
- layout(
31
- :fd_count, :uint,
32
- # TODO: Make it future proof by dynamically grabbing FD_SETSIZE.
33
- :fd_array, [:uint, 2048]
34
- )
35
- def clear; self[:fd_count] = 0; end
36
- else
37
- # FD Set size.
38
- FD_SETSIZE = C.getdtablesize
39
- layout(
40
- :fds_bits, [:long, FD_SETSIZE / FFI::Type::LONG.size]
41
- )
42
-
43
- # :nodoc:
44
- def clear; super; end
45
- end
46
- end
47
- end
48
- end
@@ -1,44 +0,0 @@
1
- module NETSNMP::Core
2
- module LibSNMP
3
- extend FFI::Library
4
- ffi_lib ["libnetsnmp", "netsnmp"]
5
-
6
- callback(:snmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
7
- callback(:netsnmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
8
-
9
- # checks whether the oid is supported
10
- attach_function :read_objid, [:string, :pointer, :pointer], :int, blocking: true
11
- # checks whether the mib is supported
12
- attach_function :get_node, [:string, :pointer, :pointer], :int, blocking: true
13
-
14
- # initializes internal stuff, loads mibs, etc etc etc...
15
- attach_function :init_snmp, [ :string ], :void, blocking: true
16
-
17
- # PDU API
18
- attach_function :snmp_clone_pdu, [ :pointer ], :pointer
19
- attach_function :snmp_pdu_type, [ :int ], :string
20
- attach_function :snmp_pdu_add_variable, [ :pointer, :pointer, :uint, :u_char, :pointer, :size_t ], :pointer, blocking: true
21
- attach_function :snmp_free_pdu, [ :pointer ], :void, blocking: true
22
- attach_function :snmp_pdu_create, [:int], :pointer, blocking: true
23
-
24
- # session handling
25
- attach_function :generate_Ku, [:pointer, :int, :string, :int, :pointer, :pointer], :int, blocking: true
26
- attach_function :snmp_sess_init, [ :pointer ], :void, blocking: true
27
- attach_function :snmp_sess_open, [ :pointer ], :pointer, blocking: true
28
- attach_function :snmp_sess_session, [ :pointer ], :pointer, blocking: true
29
- attach_function :snmp_sess_close, [ :pointer ], :int, blocking: true
30
-
31
- # send/receive API
32
- attach_function :snmp_sess_send, [ :pointer, :pointer ], :int
33
- attach_function :snmp_sess_async_send, [ :pointer, :pointer, :snmp_callback, :pointer ], :int, blocking: true
34
- attach_function :snmp_sess_select_info, [ :pointer, :pointer, :pointer, :pointer, :pointer ], :int, blocking: true
35
- attach_function :snmp_sess_read, [ :pointer, :pointer ], :int, blocking: true
36
- attach_function :snmp_sess_timeout, [ :pointer ], :void
37
- attach_function :snmp_sess_synch_response, [:pointer, :pointer, :pointer], :int, blocking: true
38
-
39
-
40
- attach_function :snmp_perror, [ :string ], :void
41
-
42
- attach_function :netsnmp_get_version, [], :string
43
- end
44
- end
@@ -1,167 +0,0 @@
1
- module NETSNMP::Core
2
- # Maps to the relevant netsnmp C library structs.
3
- module Structures
4
- extend FFI::Library
5
- typedef :u_long, :oid
6
-
7
- callback(:snmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
8
- callback(:netsnmp_callback, [ :int, :pointer, :int, :pointer, :pointer ], :int)
9
-
10
- class SessionList < FFI::Struct
11
- layout(
12
- :next, :pointer,
13
- :session, :pointer,
14
- :transport, :pointer,
15
- :internal, :pointer
16
- )
17
- end
18
-
19
- class Transport < FFI::Struct
20
- layout(
21
- :domain, :pointer,
22
- :domain_length, :int,
23
- :local, :pointer,
24
- :local_length, :int,
25
- :remote, :pointer,
26
- :remote_length, :int,
27
- :sock, :int,
28
- :flags, :u_int,
29
- :data, :pointer,
30
- :data_length, :int,
31
- :msgMaxSize, :size_t,
32
- :base_transport, :pointer
33
- )
34
- end
35
-
36
- class Session < FFI::Struct
37
- layout(
38
- :version, :long,
39
- :retries, :int,
40
- :timeout, :long,
41
- :flags, :u_long,
42
- :subsession, :pointer,
43
- :next, :pointer,
44
- :peername, :pointer,
45
- :remote_port, :u_short,
46
- :localname, :pointer,
47
- :local_port, :u_short,
48
- :authenticator, callback([ :pointer, :pointer, :pointer, :uint ], :pointer),
49
- :callback, :netsnmp_callback,
50
- :callback_magic, :pointer,
51
- :s_errno, :int,
52
- :s_snmp_errno, :int,
53
- :sessid, :long,
54
- :community, :pointer,
55
- :community_len, :size_t,
56
- :rcvMsgMaxSize, :size_t,
57
- :sndMsgMaxSize, :size_t,
58
- :isAuthoritative, :u_char,
59
- :contextEngineID, :pointer,
60
- :contextEngineIDLen, :size_t,
61
- :engineBoots, :u_int,
62
- :engineTime, :u_int,
63
- :contextName, :pointer,
64
- :contextNameLen, :size_t,
65
- :securityEngineID, :pointer,
66
- :securityEngineIDLen, :size_t,
67
- :securityName, :pointer,
68
- :securityNameLen, :size_t,
69
- :securityAuthProto, :pointer,
70
- :securityAuthProtoLen, :size_t,
71
- :securityAuthKey, [:u_char, 32],
72
- :securityAuthKeyLen, :size_t,
73
- :securityAuthLocalKey, :pointer,
74
- :securityAuthLocalKeyLen, :size_t,
75
- :securityPrivProto, :pointer,
76
- :securityPrivProtoLen, :size_t,
77
- :securityPrivKey, [:u_char, 32],
78
- :securityPrivKeyLen, :size_t,
79
- :securityPrivLocalKey, :pointer,
80
- :securityPrivLocalKeyLen, :size_t,
81
- :securityModel, :int,
82
- :securityLevel, :int,
83
- :paramName, :pointer,
84
- :securityInfo, :pointer,
85
- :myvoid, :pointer
86
- )
87
- end
88
-
89
- class Vardata < FFI::Union
90
- layout(
91
- :integer, :pointer,
92
- :string, :pointer,
93
- :objid, :pointer,
94
- :bitstring, :pointer,
95
- :counter64, :pointer,
96
- :float, :pointer,
97
- :double, :pointer
98
- )
99
- end
100
-
101
- class VariableList < FFI::Struct
102
- layout(
103
- :next_variable, :pointer,#VariableList.typed_pointer,
104
- :name, :pointer,
105
- :name_length, :size_t,
106
- :type, :u_char,
107
- :val, Vardata,
108
- :val_len, :size_t,
109
- :name_loc, [:oid, Constants::MAX_OID_LEN],
110
- :buf, [:u_char, 40],
111
- :data, :pointer,
112
- :dataFreeHook, callback([ :pointer ], :void),
113
- :index, :int
114
- )
115
- end
116
-
117
-
118
- class PDU < FFI::Struct
119
- layout(
120
- :version, :long,
121
- :command, :int,
122
- :reqid, :long,
123
- :msgid, :long,
124
- :transid, :long,
125
- :sessid, :long,
126
- :errstat, :long,
127
- :errindex, :long,
128
- :time, :u_long,
129
- :flags, :u_long,
130
- :securityModel, :int,
131
- :securityLevel, :int,
132
- :msgParseModel, :int,
133
- :transport_data, :pointer,
134
- :transport_data_length, :int,
135
- :tDomain, :pointer,
136
- :tDomainLen, :size_t,
137
- :variables, :pointer,
138
- :community, :pointer,
139
- :community_len, :size_t,
140
- :enterprise, :pointer,
141
- :enterprise_length, :size_t,
142
- :trap_type, :long,
143
- :specific_type, :long,
144
- :agent_addr, [:uchar, 4],
145
- :contextEngineID, :pointer,
146
- :contextEngineIDLen, :size_t,
147
- :contextName, :pointer,
148
- :contextNameLen, :size_t,
149
- :securityEngineID, :pointer,
150
- :securityEngineIDLen, :size_t,
151
- :securityName, :pointer,
152
- :securityNameLen, :size_t,
153
- :priority, :int,
154
- :range_subid, :int,
155
- :securityStateRef, :pointer
156
- )
157
- end
158
-
159
- class Counter64 < FFI::Struct
160
- layout(
161
- :high, :u_long,
162
- :low, :u_long
163
- )
164
- end
165
-
166
- end
167
- end