netsnmp 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5119f7e6ec751a4d3ba54076e5597b0667de904eda86802e5e3544e40a753172
4
- data.tar.gz: 35924abe6afc24d8a41c8b6429a0566644d6bf4674b2b83704ac3f215e217487
3
+ metadata.gz: 93b380d735dc2250a9c3528e7ab1e6c70147124a6dc439fe7dd4eac1f4c0fd55
4
+ data.tar.gz: 52db8f559bc3485ab4802d72ccba98fb29429a0b9a0cceec13fc5a489409e35e
5
5
  SHA512:
6
- metadata.gz: 7662ff27d3242840034b7e72f0a85132fa7007ef44ab4e207ac79f13cfdc29c3709884b098bba97d83e0f157618a8ca8c4dab5d8919bc6686aba4452b990213f
7
- data.tar.gz: 673c3ce56ca0154f5efc6247204ffebbd9d0966d43ba4371ba2cee98d10f1496e579eef84acf24349109315d35febb7c42716a8b88c432200cee3eeddd63cca3
6
+ metadata.gz: 1a7573fe1ca2f0d78a3ca4d88d8054b9fd872078352d8ed3f700525e049719d601fe8f7dda94f0ff77b866e75961eb26af80a4acd332e04d390c433405970fd7
7
+ data.tar.gz: 3524298a40a89f5364a27cfe0444f7e298016822439020c04b203960cc4c77622453f9a48d6c01ea1e072c3a004705299b6a8f34a89cb1ce00f66a98f3919d7a
data/README.md CHANGED
@@ -31,6 +31,7 @@ $ gem install netsnmp
31
31
  This gem provides:
32
32
 
33
33
  * Implementation in ruby of the SNMP Protocol for v3, v2c and v1 (most notable the rfc3414 and 3826).
34
+ * SNMPv3 USM supporting MD5/SHA/SHA256 auth and DES/AES128 privacy crypto algorithms.
34
35
  * Client/Manager API with simple interface for get, genext, set and walk.
35
36
  * Pure Ruby.
36
37
  * Support for concurrency and evented I/O.
@@ -80,7 +81,7 @@ manager.get(oid: "sysName.0") #=> 'tt'
80
81
  # SNMP walk
81
82
  # sysORDescr
82
83
  manager.walk(oid: "sysORDescr").each do |oid_code, value|
83
- # do something with them
84
+ # do something with them
84
85
  puts "for #{oid_code}: #{value}"
85
86
  end
86
87
 
@@ -214,8 +215,8 @@ gem 'netsnmp'
214
215
 
215
216
  # or, in the command line
216
217
 
217
- $ gem install netsnmp
218
- ```
218
+ $ gem install netsnmp
219
+ ```
219
220
 
220
221
  and `netsnmp` will automatically pick it up.
221
222
 
@@ -7,8 +7,7 @@ module NETSNMP
7
7
 
8
8
  prepend Loggable
9
9
 
10
- AUTHNONE = OpenSSL::ASN1::OctetString.new("\x00" * 12).with_label(:auth_mask)
11
- PRIVNONE = OpenSSL::ASN1::OctetString.new("")
10
+ PRIVNONE = OpenSSL::ASN1::OctetString.new("")
12
11
  MSG_MAX_SIZE = OpenSSL::ASN1::Integer.new(65507).with_label(:max_message_size)
13
12
  MSG_SECURITY_MODEL = OpenSSL::ASN1::Integer.new(3).with_label(:security_model) # usmSecurityModel
14
13
  MSG_VERSION = OpenSSL::ASN1::Integer.new(3).with_label(:message_version)
@@ -17,7 +16,7 @@ module NETSNMP
17
16
  def initialize(**); end
18
17
 
19
18
  def verify(stream, auth_param, security_level, security_parameters:)
20
- security_parameters.verify(stream.sub(auth_param, AUTHNONE.value), auth_param, security_level: security_level)
19
+ security_parameters.verify(stream.sub(auth_param, authnone(security_parameters.auth_protocol).value), auth_param, security_level: security_level)
21
20
  end
22
21
 
23
22
  # @param [String] payload of an snmp v3 message which can be decoded
@@ -91,7 +90,7 @@ module NETSNMP
91
90
  OpenSSL::ASN1::Integer.new(engine_boots).with_label(:engine_boots),
92
91
  OpenSSL::ASN1::Integer.new(engine_time).with_label(:engine_time),
93
92
  OpenSSL::ASN1::OctetString.new(security_parameters.username).with_label(:username),
94
- AUTHNONE,
93
+ authnone(security_parameters.auth_protocol),
95
94
  salt_param
96
95
  ]).with_label(:security_params)
97
96
  log(level: 2) { sec_params.to_hex }
@@ -120,11 +119,22 @@ module NETSNMP
120
119
  log { "signing V3 message..." }
121
120
  auth_salt = OpenSSL::ASN1::OctetString.new(signature).with_label(:auth)
122
121
  log(level: 2) { auth_salt.to_hex }
123
- none_der = AUTHNONE.to_der
122
+ none_der = authnone(security_parameters.auth_protocol).to_der
124
123
  encoded[encoded.index(none_der), none_der.size] = auth_salt.to_der
125
124
  log { Hexdump.dump(encoded) }
126
125
  end
127
126
  encoded
128
127
  end
128
+
129
+ private
130
+
131
+ # https://datatracker.ietf.org/doc/html/rfc7860#section-4.2.2 part 3
132
+ # https://datatracker.ietf.org/doc/html/rfc3414#section-6.3.2 part 3
133
+ def authnone(auth_protocol)
134
+ # The digest in the msgAuthenticationParameters field is replaced by the 12 zero octets.
135
+ # 24 octets for sha256
136
+ number_of_octets = auth_protocol == :sha256 ? 24 : 12
137
+ OpenSSL::ASN1::OctetString.new("\x00" * number_of_octets).with_label(:auth_mask)
138
+ end
129
139
  end
130
140
  end
@@ -22,13 +22,13 @@ module NETSNMP
22
22
  # The 150 Seconds is specified in https://www.ietf.org/rfc/rfc2574.txt 2.2.3
23
23
  TIMELINESS_THRESHOLD = 150
24
24
 
25
- attr_reader :security_level, :username
25
+ attr_reader :security_level, :username, :auth_protocol
26
26
  attr_reader :engine_id
27
27
 
28
28
  # @param [String] username the snmp v3 username
29
29
  # @param [String] engine_id the device engine id (initialized to '' for report)
30
30
  # @param [Symbol, integer] security_level allowed snmp v3 security level (:auth_priv, :auth_no_priv, etc)
31
- # @param [Symbol, nil] auth_protocol a supported authentication protocol (currently supported: :md5, :sha)
31
+ # @param [Symbol, nil] auth_protocol a supported authentication protocol (currently supported: :md5, :sha, :sha256)
32
32
  # @param [Symbol, nil] priv_protocol a supported privacy protocol (currently supported: :des, :aes)
33
33
  # @param [String, nil] auth_password the authentication password
34
34
  # @param [String, nil] priv_password the privacy password
@@ -110,6 +110,12 @@ module NETSNMP
110
110
 
111
111
  key = auth_key.dup
112
112
 
113
+ # SHA256 => https://datatracker.ietf.org/doc/html/rfc7860#section-4.2.2
114
+ # The 24 first octets of HMAC are taken as the computed MAC value
115
+ return OpenSSL::HMAC.digest("SHA256", key, message)[0, 24] if @auth_protocol == :sha256
116
+
117
+ # MD5 => https://datatracker.ietf.org/doc/html/rfc3414#section-6.3.2
118
+ # SHA1 => https://datatracker.ietf.org/doc/html/rfc3414#section-7.3.2
113
119
  key << "\x00" * (@auth_protocol == :md5 ? 48 : 44)
114
120
  k1 = key.xor(IPAD)
115
121
  k2 = key.xor(OPAD)
@@ -120,6 +126,7 @@ module NETSNMP
120
126
 
121
127
  digest.reset
122
128
  digest << (k2 + d1)
129
+ # The 12 first octets of the digest are taken as the computed MAC value
123
130
  digest.digest[0, 12]
124
131
  end
125
132
 
@@ -204,6 +211,7 @@ module NETSNMP
204
211
  @digest ||= case @auth_protocol
205
212
  when :md5 then OpenSSL::Digest::MD5.new
206
213
  when :sha then OpenSSL::Digest::SHA1.new
214
+ when :sha256 then OpenSSL::Digest::SHA256.new
207
215
  else
208
216
  raise Error, "unsupported auth protocol: #{@auth_protocol}"
209
217
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NETSNMP
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end
data/sig/message.rbs CHANGED
@@ -7,5 +7,9 @@ module NETSNMP
7
7
  def decode: (String stream, security_parameters: SecurityParameters) -> [ScopedPDU, String, Integer, Integer]
8
8
 
9
9
  def encode: (ScopedPDU pdu, security_parameters: SecurityParameters, ?engine_boots: Integer, ?engine_time: Integer) -> String
10
+
11
+ private
12
+
13
+ def authnone: (SecurityParameters::auth_protocol?) -> OpenSSL::ASN1::ASN1Data
10
14
  end
11
15
  end
@@ -4,11 +4,10 @@ module NETSNMP
4
4
 
5
5
  type security_level = :noauth | :auth_no_priv | :auth_priv | 0 | 1 | 3 | nil
6
6
 
7
- type auth_protocol = :md5 | :sha
7
+ type auth_protocol = :md5 | :sha | :sha256
8
8
  type priv_protocol = :des | :aes
9
9
 
10
10
 
11
- @auth_protocol: auth_protocol?
12
11
  @auth_password: String?
13
12
  @priv_protocol: priv_protocol?
14
13
  @priv_password: String?
@@ -18,6 +17,7 @@ module NETSNMP
18
17
  attr_reader security_level: security_level
19
18
  attr_reader username: String
20
19
  attr_reader engine_id: String
20
+ attr_reader auth_protocol: auth_protocol?
21
21
 
22
22
  def engine_id=: (String id) -> void
23
23
 
data/spec/client_spec.rb CHANGED
@@ -23,19 +23,19 @@ RSpec.describe NETSNMP::Client do
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
25
  let(:set_oid) { "sysUpTime.0" } # sysUpTimeInstance
26
- let(:get_result) { "DEVICE-192.168.1.1" }
27
- let(:next_result) { "The Cloud" }
26
+ let(:get_result) { "zeus.snmplabs.com (you can change this!)" }
27
+ let(:next_result) { "San Francisco, California, United States" }
28
28
  let(:walk_result) do
29
- <<-WALK
30
- 1.3.6.1.2.1.1.1.0: Device description
31
- 1.3.6.1.2.1.1.2.0: 1.3.6.1.4.1.3454
32
- 1.3.6.1.2.1.1.3.0: Timeticks: (78171676) 9 days, 1:8:36.76
33
- 1.3.6.1.2.1.1.4.0: The Owner
34
- 1.3.6.1.2.1.1.5.0: DEVICE-192.168.1.1
35
- 1.3.6.1.2.1.1.6.0: The Cloud
36
- 1.3.6.1.2.1.1.7.0: 72
37
- 1.3.6.1.2.1.1.8.0: Timeticks: (0) 0 days, 0:0:0.0
38
- WALK
29
+ {
30
+ "1.3.6.1.2.1.1.1.0" => "Linux zeus 4.8.6.5-smp #2 SMP Sun Nov 13 14:58:11 CDT 2016 i686",
31
+ "1.3.6.1.2.1.1.2.0" => "1.3.6.1.4.1.8072.3.2.10",
32
+ "1.3.6.1.2.1.1.3.0" => /Timeticks: \(\d+\) \d+ days, \d+:\d+:\d+\.\d+/,
33
+ "1.3.6.1.2.1.1.4.0" => "SNMP Laboratories, info@snmplabs.com",
34
+ "1.3.6.1.2.1.1.5.0" => "zeus.snmplabs.com (you can change this!)",
35
+ "1.3.6.1.2.1.1.6.0" => "San Francisco, California, United States",
36
+ "1.3.6.1.2.1.1.7.0" => "72",
37
+ "1.3.6.1.2.1.1.8.0" => /Timeticks: \(\d+\) \d+ days, \d+:\d+:\d+\.\d+/
38
+ }
39
39
  end
40
40
  let(:set_oid_result) { 43 }
41
41
  end
@@ -52,19 +52,19 @@ RSpec.describe NETSNMP::Client do
52
52
  let(:next_oid) { "1.3.6.1.2.1.1.6.0" }
53
53
  let(:walk_oid) { "system" }
54
54
  let(:set_oid) { "sysUpTime.0" }
55
- let(:get_result) { "DEVICE-192.168.1.1" }
56
- let(:next_result) { "The Cloud" }
55
+ let(:get_result) { "zeus.snmplabs.com (you can change this!)" }
56
+ let(:next_result) { "San Francisco, California, United States" }
57
57
  let(:walk_result) do
58
- <<-WALK
59
- 1.3.6.1.2.1.1.1.0: Device description
60
- 1.3.6.1.2.1.1.2.0: 1.3.6.1.4.1.3454
61
- 1.3.6.1.2.1.1.3.0: Timeticks: (78171676) 9 days, 1:8:36.76
62
- 1.3.6.1.2.1.1.4.0: The Owner
63
- 1.3.6.1.2.1.1.5.0: DEVICE-192.168.1.1
64
- 1.3.6.1.2.1.1.6.0: The Cloud
65
- 1.3.6.1.2.1.1.7.0: 72
66
- 1.3.6.1.2.1.1.8.0: Timeticks: (0) 0 days, 0:0:0.0
67
- WALK
58
+ {
59
+ "1.3.6.1.2.1.1.1.0" => "Linux zeus 4.8.6.5-smp #2 SMP Sun Nov 13 14:58:11 CDT 2016 i686",
60
+ "1.3.6.1.2.1.1.2.0" => "1.3.6.1.4.1.8072.3.2.10",
61
+ "1.3.6.1.2.1.1.3.0" => /Timeticks: \(\d+\) \d+ days, \d+:\d+:\d+\.\d+/,
62
+ "1.3.6.1.2.1.1.4.0" => "SNMP Laboratories, info@snmplabs.com",
63
+ "1.3.6.1.2.1.1.5.0" => "zeus.snmplabs.com (you can change this!)",
64
+ "1.3.6.1.2.1.1.6.0" => "San Francisco, California, United States",
65
+ "1.3.6.1.2.1.1.7.0" => "72",
66
+ "1.3.6.1.2.1.1.8.0" => /Timeticks: \(\d+\) \d+ days, \d+:\d+:\d+\.\d+/
67
+ }
68
68
  end
69
69
  let(:set_oid_result) { 43 }
70
70
 
@@ -101,18 +101,18 @@ RSpec.describe NETSNMP::Client do
101
101
  let(:set_oid) { "sysUpTime.0" } # sysUpTimeInstance
102
102
  let(:walk_oid) { "1.3.6.1.2.1.1.9.1.3" }
103
103
  let(:get_result) { "tt" }
104
- let(:next_result) { "KK12" }
104
+ let(:next_result) { "KK12 (edit /etc/snmp/snmpd.conf)" }
105
105
  let(:walk_result) do
106
- <<-WALK
107
- 1.3.6.1.2.1.1.9.1.3.1: The SNMP Management Architecture MIB.
108
- 1.3.6.1.2.1.1.9.1.3.2: The MIB for Message Processing and Dispatching.
109
- 1.3.6.1.2.1.1.9.1.3.3: The management information definitions for the SNMP User-based Security Model.
110
- 1.3.6.1.2.1.1.9.1.3.4: The MIB module for SNMPv2 entities
111
- 1.3.6.1.2.1.1.9.1.3.5: The MIB module for managing TCP implementations
112
- 1.3.6.1.2.1.1.9.1.3.6: The MIB module for managing IP and ICMP implementations
113
- 1.3.6.1.2.1.1.9.1.3.7: The MIB module for managing UDP implementations
114
- 1.3.6.1.2.1.1.9.1.3.8: View-based Access Control Model for SNMP.
115
- WALK
106
+ {
107
+ "1.3.6.1.2.1.1.9.1.3.1" => "The SNMP Management Architecture MIB.",
108
+ "1.3.6.1.2.1.1.9.1.3.2" => "The MIB for Message Processing and Dispatching.",
109
+ "1.3.6.1.2.1.1.9.1.3.3" => "The management information definitions for the SNMP User-based Security Model.",
110
+ "1.3.6.1.2.1.1.9.1.3.4" => "The MIB module for SNMPv2 entities",
111
+ "1.3.6.1.2.1.1.9.1.3.5" => "The MIB module for managing TCP implementations",
112
+ "1.3.6.1.2.1.1.9.1.3.6" => "The MIB module for managing IP and ICMP implementations",
113
+ "1.3.6.1.2.1.1.9.1.3.7" => "The MIB module for managing UDP implementations",
114
+ "1.3.6.1.2.1.1.9.1.3.8" => "View-based Access Control Model for SNMP."
115
+ }
116
116
  end
117
117
  let(:set_oid_result) { 43 }
118
118
  context "with a no auth no priv policy" do
@@ -157,6 +157,15 @@ RSpec.describe NETSNMP::Client do
157
157
  let(:protocol_options) { version_options.merge(user_options).merge(extra_options) }
158
158
  end
159
159
  end
160
+ context "speaking sha256" do
161
+ let(:user_options) do
162
+ { username: "authsha256", security_level: :auth_no_priv,
163
+ auth_password: "maplesyrup", auth_protocol: :sha256 }
164
+ end
165
+ it_behaves_like "an snmp client" do
166
+ let(:protocol_options) { version_options.merge(user_options).merge(extra_options) }
167
+ end
168
+ end
160
169
  end
161
170
  context "with an auth priv policy" do
162
171
  context "auth in md5, encrypting in des" do
@@ -17,18 +17,18 @@ RSpec.describe "with cellulloid", type: :celluloid do
17
17
  let(:set_oid) { "1.3.6.1.2.1.1.3.0" } # sysUpTimeInstance
18
18
  let(:walk_oid) { "1.3.6.1.2.1.1.9.1.3" }
19
19
  let(:get_result) { "tt" }
20
- let(:next_result) { "KK12" }
20
+ let(:next_result) { "KK12 (edit /etc/snmp/snmpd.conf)" }
21
21
  let(:walk_result) do
22
- <<-WALK
23
- 1.3.6.1.2.1.1.9.1.3.1: The SNMP Management Architecture MIB.
24
- 1.3.6.1.2.1.1.9.1.3.2: The MIB for Message Processing and Dispatching.
25
- 1.3.6.1.2.1.1.9.1.3.3: The management information definitions for the SNMP User-based Security Model.
26
- 1.3.6.1.2.1.1.9.1.3.4: The MIB module for SNMPv2 entities
27
- 1.3.6.1.2.1.1.9.1.3.5: The MIB module for managing TCP implementations
28
- 1.3.6.1.2.1.1.9.1.3.6: The MIB module for managing IP and ICMP implementations
29
- 1.3.6.1.2.1.1.9.1.3.7: The MIB module for managing UDP implementations
30
- 1.3.6.1.2.1.1.9.1.3.8: View-based Access Control Model for SNMP.
31
- WALK
22
+ {
23
+ "1.3.6.1.2.1.1.9.1.3.1" => "The SNMP Management Architecture MIB.",
24
+ "1.3.6.1.2.1.1.9.1.3.2" => "The MIB for Message Processing and Dispatching.",
25
+ "1.3.6.1.2.1.1.9.1.3.3" => "The management information definitions for the SNMP User-based Security Model.",
26
+ "1.3.6.1.2.1.1.9.1.3.4" => "The MIB module for SNMPv2 entities",
27
+ "1.3.6.1.2.1.1.9.1.3.5" => "The MIB module for managing TCP implementations",
28
+ "1.3.6.1.2.1.1.9.1.3.6" => "The MIB module for managing IP and ICMP implementations",
29
+ "1.3.6.1.2.1.1.9.1.3.7" => "The MIB module for managing UDP implementations",
30
+ "1.3.6.1.2.1.1.9.1.3.8" => "View-based Access Control Model for SNMP."
31
+ }
32
32
  end
33
33
 
34
34
  before(:all) { Celluloid.boot }
@@ -13,6 +13,13 @@ RSpec.describe NETSNMP::SecurityParameters do
13
13
  subject { described_class.new(security_level: :auth_priv, auth_protocol: :sha, username: "username", engine_id: engine_id, auth_password: "maplesyrup", priv_password: "maplesyrup") }
14
14
  it { expect(subject.send(:passkey, password).b).to eq("\x9f\xb5\xcc\x03\x81\x49\x7b\x37\x93\x52\x89\x39\xff\x78\x8d\x5d\x79\x14\x52\x11".b) }
15
15
  end
16
+ context "sha256" do
17
+ subject do
18
+ described_class.new(security_level: :auth_priv, auth_protocol: :sha256, username: "username", engine_id: engine_id, auth_password: "maplesyrup", priv_password: "maplesyrup")
19
+ end
20
+
21
+ it { expect(subject.send(:passkey, password).b).to eq("\xABQ\x01M\x1E\a\x7F`\x17\xDF+\x12\xBE\xE5\xF5\xAAr\x991w\xE9\xBBV\x9CM\xFFZL\xA0\xB4\xAF\xAC".b) }
22
+ end
16
23
  end
17
24
 
18
25
  describe "keys" do
@@ -34,11 +41,22 @@ RSpec.describe NETSNMP::SecurityParameters do
34
41
  priv_password: password,
35
42
  engine_id: engine_id)
36
43
  end
44
+ let(:sha256_sec) do
45
+ described_class.new(security_level: :auth_priv,
46
+ auth_protocol: :sha256,
47
+ priv_protocol: :des,
48
+ username: "username",
49
+ auth_password: password,
50
+ priv_password: password,
51
+ engine_id: engine_id)
52
+ end
37
53
  it do
38
54
  expect(md5_sec.send(:auth_key)).to eq("\x52\x6f\x5e\xed\x9f\xcc\xe2\x6f\x89\x64\xc2\x93\x07\x87\xd8\x2b".b)
39
55
  expect(md5_sec.send(:priv_key)).to eq("\x52\x6f\x5e\xed\x9f\xcc\xe2\x6f\x89\x64\xc2\x93\x07\x87\xd8\x2b".b)
40
56
  expect(sha_sec.send(:auth_key)).to eq("\x66\x95\xfe\xbc\x92\x88\xe3\x62\x82\x23\x5f\xc7\x15\x1f\x12\x84\x97\xb3\x8f\x3f".b)
41
57
  expect(sha_sec.send(:priv_key)).to eq("\x66\x95\xfe\xbc\x92\x88\xe3\x62\x82\x23\x5f\xc7\x15\x1f\x12\x84\x97\xb3\x8f\x3f".b)
58
+ expect(sha256_sec.send(:auth_key)).to eq("\x89\x82\xE0\xE5I\xE8f\xDB6\x1Akb]\x84\xCC\xCC\x11\x16-E>\xE8\xCE:dE\xC2\xD6wo\x0F\x8B".b)
59
+ expect(sha256_sec.send(:priv_key)).to eq("\x89\x82\xE0\xE5I\xE8f\xDB6\x1Akb]\x84\xCC\xCC\x11\x16-E>\xE8\xCE:dE\xC2\xD6wo\x0F\x8B".b)
42
60
  end
43
61
  end
44
62
 
@@ -22,8 +22,8 @@ RSpec.shared_examples "an snmp client" do
22
22
  let(:value) { subject.get({ oid: get_oid }, oid: next_oid) }
23
23
  it "returns the values for both" do
24
24
  expect(value).to be_a(Array)
25
- expect(value).to include(/#{get_result}/)
26
- expect(value).to include(/#{next_result}/)
25
+ expect(value).to include(get_result)
26
+ expect(value).to include(next_result)
27
27
  end
28
28
  end
29
29
  end
@@ -40,8 +40,17 @@ RSpec.shared_examples "an snmp client" do
40
40
  describe "#walk" do
41
41
  let(:value) { subject.walk(oid: walk_oid) }
42
42
  it "fetches the varbinds for the next oid" do
43
- values = value.map { |oid, val| "#{oid}: #{val}" }.join("\n") << "\n"
44
- expect(values).to eq(walk_result)
43
+ value.each do |oid, val|
44
+ match = walk_result[oid]
45
+ case match
46
+ when String
47
+ expect(val.to_s).to eq(match)
48
+ when Regexp
49
+ expect(val.to_s).to match(match)
50
+ else
51
+ next
52
+ end
53
+ end
45
54
  end
46
55
  end
47
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netsnmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-05 00:00:00.000000000 Z
11
+ date: 2021-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet