netsnmp 0.1.3 → 0.1.4
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 +5 -5
- data/.rubocop.yml +11 -0
- data/.rubocop_todo.yml +69 -0
- data/.travis.yml +6 -14
- data/Gemfile +7 -5
- data/README.md +66 -32
- data/Rakefile +7 -9
- data/lib/netsnmp/client.rb +42 -39
- data/lib/netsnmp/encryption/aes.rb +22 -22
- data/lib/netsnmp/encryption/des.rb +20 -21
- data/lib/netsnmp/encryption/none.rb +3 -3
- data/lib/netsnmp/errors.rb +1 -0
- data/lib/netsnmp/message.rb +31 -30
- data/lib/netsnmp/oid.rb +5 -4
- data/lib/netsnmp/pdu.rb +66 -69
- data/lib/netsnmp/scoped_pdu.rb +5 -7
- data/lib/netsnmp/security_parameters.rb +73 -54
- data/lib/netsnmp/session.rb +22 -24
- data/lib/netsnmp/timeticks.rb +8 -10
- data/lib/netsnmp/v3_session.rb +11 -13
- data/lib/netsnmp/varbind.rb +53 -49
- data/lib/netsnmp/version.rb +2 -1
- data/lib/netsnmp.rb +32 -12
- data/netsnmp.gemspec +10 -10
- data/spec/client_spec.rb +69 -49
- data/spec/handlers/celluloid_spec.rb +14 -10
- data/spec/oid_spec.rb +5 -3
- data/spec/pdu_spec.rb +14 -7
- data/spec/security_parameters_spec.rb +50 -18
- data/spec/session_spec.rb +9 -6
- data/spec/spec_helper.rb +14 -65
- data/spec/support/Dockerfile +3 -3
- data/spec/support/celluloid.rb +12 -6
- data/spec/support/request_examples.rb +19 -8
- data/spec/support/specs.sh +39 -0
- data/spec/support/{start_docker.sh → start-docker.sh} +4 -4
- data/spec/timeticks_spec.rb +2 -0
- data/spec/v3_session_spec.rb +8 -4
- data/spec/varbind_spec.rb +12 -0
- metadata +13 -9
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module NETSNMP
|
3
4
|
module Encryption
|
4
5
|
class AES
|
@@ -7,7 +8,7 @@ module NETSNMP
|
|
7
8
|
@local = local
|
8
9
|
end
|
9
10
|
|
10
|
-
def encrypt(decrypted_data, engine_boots
|
11
|
+
def encrypt(decrypted_data, engine_boots:, engine_time:)
|
11
12
|
cipher = OpenSSL::Cipher::AES128.new(:CFB)
|
12
13
|
|
13
14
|
iv, salt = generate_encryption_key(engine_boots, engine_time)
|
@@ -24,12 +25,11 @@ module NETSNMP
|
|
24
25
|
NETSNMP.debug { "encrypted:\n#{Hexdump.dump(encrypted_data)}" }
|
25
26
|
|
26
27
|
[encrypted_data, salt]
|
27
|
-
|
28
28
|
end
|
29
29
|
|
30
|
-
def decrypt(encrypted_data, salt
|
31
|
-
raise Error, "invalid priv salt received" unless salt.length % 8
|
32
|
-
raise Error, "invalid encrypted PDU received" unless encrypted_data.length % 8
|
30
|
+
def decrypt(encrypted_data, salt:, engine_boots:, engine_time:)
|
31
|
+
raise Error, "invalid priv salt received" unless (salt.length % 8).zero?
|
32
|
+
raise Error, "invalid encrypted PDU received" unless (encrypted_data.length % 8).zero?
|
33
33
|
|
34
34
|
cipher = OpenSSL::Cipher::AES128.new(:CFB)
|
35
35
|
cipher.padding = 0
|
@@ -40,13 +40,14 @@ module NETSNMP
|
|
40
40
|
cipher.key = des_key
|
41
41
|
cipher.iv = iv
|
42
42
|
decrypted_data = cipher.update(encrypted_data) + cipher.final
|
43
|
-
NETSNMP.debug {"decrypted:\n#{Hexdump.dump(decrypted_data)}" }
|
43
|
+
NETSNMP.debug { "decrypted:\n#{Hexdump.dump(decrypted_data)}" }
|
44
44
|
|
45
45
|
hlen, bodylen = OpenSSL::ASN1.traverse(decrypted_data) { |_, _, x, y, *| break x, y }
|
46
|
-
decrypted_data.byteslice(0, hlen+bodylen)
|
46
|
+
decrypted_data.byteslice(0, hlen + bodylen)
|
47
47
|
end
|
48
48
|
|
49
49
|
private
|
50
|
+
|
50
51
|
# 8.1.1.1
|
51
52
|
def generate_encryption_key(boots, time)
|
52
53
|
salt = [0xff & (@local >> 56),
|
@@ -62,23 +63,22 @@ module NETSNMP
|
|
62
63
|
iv = generate_decryption_key(boots, time, salt)
|
63
64
|
|
64
65
|
[iv, salt]
|
65
|
-
end
|
66
|
-
|
67
|
-
def generate_decryption_key(boots, time, salt)
|
68
|
-
[0xff & (boots >> 24),
|
69
|
-
0xff & (boots >> 16),
|
70
|
-
0xff & (boots >> 8),
|
71
|
-
0xff & boots,
|
72
|
-
0xff & (time >> 24),
|
73
|
-
0xff & (time >> 16),
|
74
|
-
0xff & (time >> 8),
|
75
|
-
0xff & time].pack("c*") + salt
|
76
|
-
end
|
77
|
-
|
78
|
-
def des_key
|
79
|
-
@priv_key[0,16]
|
80
66
|
end
|
81
67
|
|
68
|
+
def generate_decryption_key(boots, time, salt)
|
69
|
+
[0xff & (boots >> 24),
|
70
|
+
0xff & (boots >> 16),
|
71
|
+
0xff & (boots >> 8),
|
72
|
+
0xff & boots,
|
73
|
+
0xff & (time >> 24),
|
74
|
+
0xff & (time >> 16),
|
75
|
+
0xff & (time >> 8),
|
76
|
+
0xff & time].pack("c*") + salt
|
77
|
+
end
|
78
|
+
|
79
|
+
def des_key
|
80
|
+
@priv_key[0, 16]
|
81
|
+
end
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module NETSNMP
|
3
4
|
module Encryption
|
4
5
|
using StringExtensions
|
@@ -9,8 +10,7 @@ module NETSNMP
|
|
9
10
|
@local = local
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
def encrypt(decrypted_data, engine_boots: , engine_time: nil)
|
13
|
+
def encrypt(decrypted_data, engine_boots:, **)
|
14
14
|
cipher = OpenSSL::Cipher::DES.new(:CBC)
|
15
15
|
|
16
16
|
iv, salt = generate_encryption_key(engine_boots)
|
@@ -23,15 +23,14 @@ module NETSNMP
|
|
23
23
|
decrypted_data << ("\x00" * (8 - diff))
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
26
|
encrypted_data = cipher.update(decrypted_data) + cipher.final
|
28
|
-
NETSNMP.debug {"encrypted:\n#{Hexdump.dump(encrypted_data)}" }
|
27
|
+
NETSNMP.debug { "encrypted:\n#{Hexdump.dump(encrypted_data)}" }
|
29
28
|
[encrypted_data, salt]
|
30
29
|
end
|
31
30
|
|
32
|
-
def decrypt(encrypted_data, salt
|
33
|
-
raise Error, "invalid priv salt received" unless salt.length % 8
|
34
|
-
raise Error, "invalid encrypted PDU received" unless encrypted_data.length % 8
|
31
|
+
def decrypt(encrypted_data, salt:, **)
|
32
|
+
raise Error, "invalid priv salt received" unless (salt.length % 8).zero?
|
33
|
+
raise Error, "invalid encrypted PDU received" unless (encrypted_data.length % 8).zero?
|
35
34
|
|
36
35
|
cipher = OpenSSL::Cipher::DES.new(:CBC)
|
37
36
|
cipher.padding = 0
|
@@ -42,17 +41,17 @@ module NETSNMP
|
|
42
41
|
cipher.key = des_key
|
43
42
|
cipher.iv = iv
|
44
43
|
decrypted_data = cipher.update(encrypted_data) + cipher.final
|
45
|
-
NETSNMP.debug {"decrypted:\n#{Hexdump.dump(decrypted_data)}" }
|
44
|
+
NETSNMP.debug { "decrypted:\n#{Hexdump.dump(decrypted_data)}" }
|
46
45
|
|
47
46
|
hlen, bodylen = OpenSSL::ASN1.traverse(decrypted_data) { |_, _, x, y, *| break x, y }
|
48
|
-
decrypted_data.byteslice(0, hlen+bodylen)
|
47
|
+
decrypted_data.byteslice(0, hlen + bodylen)
|
49
48
|
end
|
50
49
|
|
51
|
-
|
52
50
|
private
|
51
|
+
|
53
52
|
# 8.1.1.1
|
54
53
|
def generate_encryption_key(boots)
|
55
|
-
pre_iv = @priv_key[8,8]
|
54
|
+
pre_iv = @priv_key[8, 8]
|
56
55
|
salt = [0xff & (boots >> 24),
|
57
56
|
0xff & (boots >> 16),
|
58
57
|
0xff & (boots >> 8),
|
@@ -61,19 +60,19 @@ module NETSNMP
|
|
61
60
|
0xff & (@local >> 16),
|
62
61
|
0xff & (@local >> 8),
|
63
62
|
0xff & @local].pack("c*")
|
64
|
-
|
63
|
+
@local = @local == 0xffffffff ? 0 : @local + 1
|
65
64
|
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
iv = pre_iv.xor(salt)
|
66
|
+
[iv, salt]
|
67
|
+
end
|
69
68
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
def generate_decryption_key(salt)
|
70
|
+
pre_iv = @priv_key[8, 8]
|
71
|
+
pre_iv.xor(salt)
|
72
|
+
end
|
74
73
|
|
75
|
-
def des_key
|
76
|
-
@priv_key[0,8]
|
74
|
+
def des_key
|
75
|
+
@priv_key[0, 8]
|
77
76
|
end
|
78
77
|
end
|
79
78
|
end
|
data/lib/netsnmp/errors.rb
CHANGED
data/lib/netsnmp/message.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module NETSNMP
|
3
4
|
# Factory for the SNMP v3 Message format
|
4
5
|
module Message
|
5
|
-
|
6
|
+
module_function
|
7
|
+
|
6
8
|
AUTHNONE = OpenSSL::ASN1::OctetString.new("\x00" * 12)
|
7
9
|
PRIVNONE = OpenSSL::ASN1::OctetString.new("")
|
8
10
|
MSG_MAX_SIZE = OpenSSL::ASN1::Integer.new(65507)
|
9
|
-
MSG_SECURITY_MODEL = OpenSSL::ASN1::Integer.new(3)
|
11
|
+
MSG_SECURITY_MODEL = OpenSSL::ASN1::Integer.new(3) # usmSecurityModel
|
10
12
|
MSG_VERSION = OpenSSL::ASN1::Integer.new(3)
|
11
13
|
MSG_REPORTABLE = 4
|
12
14
|
|
@@ -15,25 +17,25 @@ module NETSNMP
|
|
15
17
|
#
|
16
18
|
# @return [NETSNMP::ScopedPDU] the decoded PDU
|
17
19
|
#
|
18
|
-
def decode(stream, security_parameters:
|
20
|
+
def decode(stream, security_parameters:)
|
19
21
|
asn_tree = OpenSSL::ASN1.decode(stream)
|
20
|
-
|
22
|
+
_version, _headers, sec_params, pdu_payload = asn_tree.value
|
21
23
|
|
22
24
|
sec_params_asn = OpenSSL::ASN1.decode(sec_params.value).value
|
23
25
|
|
24
|
-
engine_id, engine_boots, engine_time,
|
26
|
+
engine_id, engine_boots, engine_time, _username, auth_param, priv_param = sec_params_asn.map(&:value)
|
25
27
|
|
26
28
|
# validate_authentication
|
27
29
|
security_parameters.verify(stream.sub(auth_param, AUTHNONE.value), auth_param)
|
28
30
|
|
29
|
-
engine_boots=engine_boots.to_i
|
30
|
-
engine_time =engine_time.to_i
|
31
|
+
engine_boots = engine_boots.to_i
|
32
|
+
engine_time = engine_time.to_i
|
31
33
|
|
32
34
|
encoded_pdu = security_parameters.decode(pdu_payload, salt: priv_param,
|
33
35
|
engine_boots: engine_boots,
|
34
36
|
engine_time: engine_time)
|
35
|
-
|
36
|
-
pdu = ScopedPDU.decode(encoded_pdu)
|
37
|
+
|
38
|
+
pdu = ScopedPDU.decode(encoded_pdu)
|
37
39
|
[pdu, engine_id, engine_boots, engine_time]
|
38
40
|
end
|
39
41
|
|
@@ -42,33 +44,33 @@ module NETSNMP
|
|
42
44
|
#
|
43
45
|
# @return [String] the byte representation of an SNMP v3 Message
|
44
46
|
#
|
45
|
-
def encode(pdu, security_parameters
|
46
|
-
scoped_pdu, salt_param = security_parameters.encode(pdu, salt: PRIVNONE,
|
47
|
-
engine_boots: engine_boots,
|
47
|
+
def encode(pdu, security_parameters:, engine_boots: 0, engine_time: 0)
|
48
|
+
scoped_pdu, salt_param = security_parameters.encode(pdu, salt: PRIVNONE,
|
49
|
+
engine_boots: engine_boots,
|
48
50
|
engine_time: engine_time)
|
49
51
|
|
50
52
|
sec_params = OpenSSL::ASN1::Sequence.new([
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
OpenSSL::ASN1::OctetString.new(security_parameters.engine_id),
|
54
|
+
OpenSSL::ASN1::Integer.new(engine_boots),
|
55
|
+
OpenSSL::ASN1::Integer.new(engine_time),
|
56
|
+
OpenSSL::ASN1::OctetString.new(security_parameters.username),
|
57
|
+
AUTHNONE,
|
58
|
+
salt_param
|
59
|
+
])
|
58
60
|
message_flags = MSG_REPORTABLE | security_parameters.security_level
|
59
61
|
message_id = OpenSSL::ASN1::Integer.new(SecureRandom.random_number(2147483647))
|
60
62
|
headers = OpenSSL::ASN1::Sequence.new([
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
63
|
+
message_id, MSG_MAX_SIZE,
|
64
|
+
OpenSSL::ASN1::OctetString.new([String(message_flags)].pack("h*")),
|
65
|
+
MSG_SECURITY_MODEL
|
66
|
+
])
|
65
67
|
|
66
|
-
encoded = OpenSSL::ASN1::Sequence([
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
encoded = OpenSSL::ASN1::Sequence([
|
69
|
+
MSG_VERSION,
|
70
|
+
headers,
|
71
|
+
OpenSSL::ASN1::OctetString.new(sec_params.to_der),
|
72
|
+
scoped_pdu
|
73
|
+
]).to_der
|
72
74
|
signature = security_parameters.sign(encoded)
|
73
75
|
if signature
|
74
76
|
auth_salt = OpenSSL::ASN1::OctetString.new(signature)
|
@@ -76,6 +78,5 @@ module NETSNMP
|
|
76
78
|
end
|
77
79
|
encoded
|
78
80
|
end
|
79
|
-
|
80
81
|
end
|
81
82
|
end
|
data/lib/netsnmp/oid.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module NETSNMP
|
3
4
|
# Abstracts the OID structure
|
4
5
|
#
|
5
6
|
module OID
|
6
7
|
OIDREGEX = /^[\d\.]*$/
|
7
8
|
|
8
|
-
|
9
|
+
module_function
|
9
10
|
|
10
11
|
def build(o)
|
11
12
|
case o
|
12
13
|
when OID then o
|
13
14
|
when Array
|
14
|
-
o.join(
|
15
|
+
o.join(".")
|
15
16
|
when OIDREGEX
|
16
|
-
o = o[1..-1] if o.start_with?(
|
17
|
+
o = o[1..-1] if o.start_with?(".")
|
17
18
|
o
|
18
19
|
# TODO: MIB to OID
|
19
20
|
else raise Error, "can't convert #{o} to OID"
|
@@ -28,7 +29,7 @@ module NETSNMP
|
|
28
29
|
# @return [true, false] whether the given OID belongs to the sub-tree
|
29
30
|
#
|
30
31
|
def parent?(parent_oid, child_oid)
|
31
|
-
child_oid.match(
|
32
|
+
child_oid.match(/\A#{parent_oid}\./)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
end
|
data/lib/netsnmp/pdu.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "forwardable"
|
3
4
|
module NETSNMP
|
4
5
|
# Abstracts the PDU base structure into a ruby object. It gives access to its varbinds.
|
5
6
|
#
|
6
7
|
class PDU
|
7
|
-
MAXREQUESTID=2147483647
|
8
|
+
MAXREQUESTID = 2147483647
|
8
9
|
class << self
|
9
|
-
|
10
10
|
def decode(der)
|
11
11
|
asn_tree = case der
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
when String
|
13
|
+
OpenSSL::ASN1.decode(der)
|
14
|
+
when OpenSSL::ASN1::ASN1Data
|
15
|
+
der
|
16
|
+
else
|
17
|
+
raise "#{der}: unexpected data"
|
18
|
+
end
|
19
19
|
|
20
20
|
*headers, request = asn_tree.value
|
21
21
|
|
@@ -25,34 +25,34 @@ module NETSNMP
|
|
25
25
|
|
26
26
|
*request_headers, varbinds = request.value
|
27
27
|
|
28
|
-
request_id, error_status, error_index
|
28
|
+
request_id, error_status, error_index = request_headers.map(&:value).map(&:to_i)
|
29
29
|
|
30
30
|
varbs = varbinds.value.map do |varbind|
|
31
|
-
oid_asn, val_asn
|
31
|
+
oid_asn, val_asn = varbind.value
|
32
32
|
oid = oid_asn.value
|
33
33
|
{ oid: oid, value: val_asn }
|
34
34
|
end
|
35
35
|
|
36
36
|
new(type: type, headers: [version, community],
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
error_status: error_status,
|
38
|
+
error_index: error_index,
|
39
|
+
request_id: request_id,
|
40
|
+
varbinds: varbs)
|
41
41
|
end
|
42
42
|
|
43
43
|
# factory method that abstracts initialization of the pdu types that the library supports.
|
44
|
-
#
|
44
|
+
#
|
45
45
|
# @param [Symbol] type the type of pdu structure to build
|
46
|
-
#
|
46
|
+
#
|
47
47
|
def build(type, **args)
|
48
48
|
typ = case type
|
49
|
-
|
50
|
-
|
51
|
-
# when :getbulk then 5
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
49
|
+
when :get then 0
|
50
|
+
when :getnext then 1
|
51
|
+
# when :getbulk then 5
|
52
|
+
when :set then 3
|
53
|
+
when :response then 2
|
54
|
+
else raise Error, "#{type} is not supported as type"
|
55
|
+
end
|
56
56
|
new(args.merge(type: typ))
|
57
57
|
end
|
58
58
|
end
|
@@ -61,11 +61,11 @@ module NETSNMP
|
|
61
61
|
|
62
62
|
attr_reader :version, :community, :request_id
|
63
63
|
|
64
|
-
def initialize(type
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
def initialize(type:, headers:,
|
65
|
+
request_id: nil,
|
66
|
+
error_status: 0,
|
67
|
+
error_index: 0,
|
68
|
+
varbinds: [])
|
69
69
|
@version, @community = headers
|
70
70
|
@version = @version.to_i
|
71
71
|
@error_status = error_status
|
@@ -79,70 +79,67 @@ module NETSNMP
|
|
79
79
|
check_error_status(@error_status)
|
80
80
|
end
|
81
81
|
|
82
|
-
|
83
82
|
def to_der
|
84
83
|
to_asn.to_der
|
85
84
|
end
|
86
85
|
|
87
86
|
# Adds a request varbind to the pdu
|
88
|
-
#
|
87
|
+
#
|
89
88
|
# @param [OID] oid a valid oid
|
90
89
|
# @param [Hash] options additional request varbind options
|
91
90
|
# @option options [Object] :value the value for the oid
|
92
|
-
def add_varbind(oid
|
91
|
+
def add_varbind(oid:, **options)
|
93
92
|
@varbinds << Varbind.new(oid, **options)
|
94
93
|
end
|
95
|
-
|
96
|
-
|
94
|
+
alias << add_varbind
|
97
95
|
|
98
96
|
def to_asn
|
99
|
-
request_id_asn = OpenSSL::ASN1::Integer.new(
|
100
|
-
error_asn = OpenSSL::ASN1::Integer.new(
|
101
|
-
error_index_asn = OpenSSL::ASN1::Integer.new(
|
97
|
+
request_id_asn = OpenSSL::ASN1::Integer.new(@request_id)
|
98
|
+
error_asn = OpenSSL::ASN1::Integer.new(@error_status)
|
99
|
+
error_index_asn = OpenSSL::ASN1::Integer.new(@error_index)
|
102
100
|
|
103
|
-
varbind_asns = OpenSSL::ASN1::Sequence.new(
|
101
|
+
varbind_asns = OpenSSL::ASN1::Sequence.new(@varbinds.map(&:to_asn))
|
104
102
|
|
105
|
-
request_asn = OpenSSL::ASN1::ASN1Data.new(
|
106
|
-
|
107
|
-
|
108
|
-
|
103
|
+
request_asn = OpenSSL::ASN1::ASN1Data.new([request_id_asn,
|
104
|
+
error_asn, error_index_asn,
|
105
|
+
varbind_asns], @type,
|
106
|
+
:CONTEXT_SPECIFIC)
|
109
107
|
|
110
|
-
OpenSSL::ASN1::Sequence.new(
|
108
|
+
OpenSSL::ASN1::Sequence.new([*encode_headers_asn, request_asn])
|
111
109
|
end
|
112
110
|
|
113
111
|
private
|
114
112
|
|
115
113
|
def encode_headers_asn
|
116
|
-
[
|
117
|
-
|
114
|
+
[OpenSSL::ASN1::Integer.new(@version),
|
115
|
+
OpenSSL::ASN1::OctetString.new(@community)]
|
118
116
|
end
|
119
117
|
|
120
|
-
|
121
118
|
# http://www.tcpipguide.com/free/t_SNMPVersion2SNMPv2MessageFormats-5.htm#Table_219
|
122
119
|
def check_error_status(status)
|
123
|
-
return if status
|
120
|
+
return if status.zero?
|
124
121
|
message = case status
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
122
|
+
when 1 then "Response-PDU too big"
|
123
|
+
when 2 then "No such name"
|
124
|
+
when 3 then "Bad value"
|
125
|
+
when 4 then "Read Only"
|
126
|
+
when 5 then "General Error"
|
127
|
+
when 6 then "Access denied"
|
128
|
+
when 7 then "Wrong type"
|
129
|
+
when 8 then "Wrong length"
|
130
|
+
when 9 then "Wrong encoding"
|
131
|
+
when 10 then "Wrong value"
|
132
|
+
when 11 then "No creation"
|
133
|
+
when 12 then "Inconsistent value"
|
134
|
+
when 13 then "Resource unavailable"
|
135
|
+
when 14 then "Commit failed"
|
136
|
+
when 15 then "Undo Failed"
|
137
|
+
when 16 then "Authorization Error"
|
138
|
+
when 17 then "Not Writable"
|
139
|
+
when 18 then "Inconsistent Name"
|
140
|
+
else
|
141
|
+
"Unknown Error: (#{status})"
|
142
|
+
end
|
146
143
|
raise Error, message
|
147
144
|
end
|
148
145
|
end
|
data/lib/netsnmp/scoped_pdu.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module NETSNMP
|
3
4
|
class ScopedPDU < PDU
|
4
|
-
|
5
|
-
|
6
5
|
attr_reader :engine_id
|
7
6
|
|
8
|
-
def initialize(type
|
7
|
+
def initialize(type:, headers:, **options)
|
9
8
|
@engine_id, @context = headers
|
10
9
|
super(type: type, headers: [3, nil], **options)
|
11
10
|
end
|
12
11
|
|
13
12
|
def encode_headers_asn
|
14
|
-
[
|
15
|
-
|
16
|
-
end
|
17
|
-
|
13
|
+
[OpenSSL::ASN1::OctetString.new(@engine_id || ""),
|
14
|
+
OpenSSL::ASN1::OctetString.new(@context || "")]
|
15
|
+
end
|
18
16
|
end
|
19
17
|
end
|