logstash-core 5.0.0.alpha1.snapshot1-java → 5.0.0.alpha1.snapshot2-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of logstash-core might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 116e0169a97708b2908a1580f19363cea4ec254c
4
- data.tar.gz: 07d1c894c876fa00e01998899674ee6cffe211d9
3
+ metadata.gz: 1897b709706618fc25d95076f5260446a6552313
4
+ data.tar.gz: ef6d4c66c9f72d39a3bcca7bad86ce1b493b1933
5
5
  SHA512:
6
- metadata.gz: 204cd8445455a5783e411a306182e4b0dea5bbaf67dfa64f9cb6d84b6e3acf6c860430913c84ed04064c12945f01b9fceaf37e5301613056a06d32256990aa02
7
- data.tar.gz: a71a7cead5c3f2a1721506831fa245ec76ee78f078fb5c4d3cd4ec1406179f4b0f5982bcb67ab7b9e8007b8a122cb22812712a624ec637c1a9c4826b1bcffba6
6
+ metadata.gz: 96edfe806e2fe9c0848cbfe10b3aeb780dc67c63e007792126bd6e0f166ece56ed79caab924d4cdbaaeae561400414d3efb7ae56a48378c9a179144f14c642a0
7
+ data.tar.gz: c8b0b175e21c70203a2978b2c5b1973633694b42c09fb0e72784e1827ad25aee4c245656770f54e060db98190630605e171a130faa3f1b92870c21bfd0046cdf
@@ -5,4 +5,4 @@
5
5
  # Note to authors: this should not include dashes because 'gem' barfs if
6
6
  # you include a dash in the version string.
7
7
 
8
- LOGSTASH_CORE_VERSION = "5.0.0-alpha1.snapshot1"
8
+ LOGSTASH_CORE_VERSION = "5.0.0-alpha1.snapshot2"
@@ -37,7 +37,7 @@ class LogStash::Agent
37
37
  @web_api_http_host = params[:web_api_http_host]
38
38
  @web_api_http_port = params[:web_api_http_port]
39
39
 
40
- @config_loader = LogStash::Config::Loader.new(@logger)
40
+ @config_loader = LogStash::Config::Loader.new(@logger, params[:debug_config])
41
41
  @reload_interval = params[:reload_interval] || 3 # seconds
42
42
  @upgrade_mutex = Mutex.new
43
43
 
@@ -391,7 +391,7 @@ module LogStash; module Config; module AST
391
391
  if type == "filter"
392
392
  i = LogStash::Config::AST.defered_conditionals_index += 1
393
393
  source = <<-CODE
394
- def cond_func_#{i}(input_events)
394
+ define_singleton_method :cond_func_#{i} do |input_events|
395
395
  result = []
396
396
  input_events.each do |event|
397
397
  events = [event]
@@ -1,8 +1,9 @@
1
1
  require "logstash/config/defaults"
2
2
 
3
3
  module LogStash; module Config; class Loader
4
- def initialize(logger)
4
+ def initialize(logger, debug_config=false)
5
5
  @logger = logger
6
+ @debug_config = debug_config
6
7
  end
7
8
 
8
9
  def format_config(config_path, config_string)
@@ -69,14 +70,18 @@ module LogStash; module Config; class Loader
69
70
  encoding_issue_files << file
70
71
  end
71
72
  config << cfg + "\n"
72
- @logger.debug? && @logger.debug("\nThe following is the content of a file", :config_file => file.to_s)
73
- @logger.debug? && @logger.debug("\n" + cfg + "\n\n")
73
+ if @debug_config
74
+ @logger.debug? && @logger.debug("\nThe following is the content of a file", :config_file => file.to_s)
75
+ @logger.debug? && @logger.debug("\n" + cfg + "\n\n")
76
+ end
74
77
  end
75
78
  if encoding_issue_files.any?
76
79
  fail("The following config files contains non-ascii characters but are not UTF-8 encoded #{encoding_issue_files}")
77
80
  end
78
- @logger.debug? && @logger.debug("\nThe following is the merged configuration")
79
- @logger.debug? && @logger.debug("\n" + config + "\n\n")
81
+ if @debug_config
82
+ @logger.debug? && @logger.debug("\nThe following is the merged configuration")
83
+ @logger.debug? && @logger.debug("\n" + config + "\n\n")
84
+ end
80
85
  return config
81
86
  end # def load_config
82
87
 
@@ -38,7 +38,8 @@ module LogStash::Config::Mixin
38
38
  PLUGIN_VERSION_1_0_0 = LogStash::Util::PluginVersion.new(1, 0, 0)
39
39
  PLUGIN_VERSION_0_9_0 = LogStash::Util::PluginVersion.new(0, 9, 0)
40
40
 
41
- ENV_PLACEHOLDER_REGEX = /\$(?<name>\w+)|\$\{(?<name>\w+)(\:(?<default>[^}]*))?\}/
41
+ ALLOW_ENV_FLAG = "__ALLOW_ENV__"
42
+ ENV_PLACEHOLDER_REGEX = /\$\{(?<name>\w+)(\:(?<default>[^}]*))?\}/
42
43
 
43
44
  # This method is called when someone does 'include LogStash::Config'
44
45
  def self.included(base)
@@ -47,13 +48,21 @@ module LogStash::Config::Mixin
47
48
  end
48
49
 
49
50
  def config_init(params)
51
+ # HACK(talevy): https://github.com/elastic/logstash/issues/4958
52
+ # Currently, the regular plugins params argument is hijacked
53
+ # to pass along the `allow_env` configuration variable. This was done as to
54
+ # not change the method signature of Plugin. This also makes it difficul to
55
+ # reason about at the same time. ALLOW_ENV_FLAG is a special param that users
56
+ # are now forbidden to set in their configuration definitions.
57
+ allow_env = params.delete(LogStash::Config::Mixin::ALLOW_ENV_FLAG) { false }
58
+
50
59
  # Validation will modify the values inside params if necessary.
51
60
  # For example: converting a string to a number, etc.
52
61
 
53
62
  # Keep a copy of the original config params so that we can later
54
63
  # differentiate between explicit configuration and implicit (default)
55
64
  # configuration.
56
- @original_params = params.clone
65
+ original_params = params.clone
57
66
 
58
67
  # store the plugin type, turns LogStash::Inputs::Base into 'input'
59
68
  @plugin_type = self.class.ancestors.find { |a| a.name =~ /::Base$/ }.config_name
@@ -102,22 +111,25 @@ module LogStash::Config::Mixin
102
111
  end
103
112
 
104
113
  # Resolve environment variables references
105
- params.each do |name, value|
106
- if (value.is_a?(Hash))
107
- value.each do |valueHashKey, valueHashValue|
108
- value[valueHashKey.to_s] = replace_env_placeholders(valueHashValue)
109
- end
110
- else
111
- if (value.is_a?(Array))
112
- value.each_index do |valueArrayIndex|
113
- value[valueArrayIndex] = replace_env_placeholders(value[valueArrayIndex])
114
+ if allow_env
115
+ params.each do |name, value|
116
+ if (value.is_a?(Hash))
117
+ value.each do |valueHashKey, valueHashValue|
118
+ value[valueHashKey.to_s] = replace_env_placeholders(valueHashValue)
114
119
  end
115
120
  else
116
- params[name.to_s] = replace_env_placeholders(value)
121
+ if (value.is_a?(Array))
122
+ value.each_index do |valueArrayIndex|
123
+ value[valueArrayIndex] = replace_env_placeholders(value[valueArrayIndex])
124
+ end
125
+ else
126
+ params[name.to_s] = replace_env_placeholders(value)
127
+ end
117
128
  end
118
129
  end
119
130
  end
120
131
 
132
+
121
133
  if !self.class.validate(params)
122
134
  raise LogStash::ConfigurationError,
123
135
  I18n.t("logstash.runner.configuration.invalid_plugin_settings")
@@ -142,6 +154,11 @@ module LogStash::Config::Mixin
142
154
  instance_variable_set("@#{key}", value)
143
155
  end
144
156
 
157
+ # now that we know the parameters are valid, we can obfuscate the original copy
158
+ # of the parameters before storing them as an instance variable
159
+ self.class.secure_params!(original_params)
160
+ @original_params = original_params
161
+
145
162
  @config = params
146
163
  end # def config_init
147
164
 
@@ -149,7 +166,6 @@ module LogStash::Config::Mixin
149
166
  # Process following patterns : $VAR, ${VAR}, ${VAR:defaultValue}
150
167
  def replace_env_placeholders(value)
151
168
  return value unless value.is_a?(String)
152
- #raise ArgumentError, "Cannot replace ENV placeholders on non-strings. Got #{value.class}" if !value.is_a?(String)
153
169
 
154
170
  value.gsub(ENV_PLACEHOLDER_REGEX) do |placeholder|
155
171
  # Note: Ruby docs claim[1] Regexp.last_match is thread-local and scoped to
@@ -163,7 +179,6 @@ module LogStash::Config::Mixin
163
179
  if replacement.nil?
164
180
  raise LogStash::ConfigurationError, "Cannot evaluate `#{placeholder}`. Environment variable `#{name}` is not set and there is no default value given."
165
181
  end
166
- @logger.info? && @logger.info("Evaluating environment variable placeholder", :placeholder => placeholder, :replacement => replacement)
167
182
  replacement
168
183
  end
169
184
  end # def replace_env_placeholders
@@ -537,6 +552,14 @@ module LogStash::Config::Mixin
537
552
  return true, result
538
553
  end # def validate_value
539
554
 
555
+ def secure_params!(params)
556
+ params.each do |key, value|
557
+ if @config[key][:validate] == :password && !value.is_a?(::LogStash::Util::Password)
558
+ params[key] = ::LogStash::Util::Password.new(value)
559
+ end
560
+ end
561
+ end
562
+
540
563
  def hash_or_array(value)
541
564
  if !value.is_a?(Hash)
542
565
  value = [*value] # coerce scalar to array if necessary
@@ -34,14 +34,14 @@ module LogStash module Instrument module PeriodicPoller
34
34
  end
35
35
 
36
36
  def start
37
- logger.debug("PeriodicPoller: Starting", :poller => self,
37
+ logger.debug("PeriodicPoller: Starting",
38
38
  :polling_interval => @options[:polling_interval],
39
39
  :polling_timeout => @options[:polling_timeout]) if logger.debug?
40
40
  @task.execute
41
41
  end
42
42
 
43
43
  def stop
44
- logger.debug("PeriodicPoller: Stopping", :poller => self)
44
+ logger.debug("PeriodicPoller: Stopping")
45
45
  @task.shutdown
46
46
  end
47
47
 
@@ -147,7 +147,7 @@ module LogStash class OutputDelegator
147
147
  end
148
148
 
149
149
  def do_close
150
- @logger.debug("closing output delegator", :klass => self)
150
+ @logger.debug("closing output delegator", :klass => @klass)
151
151
 
152
152
  if @threadsafe
153
153
  @workers.each(&:do_close)
@@ -44,7 +44,9 @@ module LogStash; class Pipeline
44
44
  :pipeline_batch_size => 125,
45
45
  :pipeline_batch_delay => 5, # in milliseconds
46
46
  :flush_interval => 5, # in seconds
47
- :flush_timeout_interval => 60 # in seconds
47
+ :flush_timeout_interval => 60, # in seconds
48
+ :debug_config => false,
49
+ :allow_env => false
48
50
  }
49
51
  MAX_INFLIGHT_WARN_THRESHOLD = 10_000
50
52
 
@@ -52,15 +54,6 @@ module LogStash; class Pipeline
52
54
  "LogStash::Inputs::Stdin"
53
55
  ]
54
56
 
55
- def self.validate_config(config_str, settings = {})
56
- begin
57
- # There should be a better way to test this
58
- self.new(config_str, settings)
59
- rescue => e
60
- e.message
61
- end
62
- end
63
-
64
57
  def initialize(config_str, settings = {})
65
58
  @config_str = config_str
66
59
  @original_settings = settings
@@ -69,6 +62,7 @@ module LogStash; class Pipeline
69
62
  @settings = DEFAULT_SETTINGS.clone
70
63
  settings.each {|setting, value| configure(setting, value) }
71
64
  @reporter = LogStash::PipelineReporter.new(@logger, self)
65
+ @allow_env = settings[:allow_env]
72
66
 
73
67
  @inputs = nil
74
68
  @filters = nil
@@ -99,7 +93,10 @@ module LogStash; class Pipeline
99
93
 
100
94
  # The config code is hard to represent as a log message...
101
95
  # So just print it.
102
- @logger.debug? && @logger.debug("Compiled pipeline code:\n#{code}")
96
+
97
+ if @settings[:debug_config] && logger.debug?
98
+ logger.debug("Compiled pipeline code", :code => code)
99
+ end
103
100
 
104
101
  begin
105
102
  eval(code)
@@ -456,6 +453,7 @@ module LogStash; class Pipeline
456
453
 
457
454
  def plugin(plugin_type, name, *args)
458
455
  args << {} if args.empty?
456
+ args.first.merge!(LogStash::Config::Mixin::ALLOW_ENV_FLAG => @allow_env)
459
457
 
460
458
  pipeline_scoped_metric = metric.namespace([:stats, :pipelines, pipeline_id.to_s.to_sym, :plugins])
461
459
 
@@ -555,4 +553,17 @@ module LogStash; class Pipeline
555
553
  end
556
554
  end
557
555
 
556
+ # Sometimes we log stuff that will dump the pipeline which may contain
557
+ # sensitive information (like the raw syntax tree which can contain passwords)
558
+ # We want to hide most of what's in here
559
+ def inspect
560
+ {
561
+ :pipeline_id => @pipeline_id,
562
+ :settings => @settings.inspect,
563
+ :ready => @ready,
564
+ :running => @running,
565
+ :flushing => @flushing
566
+ }
567
+ end
568
+
558
569
  end end
@@ -53,6 +53,10 @@ class LogStash::Runner < Clamp::Command
53
53
  option "--verbose", :flag, I18n.t("logstash.runner.flag.verbose")
54
54
  option "--debug", :flag, I18n.t("logstash.runner.flag.debug")
55
55
 
56
+ option ["--debug-config"], :flag,
57
+ I18n.t("logstash.runner.flag.debug_config"),
58
+ :attribute_name => :debug_config, :default => false
59
+
56
60
  option ["-V", "--version"], :flag,
57
61
  I18n.t("logstash.runner.flag.version")
58
62
 
@@ -94,6 +98,10 @@ class LogStash::Runner < Clamp::Command
94
98
  I18n.t("logstash.web_api.flag.http_port"),
95
99
  :attribute_name => :web_api_http_port, :default => 9600
96
100
 
101
+ option ["--allow-env"], :flag,
102
+ I18n.t("logstash.runner.flag.allow-env"),
103
+ :attribute_name => :allow_env, :default => false
104
+
97
105
  def pipeline_workers=(pipeline_workers_value)
98
106
  @pipeline_settings[:pipeline_workers] = validate_positive_integer(pipeline_workers_value)
99
107
  end
@@ -166,14 +174,14 @@ class LogStash::Runner < Clamp::Command
166
174
  end
167
175
 
168
176
  if config_test?
169
- config_loader = LogStash::Config::Loader.new(@logger, config_test?)
177
+ config_loader = LogStash::Config::Loader.new(@logger, @debug_config)
170
178
  config_str = config_loader.format_config(config_path, config_string)
171
- config_error = LogStash::Pipeline.config_valid?(config_str)
172
- if config_error == true
179
+ begin
180
+ LogStash::Pipeline.new(config_str)
173
181
  @logger.terminal "Configuration OK"
174
182
  return 0
175
- else
176
- @logger.fatal I18n.t("logstash.error", :error => config_error)
183
+ rescue => e
184
+ @logger.fatal I18n.t("logstash.runner.invalid-configuration", :error => e.message)
177
185
  return 1
178
186
  end
179
187
  end
@@ -184,12 +192,15 @@ class LogStash::Runner < Clamp::Command
184
192
  :collect_metric => true,
185
193
  :debug => debug?,
186
194
  :node_name => node_name,
195
+ :debug_config => debug_config?,
187
196
  :web_api_http_host => @web_api_http_host,
188
197
  :web_api_http_port => @web_api_http_port)
189
198
 
190
199
  @agent.register_pipeline("main", @pipeline_settings.merge({
191
200
  :config_string => config_string,
192
- :config_path => config_path
201
+ :config_path => config_path,
202
+ :debug_config => debug_config?,
203
+ :allow_env => allow_env?
193
204
  }))
194
205
 
195
206
  # enable sigint/sigterm before starting the agent
@@ -213,7 +224,7 @@ class LogStash::Runner < Clamp::Command
213
224
  show_short_help
214
225
  return 1
215
226
  rescue => e
216
- @logger.fatal I18n.t("oops", :error => e, :backtrace => e.backtrace)
227
+ @logger.fatal(I18n.t("oops"), :error => e, :backtrace => e.backtrace)
217
228
  return 1
218
229
  ensure
219
230
  Stud::untrap("INT", sigint_id) unless sigint_id.nil?
@@ -318,6 +329,10 @@ class LogStash::Runner < Clamp::Command
318
329
  @logger.subscribe(STDOUT)
319
330
  end
320
331
 
332
+ if debug_config? && @logger.level != :debug
333
+ @logger.warn("--debug-config was specified, but log level was not set to --debug! No config info will be logged.")
334
+ end
335
+
321
336
  # TODO(sissel): redirect stdout/stderr to the log as well
322
337
  # http://jira.codehaus.org/browse/JRUBY-7003
323
338
  end # def configure_logging
@@ -11,4 +11,4 @@
11
11
  # eventually this file should be in the root logstash lib fir and dependencies in logstash-core should be
12
12
  # fixed.
13
13
 
14
- LOGSTASH_VERSION = "5.0.0-alpha1.snapshot1"
14
+ LOGSTASH_VERSION = "5.0.0-alpha1.snapshot2"
@@ -91,6 +91,8 @@ en:
91
91
  bin/logstash -i SHELL [--quiet|verbose|debug]
92
92
  bin/logstash -V [--verbose|debug]
93
93
  bin/logstash --help
94
+ invalid-configuration: >-
95
+ The given configuration is invalid. Reason: %{error}
94
96
  missing-configuration: >-
95
97
  No configuration file was specified. Perhaps you forgot to provide
96
98
  the '-f yourlogstash.conf' flag?
@@ -180,6 +182,10 @@ en:
180
182
  the empty string for the '-e' flag.
181
183
  configtest: |+
182
184
  Check configuration for valid syntax and then exit.
185
+ allow-env: |+
186
+ EXPERIMENTAL. Enables templating of environment variable
187
+ values. Instances of "${VAR}" in strings will be replaced
188
+ with the respective environment variable value named "VAR".
183
189
  pipeline-workers: |+
184
190
  Sets the number of pipeline workers to run.
185
191
  pipeline-batch-size: |+
@@ -237,3 +243,7 @@ en:
237
243
  it will default to the current hostname.
238
244
  agent: |+
239
245
  Specify an alternate agent plugin name.
246
+ debug_config: |+
247
+ Print the compiled config ruby code out as a debug log (you must also have --debug enabled).
248
+ WARNING: This will include any 'password' options passed to plugin configs as plaintext, and may result
249
+ in plaintext passwords appearing in your logs!
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ["lib"]
18
18
  gem.version = LOGSTASH_CORE_VERSION.gsub(/-/, '.')
19
19
 
20
- gem.add_runtime_dependency "logstash-core-event-java", "~> 5.0.0.alpha1.snapshot1"
20
+ gem.add_runtime_dependency "logstash-core-event-java", "~> 5.0.0.alpha1.snapshot2"
21
21
 
22
22
  gem.add_runtime_dependency "cabin", "~> 0.8.0" #(Apache 2.0 license)
23
23
  gem.add_runtime_dependency "pry", "~> 0.10.1" #(Ruby license)
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
30
30
  gem.add_runtime_dependency 'puma', '~> 2.16', '>= 2.16.0'
31
31
  gem.add_runtime_dependency "jruby-openssl", "0.9.13" # Required to support TLSv1.2
32
32
  gem.add_runtime_dependency "chronic_duration", "0.10.6"
33
- gem.add_runtime_dependency "jruby-monitoring", '~> 0.1'
33
+ gem.add_runtime_dependency "jruby-monitoring", '~> 0.3.1'
34
34
 
35
35
  # TODO(sissel): Treetop 1.5.x doesn't seem to work well, but I haven't
36
36
  # investigated what the cause might be. -Jordan
@@ -191,6 +191,45 @@ describe LogStash::Agent do
191
191
  end
192
192
  end
193
193
 
194
+ describe "Environment Variables In Configs" do
195
+ let(:agent_args) { {
196
+ :logger => logger,
197
+ :auto_reload => false,
198
+ :reload_interval => 0.01
199
+ } }
200
+ let(:pipeline_id) { "main" }
201
+ let(:pipeline_config) { "input { generator { message => '${FOO}-bar' } } filter { } output { }" }
202
+ let(:pipeline_settings) { {
203
+ :config_string => pipeline_config,
204
+ } }
205
+
206
+ context "when allow_env is false" do
207
+ it "does not interpolate environment variables" do
208
+ expect(subject).to receive(:fetch_config).and_return(pipeline_config)
209
+ subject.register_pipeline(pipeline_id, pipeline_settings)
210
+ expect(subject.pipelines[pipeline_id].inputs.first.message).to eq("${FOO}-bar")
211
+ end
212
+ end
213
+
214
+ context "when allow_env is true" do
215
+ before :each do
216
+ @foo_content = ENV["FOO"]
217
+ ENV["FOO"] = "foo"
218
+ pipeline_settings.merge!(:allow_env => true)
219
+ end
220
+
221
+ after :each do
222
+ ENV["FOO"] = @foo_content
223
+ end
224
+
225
+ it "doesn't upgrade the state" do
226
+ expect(subject).to receive(:fetch_config).and_return(pipeline_config)
227
+ subject.register_pipeline(pipeline_id, pipeline_settings)
228
+ expect(subject.pipelines[pipeline_id].inputs.first.message).to eq("foo-bar")
229
+ end
230
+ end
231
+ end
232
+
194
233
  describe "#upgrade_pipeline" do
195
234
  let(:pipeline_id) { "main" }
196
235
  let(:pipeline_config) { "input { } filter { } output { }" }
@@ -143,4 +143,37 @@ describe LogStashConfigParser do
143
143
  end
144
144
  end
145
145
  end
146
+
147
+ context "when creating two instances of the same configuration" do
148
+
149
+ let(:config_string) {
150
+ "input { generator { } }
151
+ filter {
152
+ if [type] == 'test' { filter1 { } }
153
+ }
154
+ output {
155
+ output1 { }
156
+ }"
157
+ }
158
+
159
+ let(:pipeline_klass) do
160
+ Class.new do
161
+ def initialize(config)
162
+ grammar = LogStashConfigParser.new
163
+ @config = grammar.parse(config)
164
+ @code = @config.compile
165
+ eval(@code)
166
+ end
167
+ def plugin(*args);end
168
+ end
169
+ end
170
+
171
+ describe "generated conditional functionals" do
172
+ it "should be defined at instance level" do
173
+ instance_1 = pipeline_klass.new(config_string)
174
+ instance_2 = pipeline_klass.new(config_string)
175
+ expect(instance_1.method(:cond_func_1).owner).to_not be(instance_2.method(:cond_func_1).owner)
176
+ end
177
+ end
178
+ end
146
179
  end
@@ -96,6 +96,10 @@ describe LogStash::Config::Mixin do
96
96
  clone = subject.class.new(subject.params)
97
97
  expect(clone.password.value).to(be == secret)
98
98
  end
99
+
100
+ it "should obfuscate original_params" do
101
+ expect(subject.original_params['password']).to(be_a(LogStash::Util::Password))
102
+ end
99
103
  end
100
104
 
101
105
  describe "obsolete settings" do
@@ -161,6 +165,10 @@ describe LogStash::Config::Mixin do
161
165
  config :oneNumber, :validate => :number
162
166
  config :oneArray, :validate => :array
163
167
  config :oneHash, :validate => :hash
168
+
169
+ def initialize(params)
170
+ super(params.merge(LogStash::Config::Mixin::ALLOW_ENV_FLAG => true))
171
+ end
164
172
  end
165
173
  end
166
174
 
@@ -213,7 +221,7 @@ describe LogStash::Config::Mixin do
213
221
  "oneString" => "${FunString:foo}",
214
222
  "oneBoolean" => "${FunBool:false}",
215
223
  "oneArray" => [ "first array value", "${FunString:foo}" ],
216
- "oneHash" => { "key1" => "${FunString:foo}", "key2" => "$FunString is ${FunBool}", "key3" => "${FunBool:false} or ${funbool:false}" }
224
+ "oneHash" => { "key1" => "${FunString:foo}", "key2" => "${FunString} is ${FunBool}", "key3" => "${FunBool:false} or ${funbool:false}" }
217
225
  )
218
226
  end
219
227
 
@@ -137,6 +137,25 @@ describe LogStash::Pipeline do
137
137
  eos
138
138
  }
139
139
 
140
+ describe "debug compiled" do
141
+ let(:logger) { double("pipeline logger").as_null_object }
142
+
143
+ before do
144
+ expect(Cabin::Channel).to receive(:get).with(LogStash).and_return(logger).at_least(:once)
145
+ allow(logger).to receive(:debug?).and_return(true)
146
+ end
147
+
148
+ it "should not receive a debug message with the compiled code" do
149
+ expect(logger).not_to receive(:debug).with(/Compiled pipeline/, anything)
150
+ pipeline = TestPipeline.new(test_config_with_filters)
151
+ end
152
+
153
+ it "should print the compiled code if debug_config is set to true" do
154
+ expect(logger).to receive(:debug).with(/Compiled pipeline/, anything)
155
+ pipeline = TestPipeline.new(test_config_with_filters, :debug_config => true)
156
+ end
157
+ end
158
+
140
159
  context "when there is no command line -w N set" do
141
160
  it "starts one filter thread" do
142
161
  msg = "Defaulting pipeline worker threads to 1 because there are some filters that might not work with multiple worker threads"
@@ -16,6 +16,7 @@ describe LogStash::Runner do
16
16
 
17
17
  before :each do
18
18
  allow(Cabin::Channel).to receive(:get).with(LogStash).and_return(channel)
19
+ allow(channel).to receive(:subscribe).with(any_args)
19
20
  end
20
21
 
21
22
  describe "argument parsing" do
@@ -95,6 +96,26 @@ describe LogStash::Runner do
95
96
  end
96
97
  end
97
98
 
99
+ describe "--config-test" do
100
+ subject { LogStash::Runner.new("") }
101
+ let(:args) { ["-t", "-e", pipeline_string] }
102
+
103
+ context "with a good configuration" do
104
+ let(:pipeline_string) { "input { } filter { } output { }" }
105
+ it "should exit successfuly" do
106
+ expect(channel).to receive(:terminal)
107
+ expect(subject.run(args)).to eq(0)
108
+ end
109
+ end
110
+
111
+ context "with a bad configuration" do
112
+ let(:pipeline_string) { "rlwekjhrewlqrkjh" }
113
+ it "should fail by returning a bad exit code" do
114
+ expect(channel).to receive(:fatal)
115
+ expect(subject.run(args)).to eq(1)
116
+ end
117
+ end
118
+ end
98
119
  describe "pipeline settings" do
99
120
  let(:pipeline_string) { "input { stdin {} } output { stdout {} }" }
100
121
  let(:main_pipeline_settings) { { :pipeline_id => "main" } }
@@ -125,5 +146,35 @@ describe LogStash::Runner do
125
146
  subject.run("bin/logstash", args)
126
147
  end
127
148
  end
149
+
150
+ describe "debug_config" do
151
+ it "should set 'debug_config' to false by default" do
152
+ expect(LogStash::Config::Loader).to receive(:new).with(anything, false).and_call_original
153
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:debug_config => false)).and_return(pipeline)
154
+ args = ["--debug", "-e", pipeline_string]
155
+ subject.run("bin/logstash", args)
156
+ end
157
+
158
+ it "should allow overriding debug_config" do
159
+ expect(LogStash::Config::Loader).to receive(:new).with(anything, true).and_call_original
160
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:debug_config => true)).and_return(pipeline)
161
+ args = ["--debug", "--debug-config", "-e", pipeline_string]
162
+ subject.run("bin/logstash", args)
163
+ end
164
+ end
165
+
166
+ context "when configuring environment variable support" do
167
+ it "should set 'allow_env' to false by default" do
168
+ args = ["-e", pipeline_string]
169
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:allow_env => false)).and_return(pipeline)
170
+ subject.run("bin/logstash", args)
171
+ end
172
+
173
+ it "should support templating environment variables" do
174
+ args = ["-e", pipeline_string, "--allow-env"]
175
+ expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:allow_env => true)).and_return(pipeline)
176
+ subject.run("bin/logstash", args)
177
+ end
178
+ end
128
179
  end
129
180
  end
metadata CHANGED
@@ -1,33 +1,33 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.alpha1.snapshot1
4
+ version: 5.0.0.alpha1.snapshot2
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
11
+ date: 2016-04-04 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
17
  - !ruby/object:Gem::Version
18
- version: 5.0.0.alpha1.snapshot1
18
+ version: 5.0.0.alpha1.snapshot2
19
19
  name: logstash-core-event-java
20
20
  prerelease: false
21
21
  type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 5.0.0.alpha1.snapshot1
26
+ version: 5.0.0.alpha1.snapshot2
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - ~>
30
+ - - "~>"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.8.0
33
33
  name: cabin
@@ -35,13 +35,13 @@ dependencies:
35
35
  type: :runtime
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.8.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ~>
44
+ - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.10.1
47
47
  name: pry
@@ -49,13 +49,13 @@ dependencies:
49
49
  type: :runtime
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.10.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ~>
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: 0.0.19
61
61
  name: stud
@@ -63,13 +63,13 @@ dependencies:
63
63
  type: :runtime
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.0.19
69
69
  - !ruby/object:Gem::Dependency
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ~>
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 0.6.5
75
75
  name: clamp
@@ -77,7 +77,7 @@ dependencies:
77
77
  type: :runtime
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.6.5
83
83
  - !ruby/object:Gem::Dependency
@@ -97,7 +97,7 @@ dependencies:
97
97
  - !ruby/object:Gem::Dependency
98
98
  requirement: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - ~>
100
+ - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: 0.8.3
103
103
  name: gems
@@ -105,7 +105,7 @@ dependencies:
105
105
  type: :runtime
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.8.3
111
111
  - !ruby/object:Gem::Dependency
@@ -125,10 +125,10 @@ dependencies:
125
125
  - !ruby/object:Gem::Dependency
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
- - - ~>
128
+ - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '1.4'
131
- - - '>='
131
+ - - ">="
132
132
  - !ruby/object:Gem::Version
133
133
  version: 1.4.6
134
134
  name: sinatra
@@ -136,19 +136,19 @@ dependencies:
136
136
  type: :runtime
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - ~>
139
+ - - "~>"
140
140
  - !ruby/object:Gem::Version
141
141
  version: '1.4'
142
- - - '>='
142
+ - - ">="
143
143
  - !ruby/object:Gem::Version
144
144
  version: 1.4.6
145
145
  - !ruby/object:Gem::Dependency
146
146
  requirement: !ruby/object:Gem::Requirement
147
147
  requirements:
148
- - - ~>
148
+ - - "~>"
149
149
  - !ruby/object:Gem::Version
150
150
  version: '2.16'
151
- - - '>='
151
+ - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: 2.16.0
154
154
  name: puma
@@ -156,10 +156,10 @@ dependencies:
156
156
  type: :runtime
157
157
  version_requirements: !ruby/object:Gem::Requirement
158
158
  requirements:
159
- - - ~>
159
+ - - "~>"
160
160
  - !ruby/object:Gem::Version
161
161
  version: '2.16'
162
- - - '>='
162
+ - - ">="
163
163
  - !ruby/object:Gem::Version
164
164
  version: 2.16.0
165
165
  - !ruby/object:Gem::Dependency
@@ -193,21 +193,21 @@ dependencies:
193
193
  - !ruby/object:Gem::Dependency
194
194
  requirement: !ruby/object:Gem::Requirement
195
195
  requirements:
196
- - - ~>
196
+ - - "~>"
197
197
  - !ruby/object:Gem::Version
198
- version: '0.1'
198
+ version: 0.3.1
199
199
  name: jruby-monitoring
200
200
  prerelease: false
201
201
  type: :runtime
202
202
  version_requirements: !ruby/object:Gem::Requirement
203
203
  requirements:
204
- - - ~>
204
+ - - "~>"
205
205
  - !ruby/object:Gem::Version
206
- version: '0.1'
206
+ version: 0.3.1
207
207
  - !ruby/object:Gem::Dependency
208
208
  requirement: !ruby/object:Gem::Requirement
209
209
  requirements:
210
- - - <
210
+ - - "<"
211
211
  - !ruby/object:Gem::Version
212
212
  version: 1.5.0
213
213
  name: treetop
@@ -215,7 +215,7 @@ dependencies:
215
215
  type: :runtime
216
216
  version_requirements: !ruby/object:Gem::Requirement
217
217
  requirements:
218
- - - <
218
+ - - "<"
219
219
  - !ruby/object:Gem::Version
220
220
  version: 1.5.0
221
221
  - !ruby/object:Gem::Dependency
@@ -235,7 +235,7 @@ dependencies:
235
235
  - !ruby/object:Gem::Dependency
236
236
  requirement: !ruby/object:Gem::Requirement
237
237
  requirements:
238
- - - ~>
238
+ - - "~>"
239
239
  - !ruby/object:Gem::Version
240
240
  version: 0.5.4
241
241
  name: minitar
@@ -243,13 +243,13 @@ dependencies:
243
243
  type: :runtime
244
244
  version_requirements: !ruby/object:Gem::Requirement
245
245
  requirements:
246
- - - ~>
246
+ - - "~>"
247
247
  - !ruby/object:Gem::Version
248
248
  version: 0.5.4
249
249
  - !ruby/object:Gem::Dependency
250
250
  requirement: !ruby/object:Gem::Requirement
251
251
  requirements:
252
- - - ~>
252
+ - - "~>"
253
253
  - !ruby/object:Gem::Version
254
254
  version: 1.1.7
255
255
  name: rubyzip
@@ -257,13 +257,13 @@ dependencies:
257
257
  type: :runtime
258
258
  version_requirements: !ruby/object:Gem::Requirement
259
259
  requirements:
260
- - - ~>
260
+ - - "~>"
261
261
  - !ruby/object:Gem::Version
262
262
  version: 1.1.7
263
263
  - !ruby/object:Gem::Dependency
264
264
  requirement: !ruby/object:Gem::Requirement
265
265
  requirements:
266
- - - ~>
266
+ - - "~>"
267
267
  - !ruby/object:Gem::Version
268
268
  version: 0.3.5
269
269
  name: thread_safe
@@ -271,13 +271,13 @@ dependencies:
271
271
  type: :runtime
272
272
  version_requirements: !ruby/object:Gem::Requirement
273
273
  requirements:
274
- - - ~>
274
+ - - "~>"
275
275
  - !ruby/object:Gem::Version
276
276
  version: 0.3.5
277
277
  - !ruby/object:Gem::Dependency
278
278
  requirement: !ruby/object:Gem::Requirement
279
279
  requirements:
280
- - - ~>
280
+ - - "~>"
281
281
  - !ruby/object:Gem::Version
282
282
  version: 0.3.7
283
283
  name: jrjackson
@@ -285,7 +285,7 @@ dependencies:
285
285
  type: :runtime
286
286
  version_requirements: !ruby/object:Gem::Requirement
287
287
  requirements:
288
- - - ~>
288
+ - - "~>"
289
289
  - !ruby/object:Gem::Version
290
290
  version: 0.3.7
291
291
  description: The core components of logstash, the scalable log and event management tool
@@ -445,12 +445,12 @@ require_paths:
445
445
  - lib
446
446
  required_ruby_version: !ruby/object:Gem::Requirement
447
447
  requirements:
448
- - - '>='
448
+ - - ">="
449
449
  - !ruby/object:Gem::Version
450
450
  version: '0'
451
451
  required_rubygems_version: !ruby/object:Gem::Requirement
452
452
  requirements:
453
- - - '>'
453
+ - - ">"
454
454
  - !ruby/object:Gem::Version
455
455
  version: 1.3.1
456
456
  requirements: []