logstash-input-http_poller 5.1.0 → 5.3.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: d7223eb133a657b108ccadc547d953ea940d9c7f814b32e69048bee665ff89fa
4
- data.tar.gz: ea919bb6bd64fd83cedf9421e2457e60717357ae2ad41798feb2edb227403f40
3
+ metadata.gz: 59101199a9b6eda278187132d5e5fd719247a893a29917fb305178347f89bf1e
4
+ data.tar.gz: 10f4717d83cd6befd62a314939c27db5633e65cd7c83706478efe3c2f42b1983
5
5
  SHA512:
6
- metadata.gz: 205e05fa3dc29773537dbfa9f58eb9efe489b518b3e210c1668434221b69b3f7c339f57c70951ee83f8ddffa55eaf22e3a269479e079e453080f4089301e9071
7
- data.tar.gz: a1b9acc31715ea764b3f50a8388da6578d1d3e5380503d154c9d5e8afb347992b8ce7c8dd5fc60c4783c3dfe81b7e722691e70c5631fc9823c8ea979f55d87a9
6
+ metadata.gz: e6eb58b9354d0e60aa5c2d5c1217f8fa769c3c70b8f207c453645b8e12dadd5b533193c8fcb60689319be0d6abdcba5e2de931f956a6b7974739d1cc516dad35
7
+ data.tar.gz: 15dcd344b59b3a14184153b82f5be9375427a5ff3cbdf2103922a4c8800624957ed86bff73c45bdf854ac52577e7a899f35c750d123ca8b8fc870e005e36cd5a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 5.3.0
2
+ - Feat: added ssl_supported_protocols option [#133](https://github.com/logstash-plugins/logstash-input-http_poller/pull/133)
3
+
4
+ ## 5.2.1
5
+ - Deps: unpin rufus-scheduler dependency [#130](https://github.com/logstash-plugins/logstash-input-http_poller/pull/130)
6
+
7
+ ## 5.2.0
8
+ - Feat: support ssl_verification_mode option [#131](https://github.com/logstash-plugins/logstash-input-http_poller/pull/131)
9
+
1
10
  ## 5.1.0
2
11
  - Add ECS support [#129](https://github.com/logstash-plugins/logstash-input-http_poller/pull/129)
3
12
 
data/Gemfile CHANGED
@@ -9,3 +9,5 @@ if Dir.exist?(logstash_path) && use_logstash_source
9
9
  gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
10
10
  gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
11
11
  end
12
+
13
+ gem 'rufus-scheduler', ENV['RUFUS_SCHEDULER_VERSION'] if ENV['RUFUS_SCHEDULER_VERSION']
data/docs/index.asciidoc CHANGED
@@ -146,6 +146,8 @@ This plugin supports the following configuration options plus the <<plugins-{typ
146
146
  | <<plugins-{type}s-{plugin}-retry_non_idempotent>> |<<boolean,boolean>>|No
147
147
  | <<plugins-{type}s-{plugin}-schedule>> |<<hash,hash>>|Yes
148
148
  | <<plugins-{type}s-{plugin}-socket_timeout>> |<<number,number>>|No
149
+ | <<plugins-{type}s-{plugin}-ssl_supported_protocols>> |<<string,string>>|No
150
+ | <<plugins-{type}s-{plugin}-ssl_verification_mode>> |<<string,string>>|No
149
151
  | <<plugins-{type}s-{plugin}-target>> |<<string,string>>|No
150
152
  | <<plugins-{type}s-{plugin}-truststore>> |a valid filesystem path|No
151
153
  | <<plugins-{type}s-{plugin}-truststore_password>> |<<password,password>>|No
@@ -413,6 +415,39 @@ See: rufus/scheduler for details about different schedule options and value stri
413
415
 
414
416
  Timeout (in seconds) to wait for data on the socket. Default is `10s`
415
417
 
418
+ [id="plugins-{type}s-{plugin}-ssl_supported_protocols"]
419
+ ===== `ssl_supported_protocols`
420
+
421
+ * Value type is <<string,string>>
422
+ * Allowed values are: `'TLSv1.1'`, `'TLSv1.2'`, `'TLSv1.3'`
423
+ * Default depends on the JDK being used. With up-to-date Logstash, the default is `['TLSv1.2', 'TLSv1.3']`.
424
+ `'TLSv1.1'` is not considered secure and is only provided for legacy applications.
425
+
426
+ List of allowed SSL/TLS versions to use when establishing a connection to the HTTP endpoint.
427
+
428
+ For Java 8 `'TLSv1.3'` is supported only since **8u262** (AdoptOpenJDK), but requires that you set the
429
+ `LS_JAVA_OPTS="-Djdk.tls.client.protocols=TLSv1.3"` system property in Logstash.
430
+
431
+ NOTE: If you configure the plugin to use `'TLSv1.1'` on any recent JVM, such as the one packaged with Logstash,
432
+ the protocol is disabled by default and needs to be enabled manually by changing `jdk.tls.disabledAlgorithms` in
433
+ the *$JDK_HOME/conf/security/java.security* configuration file. That is, `TLSv1.1` needs to be removed from the list.
434
+
435
+ [id="plugins-{type}s-{plugin}-ssl_verification_mode"]
436
+ ===== `ssl_verification_mode`
437
+
438
+ * Value type is <<string,string>>
439
+ * Supported values are: `full`, `none`
440
+ * Default value is `full`
441
+
442
+ Controls the verification of server certificates.
443
+ The `full` option verifies that the provided certificate is signed by a trusted authority (CA)
444
+ and also that the server’s hostname (or IP address) matches the names identified within the certificate.
445
+
446
+ The `none` setting performs no verification of the server’s certificate.
447
+ This mode disables many of the security benefits of SSL/TLS and should only be used after cautious consideration.
448
+ It is primarily intended as a temporary diagnostic mechanism when attempting to resolve TLS errors.
449
+ Using `none` in production environments is strongly discouraged.
450
+
416
451
  [id="plugins-{type}s-{plugin}-target"]
417
452
  ===== `target`
418
453
 
@@ -55,9 +55,12 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
55
55
  setup_requests!
56
56
  end
57
57
 
58
+ # @overload
58
59
  def stop
59
- Stud.stop!(@interval_thread) if @interval_thread
60
- @scheduler.stop if @scheduler
60
+ if @scheduler
61
+ @scheduler.shutdown # on newer Rufus (3.8) this joins on the scheduler thread
62
+ end
63
+ # TODO implement client.close as we as releasing it's pooled resources!
61
64
  end
62
65
 
63
66
  private
@@ -163,16 +166,15 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
163
166
  #schedule hash must contain exactly one of the allowed keys
164
167
  msg_invalid_schedule = "Invalid config. schedule hash must contain " +
165
168
  "exactly one of the following keys - cron, at, every or in"
166
- raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length !=1
169
+ raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length != 1
167
170
  schedule_type = @schedule.keys.first
168
171
  schedule_value = @schedule[schedule_type]
169
172
  raise LogStash::ConfigurationError, msg_invalid_schedule unless Schedule_types.include?(schedule_type)
170
173
 
171
174
  @scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
172
- #as of v3.0.9, :first_in => :now doesn't work. Use the following workaround instead
173
175
  opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
174
176
  @scheduler.send(schedule_type, schedule_value, opts) { run_once(queue) }
175
- @scheduler.join
177
+ @scheduler.thread.join # due newer rufus (3.8) doing a blocking operation on scheduler.join
176
178
  end
177
179
 
178
180
  def run_once(queue)
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-http_poller'
3
- s.version = '5.1.0'
3
+ s.version = '5.3.0'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Decodes the output of an HTTP API into events"
6
- 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"
6
+ 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"
7
7
  s.authors = [ "Elastic", "andrewvc"]
8
8
  s.email = 'info@elastic.co'
9
9
  s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
@@ -20,9 +20,8 @@ Gem::Specification.new do |s|
20
20
  # Gem dependencies
21
21
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
22
22
  s.add_runtime_dependency 'logstash-codec-plain'
23
- s.add_runtime_dependency 'logstash-mixin-http_client', "~> 7"
24
- s.add_runtime_dependency 'stud', "~> 0.0.22"
25
- s.add_runtime_dependency 'rufus-scheduler', "~>3.0.9"
23
+ s.add_runtime_dependency "logstash-mixin-http_client", ">= 7.2.0"
24
+ s.add_runtime_dependency 'rufus-scheduler', ">= 3.0.9"
26
25
  s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.3'
27
26
  s.add_runtime_dependency 'logstash-mixin-event_support', '~> 1.0', '>= 1.0.1'
28
27
  s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
@@ -25,18 +25,19 @@ describe LogStash::Inputs::HTTP_Poller do
25
25
  "schedule" => default_schedule,
26
26
  "urls" => default_urls,
27
27
  "codec" => "json",
28
- "metadata_target" => metadata_target
28
+ "metadata_target" => metadata_target,
29
+ "pool_max" => 3, "pool_max_per_route" => 1, 'keepalive' => false
29
30
  }
30
31
  }
31
- let(:klass) { LogStash::Inputs::HTTP_Poller }
32
+ let(:opts) { default_opts }
32
33
 
34
+ subject(:plugin) { described_class.new(opts) }
33
35
 
34
36
  describe "instances" do
35
- subject { klass.new(default_opts) }
37
+ subject { described_class.new(default_opts) }
36
38
 
37
- before do
38
- subject.register
39
- end
39
+ before { subject.register }
40
+ after { subject.stop }
40
41
 
41
42
  describe "#run" do
42
43
  it "should setup a scheduler" do
@@ -189,22 +190,21 @@ describe LogStash::Inputs::HTTP_Poller do
189
190
  "metadata_target" => metadata_target
190
191
  }
191
192
  }
192
- it "should run at the schedule" do
193
- instance = klass.new(opts)
194
- instance.register
193
+
194
+ before do
195
195
  Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
196
196
  Timecop.scale(60)
197
- queue = Queue.new
198
- runner = Thread.new do
199
- instance.run(queue)
200
- end
201
- sleep 3
202
- instance.stop
203
- runner.kill
204
- runner.join
205
- expect(queue.size).to eq(2)
197
+ end
198
+
199
+ after do
206
200
  Timecop.return
207
201
  end
202
+
203
+ it "should run at the schedule" do
204
+ run_plugin_and_yield_queue(plugin, sleep: 3) do |queue|
205
+ try(5) { expect(queue.size).to be >= 2 }
206
+ end
207
+ end
208
208
  end
209
209
 
210
210
  context "given 'at' expression" do
@@ -216,22 +216,21 @@ describe LogStash::Inputs::HTTP_Poller do
216
216
  "metadata_target" => metadata_target
217
217
  }
218
218
  }
219
- it "should run at the schedule" do
220
- instance = klass.new(opts)
221
- instance.register
219
+
220
+ before do
222
221
  Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
223
- Timecop.scale(60 * 5)
224
- queue = Queue.new
225
- runner = Thread.new do
226
- instance.run(queue)
227
- end
228
- sleep 2
229
- instance.stop
230
- runner.kill
231
- runner.join
232
- expect(queue.size).to eq(1)
222
+ Timecop.scale (60 * 5) / 2
223
+ end
224
+
225
+ after do
233
226
  Timecop.return
234
227
  end
228
+
229
+ it "should run at the schedule" do
230
+ run_plugin_and_yield_queue(plugin, sleep: 2) do |queue|
231
+ try(5) { expect(queue.size).to eq(1) }
232
+ end
233
+ end
235
234
  end
236
235
 
237
236
  context "given 'every' expression" do
@@ -244,20 +243,12 @@ describe LogStash::Inputs::HTTP_Poller do
244
243
  }
245
244
  }
246
245
  it "should run at the schedule" do
247
- instance = klass.new(opts)
248
- instance.register
249
- queue = Queue.new
250
- runner = Thread.new do
251
- instance.run(queue)
246
+ run_plugin_and_yield_queue(plugin, sleep: 5) do |queue|
247
+ #T 0123456
248
+ #events x x x x
249
+ #expects 3 events at T=5
250
+ try(5) { expect(queue.size).to be_between(2, 3) }
252
251
  end
253
- #T 0123456
254
- #events x x x x
255
- #expects 3 events at T=5
256
- sleep 5
257
- instance.stop
258
- runner.kill
259
- runner.join
260
- expect(queue.size).to be_between(2, 3)
261
252
  end
262
253
  end
263
254
 
@@ -271,21 +262,28 @@ describe LogStash::Inputs::HTTP_Poller do
271
262
  }
272
263
  }
273
264
  it "should run at the schedule" do
274
- instance = klass.new(opts)
275
- instance.register
276
- queue = Queue.new
277
- runner = Thread.new do
278
- instance.run(queue)
265
+ run_plugin_and_yield_queue(plugin, sleep: 2.5) do |queue|
266
+ try(5) { expect(queue.size).to eq(1) }
279
267
  end
280
- sleep 3
281
- instance.stop
282
- runner.kill
283
- runner.join
284
- expect(queue.size).to eq(1)
285
268
  end
286
269
  end
287
270
  end
288
271
 
272
+ def run_plugin_and_yield_queue(plugin, sleep: nil)
273
+ plugin.register
274
+ queue = Queue.new
275
+ begin
276
+ runner = Thread.new do
277
+ plugin.run(queue)
278
+ end
279
+ sleep(sleep) if sleep
280
+ yield(queue)
281
+ ensure
282
+ plugin.stop
283
+ runner.join if runner
284
+ end
285
+ end
286
+
289
287
  describe "events", :ecs_compatibility_support, :aggregate_failures do
290
288
  ecs_compatibility_matrix(:disabled, :v1, :v8 => :v1) do |ecs_select|
291
289
  before do
@@ -339,6 +337,8 @@ describe LogStash::Inputs::HTTP_Poller do
339
337
  event # materialize the subject
340
338
  end
341
339
 
340
+ after { poller.stop }
341
+
342
342
  it "should enqueue a message" do
343
343
  expect(event).to be_a(LogStash::Event)
344
344
  end
@@ -399,9 +399,6 @@ describe LogStash::Inputs::HTTP_Poller do
399
399
  let(:payload) { {"a" => 2, "hello" => ["a", "b", "c"]} }
400
400
  let(:response_body) { LogStash::Json.dump(payload) }
401
401
  let(:opts) { default_opts }
402
- let(:instance) {
403
- klass.new(opts)
404
- }
405
402
  let(:name) { default_name }
406
403
  let(:url) { default_url }
407
404
  let(:code) { 202 }
@@ -411,14 +408,14 @@ describe LogStash::Inputs::HTTP_Poller do
411
408
  }
412
409
 
413
410
  before do
414
- instance.register
411
+ plugin.register
415
412
  u = url.is_a?(Hash) ? url["url"] : url # handle both complex specs and simple string URLs
416
- instance.client.stub(u,
413
+ plugin.client.stub(u,
417
414
  :body => response_body,
418
415
  :code => code
419
416
  )
420
- allow(instance).to receive(:decorate)
421
- instance.send(:run_once, queue)
417
+ allow(plugin).to receive(:decorate)
418
+ plugin.send(:run_once, queue)
422
419
  end
423
420
 
424
421
  it "should have a matching message" do
@@ -426,7 +423,7 @@ describe LogStash::Inputs::HTTP_Poller do
426
423
  end
427
424
 
428
425
  it "should decorate the event" do
429
- expect(instance).to have_received(:decorate).once
426
+ expect(plugin).to have_received(:decorate).once
430
427
  end
431
428
 
432
429
  include_examples("matching metadata")
@@ -434,7 +431,7 @@ describe LogStash::Inputs::HTTP_Poller do
434
431
  context "with an empty body" do
435
432
  let(:response_body) { "" }
436
433
  it "should return an empty event" do
437
- instance.send(:run_once, queue)
434
+ plugin.send(:run_once, queue)
438
435
  headers_field = ecs_select[disabled: "[#{metadata_target}][response_headers]",
439
436
  v1: "[#{metadata_target}][input][http_poller][response][headers]"]
440
437
  expect(event.get("#{headers_field}[content-length]")).to eql("0")
@@ -449,7 +446,7 @@ describe LogStash::Inputs::HTTP_Poller do
449
446
  }
450
447
 
451
448
  it "should not have any metadata on the event" do
452
- instance.send(:run_once, queue)
449
+ plugin.send(:run_once, queue)
453
450
  expect(event.get(metadata_target)).to be_nil
454
451
  end
455
452
  end
@@ -555,6 +552,8 @@ describe LogStash::Inputs::HTTP_Poller do
555
552
 
556
553
  describe "stopping" do
557
554
  let(:config) { default_opts }
558
- it_behaves_like "an interruptible input plugin"
555
+ it_behaves_like "an interruptible input plugin" do
556
+ let(:allowed_lag) { 10 } # CI: wait till scheduler shuts down
557
+ end
559
558
  end
560
559
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-http_poller
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-08-19 00:00:00.000000000 Z
12
+ date: 2022-03-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  requirement: !ruby/object:Gem::Requirement
@@ -48,35 +48,21 @@ dependencies:
48
48
  - !ruby/object:Gem::Dependency
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '7'
53
+ version: 7.2.0
54
54
  name: logstash-mixin-http_client
55
55
  prerelease: false
56
56
  type: :runtime
57
57
  version_requirements: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '7'
62
- - !ruby/object:Gem::Dependency
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: 0.0.22
68
- name: stud
69
- prerelease: false
70
- type: :runtime
71
- version_requirements: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: 0.0.22
61
+ version: 7.2.0
76
62
  - !ruby/object:Gem::Dependency
77
63
  requirement: !ruby/object:Gem::Requirement
78
64
  requirements:
79
- - - "~>"
65
+ - - ">="
80
66
  - !ruby/object:Gem::Version
81
67
  version: 3.0.9
82
68
  name: rufus-scheduler
@@ -84,7 +70,7 @@ dependencies:
84
70
  type: :runtime
85
71
  version_requirements: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - "~>"
73
+ - - ">="
88
74
  - !ruby/object:Gem::Version
89
75
  version: 3.0.9
90
76
  - !ruby/object:Gem::Dependency