netsnmp 0.1.8 → 0.4.1
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.
- checksums.yaml +4 -4
- data/README.md +60 -27
- data/lib/netsnmp.rb +3 -21
- data/lib/netsnmp/client.rb +4 -5
- data/lib/netsnmp/encryption/aes.rb +1 -3
- data/lib/netsnmp/encryption/des.rb +0 -2
- data/lib/netsnmp/errors.rb +1 -0
- data/lib/netsnmp/extensions.rb +113 -0
- data/lib/netsnmp/loggable.rb +36 -0
- data/lib/netsnmp/message.rb +70 -28
- data/lib/netsnmp/mib.rb +172 -0
- data/lib/netsnmp/mib/parser.rb +750 -0
- data/lib/netsnmp/oid.rb +7 -12
- data/lib/netsnmp/pdu.rb +23 -12
- data/lib/netsnmp/scoped_pdu.rb +8 -2
- data/lib/netsnmp/security_parameters.rb +22 -14
- data/lib/netsnmp/session.rb +14 -16
- data/lib/netsnmp/v3_session.rb +21 -9
- data/lib/netsnmp/varbind.rb +27 -22
- data/lib/netsnmp/version.rb +1 -1
- data/sig/client.rbs +24 -0
- data/sig/loggable.rbs +16 -0
- data/sig/message.rbs +9 -0
- data/sig/mib.rbs +21 -0
- data/sig/mib/parser.rbs +7 -0
- data/sig/netsnmp.rbs +19 -0
- data/sig/oid.rbs +18 -0
- data/sig/openssl.rbs +20 -0
- data/sig/pdu.rbs +48 -0
- data/sig/scoped_pdu.rbs +15 -0
- data/sig/security_parameters.rbs +58 -0
- data/sig/session.rbs +38 -0
- data/sig/timeticks.rbs +7 -0
- data/sig/v3_session.rbs +21 -0
- data/sig/varbind.rbs +30 -0
- data/spec/client_spec.rb +26 -8
- data/spec/handlers/celluloid_spec.rb +4 -3
- data/spec/mib_spec.rb +13 -0
- data/spec/session_spec.rb +2 -2
- data/spec/spec_helper.rb +9 -5
- data/spec/support/request_examples.rb +2 -2
- data/spec/v3_session_spec.rb +4 -4
- data/spec/varbind_spec.rb +5 -3
- metadata +31 -71
- data/.coveralls.yml +0 -1
- data/.gitignore +0 -14
- data/.rspec +0 -2
- data/.rubocop.yml +0 -11
- data/.rubocop_todo.yml +0 -69
- data/.travis.yml +0 -28
- data/Gemfile +0 -22
- data/Rakefile +0 -30
- data/netsnmp.gemspec +0 -31
- data/spec/support/Dockerfile +0 -14
- data/spec/support/specs.sh +0 -51
- data/spec/support/stop_docker.sh +0 -5
data/lib/netsnmp/version.rb
CHANGED
data/sig/client.rbs
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def get: (*untyped) -> untyped
|
5
|
+
| (*untyped) { (PDU) -> void } -> untyped
|
6
|
+
|
7
|
+
def get_next: (*untyped) -> untyped
|
8
|
+
| (*untyped) { (PDU) -> void } -> untyped
|
9
|
+
|
10
|
+
def set: (*untyped) -> untyped
|
11
|
+
| (*untyped) { (PDU) -> void } -> untyped
|
12
|
+
|
13
|
+
def inform: (*untyped) -> untyped
|
14
|
+
| (*untyped) { (PDU) -> void } -> untyped
|
15
|
+
|
16
|
+
def walk: (oid: oid) -> _Each[oid_type, oid_value]
|
17
|
+
|
18
|
+
def close: () -> void
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def initialize: (?version?: snmp_version, **untyped) -> untyped
|
23
|
+
end
|
24
|
+
end
|
data/sig/loggable.rbs
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
module Loggable
|
3
|
+
interface _Debugger
|
4
|
+
def <<: (string) -> void
|
5
|
+
end
|
6
|
+
|
7
|
+
DEBUG_LEVEL: Integer
|
8
|
+
DEBUG: _Debugger
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def initialize: (?debug: _DEBUGGER, ?debug_level: Integer, **untyped) -> void
|
13
|
+
|
14
|
+
def log: (?level: Integer) { () -> String } -> void
|
15
|
+
end
|
16
|
+
end
|
data/sig/message.rbs
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class Message
|
3
|
+
prepend Loggable
|
4
|
+
|
5
|
+
def decode: (String stream, security_parameters: SecurityParameters) -> [ScopedPDU, String, Integer, Integer]
|
6
|
+
|
7
|
+
def encode: (ScopedPDU pdu, security_parameters: SecurityParameters, ?engine_boots: Integer, ?engine_time: Integer) -> String
|
8
|
+
end
|
9
|
+
end
|
data/sig/mib.rbs
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
module MIB
|
3
|
+
type import = {ids: Array[{name: string}], name: string} | {ids: {name: string}, name: string}
|
4
|
+
|
5
|
+
|
6
|
+
MIBDIRS: Array[String]
|
7
|
+
PARSER: Parser
|
8
|
+
|
9
|
+
@parser_mutex: Mutex
|
10
|
+
@modules_loaded: Array[String]
|
11
|
+
@object_identifiers: Hash[String, String]
|
12
|
+
|
13
|
+
def self?.oid: (String identifier) -> String?
|
14
|
+
| (Array[_ToS] identifier) -> String?
|
15
|
+
|
16
|
+
def self?.load: (String mod) -> void
|
17
|
+
|
18
|
+
def self?.load_imports: ((Array[import] | import)? data) -> Hash[String, Array[String]]?
|
19
|
+
def self?.load_defaults: () -> void
|
20
|
+
end
|
21
|
+
end
|
data/sig/mib/parser.rbs
ADDED
data/sig/netsnmp.rbs
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
interface _Logger
|
3
|
+
def <<: (string) -> void
|
4
|
+
end
|
5
|
+
|
6
|
+
interface _Authenticate
|
7
|
+
def reset: () -> void
|
8
|
+
def <<: (string) -> void
|
9
|
+
def digest: () -> String
|
10
|
+
end
|
11
|
+
|
12
|
+
interface _Encrypt
|
13
|
+
def encrypt: (String payload, engine_boots: Integer, engine_time: Integer) -> String
|
14
|
+
|
15
|
+
def decrypt: (String payload, salt: String, engine_boots: Integer, engine_time: Integer) -> String
|
16
|
+
end
|
17
|
+
|
18
|
+
type snmp_version = 0 | 1 | 3 | :v1 | :v2c | :v3 | nil
|
19
|
+
end
|
data/sig/oid.rbs
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
type oid = String | Array[_ToS]
|
3
|
+
|
4
|
+
type oid_type = Integer | :ipaddress | :counter32 | :gauge | :timetick | :opaque | :nsap | :counter64 | :uinteger
|
5
|
+
|
6
|
+
type oid_value = String | Integer | Timetick | true | false | nil | IPAddr
|
7
|
+
|
8
|
+
# type oid_options = {}
|
9
|
+
|
10
|
+
module OID
|
11
|
+
|
12
|
+
def self?.build: (oid) -> String
|
13
|
+
|
14
|
+
def self?.to_asn: (String oid) -> OpenSSL::ASN1::ObjectId
|
15
|
+
|
16
|
+
def self?.parent?: (String oid, String oid) -> bool
|
17
|
+
end
|
18
|
+
end
|
data/sig/openssl.rbs
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module OpenSSL
|
2
|
+
module ASN1
|
3
|
+
class ASN1Data
|
4
|
+
end
|
5
|
+
class ObjectId < ASN1Data
|
6
|
+
end
|
7
|
+
class Primitive < ASN1Data
|
8
|
+
end
|
9
|
+
class Integer < ASN1Data
|
10
|
+
end
|
11
|
+
class OctetString < ASN1Data
|
12
|
+
end
|
13
|
+
class Sequence < ASN1Data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
interface _ToAsn
|
19
|
+
def to_asn: () -> OpenSSL::ASN1::ASN1Data
|
20
|
+
end
|
data/sig/pdu.rbs
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
type pdu_type = :get | :getnext | :set | :inform | :trap | :response
|
3
|
+
|
4
|
+
class PDU
|
5
|
+
|
6
|
+
# type pdu_options = {
|
7
|
+
# headers: [snmp_version?, String?],
|
8
|
+
# ?request_id: String,
|
9
|
+
# ?error_status: Integer,
|
10
|
+
# ?error_index: Integer,
|
11
|
+
# ?varbinds: Array[varbind_options]
|
12
|
+
# }
|
13
|
+
|
14
|
+
attr_reader varbinds: Array[Varbind]
|
15
|
+
attr_reader type: Integer
|
16
|
+
attr_reader version: snmp_version
|
17
|
+
attr_reader community: String
|
18
|
+
attr_reader request_id: Integer
|
19
|
+
|
20
|
+
def self.decode: (String der) -> PDU
|
21
|
+
| (OpenSSL::ASN1::ASN1Data der) -> PDU
|
22
|
+
|
23
|
+
def self.build: (pdu_type, **untyped) -> PDU
|
24
|
+
|
25
|
+
|
26
|
+
def to_asn: () -> OpenSSL::ASN1::ASN1Data
|
27
|
+
|
28
|
+
def to_der: () -> String
|
29
|
+
|
30
|
+
def add_varbind: (oid: oid, **varbind_options) -> void
|
31
|
+
alias << add_varbind
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def initialize: (
|
36
|
+
type: Integer,
|
37
|
+
headers: [snmp_version?, String?],
|
38
|
+
?request_id: Integer,
|
39
|
+
?error_status: Integer,
|
40
|
+
?error_index: Integer,
|
41
|
+
?varbinds: Array[varbind_options]
|
42
|
+
) -> untyped
|
43
|
+
|
44
|
+
def encode_headers_asn: () -> [OpenSSL::ASN1::Integer, OpenSSL::ASN1::OctetString]
|
45
|
+
|
46
|
+
def check_error_status: (Integer) -> void
|
47
|
+
end
|
48
|
+
end
|
data/sig/scoped_pdu.rbs
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class ScopedPDU < PDU
|
3
|
+
attr_reader engine_id: String
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize: (
|
8
|
+
type: Integer,
|
9
|
+
headers: [String?, String?],
|
10
|
+
**untyped
|
11
|
+
) -> void
|
12
|
+
|
13
|
+
def encode_headers_asn: () -> [OpenSSL::ASN1::OctetString, OpenSSL::ASN1::OctetString]
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class SecurityParameters
|
3
|
+
prepend Loggable
|
4
|
+
|
5
|
+
type security_level = :noauth | :auth_no_priv | :auth_priv | 0 | 1 | 3 | nil
|
6
|
+
|
7
|
+
type auth_protocol = :md5 | :sha
|
8
|
+
type priv_protocol = :des | :aes
|
9
|
+
|
10
|
+
|
11
|
+
@auth_protocol: auth_protocol?
|
12
|
+
@auth_password: String?
|
13
|
+
@priv_protocol: priv_protocol?
|
14
|
+
@priv_password: String?
|
15
|
+
@digest: _Authenticate?
|
16
|
+
@encryption: _Encrypt?
|
17
|
+
|
18
|
+
attr_reader security_level: security_level
|
19
|
+
attr_reader username: String
|
20
|
+
attr_reader engine_id: String
|
21
|
+
|
22
|
+
def engine_id=: (String id) -> void
|
23
|
+
|
24
|
+
def encode: (_ToAsn, salt: OpenSSL::ASN1::ASN1Data, engine_time: Integer, engine_boots: Integer) -> [OpenSSL::ASN1::ASN1Data, OpenSSL::ASN1::ASN1Data]
|
25
|
+
|
26
|
+
def decode: (OpenSSL::ASN1::ASN1Data | String der, salt: OpenSSL::ASN1::ASN1Data | String, engine_time: Integer, engine_boots: Integer, ?security_level: Integer?) -> OpenSSL::ASN1::ASN1Data
|
27
|
+
|
28
|
+
def sign: (String message) -> String?
|
29
|
+
|
30
|
+
def verify: (String stream, String salt, ?security_level: Integer?) -> void
|
31
|
+
|
32
|
+
def must_revalidate?: () -> bool
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def initialize: (
|
37
|
+
username: String,
|
38
|
+
?engine_id: String,
|
39
|
+
?security_level: security_level?,
|
40
|
+
?auth_protocol: auth_protocol?,
|
41
|
+
?auth_password: String?,
|
42
|
+
?priv_protocol: priv_protocol?,
|
43
|
+
?priv_password: String?,
|
44
|
+
) -> untyped
|
45
|
+
|
46
|
+
def auth_key: () -> String
|
47
|
+
|
48
|
+
def priv_key: () -> String
|
49
|
+
|
50
|
+
def check_parameters: () -> void
|
51
|
+
|
52
|
+
def localize_key: (String key) -> String
|
53
|
+
|
54
|
+
def passkey: (String password) -> String
|
55
|
+
|
56
|
+
def authorizable?: () -> bool
|
57
|
+
end
|
58
|
+
end
|
data/sig/session.rbs
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class Session
|
3
|
+
prepend Loggable
|
4
|
+
|
5
|
+
@transport: _Transport
|
6
|
+
@version: 0 | 1 | 3
|
7
|
+
@community: String?
|
8
|
+
|
9
|
+
def close: () -> void
|
10
|
+
|
11
|
+
def build_pdu: (pdu_type, *untyped) -> PDU
|
12
|
+
|
13
|
+
def send: (PDU) -> PDU
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def initialize: (?version: snmp_version, ?community: String, **untyped) -> untyped
|
18
|
+
|
19
|
+
def validate: (?host: String?, ?port: Integer, ?proxy: _Transport, ?timeout: Integer, **untyped) -> void
|
20
|
+
|
21
|
+
class Transport
|
22
|
+
def initialize: (String host, Integer port, timeout: Integer) -> untyped
|
23
|
+
def close: () -> void
|
24
|
+
def send: (String payload) -> String
|
25
|
+
def write: (String) -> void
|
26
|
+
def recv: () -> void
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def wait: (:wait_readable | :wait_writable) -> void
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
interface _Transport
|
35
|
+
def close: () -> void
|
36
|
+
def send: (String payload) -> String
|
37
|
+
end
|
38
|
+
end
|
data/sig/timeticks.rbs
ADDED
data/sig/v3_session.rbs
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class V3Session < Session
|
3
|
+
|
4
|
+
def build_pdu: (pdu_type, *untyped) -> ScopedPDU
|
5
|
+
|
6
|
+
def send: (ScopedPDU pdu) -> ScopedPDU
|
7
|
+
| (ScopedPDU pdu) -> [PDU, String, Integer, Integer]
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def encode: (ScopedPDU) -> String
|
12
|
+
|
13
|
+
def initialize: (?context: String, **untyped) -> untyped
|
14
|
+
|
15
|
+
def security_parameters: () -> SecurityParameters
|
16
|
+
|
17
|
+
def probe_for_engine: () -> String
|
18
|
+
|
19
|
+
def decode: (String, ?security_parameters: SecurityParameters) -> [PDU, String, Integer, Integer]
|
20
|
+
end
|
21
|
+
end
|
data/sig/varbind.rbs
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
type varbind_options = untyped
|
3
|
+
|
4
|
+
class Varbind
|
5
|
+
|
6
|
+
type varbind_value = OpenSSL::ASN1::OctetString | OpenSSL::ASN1::Primitive | OpenSSL::ASN1::ASN1Data | oid_value
|
7
|
+
|
8
|
+
attr_reader oid: String
|
9
|
+
attr_reader value: oid_value
|
10
|
+
|
11
|
+
def to_asn: () -> OpenSSL::ASN1::Sequence
|
12
|
+
|
13
|
+
def to_der: () -> String
|
14
|
+
|
15
|
+
def convert_val: (varbind_value) -> oid_value
|
16
|
+
|
17
|
+
|
18
|
+
def convert_to_asn: (oid_type, oid_value) -> OpenSSL::ASN1::ASN1Data
|
19
|
+
|
20
|
+
def convert_application_asn: (OpenSSL::ASN1::ASN1Data asn) -> oid_value
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def initialize: (oid, ?value: varbind_value, ?type: oid_type) -> untyped
|
25
|
+
|
26
|
+
def unpack_32bit_integer: (String) -> Integer
|
27
|
+
|
28
|
+
def unpack_64bit_integer: (String) -> Integer
|
29
|
+
end
|
30
|
+
end
|
data/spec/client_spec.rb
CHANGED
@@ -3,11 +3,11 @@
|
|
3
3
|
require_relative "support/request_examples"
|
4
4
|
|
5
5
|
RSpec.describe NETSNMP::Client do
|
6
|
-
let(:host) {
|
6
|
+
let(:host) { SNMPHOST }
|
7
7
|
|
8
8
|
let(:device_options) do
|
9
9
|
{
|
10
|
-
peername:
|
10
|
+
peername: SNMPHOST,
|
11
11
|
port: SNMPPORT
|
12
12
|
}
|
13
13
|
end
|
@@ -22,7 +22,7 @@ RSpec.describe NETSNMP::Client do
|
|
22
22
|
let(:get_oid) { "1.3.6.1.2.1.1.5.0" }
|
23
23
|
let(:next_oid) { "1.3.6.1.2.1.1.6.0" }
|
24
24
|
let(:walk_oid) { "1.3.6.1.2.1.1" }
|
25
|
-
let(:set_oid) { "
|
25
|
+
let(:set_oid) { "sysUpTime.0" } # sysUpTimeInstance
|
26
26
|
let(:get_result) { "DEVICE-192.168.1.1" }
|
27
27
|
let(:next_result) { "The Cloud" }
|
28
28
|
let(:walk_result) do
|
@@ -48,10 +48,10 @@ RSpec.describe NETSNMP::Client do
|
|
48
48
|
community: "public"
|
49
49
|
}
|
50
50
|
end
|
51
|
-
let(:get_oid) { "
|
51
|
+
let(:get_oid) { "sysName.0" }
|
52
52
|
let(:next_oid) { "1.3.6.1.2.1.1.6.0" }
|
53
|
-
let(:walk_oid) { "
|
54
|
-
let(:set_oid) { "
|
53
|
+
let(:walk_oid) { "system" }
|
54
|
+
let(:set_oid) { "sysUpTime.0" }
|
55
55
|
let(:get_result) { "DEVICE-192.168.1.1" }
|
56
56
|
let(:next_result) { "The Cloud" }
|
57
57
|
let(:walk_result) do
|
@@ -67,6 +67,24 @@ RSpec.describe NETSNMP::Client do
|
|
67
67
|
WALK
|
68
68
|
end
|
69
69
|
let(:set_oid_result) { 43 }
|
70
|
+
|
71
|
+
context "when the returned value is a hex-string" do
|
72
|
+
let(:protocol_options) do
|
73
|
+
{
|
74
|
+
version: "2c",
|
75
|
+
community: "foreignformats/winxp1"
|
76
|
+
}
|
77
|
+
end
|
78
|
+
let(:hex_get_oid) { "1.3.6.1.2.1.25.3.7.1.3.10.1" }
|
79
|
+
let(:hex_get_result) { "\x01\x00\x00\x00" }
|
80
|
+
let(:hex_get_output) { "01 00 00 00" }
|
81
|
+
let(:value) { subject.get(oid: hex_get_oid) }
|
82
|
+
|
83
|
+
it "returns the string, which outputs the hex-representation" do
|
84
|
+
expect(value).to eq(hex_get_result)
|
85
|
+
expect(value.inspect).to include(hex_get_output)
|
86
|
+
end
|
87
|
+
end
|
70
88
|
end
|
71
89
|
end
|
72
90
|
|
@@ -78,9 +96,9 @@ RSpec.describe NETSNMP::Client do
|
|
78
96
|
context: "a172334d7d97871b72241397f713fa12"
|
79
97
|
}
|
80
98
|
end
|
81
|
-
let(:get_oid) { "
|
99
|
+
let(:get_oid) { "sysName.0" }
|
82
100
|
let(:next_oid) { "1.3.6.1.2.1.1.6.0" }
|
83
|
-
let(:set_oid) { "
|
101
|
+
let(:set_oid) { "sysUpTime.0" } # sysUpTimeInstance
|
84
102
|
let(:walk_oid) { "1.3.6.1.2.1.1.9.1.3" }
|
85
103
|
let(:get_result) { "tt" }
|
86
104
|
let(:next_result) { "KK12" }
|