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

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.

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: []