logstash-filter-cipher 2.0.7 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/docs/index.asciidoc +0 -23
- data/lib/logstash/filters/cipher.rb +10 -46
- data/logstash-filter-cipher.gemspec +3 -2
- data/spec/filters/cipher_spec.rb +123 -195
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98f7eee7d009598d46ceb96dd6c731a328206b1e
|
4
|
+
data.tar.gz: 434b055742014838598d35287605c9975b893c56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a10c0455125608f96177b00d607020d805be56db9749316e7a554ed43000d88cc685637f0b65a78350811c7cd8b73294274cf7ede1ecacf3a4d31f87bbf65c4a
|
7
|
+
data.tar.gz: 61cf16ce5286967379ccddb678e437d6b9d1468ed735a6f9dc76b764de9663d81a257e66e39384347860a2cca5b68ca91f665ad63325836f76843c29bf7d26fd
|
data/CHANGELOG.md
CHANGED
data/docs/index.asciidoc
CHANGED
@@ -97,29 +97,6 @@ it, Set this parameter to 0
|
|
97
97
|
[source,ruby]
|
98
98
|
filter { cipher { cipher_padding => 0 }}
|
99
99
|
|
100
|
-
[id="plugins-{type}s-{plugin}-iv"]
|
101
|
-
===== `iv` (DEPRECATED)
|
102
|
-
|
103
|
-
* DEPRECATED WARNING: This configuration item is deprecated and may not be available in future versions.
|
104
|
-
* Value type is <<string,string>>
|
105
|
-
* There is no default value for this setting.
|
106
|
-
|
107
|
-
The initialization vector to use (statically hard-coded). For
|
108
|
-
a random IV see the iv_random_length property
|
109
|
-
|
110
|
-
NOTE: If iv_random_length is set, it takes precedence over any value set for "iv"
|
111
|
-
|
112
|
-
The cipher modes CBC, CFB, OFB and CTR all need an "initialization
|
113
|
-
vector", or short, IV. ECB mode is the only mode that does not require
|
114
|
-
an IV, but there is almost no legitimate use case for this mode
|
115
|
-
because of the fact that it does not sufficiently hide plaintext patterns.
|
116
|
-
|
117
|
-
For AES algorithms set this to a 16 byte string.
|
118
|
-
[source,ruby]
|
119
|
-
filter { cipher { iv => "1234567890123456" }}
|
120
|
-
|
121
|
-
Deprecated: Please use `iv_random_length` instead
|
122
|
-
|
123
100
|
[id="plugins-{type}s-{plugin}-iv_random_length"]
|
124
101
|
===== `iv_random_length`
|
125
102
|
|
@@ -1,9 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/filters/base"
|
3
|
-
require "logstash/namespace"
|
4
3
|
require "openssl"
|
5
4
|
|
6
|
-
|
7
5
|
# This filter parses a source and apply a cipher or decipher before
|
8
6
|
# storing it in the target.
|
9
7
|
#
|
@@ -85,30 +83,13 @@ class LogStash::Filters::Cipher < LogStash::Filters::Base
|
|
85
83
|
# filter { cipher { cipher_padding => 0 }}
|
86
84
|
config :cipher_padding, :validate => :string
|
87
85
|
|
88
|
-
|
89
|
-
# a random IV see the iv_random_length property
|
90
|
-
#
|
91
|
-
# NOTE: If iv_random_length is set, it takes precedence over any value set for "iv"
|
92
|
-
#
|
93
|
-
# The cipher modes CBC, CFB, OFB and CTR all need an "initialization
|
94
|
-
# vector", or short, IV. ECB mode is the only mode that does not require
|
95
|
-
# an IV, but there is almost no legitimate use case for this mode
|
96
|
-
# because of the fact that it does not sufficiently hide plaintext patterns.
|
97
|
-
#
|
98
|
-
# For AES algorithms set this to a 16 byte string.
|
99
|
-
# [source,ruby]
|
100
|
-
# filter { cipher { iv => "1234567890123456" }}
|
101
|
-
#
|
102
|
-
# Deprecated: Please use `iv_random_length` instead
|
103
|
-
config :iv, :validate => :string, :deprecated => "Please use 'iv_random_length'"
|
86
|
+
config :iv, :validate => :string, :obsolete => "Please use 'iv_random_length'"
|
104
87
|
|
105
88
|
# Force an random IV to be used per encryption invocation and specify
|
106
89
|
# the length of the random IV that will be generated via:
|
107
90
|
#
|
108
91
|
# OpenSSL::Random.random_bytes(int_length)
|
109
92
|
#
|
110
|
-
# If iv_random_length is set, it takes precedence over any value set for "iv"
|
111
|
-
#
|
112
93
|
# Enabling this will force the plugin to generate a unique
|
113
94
|
# random IV for each encryption call. This random IV will be prepended to the
|
114
95
|
# encrypted result bytes and then base64 encoded. On decryption "iv_random_length" must
|
@@ -118,7 +99,7 @@ class LogStash::Filters::Cipher < LogStash::Filters::Base
|
|
118
99
|
# For AES algorithms you can set this to a 16
|
119
100
|
# [source,ruby]
|
120
101
|
# filter { cipher { iv_random_length => 16 }}
|
121
|
-
config :iv_random_length, :validate => :number
|
102
|
+
config :iv_random_length, :validate => :number, :required => true
|
122
103
|
|
123
104
|
# If this is set the internal Cipher instance will be
|
124
105
|
# re-used up to @max_cipher_reuse times before being
|
@@ -147,32 +128,24 @@ class LogStash::Filters::Cipher < LogStash::Filters::Base
|
|
147
128
|
#If decrypt or encrypt fails, we keep it it intact.
|
148
129
|
begin
|
149
130
|
|
150
|
-
if (event
|
131
|
+
if (event.get(@source).nil? || event.get(@source).empty?)
|
151
132
|
@logger.debug("Event to filter, event 'source' field: " + @source + " was null(nil) or blank, doing nothing")
|
152
133
|
return
|
153
134
|
end
|
154
135
|
|
155
136
|
#@logger.debug("Event to filter", :event => event)
|
156
|
-
data = event
|
137
|
+
data = event.get(@source)
|
157
138
|
if @mode == "decrypt"
|
158
139
|
data = Base64.strict_decode64(data) if @base64 == true
|
159
|
-
|
160
|
-
|
161
|
-
@random_iv = data.byteslice(0,@iv_random_length)
|
162
|
-
data = data.byteslice(@iv_random_length..data.length)
|
163
|
-
end
|
164
|
-
|
140
|
+
@random_iv = data.byteslice(0,@iv_random_length)
|
141
|
+
data = data.byteslice(@iv_random_length..data.length)
|
165
142
|
end
|
166
143
|
|
167
|
-
if
|
144
|
+
if @mode == "encrypt"
|
168
145
|
@random_iv = OpenSSL::Random.random_bytes(@iv_random_length)
|
169
146
|
end
|
170
147
|
|
171
|
-
|
172
|
-
# and force the cipher's IV = to the random value
|
173
|
-
if !@iv_random_length.nil?
|
174
|
-
@cipher.iv = @random_iv
|
175
|
-
end
|
148
|
+
@cipher.iv = @random_iv
|
176
149
|
|
177
150
|
result = @cipher.update(data) + @cipher.final
|
178
151
|
|
@@ -197,7 +170,7 @@ class LogStash::Filters::Cipher < LogStash::Filters::Base
|
|
197
170
|
|
198
171
|
result = result.force_encoding("utf-8") if @mode == "decrypt"
|
199
172
|
|
200
|
-
event
|
173
|
+
event.set(@target, result)
|
201
174
|
|
202
175
|
#Is it necessary to add 'if !result.nil?' ? exception have been already catched.
|
203
176
|
#In doubt, I keep it.
|
@@ -238,18 +211,9 @@ class LogStash::Filters::Cipher < LogStash::Filters::Base
|
|
238
211
|
|
239
212
|
@cipher.key = @key
|
240
213
|
|
241
|
-
if !@iv.nil? and !@iv.empty? and @iv_random_length.nil?
|
242
|
-
@cipher.iv = @iv if @iv
|
243
|
-
|
244
|
-
elsif !@iv_random_length.nil?
|
245
|
-
@logger.debug("iv_random_length is configured, ignoring any statically defined value for 'iv'", :iv_random_length => @iv_random_length)
|
246
|
-
else
|
247
|
-
raise "cipher plugin: either 'iv' or 'iv_random_length' must be configured, but not both; aborting"
|
248
|
-
end
|
249
|
-
|
250
214
|
@cipher.padding = @cipher_padding if @cipher_padding
|
251
215
|
|
252
|
-
@logger.debug("Cipher initialisation done", :mode => @mode, :key => @key, :
|
216
|
+
@logger.debug("Cipher initialisation done", :mode => @mode, :key => @key, :iv_random_length => @iv_random_length, :iv_random => @iv_random, :cipher_padding => @cipher_padding)
|
253
217
|
end # def init_cipher
|
254
218
|
|
255
219
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-filter-cipher'
|
4
|
-
s.version = '
|
4
|
+
s.version = '3.0.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "This filter parses a source and apply a cipher or decipher before storing it in the target"
|
7
7
|
s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
|
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
|
|
19
19
|
# Special flag to let us know this is actually a logstash plugin
|
20
20
|
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
|
21
21
|
|
22
|
+
|
22
23
|
# Gem dependencies
|
23
|
-
s.add_runtime_dependency "logstash-core-plugin-api", "
|
24
|
+
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
|
24
25
|
|
25
26
|
s.add_development_dependency 'logstash-devutils'
|
26
27
|
end
|
data/spec/filters/cipher_spec.rb
CHANGED
@@ -1,215 +1,143 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'logstash-core'
|
3
|
+
require "logstash/codecs/base"
|
4
|
+
require 'logstash/filters/cipher'
|
2
5
|
|
3
|
-
|
4
|
-
require 'logstash/filters/cipher'
|
6
|
+
describe LogStash::Filters::Cipher do
|
5
7
|
|
6
|
-
|
8
|
+
let(:cleartext) do
|
9
|
+
'شسيبشن٤٤ت٥ت داھدساققبمر фывапролдзщшгнекутцйячсмить asdfghjklqpoiuztreyxcvbnm,.-öäü+ä123ß´yö.,;LÖÜ*O 來少精清皆人址法田手扌打表氵開日大木裝 1234567890#$%^&*()!@#;:\'?.>,<testAESEn+=_-~`}]'
|
10
|
+
end
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
12
|
+
describe 'single event, encrypt/decrypt aes-128-cbc, 16b RANDOM IV, 16b key, b64 encode' do
|
13
|
+
let(:event) do
|
14
|
+
LogStash::Event.new(LogStash::Json.load("{\"message\":\"#{cleartext}\"}"))
|
15
|
+
end
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
let(:encrypter) do
|
18
|
+
described_class.new(
|
19
|
+
"algorithm" => "aes-128-cbc",
|
20
|
+
"cipher_padding" => 1,
|
21
|
+
"iv_random_length" => 16,
|
22
|
+
"key" => "1234567890123456",
|
23
|
+
"key_size" => 16,
|
24
|
+
"mode" => "encrypt",
|
25
|
+
"source" => "message",
|
26
|
+
"target" => "message_crypted",
|
27
|
+
"base64" => true,
|
28
|
+
"max_cipher_reuse" => 1)
|
29
|
+
end
|
15
30
|
|
16
|
-
|
31
|
+
let(:decrypter) do
|
32
|
+
described_class.new(
|
33
|
+
"algorithm" => "aes-128-cbc",
|
34
|
+
"cipher_padding" => 1,
|
35
|
+
"iv_random_length" => 16,
|
36
|
+
"key" => "1234567890123456",
|
37
|
+
"key_size" => 16,
|
38
|
+
"mode" => "decrypt",
|
39
|
+
"source" => "message_crypted",
|
40
|
+
"target" => "message_decrypted",
|
41
|
+
"base64" => true,
|
42
|
+
"max_cipher_reuse" => 1)
|
43
|
+
end
|
17
44
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
45
|
+
before(:each) do
|
46
|
+
encrypter.register
|
47
|
+
decrypter.register
|
48
|
+
end
|
24
49
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
pipeline.filter(evt) do |filtered_event|
|
31
|
-
results.push(filtered_event)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
pipeline.flush_filters(:final => true) { |flushed_event| results << flushed_event }
|
35
|
-
|
36
|
-
results.select { |e| !e.cancelled? }
|
37
|
-
end
|
50
|
+
let(:result) do
|
51
|
+
encrypter.filter(event)
|
52
|
+
decrypter.filter(event)
|
53
|
+
event
|
54
|
+
end
|
38
55
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
<<-CONFIG
|
43
|
-
filter {
|
44
|
-
|
45
|
-
cipher {
|
46
|
-
algorithm => "aes-128-cbc"
|
47
|
-
cipher_padding => 1
|
48
|
-
iv_random_length => 16
|
49
|
-
key => "1234567890123456"
|
50
|
-
key_size => 16
|
51
|
-
mode => "encrypt"
|
52
|
-
source => "message"
|
53
|
-
target => "message_crypted"
|
54
|
-
base64 => true
|
55
|
-
max_cipher_reuse => 1
|
56
|
-
}
|
57
|
-
|
58
|
-
cipher {
|
59
|
-
algorithm => "aes-128-cbc"
|
60
|
-
cipher_padding => 1
|
61
|
-
iv_random_length => 16
|
62
|
-
key => "1234567890123456"
|
63
|
-
key_size => 16
|
64
|
-
mode => "decrypt"
|
65
|
-
source => "message_crypted"
|
66
|
-
target => "message_decrypted"
|
67
|
-
base64 => true
|
68
|
-
max_cipher_reuse => 1
|
69
|
-
}
|
70
|
-
}
|
71
|
-
CONFIG
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'validate initial cleartext message' do
|
75
|
-
result = results.first
|
76
|
-
expect(result["message"]).to eq(cleartext)
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'validate decrypted message' do
|
80
|
-
result = results.first
|
81
|
-
expect(result["message_decrypted"]).to eq(result["message"])
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'validate encrypted message is not equal to message' do
|
85
|
-
result = results.first
|
86
|
-
expect(result["message"]).not_to eq(result["message_crypted"])
|
87
|
-
end
|
56
|
+
it 'validate initial cleartext message' do
|
57
|
+
expect(result.get("message")).to eq(cleartext)
|
58
|
+
end
|
88
59
|
|
89
|
-
|
60
|
+
it 'validate decrypted message' do
|
61
|
+
expect(result.get("message_decrypted")).to eq(result.get("message"))
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'validate encrypted message is not equal to message' do
|
65
|
+
expect(result.get("message")).not_to eq(result.get("message_crypted"))
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
90
69
|
|
70
|
+
describe '1000 events, 11 re-use, encrypt/decrypt aes-128-cbc, 16b RANDOM IV, 16b key, b64 encode' do
|
91
71
|
|
92
|
-
|
93
|
-
|
94
|
-
let(:config) do
|
95
|
-
<<-CONFIG
|
96
|
-
filter {
|
97
|
-
|
98
|
-
cipher {
|
99
|
-
algorithm => "aes-128-cbc"
|
100
|
-
cipher_padding => 1
|
101
|
-
iv => "1234567890123456"
|
102
|
-
key => "1234567890123456"
|
103
|
-
key_size => 16
|
104
|
-
mode => "encrypt"
|
105
|
-
source => "message"
|
106
|
-
target => "message_crypted"
|
107
|
-
base64 => true
|
108
|
-
max_cipher_reuse => 1
|
109
|
-
}
|
110
|
-
|
111
|
-
cipher {
|
112
|
-
algorithm => "aes-128-cbc"
|
113
|
-
cipher_padding => 1
|
114
|
-
iv => "1234567890123456"
|
115
|
-
key => "1234567890123456"
|
116
|
-
key_size => 16
|
117
|
-
mode => "decrypt"
|
118
|
-
source => "message_crypted"
|
119
|
-
target => "message_decrypted"
|
120
|
-
base64 => true
|
121
|
-
max_cipher_reuse => 1
|
122
|
-
}
|
123
|
-
}
|
124
|
-
CONFIG
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'validate initial cleartext message' do
|
128
|
-
result = results.first
|
129
|
-
expect(result["message"]).to eq(cleartext)
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'validate decrypted message' do
|
133
|
-
result = results.first
|
134
|
-
expect(result["message_decrypted"]).to eq(result["message"])
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'validate encrypted message is not equal to message' do
|
138
|
-
result = results.first
|
139
|
-
expect(result["message"]).not_to eq(result["message_crypted"])
|
140
|
-
end
|
72
|
+
total_events = 1000
|
141
73
|
|
74
|
+
let(:events) do
|
75
|
+
(1..total_events).map do |i|
|
76
|
+
LogStash::Event.new(LogStash::Json.load("{\"message\":\"#{cleartext}\"}"))
|
142
77
|
end
|
78
|
+
end
|
79
|
+
|
80
|
+
let(:encrypter) do
|
81
|
+
described_class.new(
|
82
|
+
"algorithm" => "aes-128-cbc",
|
83
|
+
"cipher_padding" => 1,
|
84
|
+
"iv_random_length" => 16,
|
85
|
+
"key" => "1234567890123456",
|
86
|
+
"key_size" => 16,
|
87
|
+
"mode" => "encrypt",
|
88
|
+
"source" => "message",
|
89
|
+
"target" => "message_crypted",
|
90
|
+
"base64" => true,
|
91
|
+
"max_cipher_reuse" => 11)
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:decrypter) do
|
95
|
+
described_class.new(
|
96
|
+
"algorithm" => "aes-128-cbc",
|
97
|
+
"cipher_padding" => 1,
|
98
|
+
"iv_random_length" => 16,
|
99
|
+
"key" => "1234567890123456",
|
100
|
+
"key_size" => 16,
|
101
|
+
"mode" => "decrypt",
|
102
|
+
"source" => "message_crypted",
|
103
|
+
"target" => "message_decrypted",
|
104
|
+
"base64" => true,
|
105
|
+
"max_cipher_reuse" => 11)
|
106
|
+
end
|
107
|
+
|
108
|
+
before(:each) do
|
109
|
+
encrypter.register
|
110
|
+
decrypter.register
|
111
|
+
end
|
143
112
|
|
113
|
+
let(:results) do
|
114
|
+
events.each do |e|
|
115
|
+
encrypter.filter(e)
|
116
|
+
decrypter.filter(e)
|
117
|
+
end
|
118
|
+
events
|
119
|
+
end
|
144
120
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
let(:event) do
|
150
|
-
events = []
|
151
|
-
(1..total_events).each do |i|
|
152
|
-
events.push("{\"message\":\"#{cleartext}\"}")
|
153
|
-
end
|
154
|
-
return events
|
155
|
-
end
|
156
|
-
|
157
|
-
let(:config) do
|
158
|
-
<<-CONFIG
|
159
|
-
filter {
|
160
|
-
|
161
|
-
cipher {
|
162
|
-
algorithm => "aes-128-cbc"
|
163
|
-
cipher_padding => 1
|
164
|
-
iv_random_length => 16
|
165
|
-
key => "1234567890123456"
|
166
|
-
key_size => 16
|
167
|
-
mode => "encrypt"
|
168
|
-
source => "message"
|
169
|
-
target => "message_crypted"
|
170
|
-
base64 => true
|
171
|
-
max_cipher_reuse => 11
|
172
|
-
}
|
173
|
-
|
174
|
-
cipher {
|
175
|
-
algorithm => "aes-128-cbc"
|
176
|
-
cipher_padding => 1
|
177
|
-
iv_random_length => 16
|
178
|
-
key => "1234567890123456"
|
179
|
-
key_size => 16
|
180
|
-
mode => "decrypt"
|
181
|
-
source => "message_crypted"
|
182
|
-
target => "message_decrypted"
|
183
|
-
base64 => true
|
184
|
-
max_cipher_reuse => 11
|
185
|
-
}
|
186
|
-
}
|
187
|
-
CONFIG
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'validate total events' do
|
191
|
-
expect(results.length).to eq(total_events)
|
192
|
-
end
|
193
|
-
|
194
|
-
it 'validate initial cleartext message' do
|
195
|
-
results.each do |result|
|
196
|
-
expect(result["message"]).to eq(cleartext)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'validate decrypted message' do
|
201
|
-
results.each do |result|
|
202
|
-
expect(result["message_decrypted"]).to eq(result["message"])
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
it 'validate encrypted message is not equal to message' do
|
207
|
-
results.each do |result|
|
208
|
-
expect(result["message"]).not_to eq(result["message_crypted"])
|
209
|
-
end
|
210
|
-
end
|
121
|
+
it 'validate total events' do
|
122
|
+
expect(results.length).to eq(total_events)
|
123
|
+
end
|
211
124
|
|
125
|
+
it 'validate initial cleartext message' do
|
126
|
+
results.each do |result|
|
127
|
+
expect(result.get("message")).to eq(cleartext)
|
212
128
|
end
|
129
|
+
end
|
213
130
|
|
131
|
+
it 'validate decrypted message' do
|
132
|
+
results.each do |result|
|
133
|
+
expect(result.get("message_decrypted")).to eq(result.get("message"))
|
134
|
+
end
|
214
135
|
end
|
215
136
|
|
137
|
+
it 'validate encrypted message is not equal to message' do
|
138
|
+
results.each do |result|
|
139
|
+
expect(result.get("message")).not_to eq(result.get("message_crypted"))
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-cipher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - "
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.60'
|
19
|
+
- - "<="
|
17
20
|
- !ruby/object:Gem::Version
|
18
|
-
version: '
|
21
|
+
version: '2.99'
|
19
22
|
name: logstash-core-plugin-api
|
20
23
|
prerelease: false
|
21
24
|
type: :runtime
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.60'
|
30
|
+
- - "<="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
32
|
+
version: '2.99'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
requirement: !ruby/object:Gem::Requirement
|
29
35
|
requirements:
|