logstash-input-http_poller 5.1.0 → 5.3.0

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 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