logstash-input-elasticsearch 4.8.1 → 4.9.3

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: f2739ba5eed141d75ad674402bb35485e0be50c6a7593556dbcda575120bbb54
4
- data.tar.gz: 1affc8bfa4aad83cda6c59f0a6b3dcf7ca24a5d7e0e53cacc66f45b88d353ce1
3
+ metadata.gz: dc71917516d5297b151b09c3b26324272ee472fa8ae987fad6b30fa99492d382
4
+ data.tar.gz: cd72359f663375ad910dbf02a70d151160e449311bff81c0f77d062c7625c597
5
5
  SHA512:
6
- metadata.gz: d4d2eb3be415ddf52ed7b17d06999fe93022004fcf218d11919c750e3b98f8a1ddc943d7d0911232a43fcc8f237a08ffcbd63ba5ec1dd59de9498061f4b4bf25
7
- data.tar.gz: 74524dcd7cacd49a324049f80b5cabf5bd2a96c8c634ed15877139371cc8cb89bb38c074a576a0214a3785e218ee5dc0f0966b59de75394e679d8eef34ad14ed
6
+ metadata.gz: ea7bca9aa226958479061efab4172224039d10a93579ef482418ad6955c493c00a45b1372ce6bd61aaba07e6c89bc2e96d1236cfd4be2e326193b52805ca448f
7
+ data.tar.gz: 0f08585317a26f8a647be73e4e70b9a421025f1c81bcfa8518c1188cb60a0efea49f131a1e80645bd920c0806bb8c54542da07ab1cab44b540313a062b8b351d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## 4.9.3
2
+ - Fixed SSL handshake hang indefinitely with proxy setup [#156](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/156)
3
+
4
+ ## 4.9.2
5
+ - Fix: a regression (in LS 7.14.0) where due the elasticsearch client update (from 5.0.5 to 7.5.0) the `Authorization`
6
+ header isn't passed, this leads to the plugin not being able to leverage `user`/`password` credentials set by the user.
7
+ [#153](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/153)
8
+
9
+ ## 4.9.1
10
+ - [DOC] Replaced hard-coded links with shared attributes [#143](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/143)
11
+ - [DOC] Added missing quote to docinfo_fields example [#145](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/145)
12
+
13
+ ## 4.9.0
14
+ - Added `target` option, allowing the hit's source to target a specific field instead of being expanded at the root of the event. This allows the input to play nicer with the Elastic Common Schema when the input does not follow the schema. [#117](https://github.com/logstash-plugins/logstash-input-elasticsearch/issues/117)
15
+
16
+ ## 4.8.3
17
+ - [DOC] Fixed links to restructured Logstash-to-cloud docs [#139](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/139)
18
+
19
+ ## 4.8.2
20
+ - [DOC] Document the permissions required in secured clusters [#137](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/137)
21
+
1
22
  ## 4.8.1
2
23
  - Fixed connection error when using multiple `slices`. [#133](https://github.com/logstash-plugins/logstash-input-elasticsearch/issues/133)
3
24
 
data/CONTRIBUTORS CHANGED
@@ -7,6 +7,7 @@ Contributors:
7
7
  * Jordan Sissel (jordansissel)
8
8
  * João Duarte (jsvd)
9
9
  * Kurt Hurtado (kurtado)
10
+ * Luca Belluccini (lucabelluccini)
10
11
  * Pier-Hugues Pellerin (ph)
11
12
  * Richard Pijnenburg (electrical)
12
13
  * Suyog Rao (suyograo)
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Logstash Plugin
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/logstash-input-elasticsearch.svg)](https://badge.fury.io/rb/logstash-input-elasticsearch)
4
- [![Travis Build Status](https://travis-ci.org/logstash-plugins/logstash-input-elasticsearch.svg)](https://travis-ci.org/logstash-plugins/logstash-input-elasticsearch)
4
+ [![Travis Build Status](https://travis-ci.com/logstash-plugins/logstash-input-elasticsearch.svg)](https://travis-ci.com/logstash-plugins/logstash-input-elasticsearch)
5
5
 
6
6
  This is a plugin for [Logstash](https://github.com/elastic/logstash).
7
7
 
data/docs/index.asciidoc CHANGED
@@ -77,6 +77,11 @@ Authentication to a secure Elasticsearch cluster is possible using _one_ of the
77
77
  * <<plugins-{type}s-{plugin}-cloud_auth>>
78
78
  * <<plugins-{type}s-{plugin}-api_key>>
79
79
 
80
+ [id="plugins-{type}s-{plugin}-autz"]
81
+ ==== Authorization
82
+
83
+ Authorization to a secure Elasticsearch cluster requires `read` permission at index level and `monitoring` permissions at cluster level.
84
+ The `monitoring` permission at cluster level is necessary to perform periodic connectivity checks.
80
85
 
81
86
  [id="plugins-{type}s-{plugin}-options"]
82
87
  ==== Elasticsearch Input Configuration Options
@@ -106,6 +111,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
106
111
  | <<plugins-{type}s-{plugin}-slices>> |<<number,number>>|No
107
112
  | <<plugins-{type}s-{plugin}-ssl>> |<<boolean,boolean>>|No
108
113
  | <<plugins-{type}s-{plugin}-socket_timeout_seconds>> | <<number,number>>|No
114
+ | <<plugins-{type}s-{plugin}-target>> | {logstash-ref}/field-references-deepdive.html[field reference] | No
109
115
  | <<plugins-{type}s-{plugin}-user>> |<<string,string>>|No
110
116
  |=======================================================================
111
117
 
@@ -122,7 +128,10 @@ input plugins.
122
128
 
123
129
  Authenticate using Elasticsearch API key. Note that this option also requires enabling the `ssl` option.
124
130
 
125
- Format is `id:api_key` where `id` and `api_key` are as returned by the Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[Create API key API].
131
+ Format is `id:api_key` where `id` and `api_key` are as returned by the
132
+ Elasticsearch
133
+ {ref}/security-api-create-api-key.html[Create
134
+ API key API].
126
135
 
127
136
  [id="plugins-{type}s-{plugin}-ca_file"]
128
137
  ===== `ca_file`
@@ -140,7 +149,8 @@ SSL Certificate Authority file in PEM encoded format, must also include any chai
140
149
 
141
150
  Cloud authentication string ("<username>:<password>" format) is an alternative for the `user`/`password` pair.
142
151
 
143
- For more info, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_auth[Logstash-to-Cloud documentation]
152
+ For more info, check out the
153
+ {logstash-ref}/connecting-to-cloud.html[Logstash-to-Cloud documentation].
144
154
 
145
155
  [id="plugins-{type}s-{plugin}-cloud_id"]
146
156
  ===== `cloud_id`
@@ -150,7 +160,8 @@ For more info, check out the https://www.elastic.co/guide/en/logstash/current/co
150
160
 
151
161
  Cloud ID, from the Elastic Cloud web console. If set `hosts` should not be used.
152
162
 
153
- For more info, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_id[Logstash-to-Cloud documentation]
163
+ For more info, check out the
164
+ {logstash-ref}/connecting-to-cloud.html[Logstash-to-Cloud documentation].
154
165
 
155
166
  [id="plugins-{type}s-{plugin}-connect_timeout_seconds"]
156
167
  ===== `connect_timeout_seconds`
@@ -204,7 +215,7 @@ Example
204
215
  elasticsearch {
205
216
  docinfo => true
206
217
  add_field => {
207
- identifier => %{[@metadata][_index]}:%{[@metadata][_type]}:%{[@metadata][_id]}"
218
+ identifier => "%{[@metadata][_index]}:%{[@metadata][_type]}:%{[@metadata][_id]}"
208
219
  }
209
220
  }
210
221
  }
@@ -247,10 +258,9 @@ can be either IP, HOST, IP:port, or HOST:port. The port defaults to
247
258
  * Value type is <<string,string>>
248
259
  * Default value is `"logstash-*"`
249
260
 
250
- The index or alias to search. See
251
- https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-index.html[Multi Indices documentation]
252
- in the Elasticsearch documentation for more information on how to reference
253
- multiple indices.
261
+ The index or alias to search. See {ref}/multi-index.html[Multi Indices
262
+ documentation] in the Elasticsearch documentation for more information on how to
263
+ reference multiple indices.
254
264
 
255
265
 
256
266
  [id="plugins-{type}s-{plugin}-password"]
@@ -279,9 +289,8 @@ environment variables e.g. `proxy => '${LS_PROXY:}'`.
279
289
  * Value type is <<string,string>>
280
290
  * Default value is `'{ "sort": [ "_doc" ] }'`
281
291
 
282
- The query to be executed. Read the
283
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html[Elasticsearch query DSL documentation]
284
- for more information.
292
+ The query to be executed. Read the {ref}/query-dsl.html[Elasticsearch query DSL
293
+ documentation] for more information.
285
294
 
286
295
  [id="plugins-{type}s-{plugin}-request_timeout_seconds"]
287
296
  ===== `request_timeout_seconds`
@@ -332,7 +341,7 @@ This allows you to set the maximum number of hits returned per scroll.
332
341
 
333
342
  In some cases, it is possible to improve overall throughput by consuming multiple
334
343
  distinct slices of a query simultaneously using
335
- https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#slice-scroll[sliced scrolls],
344
+ {ref}/paginate-search-results.html#slice-scroll[sliced scrolls],
336
345
  especially if the pipeline is spending significant time waiting on Elasticsearch
337
346
  to provide results.
338
347
 
@@ -365,6 +374,19 @@ server (i.e. HTTPS will be used instead of plain HTTP).
365
374
  The maximum amount of time, in seconds, to wait on an incomplete response from Elasticsearch while no additional data has been appended.
366
375
  Socket timeouts usually occur while waiting for the first byte of a response, such as when executing a particularly complex query.
367
376
 
377
+
378
+ [id="plugins-{type}s-{plugin}-target"]
379
+ ===== `target`
380
+
381
+ * Value type is {logstash-ref}/field-references-deepdive.html[field reference]
382
+ * There is no default value for this setting.
383
+
384
+ Without a `target`, events are created from each hit's `_source` at the root level.
385
+ When the `target` is set to a field reference, the `_source` of the hit is placed in the target field instead.
386
+
387
+ This option can be useful to avoid populating unknown fields when a downstream schema such as ECS is enforced.
388
+ It is also possible to target an entry in the event's metadata, which will be available during event processing but not exported to your outputs (e.g., `target \=> "[@metadata][_source]"`).
389
+
368
390
  [id="plugins-{type}s-{plugin}-user"]
369
391
  ===== `user`
370
392
 
@@ -3,9 +3,13 @@ require "logstash/inputs/base"
3
3
  require "logstash/namespace"
4
4
  require "logstash/json"
5
5
  require "logstash/util/safe_uri"
6
+ require 'logstash/plugin_mixins/validator_support/field_reference_validation_adapter'
6
7
  require "base64"
7
- require_relative "patch"
8
8
 
9
+ require "elasticsearch"
10
+ require "elasticsearch/transport/transport/http/manticore"
11
+ require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
12
+ require_relative "elasticsearch/patches/_elasticsearch_transport_connections_selector"
9
13
 
10
14
  # .Compatibility Note
11
15
  # [NOTE]
@@ -62,6 +66,8 @@ require_relative "patch"
62
66
  #
63
67
  #
64
68
  class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
69
+ extend LogStash::PluginMixins::ValidatorSupport::FieldReferenceValidationAdapter
70
+
65
71
  config_name "elasticsearch"
66
72
 
67
73
  default :codec, "json"
@@ -175,10 +181,11 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
175
181
  # exactly once.
176
182
  config :schedule, :validate => :string
177
183
 
184
+ # If set, the _source of each hit will be added nested under the target instead of at the top-level
185
+ config :target, :validate => :field_reference
186
+
178
187
  def register
179
- require "elasticsearch"
180
188
  require "rufus/scheduler"
181
- require "elasticsearch/transport/transport/http/manticore"
182
189
 
183
190
  @options = {
184
191
  :index => @index,
@@ -219,7 +226,6 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
219
226
  end
220
227
 
221
228
 
222
-
223
229
  def run(output_queue)
224
230
  if @schedule
225
231
  @scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
@@ -261,7 +267,6 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
261
267
 
262
268
  logger.info("Slice starting", slice_id: slice_id, slices: @slices) unless slice_id.nil?
263
269
 
264
- scroll_id = nil
265
270
  begin
266
271
  r = search_request(slice_options)
267
272
 
@@ -298,7 +303,12 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
298
303
  end
299
304
 
300
305
  def push_hit(hit, output_queue)
301
- event = LogStash::Event.new(hit['_source'])
306
+ if @target.nil?
307
+ event = LogStash::Event.new(hit['_source'])
308
+ else
309
+ event = LogStash::Event.new
310
+ event.set(@target, hit['_source'])
311
+ end
302
312
 
303
313
  if @docinfo
304
314
  # do not assume event[@docinfo_target] to be in-place updatable. first get it, update it, then at the end set it in the event.
@@ -377,14 +387,14 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
377
387
  return {} unless user && password && password.value
378
388
 
379
389
  token = ::Base64.strict_encode64("#{user}:#{password.value}")
380
- { Authorization: "Basic #{token}" }
390
+ { 'Authorization' => "Basic #{token}" }
381
391
  end
382
392
 
383
393
  def setup_api_key(api_key)
384
394
  return {} unless (api_key && api_key.value)
385
395
 
386
396
  token = ::Base64.strict_encode64(api_key.value)
387
- { Authorization: "ApiKey #{token}" }
397
+ { 'Authorization' => "ApiKey #{token}" }
388
398
  end
389
399
 
390
400
  def fill_user_password_from_cloud_auth
@@ -1,10 +1,13 @@
1
- if Gem.loaded_specs['elasticsearch-transport'].version >= Gem::Version.new("7.2.0")
1
+ require 'elasticsearch'
2
+ require 'elasticsearch/transport/transport/connections/selector'
3
+
4
+ if Gem.loaded_specs['elasticsearch-transport'].version < Gem::Version.new("7.2.0")
2
5
  # elasticsearch-transport versions prior to 7.2.0 suffered of a race condition on accessing
3
- # the connection pool. This issue was fixed with https://github.com/elastic/elasticsearch-ruby/commit/15f9d78591a6e8823948494d94b15b0ca38819d1
4
- # This plugin, at the moment, is forced to use v5.x so we have to monkey patch the gem. When this requirement
5
- # ceases, this patch could be removed.
6
- puts "WARN remove the patch code into logstash-input-elasticsearch plugin"
7
- else
6
+ # the connection pool. This issue was fixed (in 7.2.0) with
7
+ # https://github.com/elastic/elasticsearch-ruby/commit/15f9d78591a6e8823948494d94b15b0ca38819d1
8
+ #
9
+ # This plugin, at the moment, is using elasticsearch >= 5.0.5
10
+ # When this requirement ceases, this patch could be removed.
8
11
  module Elasticsearch
9
12
  module Transport
10
13
  module Transport
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ require "elasticsearch"
3
+ require "elasticsearch/transport/transport/http/manticore"
4
+
5
+ es_client_version = Gem.loaded_specs['elasticsearch-transport'].version
6
+ if es_client_version >= Gem::Version.new('7.2') && es_client_version < Gem::Version.new('7.16')
7
+ # elasticsearch-transport 7.2.0 - 7.14.0 had a bug where setting http headers
8
+ # ES::Client.new ..., transport_options: { headers: { 'Authorization' => ... } }
9
+ # would be lost https://github.com/elastic/elasticsearch-ruby/issues/1428
10
+ #
11
+ # NOTE: needs to be idempotent as filter ES plugin might apply the same patch!
12
+ #
13
+ # @private
14
+ module Elasticsearch
15
+ module Transport
16
+ module Transport
17
+ module HTTP
18
+ class Manticore
19
+
20
+ def apply_headers(request_options, options)
21
+ headers = (options && options[:headers]) || {}
22
+ headers[CONTENT_TYPE_STR] = find_value(headers, CONTENT_TYPE_REGEX) || DEFAULT_CONTENT_TYPE
23
+ headers[USER_AGENT_STR] = find_value(headers, USER_AGENT_REGEX) || user_agent_header
24
+ headers[ACCEPT_ENCODING] = GZIP if use_compression?
25
+ (request_options[:headers] ||= {}).merge!(headers) # this line was changed
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-elasticsearch'
4
- s.version = '4.8.1'
4
+ s.version = '4.9.3'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads query results from an Elasticsearch cluster"
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"
@@ -20,19 +20,18 @@ Gem::Specification.new do |s|
20
20
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
21
21
 
22
22
  # Gem dependencies
23
+ s.add_runtime_dependency "logstash-mixin-validator_support", '~> 1.0'
23
24
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
24
25
 
25
- s.add_runtime_dependency 'elasticsearch', '>= 5.0.3'
26
+ s.add_runtime_dependency 'elasticsearch', '>= 5.0.5' # LS >= 6.7 and < 7.14 all used version 5.0.5
26
27
 
27
28
  s.add_runtime_dependency 'logstash-codec-json'
28
- s.add_runtime_dependency 'logstash-codec-plain'
29
29
  s.add_runtime_dependency 'sequel'
30
30
  s.add_runtime_dependency 'tzinfo'
31
31
  s.add_runtime_dependency 'tzinfo-data'
32
32
  s.add_runtime_dependency 'rufus-scheduler'
33
- s.add_runtime_dependency 'manticore', "~> 0.6"
34
- s.add_runtime_dependency 'faraday', "~> 0.15.4"
35
-
33
+ s.add_runtime_dependency 'manticore', ">= 0.7.1"
34
+ s.add_development_dependency 'faraday', "~> 0.15.4"
36
35
  s.add_development_dependency 'logstash-devutils'
37
36
  s.add_development_dependency 'timecop'
38
37
  end
data/spec/es_helper.rb CHANGED
@@ -1,30 +1,31 @@
1
1
  module ESHelper
2
2
  def self.get_host_port
3
- return "elasticsearch:9200" if ENV["INTEGRATION"] == "true" || ENV["SECURE_INTEGRATION"] == "true"
4
- raise "This setting is only used for integration tests"
3
+ if ENV["INTEGRATION"] == "true" || ENV["SECURE_INTEGRATION"] == "true"
4
+ "elasticsearch:9200"
5
+ else
6
+ "localhost:9200" # for local running integration specs outside docker
7
+ end
5
8
  end
6
9
 
7
- def self.get_client(options = {})
8
- ssl_options = {}
9
- hosts = [get_host_port]
10
+ def self.get_client(options)
11
+ require 'elasticsearch/transport/transport/http/faraday' # supports user/password options
12
+ host, port = get_host_port.split(':')
13
+ host_opts = { host: host, port: port, scheme: 'http' }
14
+ ssl_opts = {}
10
15
 
11
16
  if options[:ca_file]
12
- ssl_options = { :ssl => true, :ca_file => options[:ca_file] }
13
- hosts.map! do |h|
14
- host, port = h.split(":")
15
- { :host => host, :scheme => 'https', :port => port }
16
- end
17
+ ssl_opts = { ca_file: options[:ca_file], version: 'TLSv1.2', verify: false }
18
+ host_opts[:scheme] = 'https'
17
19
  end
18
20
 
19
- transport_options = {}
20
-
21
21
  if options[:user] && options[:password]
22
- token = Base64.strict_encode64("#{options[:user]}:#{options[:password]}")
23
- transport_options[:headers] = { :Authorization => "Basic #{token}" }
22
+ host_opts[:user] = options[:user]
23
+ host_opts[:password] = options[:password]
24
24
  end
25
25
 
26
- @client = Elasticsearch::Client.new(:hosts => hosts, :transport_options => transport_options, :ssl => ssl_options,
27
- :transport_class => ::Elasticsearch::Transport::Transport::HTTP::Manticore)
26
+ Elasticsearch::Client.new(hosts: [host_opts],
27
+ transport_options: { ssl: ssl_opts },
28
+ transport_class: Elasticsearch::Transport::Transport::HTTP::Faraday)
28
29
  end
29
30
 
30
31
  def self.doc_type
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDSTCCAjGgAwIBAgIUUcAg9c8B8jiliCkOEJyqoAHrmccwDQYJKoZIhvcNAQEL
3
+ BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
4
+ cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNDU1WhcNMjQwODExMDUxNDU1WjA0MTIwMAYD
5
+ VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
6
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1HuusRuGNsztd4EQvqwcMr
7
+ 8XvnNNaalerpMOorCGySEFrNf0HxDIVMGMCrOv1F8SvlcGq3XANs2MJ4F2xhhLZr
8
+ PpqVHx+QnSZ66lu5R89QVSuMh/dCMxhNBlOA/dDlvy+EJBl9H791UGy/ChhSgaBd
9
+ OKVyGkhjErRTeMIq7rR7UG6GL/fV+JGy41UiLrm1KQP7/XVD9UzZfGq/hylFkTPe
10
+ oox5BUxdxUdDZ2creOID+agtIYuJVIkelKPQ+ljBY3kWBRexqJQsvyNUs1gZpjpz
11
+ YUCzuVcXDRuJXYQXGqWXhsBPfJv+ZcSyMIBUfWT/G13cWU1iwufPy0NjajowPZsC
12
+ AwEAAaNTMFEwHQYDVR0OBBYEFMgkye5+2l+TE0I6RsXRHjGBwpBGMB8GA1UdIwQY
13
+ MBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
14
+ hvcNAQELBQADggEBAIgtJW8sy5lBpzPRHkmWSS/SCZIPsABW+cHqQ3e0udrI3CLB
15
+ G9n7yqAPWOBTbdqC2GM8dvAS/Twx4Bub/lWr84dFCu+t0mQq4l5kpJMVRS0KKXPL
16
+ DwJbUN3oPNYy4uPn5Xi+XY3BYFce5vwJUsqIxeAbIOxVTNx++k5DFnB0ESAM23QL
17
+ sgUZl7xl3/DkdO4oHj30gmTRW9bjCJ6umnHIiO3JoJatrprurUIt80vHC4Ndft36
18
+ NBQ9mZpequ4RYjpSZNLcVsxyFAYwEY4g8MvH0MoMo2RRLfehmMCzXnI/Wh2qEyYz
19
+ emHprBii/5y1HieKXlX9CZRb5qEPHckDVXW3znw=
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
3
+ QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
4
+ 90IzGE0GU4D90OW/L4QkGX0fv3VQbL8KGFKBoF04pXIaSGMStFN4wirutHtQboYv
5
+ 99X4kbLjVSIuubUpA/v9dUP1TNl8ar+HKUWRM96ijHkFTF3FR0NnZyt44gP5qC0h
6
+ i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
7
+ m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABAoIBABmBC0P6Ebegljkk
8
+ lO26GdbOKvbfqulDS3mN5QMyXkUMopea03YzMnKUJriE+2O33a1mUcuDPWnLpYPK
9
+ BTiQieYHlulNtY0Bzf+R69igRq9+1WpZftGnzrlu7NVxkOokRqWJv3546ilV7QZ0
10
+ f9ngmu+tiN7hEnlBC8m613VMuGGb3czwbCizEVZxlZX0Dk2GExbH7Yf3NNs/aOP/
11
+ 8x6CqgL+rhrtOQ80xwRrOlEF8oSSjXCzypa3nFv21YO3J2lVo4BoIwnHgOzyz46A
12
+ b37gekqXXajIYQ0HAB+NDgVoCRFFJ7Xe16mgB3DpyUpUJzwiMedJkeQ0TprIownQ
13
+ +1mPe9ECgYEA/K4jc0trr3sk8KtcZjOYdpvwrhEqSSGEPeGfFujZaKOb8PZ8PX6j
14
+ MbCTV12nEgm8FEhZQ3azxLnO17gbJ2A+Ksm/IIwnTWlqvvMZD5qTQ7L3qZuCtbWQ
15
+ +EGC/H1SDjhiwvjHcXP61/tYL/peApBSoj0L4kC+U/VaNyvicudKk08CgYEAr46J
16
+ 4VJBJfZ4ZaUBRy53+fy+mknOfaj2wo8MnD3u+/x4YWTapqvDOPN2nJVtKlIsxbS4
17
+ qCO+fzUV17YHlsQmGULNbtFuXWJkP/RcLVbe8VYg/6tmk0dJwNAe90flagX2KJov
18
+ 8eDX129nNpuUqrNNWsfeLmPmH6vUzpKlga+1zfUCgYBrbUHHJ96dmbZn2AMNtIvy
19
+ iXP3HXcj5msJwB3aKJ8eHMkU1kaWAnwxiQfrkfaQ9bCP0v6YbyQY1IJ7NlvdDs7/
20
+ dAydMtkW0WW/zyztdGN92d3vrx0QUiRTV87vt/wl7ZUXnZt1wcB5CPRCWaiUYHWx
21
+ YlDmHW6N1XdIk5DQF0OegwKBgEt7S8k3Zo9+A5IgegYy8p7njsQjy8a3qTFJ9DAR
22
+ aPmrOc8WX/SdkVihRXRZwxAZOOrgoyyYAcYL+xI+T9EBESh3UoC9R2ibb2MYG7Ha
23
+ 0gyN7a4/8eCNHCbs1QOZRAhr+8TFVqv28pbMbWJLToZ+hVns6Zikl0MyzFLtNoAm
24
+ HlMpAoGBAIOkqnwwuRKhWprL59sdcJfWY26os9nvuDV4LoKFNEFLJhj2AA2/3UlV
25
+ v85gqNSxnMNlHLZC9l2HZ3mKv/mfx1aikmFvyhJAnk5u0f9KkexmCPLjQzS5q3ba
26
+ yFuxK2DXwN4x46RgQPFlLjOTCX0BG6rkEu4JdonF8ETSjoCtGEU8
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDNjCCAh6gAwIBAgIUF9wE+oqGSbm4UVn1y9gEjzyaJFswDQYJKoZIhvcNAQEL
3
+ BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
4
+ cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
5
+ VQQDEwJlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2S2by0lgyu
6
+ 1JfgGgZ41PNXbH2qMPMzowguVVdtZ16WM0CaEG7lnLxmMcC+2Q7NnGuFnPAVQo9T
7
+ Q3bh7j+1PkCJVHUKZfJIeWtGc9+qXBcO1MhedfwM1osSa4bfwM85G+XKWbRNtmSt
8
+ CoUuKArIyZkzdBAAQLBoQyPf3DIza1Au4j9Hb3zrswD6e7n2PN4ffIyil1GFduLJ
9
+ 2275qqFiOhkEDUhv7BKNftVBh/89O/5lSqAQGuQ1aDRr8TdHwhO71u4ZIU/Pn6yX
10
+ LGBWrQG53+qpdCsxGvJTfbtIEYUDTN83CirIxDKJgc1QXOEldylztHf4xnQ7ZarJ
11
+ tqF6pUzHbRsCAwEAAaNnMGUwHQYDVR0OBBYEFFQUK+6Cg2kExRj1xSDzEi4kkgKX
12
+ MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBgGA1UdEQQRMA+CDWVs
13
+ YXN0aWNzZWFyY2gwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAinaknZIc
14
+ 7xtQNwUwa+kdET+I4lMz+TJw9vTjGKPJqe082n81ycKU5b+a/OndG90z+dTwhShW
15
+ f0oZdIe/1rDCdiRU4ceCZA4ybKrFDIbW8gOKZOx9rsgEx9XNELj4ocZTBqxjQmNE
16
+ Ho91fli5aEm0EL2vJgejh4hcfDeElQ6go9gtvAHQ57XEADQSenvt69jOICOupnS+
17
+ LSjDVhv/VLi3CAip0B+lD5fX/DVQdrJ62eRGuQYxoouE3saCO58qUUrKB39yD9KA
18
+ qRA/sVxyLogxaU+5dLfc0NJdOqSzStxQ2vdMvAWo9tZZ2UBGFrk5SdwCQe7Yv5mX
19
+ qi02i4q6meHGcw==
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5VV21nXpYzQJoQ
3
+ buWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz36pcFw7UyF51
4
+ /AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/cMjNrUC7iP0dv
5
+ fOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH/z07/mVKoBAa
6
+ 5DVoNGvxN0fCE7vW7hkhT8+frJcsYFatAbnf6ql0KzEa8lN9u0gRhQNM3zcKKsjE
7
+ MomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABAoIBAQCm/VBDz41ImG7p
8
+ yu3e6iMeFi7HW5SKdlRUS5dJbHT1uBWJAm/q8TbwvnUBVdsn9cKWY06QYDPQBjAy
9
+ 0LxRSIKivjyl+aIJDZbbEUXrmk/M0zT9rHtgSc2isM8ITH6IHw5q7lmNMPLYOu6T
10
+ IMvfTDtADBOOTV/vF+/4NKf5GCUXVt1XTzLBFMK0p/ZoI7Fsw7fhH6FR12vk0xA4
11
+ BEC4pwRbGfHo7P31ii0by8epkve93tF4IZuFmN92A84bN1z7Kc4TYaSbua2rgguz
12
+ FzMyWpsTxr363HzCK1xOJb6JyJOiXbq4+j2oqtne3GIvyozJeiyKRgjLIMoe/LV7
13
+ fPPc5wlhAoGBAOD3z0JH2eyR/1RHILFsWInH2nDbKHHuCjhFIL2XloeXsJkiJZ95
14
+ BpdjExMZCqD44tPNRW/GgWKwoVwltm6zB0aq0aW/OfOzw6fhKt1W+go47L7Tpwap
15
+ VQgy6BFXSueUKfQDlZEWV4E2gakf8vOl0/VRQExae/CeKf1suEedQaErAoGBAMWE
16
+ LOmNDEU2NFqghfNBAFYyFJst3YnBmSmlL7W22+OsfSK/PhxnJbuNHxMgxpg9rieW
17
+ tVyjuZRo/i7WLVm3uG+dK1RJ9t8Y6kpYkCRKpi9G8DBOj3PSulOybBr+fdRfW9mf
18
+ 8UmqOjOkrhxXPkchc9TY4EM7/1XeKvEidlIp0gvRAoGAAurz4zYvW2QhXaR2hhaT
19
+ p2XSLXiKM8AUndo3rH3U0/lhrvrEZicZsMj2LF88xg20U27sIaD/eJo13Y4XqaPk
20
+ ykPY6D9srv574SeIeMpx/8PxPiBcoDd+BNc0L1VkgVBoouORAwq5I9HjKKBjdEmI
21
+ UDw3i0X5KYvDm6fXVAZ0HXUCgYBWc4To8KiXPqNpq2sVzrSkBaWJSmj2G7u7Q6b/
22
+ RTs3is72v3gjHG6iiaE5URY7mnu4rjlRhAP9Vnsy6uHMrCJZEBTf/sPEYHZj9iGZ
23
+ EOduOAF3U1tsmaaebbDtm8hdhSOBvITy9kQlSIZAt1r17Ulytz5pj0AySFzJUIkz
24
+ a0SZkQKBgCWixtUxiK8PAdWhyS++90WJeJn8eqjuSAz+VMtFQFRRWDUbkiHvGMRu
25
+ o/Hhk6zS46gSF2Evb1d26uUEenXnJlIp6YWzb0DLPrfy5P53kPA6YEvYq5MSAg3l
26
+ DZOJUF+ko7cWXSZkeTIBH/jrGOdP4tTALZt6DNt+Gz7xwPO5tGgV
27
+ -----END RSA PRIVATE KEY-----
@@ -40,57 +40,91 @@ describe LogStash::Inputs::TestableElasticsearch do
40
40
  end
41
41
  end
42
42
 
43
- it "should retrieve json event from elasticseach" do
44
- config = %q[
45
- input {
46
- elasticsearch {
47
- hosts => ["localhost"]
48
- query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
43
+ context 'creating events from Elasticsearch' do
44
+ let(:config) do
45
+ %q[
46
+ input {
47
+ elasticsearch {
48
+ hosts => ["localhost"]
49
+ query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
50
+ }
49
51
  }
52
+ ]
53
+ end
54
+
55
+ let(:mock_response) do
56
+ {
57
+ "_scroll_id" => "cXVlcnlUaGVuRmV0Y2g",
58
+ "took" => 27,
59
+ "timed_out" => false,
60
+ "_shards" => {
61
+ "total" => 169,
62
+ "successful" => 169,
63
+ "failed" => 0
64
+ },
65
+ "hits" => {
66
+ "total" => 1,
67
+ "max_score" => 1.0,
68
+ "hits" => [ {
69
+ "_index" => "logstash-2014.10.12",
70
+ "_type" => "logs",
71
+ "_id" => "C5b2xLQwTZa76jBmHIbwHQ",
72
+ "_score" => 1.0,
73
+ "_source" => { "message" => ["ohayo"] }
74
+ } ]
75
+ }
50
76
  }
51
- ]
52
-
53
- response = {
54
- "_scroll_id" => "cXVlcnlUaGVuRmV0Y2g",
55
- "took" => 27,
56
- "timed_out" => false,
57
- "_shards" => {
58
- "total" => 169,
59
- "successful" => 169,
60
- "failed" => 0
61
- },
62
- "hits" => {
63
- "total" => 1,
64
- "max_score" => 1.0,
65
- "hits" => [ {
66
- "_index" => "logstash-2014.10.12",
67
- "_type" => "logs",
68
- "_id" => "C5b2xLQwTZa76jBmHIbwHQ",
69
- "_score" => 1.0,
70
- "_source" => { "message" => ["ohayo"] }
71
- } ]
77
+ end
78
+
79
+ let(:mock_scroll_response) do
80
+ {
81
+ "_scroll_id" => "r453Wc1jh0caLJhSDg",
82
+ "hits" => { "hits" => [] }
72
83
  }
73
- }
84
+ end
74
85
 
75
- scroll_reponse = {
76
- "_scroll_id" => "r453Wc1jh0caLJhSDg",
77
- "hits" => { "hits" => [] }
78
- }
86
+ before(:each) do
87
+ client = Elasticsearch::Client.new
88
+ expect(Elasticsearch::Client).to receive(:new).with(any_args).and_return(client)
89
+ expect(client).to receive(:search).with(any_args).and_return(mock_response)
90
+ expect(client).to receive(:scroll).with({ :body => { :scroll_id => "cXVlcnlUaGVuRmV0Y2g" }, :scroll=> "1m" }).and_return(mock_scroll_response)
91
+ expect(client).to receive(:clear_scroll).and_return(nil)
92
+ end
79
93
 
80
- client = Elasticsearch::Client.new
81
- expect(Elasticsearch::Client).to receive(:new).with(any_args).and_return(client)
82
- expect(client).to receive(:search).with(any_args).and_return(response)
83
- expect(client).to receive(:scroll).with({ :body => { :scroll_id => "cXVlcnlUaGVuRmV0Y2g" }, :scroll=> "1m" }).and_return(scroll_reponse)
84
- expect(client).to receive(:clear_scroll).and_return(nil)
94
+ it 'creates the events from the hits' do
95
+ event = input(config) do |pipeline, queue|
96
+ queue.pop
97
+ end
85
98
 
86
- event = input(config) do |pipeline, queue|
87
- queue.pop
99
+ expect(event).to be_a(LogStash::Event)
100
+ puts event.to_hash_with_metadata
101
+ expect(event.get("message")).to eql [ "ohayo" ]
88
102
  end
89
103
 
90
- expect(event).to be_a(LogStash::Event)
91
- expect(event.get("message")).to eql [ "ohayo" ]
92
- end
104
+ context 'when a target is set' do
105
+ let(:config) do
106
+ %q[
107
+ input {
108
+ elasticsearch {
109
+ hosts => ["localhost"]
110
+ query => '{ "query": { "match": { "city_name": "Okinawa" } }, "fields": ["message"] }'
111
+ target => "[@metadata][_source]"
112
+ }
113
+ }
114
+ ]
115
+ end
93
116
 
117
+ it 'creates the event using the target' do
118
+ event = input(config) do |pipeline, queue|
119
+ queue.pop
120
+ end
121
+
122
+ expect(event).to be_a(LogStash::Event)
123
+ puts event.to_hash_with_metadata
124
+ expect(event.get("[@metadata][_source][message]")).to eql [ "ohayo" ]
125
+ end
126
+ end
127
+ end
94
128
 
95
129
  # This spec is an adapter-spec, ensuring that we send the right sequence of messages to our Elasticsearch Client
96
130
  # to support sliced scrolling. The underlying implementation will spawn its own threads to consume, so we must be
@@ -132,7 +166,7 @@ describe LogStash::Inputs::TestableElasticsearch do
132
166
  end
133
167
 
134
168
  context 'without slices directive' do
135
- let(:config) { super.tap { |h| h.delete('slices') } }
169
+ let(:config) { super().tap { |h| h.delete('slices') } }
136
170
  it 'runs just one slice' do
137
171
  expect(plugin).to receive(:do_run_slice).with(duck_type(:<<))
138
172
  expect(Thread).to_not receive(:new)
@@ -529,22 +563,22 @@ describe LogStash::Inputs::TestableElasticsearch do
529
563
  'sample:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2OjkyNDMkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA=='
530
564
  end
531
565
 
532
- let(:config) { super.merge({ 'cloud_id' => valid_cloud_id }) }
566
+ let(:config) { super().merge({ 'cloud_id' => valid_cloud_id }) }
533
567
 
534
568
  it "should set host(s)" do
535
569
  plugin.register
536
570
  client = plugin.send(:client)
537
- expect( client.transport.hosts ).to eql [{
538
- :scheme => "https",
539
- :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
540
- :port => 9243,
541
- :path => "",
542
- :protocol => "https"
543
- }]
571
+ expect( client.transport.instance_variable_get(:@hosts) ).to eql [{
572
+ :scheme => "https",
573
+ :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
574
+ :port => 9243,
575
+ :path => "",
576
+ :protocol => "https"
577
+ }]
544
578
  end
545
579
 
546
580
  context 'invalid' do
547
- let(:config) { super.merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
581
+ let(:config) { super().merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
548
582
 
549
583
  it "should fail" do
550
584
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id.*? is invalid/
@@ -552,7 +586,7 @@ describe LogStash::Inputs::TestableElasticsearch do
552
586
  end
553
587
 
554
588
  context 'hosts also set' do
555
- let(:config) { super.merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
589
+ let(:config) { super().merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
556
590
 
557
591
  it "should fail" do
558
592
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id and hosts/
@@ -561,18 +595,18 @@ describe LogStash::Inputs::TestableElasticsearch do
561
595
  end if LOGSTASH_VERSION > '6.0'
562
596
 
563
597
  describe "cloud.auth" do
564
- let(:config) { super.merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
598
+ let(:config) { super().merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
565
599
 
566
600
  it "should set authorization" do
567
601
  plugin.register
568
602
  client = plugin.send(:client)
569
- auth_header = client.transport.options[:transport_options][:headers][:Authorization]
603
+ auth_header = client.transport.instance_variable_get(:@options)[:transport_options][:headers]['Authorization']
570
604
 
571
605
  expect( auth_header ).to eql "Basic #{Base64.encode64('elastic:my-passwd-00').rstrip}"
572
606
  end
573
607
 
574
608
  context 'invalid' do
575
- let(:config) { super.merge({ 'cloud_auth' => 'invalid-format' }) }
609
+ let(:config) { super().merge({ 'cloud_auth' => 'invalid-format' }) }
576
610
 
577
611
  it "should fail" do
578
612
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_auth.*? format/
@@ -580,7 +614,7 @@ describe LogStash::Inputs::TestableElasticsearch do
580
614
  end
581
615
 
582
616
  context 'user also set' do
583
- let(:config) { super.merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
617
+ let(:config) { super().merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
584
618
 
585
619
  it "should fail" do
586
620
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
@@ -590,7 +624,7 @@ describe LogStash::Inputs::TestableElasticsearch do
590
624
 
591
625
  describe "api_key" do
592
626
  context "without ssl" do
593
- let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
627
+ let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
594
628
 
595
629
  it "should fail" do
596
630
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /api_key authentication requires SSL\/TLS/
@@ -598,18 +632,18 @@ describe LogStash::Inputs::TestableElasticsearch do
598
632
  end
599
633
 
600
634
  context "with ssl" do
601
- let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
635
+ let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
602
636
 
603
637
  it "should set authorization" do
604
638
  plugin.register
605
639
  client = plugin.send(:client)
606
- auth_header = client.transport.options[:transport_options][:headers][:Authorization]
640
+ auth_header = client.transport.instance_variable_get(:@options)[:transport_options][:headers]['Authorization']
607
641
 
608
642
  expect( auth_header ).to eql "ApiKey #{Base64.strict_encode64('foo:bar')}"
609
643
  end
610
644
 
611
645
  context 'user also set' do
612
- let(:config) { super.merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
646
+ let(:config) { super().merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
613
647
 
614
648
  it "should fail" do
615
649
  expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
@@ -619,24 +653,24 @@ describe LogStash::Inputs::TestableElasticsearch do
619
653
  end if LOGSTASH_VERSION > '6.0'
620
654
 
621
655
  describe "proxy" do
622
- let(:config) { super.merge({ 'proxy' => 'http://localhost:1234' }) }
656
+ let(:config) { super().merge({ 'proxy' => 'http://localhost:1234' }) }
623
657
 
624
658
  it "should set proxy" do
625
659
  plugin.register
626
660
  client = plugin.send(:client)
627
- proxy = client.transport.options[:transport_options][:proxy]
661
+ proxy = client.transport.instance_variable_get(:@options)[:transport_options][:proxy]
628
662
 
629
663
  expect( proxy ).to eql "http://localhost:1234"
630
664
  end
631
665
 
632
666
  context 'invalid' do
633
- let(:config) { super.merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
667
+ let(:config) { super().merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
634
668
 
635
669
  it "should not set proxy" do
636
670
  plugin.register
637
671
  client = plugin.send(:client)
638
672
 
639
- expect( client.transport.options[:transport_options] ).to_not include(:proxy)
673
+ expect( client.transport.instance_variable_get(:@options)[:transport_options] ).to_not include(:proxy)
640
674
  end
641
675
  end
642
676
  end
@@ -11,7 +11,7 @@ describe LogStash::Inputs::Elasticsearch do
11
11
  'query' => '{ "query": { "match": { "message": "Not found"} }}' } }
12
12
  let(:plugin) { described_class.new(config) }
13
13
  let(:event) { LogStash::Event.new({}) }
14
- let(:client_options) {{}}
14
+ let(:client_options) { Hash.new }
15
15
 
16
16
  before(:each) do
17
17
  @es = ESHelper.get_client(client_options)
@@ -47,17 +47,29 @@ describe LogStash::Inputs::Elasticsearch do
47
47
  end
48
48
 
49
49
  describe 'against a secured elasticsearch', :secure_integration => true do
50
- let(:user) { 'simpleuser' }
51
- let(:password) { 'abc123' }
52
- let(:ca_file) { "spec/fixtures/test_certs/test.crt" }
53
- let(:client_options) {{:ca_file => ca_file, :user => user, :password => password}}
54
- let(:config) { super.merge({
55
- 'user' => user,
56
- 'password' => password,
57
- 'ssl' => true,
58
- 'ca_file' => ca_file })
59
- }
50
+ let(:user) { ENV['ELASTIC_USER'] || 'simpleuser' }
51
+ let(:password) { ENV['ELASTIC_PASSWORD'] || 'abc123' }
52
+ let(:ca_file) { "spec/fixtures/test_certs/ca.crt" }
53
+
54
+ let(:client_options) { { :ca_file => ca_file, :user => user, :password => password } }
55
+
56
+ let(:config) { super().merge('user' => user, 'password' => password, 'ssl' => true, 'ca_file' => ca_file) }
57
+
60
58
  it_behaves_like 'an elasticsearch index plugin'
59
+
60
+ context "incorrect auth credentials" do
61
+
62
+ let(:config) do
63
+ super().merge('user' => 'archer', 'password' => 'b0gus!')
64
+ end
65
+
66
+ let(:queue) { [] }
67
+
68
+ it "fails to run the plugin" do
69
+ plugin.register
70
+ expect { plugin.run queue }.to raise_error Elasticsearch::Transport::Transport::Errors::Unauthorized
71
+ end
72
+ end
73
+
61
74
  end
62
75
  end
63
-
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.8.1
4
+ version: 4.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-20 00:00:00.000000000 Z
11
+ date: 2021-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ name: logstash-mixin-validator_support
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  requirement: !ruby/object:Gem::Requirement
15
29
  requirements:
@@ -35,7 +49,7 @@ dependencies:
35
49
  requirements:
36
50
  - - ">="
37
51
  - !ruby/object:Gem::Version
38
- version: 5.0.3
52
+ version: 5.0.5
39
53
  name: elasticsearch
40
54
  prerelease: false
41
55
  type: :runtime
@@ -43,7 +57,7 @@ dependencies:
43
57
  requirements:
44
58
  - - ">="
45
59
  - !ruby/object:Gem::Version
46
- version: 5.0.3
60
+ version: 5.0.5
47
61
  - !ruby/object:Gem::Dependency
48
62
  requirement: !ruby/object:Gem::Requirement
49
63
  requirements:
@@ -58,20 +72,6 @@ dependencies:
58
72
  - - ">="
59
73
  - !ruby/object:Gem::Version
60
74
  version: '0'
61
- - !ruby/object:Gem::Dependency
62
- requirement: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: '0'
67
- name: logstash-codec-plain
68
- prerelease: false
69
- type: :runtime
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
@@ -131,17 +131,17 @@ dependencies:
131
131
  - !ruby/object:Gem::Dependency
132
132
  requirement: !ruby/object:Gem::Requirement
133
133
  requirements:
134
- - - "~>"
134
+ - - ">="
135
135
  - !ruby/object:Gem::Version
136
- version: '0.6'
136
+ version: 0.7.1
137
137
  name: manticore
138
138
  prerelease: false
139
139
  type: :runtime
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - "~>"
142
+ - - ">="
143
143
  - !ruby/object:Gem::Version
144
- version: '0.6'
144
+ version: 0.7.1
145
145
  - !ruby/object:Gem::Dependency
146
146
  requirement: !ruby/object:Gem::Requirement
147
147
  requirements:
@@ -150,7 +150,7 @@ dependencies:
150
150
  version: 0.15.4
151
151
  name: faraday
152
152
  prerelease: false
153
- type: :runtime
153
+ type: :development
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - "~>"
@@ -200,13 +200,14 @@ files:
200
200
  - README.md
201
201
  - docs/index.asciidoc
202
202
  - lib/logstash/inputs/elasticsearch.rb
203
- - lib/logstash/inputs/patch.rb
203
+ - lib/logstash/inputs/elasticsearch/patches/_elasticsearch_transport_connections_selector.rb
204
+ - lib/logstash/inputs/elasticsearch/patches/_elasticsearch_transport_http_manticore.rb
204
205
  - logstash-input-elasticsearch.gemspec
205
206
  - spec/es_helper.rb
206
- - spec/fixtures/test_certs/ca/ca.crt
207
- - spec/fixtures/test_certs/ca/ca.key
208
- - spec/fixtures/test_certs/test.crt
209
- - spec/fixtures/test_certs/test.key
207
+ - spec/fixtures/test_certs/ca.crt
208
+ - spec/fixtures/test_certs/ca.key
209
+ - spec/fixtures/test_certs/es.crt
210
+ - spec/fixtures/test_certs/es.key
210
211
  - spec/inputs/elasticsearch_spec.rb
211
212
  - spec/inputs/integration/elasticsearch_spec.rb
212
213
  homepage: http://www.elastic.co/guide/en/logstash/current/index.html
@@ -230,16 +231,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
231
  - !ruby/object:Gem::Version
231
232
  version: '0'
232
233
  requirements: []
233
- rubyforge_project:
234
- rubygems_version: 2.6.13
234
+ rubygems_version: 3.1.6
235
235
  signing_key:
236
236
  specification_version: 4
237
237
  summary: Reads query results from an Elasticsearch cluster
238
238
  test_files:
239
239
  - spec/es_helper.rb
240
- - spec/fixtures/test_certs/ca/ca.crt
241
- - spec/fixtures/test_certs/ca/ca.key
242
- - spec/fixtures/test_certs/test.crt
243
- - spec/fixtures/test_certs/test.key
240
+ - spec/fixtures/test_certs/ca.crt
241
+ - spec/fixtures/test_certs/ca.key
242
+ - spec/fixtures/test_certs/es.crt
243
+ - spec/fixtures/test_certs/es.key
244
244
  - spec/inputs/elasticsearch_spec.rb
245
245
  - spec/inputs/integration/elasticsearch_spec.rb
@@ -1,32 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- w4IZTvlmwKW3FyMDhwYL/zX7J0c6MzMPLEdi73Qjzmr3ENIrir4O86wNz81YRfYk
18
- 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
- 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
- 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
- UOzvpCoawSXH1FP2ycA+P1bP8H8htjwvV334ZADlQrDQRu0hqa1T+DxwhLxNOxgE
22
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
31
- nIg9fQPvVw+fIHACZQ==
32
- -----END CERTIFICATE-----
@@ -1,51 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- nfdJo7rqujyBqXu+MetcpCR59VhHB187oOqpuFXoviwyLLwXNDnlMymgzflxa6+g
5
- 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
- COIe3EOxj+z3cApr+8uS1cpQrmcDeOMk6EBtFNWds4CDEW3Rhtf3zFb9pSqxyAFR
7
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- BvO/Q0T2lv/t6B+SL47WCQ3pwHqyioyrX2yGPtSFp+R4gZCMJkLJcOPC+b1QsIBw
37
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
51
- -----END RSA PRIVATE KEY-----
@@ -1,36 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- /tiVVjImmQiVB3dE9fMR/pVJiO2v0COnWuG+/brXWrQIHk0AuD8pHc6Iw9iZODkc
12
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CAwCTkExDzANBgNVBAcMBkxpc2JvbjEOMAwGA1UECgwFTXlMYWIxDzANBgNVBAMM
23
- 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
- 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
- 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
- 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
- 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
- HhUlUx1T7jHzNllJBRF3IaOk72yjoU4cL0qVy9874SXPwdpeFHtvS4TdQTLqnAGR
29
- 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
- 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
- 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
- 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
- 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
- VTrvnAM1L3LwqtYQYfUWUHYZFYdvh8layA2ImNE7yx/9wIIkw/L1j9m71Upi6WKR
35
- FKbYFqzgpWksa+zZ2RYYplUAxq0wYw==
36
- -----END CERTIFICATE-----
@@ -1,51 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- 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
- 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
- CJUHd0T18xH+lUmI7a/QI6da4b79utdatAgeTQC4PykdzojD2Jk4ORwCjncHjWpu
7
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0OYfHE6ioNCldce1eKpokaWtHvh41ySXJXUqwg4eIYC1ylmGfr0RwvXOLuBJPNkJ
17
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 5t4YaC2nj2HeYa8BBf/xVdHFSY/Ncs/w+RRJWb/dJhMRQxFF4QdEFVcX2RvFMK7V
36
- IJceX2JWBqvjM4O8h2dy6tCKzZG7zxZ9MxXNicuutUith2W8iY5pFPLqxdDHHw6f
37
- f6CiYivPv3jFeVhEG/LbCmuDy8FW5162rCnNtTtWDFkX8i077xhEQ4Wf11ZEKVgl
38
- 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
- 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
- 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
- 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
- v/J1/F6WSBoqFWsNjy97rHlI95FJbIEeM1I0IeCmPPMY5RFY/w+SNI7NxFJVqiwr
43
- +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
- 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
- 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
- 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
- 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
- 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
- r/4xcq7TmKSoJqkb0OcOkhqjeZWleA6xRtEvHPGRzbEM67FVsVTxr/N9BX5tS9zu
50
- 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
51
- -----END RSA PRIVATE KEY-----