fluentd 1.11.2-x64-mingw32 → 1.12.1-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/workflows/build.yaml +29 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.travis.yml +22 -2
- data/CHANGELOG.md +114 -0
- data/README.md +2 -2
- data/appveyor.yml +3 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-ctl +7 -0
- data/fluentd.gemspec +8 -8
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/command/ca_generate.rb +6 -3
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/ctl.rb +177 -0
- data/lib/fluent/command/fluentd.rb +4 -0
- data/lib/fluent/command/plugin_config_formatter.rb +17 -2
- data/lib/fluent/config/section.rb +1 -1
- data/lib/fluent/env.rb +4 -0
- data/lib/fluent/log.rb +33 -3
- data/lib/fluent/plugin.rb +5 -0
- data/lib/fluent/plugin/buffer.rb +27 -57
- data/lib/fluent/plugin/buffer/chunk.rb +2 -1
- data/lib/fluent/plugin/formatter.rb +24 -0
- data/lib/fluent/plugin/formatter_csv.rb +1 -1
- data/lib/fluent/plugin/formatter_hash.rb +3 -1
- data/lib/fluent/plugin/formatter_json.rb +3 -1
- data/lib/fluent/plugin/formatter_ltsv.rb +5 -3
- data/lib/fluent/plugin/formatter_out_file.rb +6 -4
- data/lib/fluent/plugin/formatter_single_value.rb +4 -2
- data/lib/fluent/plugin/formatter_tsv.rb +4 -2
- data/lib/fluent/plugin/in_exec.rb +4 -2
- data/lib/fluent/plugin/in_http.rb +23 -2
- data/lib/fluent/plugin/in_tail.rb +109 -41
- data/lib/fluent/plugin/in_tail/position_file.rb +39 -14
- data/lib/fluent/plugin/in_tcp.rb +1 -0
- data/lib/fluent/plugin/out_http.rb +29 -4
- data/lib/fluent/plugin/output.rb +15 -6
- data/lib/fluent/plugin/parser_json.rb +5 -2
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +1 -1
- data/lib/fluent/plugin_helper/inject.rb +4 -1
- data/lib/fluent/plugin_helper/retry_state.rb +4 -0
- data/lib/fluent/supervisor.rb +162 -51
- data/lib/fluent/system_config.rb +4 -2
- data/lib/fluent/time.rb +1 -0
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +22 -4
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/test/command/test_binlog_reader.rb +22 -6
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_ctl.rb +57 -0
- data/test/command/test_fluentd.rb +30 -0
- data/test/command/test_plugin_config_formatter.rb +124 -2
- data/test/plugin/in_tail/test_position_file.rb +46 -26
- data/test/plugin/test_buffer.rb +4 -0
- data/test/plugin/test_filter_stdout.rb +6 -1
- data/test/plugin/test_formatter_hash.rb +6 -3
- data/test/plugin/test_formatter_json.rb +14 -4
- data/test/plugin/test_formatter_ltsv.rb +13 -5
- data/test/plugin/test_formatter_out_file.rb +35 -14
- data/test/plugin/test_formatter_single_value.rb +12 -6
- data/test/plugin/test_formatter_tsv.rb +12 -4
- data/test/plugin/test_in_exec.rb +18 -0
- data/test/plugin/test_in_http.rb +25 -0
- data/test/plugin/test_in_tail.rb +433 -30
- data/test/plugin/test_out_file.rb +23 -18
- data/test/plugin/test_out_http.rb +19 -0
- data/test/plugin/test_output.rb +12 -0
- data/test/plugin/test_parser_syslog.rb +2 -2
- data/test/plugin/test_sd_file.rb +1 -1
- data/test/plugin_helper/test_compat_parameters.rb +7 -2
- data/test/plugin_helper/test_http_server_helper.rb +8 -1
- data/test/plugin_helper/test_inject.rb +42 -0
- data/test/plugin_helper/test_server.rb +18 -5
- data/test/test_capability.rb +74 -0
- data/test/test_formatter.rb +34 -10
- data/test/test_log.rb +44 -0
- data/test/test_output.rb +6 -1
- data/test/test_supervisor.rb +150 -1
- metadata +49 -37
@@ -11,6 +11,11 @@ class FileOutputTest < Test::Unit::TestCase
|
|
11
11
|
Fluent::Test.setup
|
12
12
|
FileUtils.rm_rf(TMP_DIR)
|
13
13
|
FileUtils.mkdir_p(TMP_DIR)
|
14
|
+
@default_newline = if Fluent.windows?
|
15
|
+
"\r\n"
|
16
|
+
else
|
17
|
+
"\n"
|
18
|
+
end
|
14
19
|
end
|
15
20
|
|
16
21
|
TMP_DIR = File.expand_path(File.dirname(__FILE__) + "/../tmp/out_file#{ENV['TEST_ENV_NUMBER']}")
|
@@ -91,7 +96,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
91
96
|
end
|
92
97
|
end
|
93
98
|
assert_equal 1, d.formatted.size
|
94
|
-
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}
|
99
|
+
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
95
100
|
end
|
96
101
|
|
97
102
|
test 'no configuration error raised for basic configuration using "*" (v0.12 style)' do
|
@@ -296,11 +301,11 @@ class FileOutputTest < Test::Unit::TestCase
|
|
296
301
|
|
297
302
|
assert_equal 5, d.formatted.size
|
298
303
|
|
299
|
-
r1 = %!2016-10-03 23:58:09 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:58:09 +0900"}
|
300
|
-
r2 = %!2016-10-03 23:59:33 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:59:33 +0900"}
|
301
|
-
r3 = %!2016-10-03 23:59:57 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 08:59:57 +0900"}
|
302
|
-
r4 = %!2016-10-04 00:00:17 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 09:00:17 +0900"}
|
303
|
-
r5 = %!2016-10-04 00:01:59 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 09:01:59 +0900"}
|
304
|
+
r1 = %!2016-10-03 23:58:09 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:58:09 +0900"}#{@default_newline}!
|
305
|
+
r2 = %!2016-10-03 23:59:33 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 08:59:33 +0900"}#{@default_newline}!
|
306
|
+
r3 = %!2016-10-03 23:59:57 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 08:59:57 +0900"}#{@default_newline}!
|
307
|
+
r4 = %!2016-10-04 00:00:17 +0000,my.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"my.data","time":"2016/10/04 09:00:17 +0900"}#{@default_newline}!
|
308
|
+
r5 = %!2016-10-04 00:01:59 +0000,your.data,{"type":"a","message":"data raw content","hostname":"testing.local","tag":"your.data","time":"2016/10/04 09:01:59 +0900"}#{@default_newline}!
|
304
309
|
assert_equal r1, d.formatted[0]
|
305
310
|
assert_equal r2, d.formatted[1]
|
306
311
|
assert_equal r3, d.formatted[2]
|
@@ -329,8 +334,8 @@ class FileOutputTest < Test::Unit::TestCase
|
|
329
334
|
d.feed(time, {"a"=>2})
|
330
335
|
end
|
331
336
|
assert_equal 2, d.formatted.size
|
332
|
-
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
333
|
-
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":2}
|
337
|
+
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
338
|
+
assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}], d.formatted[1]
|
334
339
|
end
|
335
340
|
|
336
341
|
test 'time formatted with specified timezone, using area name' do
|
@@ -344,7 +349,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
344
349
|
d.feed(time, {"a"=>1})
|
345
350
|
end
|
346
351
|
assert_equal 1, d.formatted.size
|
347
|
-
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}
|
352
|
+
assert_equal %[2011-01-02T21:14:15+08:00\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
348
353
|
end
|
349
354
|
|
350
355
|
test 'time formatted with specified timezone, using offset' do
|
@@ -358,7 +363,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
358
363
|
d.feed(time, {"a"=>1})
|
359
364
|
end
|
360
365
|
assert_equal 1, d.formatted.size
|
361
|
-
assert_equal %[2011-01-02T09:44:15-03:30\ttest\t{"a":1}
|
366
|
+
assert_equal %[2011-01-02T09:44:15-03:30\ttest\t{"a":1}#{@default_newline}], d.formatted[0]
|
362
367
|
end
|
363
368
|
|
364
369
|
test 'configuration error raised for invalid timezone' do
|
@@ -402,7 +407,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
402
407
|
end
|
403
408
|
|
404
409
|
assert File.exist?("#{TMP_DIR}/out_file_test.20110102_0.log.gz")
|
405
|
-
check_gzipped_result("#{TMP_DIR}/out_file_test.20110102_0.log.gz", %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
410
|
+
check_gzipped_result("#{TMP_DIR}/out_file_test.20110102_0.log.gz", %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}])
|
406
411
|
end
|
407
412
|
end
|
408
413
|
|
@@ -469,7 +474,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
469
474
|
end
|
470
475
|
|
471
476
|
path = d.instance.last_written_path
|
472
|
-
check_gzipped_result(path, %[#{Yajl.dump({"a" => 1, 'time' => time.to_i})}
|
477
|
+
check_gzipped_result(path, %[#{Yajl.dump({"a" => 1, 'time' => time.to_i})}#{@default_newline}] + %[#{Yajl.dump({"a" => 2, 'time' => time.to_i})}#{@default_newline}])
|
473
478
|
end
|
474
479
|
|
475
480
|
test 'ltsv' do
|
@@ -482,7 +487,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
482
487
|
end
|
483
488
|
|
484
489
|
path = d.instance.last_written_path
|
485
|
-
check_gzipped_result(path, %[a:1\ttime:2011-01-02T13:14:15Z
|
490
|
+
check_gzipped_result(path, %[a:1\ttime:2011-01-02T13:14:15Z#{@default_newline}] + %[a:2\ttime:2011-01-02T13:14:15Z#{@default_newline}])
|
486
491
|
end
|
487
492
|
|
488
493
|
test 'single_value' do
|
@@ -495,13 +500,13 @@ class FileOutputTest < Test::Unit::TestCase
|
|
495
500
|
end
|
496
501
|
|
497
502
|
path = d.instance.last_written_path
|
498
|
-
check_gzipped_result(path, %[1
|
503
|
+
check_gzipped_result(path, %[1#{@default_newline}] + %[2#{@default_newline}])
|
499
504
|
end
|
500
505
|
end
|
501
506
|
|
502
507
|
test 'path with index number' do
|
503
508
|
time = event_time("2011-01-02 13:14:15 UTC")
|
504
|
-
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
509
|
+
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}]
|
505
510
|
|
506
511
|
write_once = ->(){
|
507
512
|
d = create_driver
|
@@ -532,7 +537,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
532
537
|
|
533
538
|
test 'append' do
|
534
539
|
time = event_time("2011-01-02 13:14:15 UTC")
|
535
|
-
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}
|
540
|
+
formatted_lines = %[2011-01-02T13:14:15Z\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T13:14:15Z\ttest\t{"a":2}#{@default_newline}]
|
536
541
|
|
537
542
|
write_once = ->(){
|
538
543
|
d = create_driver %[
|
@@ -567,7 +572,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
567
572
|
test 'append when JST' do
|
568
573
|
with_timezone(Fluent.windows? ? "JST-9" : "Asia/Tokyo") do
|
569
574
|
time = event_time("2011-01-02 03:14:15+09:00")
|
570
|
-
formatted_lines = %[2011-01-02T03:14:15+09:00\ttest\t{"a":1}
|
575
|
+
formatted_lines = %[2011-01-02T03:14:15+09:00\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T03:14:15+09:00\ttest\t{"a":2}#{@default_newline}]
|
571
576
|
|
572
577
|
write_once = ->(){
|
573
578
|
d = create_driver %[
|
@@ -603,7 +608,7 @@ class FileOutputTest < Test::Unit::TestCase
|
|
603
608
|
test 'append when UTC-02 but timekey_zone is +0900' do
|
604
609
|
with_timezone("UTC-02") do # +0200
|
605
610
|
time = event_time("2011-01-02 17:14:15+02:00")
|
606
|
-
formatted_lines = %[2011-01-02T17:14:15+02:00\ttest\t{"a":1}
|
611
|
+
formatted_lines = %[2011-01-02T17:14:15+02:00\ttest\t{"a":1}#{@default_newline}] + %[2011-01-02T17:14:15+02:00\ttest\t{"a":2}#{@default_newline}]
|
607
612
|
|
608
613
|
write_once = ->(){
|
609
614
|
d = create_driver %[
|
@@ -280,6 +280,25 @@ class HTTPOutputTest < Test::Unit::TestCase
|
|
280
280
|
assert_equal "fluentd!", result.headers['test_header']
|
281
281
|
end
|
282
282
|
|
283
|
+
def test_write_with_headers_from_placeholders
|
284
|
+
d = create_driver(config + %[
|
285
|
+
headers_from_placeholders {"x-test":"${$.foo.bar}-test","x-tag":"${tag}"}
|
286
|
+
<buffer tag,$.foo.bar>
|
287
|
+
</buffer>
|
288
|
+
])
|
289
|
+
d.run(default_tag: 'test.http') do
|
290
|
+
test_events.each { |event|
|
291
|
+
ev = event.dup
|
292
|
+
ev['foo'] = {'bar' => 'abcd'}
|
293
|
+
d.feed(ev)
|
294
|
+
}
|
295
|
+
end
|
296
|
+
|
297
|
+
result = @@result
|
298
|
+
assert_equal "abcd-test", result.headers['x-test']
|
299
|
+
assert_equal "test.http", result.headers['x-tag']
|
300
|
+
end
|
301
|
+
|
283
302
|
def test_write_with_retryable_response
|
284
303
|
old_report_on_exception = Thread.report_on_exception
|
285
304
|
Thread.report_on_exception = false # thread finished as invalid state since RetryableResponse raises.
|
data/test/plugin/test_output.rb
CHANGED
@@ -378,6 +378,18 @@ class OutputTest < Test::Unit::TestCase
|
|
378
378
|
assert { logs.any? { |log| log.include?("${chunk_id} is not allowed in this plugin") } }
|
379
379
|
end
|
380
380
|
|
381
|
+
test '#extract_placeholders does not log for ${chunk_id} placeholder' do
|
382
|
+
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
|
383
|
+
tmpl = "/mypath/${chunk_id}/tail"
|
384
|
+
t = event_time('2016-04-11 20:30:00 +0900')
|
385
|
+
v = {key1: "value1", key2: "value2"}
|
386
|
+
c = create_chunk(timekey: t, tag: 'fluentd.test.output', variables: v)
|
387
|
+
@i.log.out.logs.clear
|
388
|
+
@i.extract_placeholders(tmpl, c)
|
389
|
+
logs = @i.log.out.logs
|
390
|
+
assert { logs.none? { |log| log.include?("${chunk_id}") } }
|
391
|
+
end
|
392
|
+
|
381
393
|
test '#extract_placeholders logs warn message with not replaced key' do
|
382
394
|
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
|
383
395
|
tmpl = "/mypath/${key1}/test"
|
@@ -38,7 +38,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
|
|
38
38
|
data('regexp' => 'regexp', 'string' => 'string')
|
39
39
|
def test_parse_with_time_format2(param)
|
40
40
|
@parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'parser_type' => param)
|
41
|
-
@parser.instance.parse(
|
41
|
+
@parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd[11111]: [error] Syslog test") { |time, record|
|
42
42
|
assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
|
43
43
|
assert_equal(@expected, record)
|
44
44
|
}
|
@@ -47,7 +47,7 @@ class SyslogParserTest < ::Test::Unit::TestCase
|
|
47
47
|
|
48
48
|
def test_parse_with_time_format_rfc5424
|
49
49
|
@parser.configure('time_format' => '%Y-%m-%dT%H:%M:%SZ', 'message_format' => 'rfc5424')
|
50
|
-
@parser.instance.parse(
|
50
|
+
@parser.instance.parse("#{Time.now.year}-03-03T10:14:29Z 192.168.0.1 fluentd 11111 - - [error] Syslog test") { |time, record|
|
51
51
|
assert_equal(event_time('Mar 03 10:14:29', format: '%b %d %H:%M:%S'), time)
|
52
52
|
assert_equal(@expected.merge('host' => '192.168.0.1', 'msgid' => '-', 'extradata' => '-'), record)
|
53
53
|
}
|
data/test/plugin/test_sd_file.rb
CHANGED
@@ -149,7 +149,7 @@ class FileServiceDiscoveryTest < ::Test::Unit::TestCase
|
|
149
149
|
assert_empty queue
|
150
150
|
end
|
151
151
|
|
152
|
-
test 'Skip if error is
|
152
|
+
test 'Skip if error is occurred' do
|
153
153
|
@sd_file.extend(TestStatEventHelperWrapper)
|
154
154
|
|
155
155
|
create_tmp_config('config.json', JSON.generate([{ port: 1233, host: '127.0.0.1' }]))
|
@@ -10,6 +10,11 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
10
10
|
setup do
|
11
11
|
Fluent::Test.setup
|
12
12
|
@i = nil
|
13
|
+
@default_newline = if Fluent.windows?
|
14
|
+
"\r\n"
|
15
|
+
else
|
16
|
+
"\n"
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
teardown do
|
@@ -226,7 +231,7 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
226
231
|
t = event_time('2016-06-24 16:05:01') # localtime
|
227
232
|
iso8601str = Time.at(t.to_i).iso8601
|
228
233
|
formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
|
229
|
-
assert_equal "value%1,tag%tag.test,time%#{iso8601str}
|
234
|
+
assert_equal "value%1,tag%tag.test,time%#{iso8601str}#{@default_newline}", formatted
|
230
235
|
end
|
231
236
|
|
232
237
|
test 'plugin helper setups time injecting as unix time (integer from epoch)' do
|
@@ -260,7 +265,7 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
260
265
|
t = event_time('2016-06-24 16:05:01') # localtime
|
261
266
|
iso8601str = Time.at(t.to_i).iso8601
|
262
267
|
formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
|
263
|
-
assert_equal "value%1,tag%tag.test,time%#{iso8601str}
|
268
|
+
assert_equal "value%1,tag%tag.test,time%#{iso8601str}#{@default_newline}", formatted
|
264
269
|
end
|
265
270
|
end
|
266
271
|
|
@@ -132,7 +132,9 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
132
132
|
error = e
|
133
133
|
end
|
134
134
|
|
135
|
-
|
135
|
+
if response
|
136
|
+
resp = Response.new(response.status.to_s, response.body.read, response.headers)
|
137
|
+
end
|
136
138
|
end
|
137
139
|
|
138
140
|
if error
|
@@ -278,6 +280,7 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
278
280
|
driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: PORT, logger: NULL_LOGGER) do |s|
|
279
281
|
s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
|
280
282
|
end
|
283
|
+
omit "TLS connection should be aborted due to `Errno::ECONNABORTED`. Need to debug." if Fluent.windows?
|
281
284
|
|
282
285
|
resp = secure_get("https://127.0.0.1:#{PORT}/example/hello", verify: false)
|
283
286
|
assert_equal('200', resp.code)
|
@@ -293,6 +296,8 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
293
296
|
'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem'],
|
294
297
|
'without passphrase' => [nil, 'cert.pem', 'cert-key.pem'])
|
295
298
|
test 'load self-signed cert/key pair, verified from clients using cert files' do |(passphrase, cert, private_key)|
|
299
|
+
omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
|
300
|
+
|
296
301
|
cert_path = File.join(CERT_DIR, cert)
|
297
302
|
private_key_path = File.join(CERT_DIR, private_key)
|
298
303
|
opt = { 'insecure' => 'false', 'private_key_path' => private_key_path, 'cert_path' => cert_path }
|
@@ -315,6 +320,8 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
315
320
|
'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem', 'ca-cert-pass.pem'],
|
316
321
|
'without passphrase' => [nil, 'cert.pem', 'cert-key.pem', 'ca-cert.pem'])
|
317
322
|
test 'load cert by private CA cert file, verified from clients using CA cert file' do |(passphrase, cert, cert_key, ca_cert)|
|
323
|
+
omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
|
324
|
+
|
318
325
|
cert_path = File.join(CERT_CA_DIR, cert)
|
319
326
|
private_key_path = File.join(CERT_CA_DIR, cert_key)
|
320
327
|
|
@@ -176,6 +176,48 @@ class InjectHelperTest < Test::Unit::TestCase
|
|
176
176
|
assert_equal record.merge({"timedata" => float_time}), @d.inject_values_to_record('tag', time, record)
|
177
177
|
end
|
178
178
|
|
179
|
+
test 'injects time as unix time millis into specified key' do
|
180
|
+
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
181
|
+
time_subsecond = 320_101_224
|
182
|
+
time = Fluent::EventTime.new(time_in_unix, time_subsecond)
|
183
|
+
unixtime_millis = 1466464211320
|
184
|
+
|
185
|
+
@d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_millis"))
|
186
|
+
@d.start
|
187
|
+
|
188
|
+
record = {"key1" => "value1", "key2" => 2}
|
189
|
+
assert_equal record.merge({"timedata" => unixtime_millis}), @d.inject_values_to_record('tag', time, record)
|
190
|
+
assert_equal record.merge({"timedata" => time_in_unix * 1_000}), @d.inject_values_to_record('tag', time_in_unix, record)
|
191
|
+
end
|
192
|
+
|
193
|
+
test 'injects time as unix time micros into specified key' do
|
194
|
+
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
195
|
+
time_subsecond = 320_101_224
|
196
|
+
time = Fluent::EventTime.new(time_in_unix, time_subsecond)
|
197
|
+
unixtime_micros = 1466464211320101
|
198
|
+
|
199
|
+
@d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_micros"))
|
200
|
+
@d.start
|
201
|
+
|
202
|
+
record = {"key1" => "value1", "key2" => 2}
|
203
|
+
assert_equal record.merge({"timedata" => unixtime_micros}), @d.inject_values_to_record('tag', time, record)
|
204
|
+
assert_equal record.merge({"timedata" => time_in_unix * 1_000_000}), @d.inject_values_to_record('tag', time_in_unix, record)
|
205
|
+
end
|
206
|
+
|
207
|
+
test 'injects time as unix time nanos into specified key' do
|
208
|
+
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
209
|
+
time_subsecond = 320_101_224
|
210
|
+
time = Fluent::EventTime.new(time_in_unix, time_subsecond)
|
211
|
+
unixtime_nanos = 1466464211320101224
|
212
|
+
|
213
|
+
@d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_nanos"))
|
214
|
+
@d.start
|
215
|
+
|
216
|
+
record = {"key1" => "value1", "key2" => 2}
|
217
|
+
assert_equal record.merge({"timedata" => unixtime_nanos}), @d.inject_values_to_record('tag', time, record)
|
218
|
+
assert_equal record.merge({"timedata" => time_in_unix * 1_000_000_000}), @d.inject_values_to_record('tag', time_in_unix, record)
|
219
|
+
end
|
220
|
+
|
179
221
|
test 'injects time as unix time into specified key' do
|
180
222
|
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
181
223
|
time_subsecond = 320_101_224
|
@@ -832,8 +832,9 @@ class ServerPluginHelperTest < Test::Unit::TestCase
|
|
832
832
|
chain_cert.sign(root_key, "sha256")
|
833
833
|
|
834
834
|
server_cert, server_key, _ = CertUtil.cert_option_generate_pair(create_server_options, chain_cert.subject)
|
835
|
-
|
836
|
-
server_cert.add_extension
|
835
|
+
factory = OpenSSL::X509::ExtensionFactory.new
|
836
|
+
server_cert.add_extension(factory.create_extension('basicConstraints', 'CA:FALSE'))
|
837
|
+
server_cert.add_extension(factory.create_extension('nsCertType', 'server'))
|
837
838
|
server_cert.sign(chain_key, "sha256")
|
838
839
|
|
839
840
|
# write chained cert
|
@@ -1494,8 +1495,13 @@ class ServerPluginHelperTest < Test::Unit::TestCase
|
|
1494
1495
|
test "can't connect with different TLS version" do
|
1495
1496
|
@d.server_create_tls(:s, PORT, tls_options: @tls_options) do |data, conn|
|
1496
1497
|
end
|
1498
|
+
if defined?(OpenSSL::SSL::TLS1_3_VERSION)
|
1499
|
+
version = :'TLS1_3'
|
1500
|
+
else
|
1501
|
+
version = :'TLS1_1'
|
1502
|
+
end
|
1497
1503
|
assert_raise(OpenSSL::SSL::SSLError, Errno::ECONNRESET) {
|
1498
|
-
open_tls_session('127.0.0.1', PORT, cert_path: @cert_path, version:
|
1504
|
+
open_tls_session('127.0.0.1', PORT, cert_path: @cert_path, version: version) do |sock|
|
1499
1505
|
end
|
1500
1506
|
}
|
1501
1507
|
end
|
@@ -1503,14 +1509,21 @@ class ServerPluginHelperTest < Test::Unit::TestCase
|
|
1503
1509
|
test "can specify multiple TLS versions by min_version/max_version" do
|
1504
1510
|
omit "min_version=/max_version= is not supported" unless Fluent::TLS::MIN_MAX_AVAILABLE
|
1505
1511
|
|
1506
|
-
|
1512
|
+
min_version = :'TLS1_2'
|
1513
|
+
if defined?(OpenSSL::SSL::TLS1_3_VERSION)
|
1514
|
+
max_version = :'TLS1_3'
|
1515
|
+
else
|
1516
|
+
max_version = :'TLS1_2'
|
1517
|
+
end
|
1518
|
+
|
1519
|
+
opts = @tls_options.merge(min_version: min_version, max_version: max_version)
|
1507
1520
|
@d.server_create_tls(:s, PORT, tls_options: opts) do |data, conn|
|
1508
1521
|
end
|
1509
1522
|
assert_raise(OpenSSL::SSL::SSLError, Errno::ECONNRESET) {
|
1510
1523
|
open_tls_session('127.0.0.1', PORT, cert_path: @cert_path, version: :'TLS1') do |sock|
|
1511
1524
|
end
|
1512
1525
|
}
|
1513
|
-
[
|
1526
|
+
[min_version, max_version].each { |ver|
|
1514
1527
|
assert_nothing_raised {
|
1515
1528
|
open_tls_session('127.0.0.1', PORT, cert_path: @cert_path, version: ver) do |sock|
|
1516
1529
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'fluent/test'
|
3
|
+
require 'fluent/capability'
|
4
|
+
|
5
|
+
class FluentCapabilityTest < ::Test::Unit::TestCase
|
6
|
+
setup do
|
7
|
+
@capability = Fluent::Capability.new(:current_process)
|
8
|
+
omit "Fluent::Capability class is not usable on this environment" unless @capability.usable?
|
9
|
+
end
|
10
|
+
|
11
|
+
sub_test_case "check capability" do
|
12
|
+
test "effective" do
|
13
|
+
@capability.clear(:both)
|
14
|
+
assert_true @capability.update(:add, :effective, :dac_read_search)
|
15
|
+
assert_equal CapNG::Result::PARTIAL, @capability.have_capabilities?(:caps)
|
16
|
+
assert_nothing_raised do
|
17
|
+
@capability.apply(:caps)
|
18
|
+
end
|
19
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
|
20
|
+
assert_true @capability.have_capability?(:effective, :dac_read_search)
|
21
|
+
assert_false @capability.have_capability?(:inheritable, :dac_read_search)
|
22
|
+
assert_false @capability.have_capability?(:permitted, :dac_read_search)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "inheritable" do
|
26
|
+
@capability.clear(:both)
|
27
|
+
capabilities = [:chown, :dac_override]
|
28
|
+
assert_equal [true, true], @capability.update(:add, :inheritable, capabilities)
|
29
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:caps)
|
30
|
+
assert_nothing_raised do
|
31
|
+
@capability.apply(:caps)
|
32
|
+
end
|
33
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
|
34
|
+
capabilities.each do |capability|
|
35
|
+
assert_false @capability.have_capability?(:effective, capability)
|
36
|
+
assert_true @capability.have_capability?(:inheritable, capability)
|
37
|
+
assert_false @capability.have_capability?(:permitted, capability)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
test "permitted" do
|
42
|
+
@capability.clear(:both)
|
43
|
+
capabilities = [:fowner, :fsetid, :kill]
|
44
|
+
assert_equal [true, true, true], @capability.update(:add, :permitted, capabilities)
|
45
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:caps)
|
46
|
+
assert_nothing_raised do
|
47
|
+
@capability.apply(:caps)
|
48
|
+
end
|
49
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
|
50
|
+
capabilities.each do |capability|
|
51
|
+
assert_false @capability.have_capability?(:effective, capability)
|
52
|
+
assert_false @capability.have_capability?(:inheritable, capability)
|
53
|
+
assert_true @capability.have_capability?(:permitted, capability)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
test "effective/inheritable/permitted" do
|
58
|
+
@capability.clear(:both)
|
59
|
+
capabilities = [:setpcap, :net_admin, :net_raw, :sys_boot, :sys_time]
|
60
|
+
update_type = CapNG::Type::EFFECTIVE | CapNG::Type::INHERITABLE | CapNG::Type::PERMITTED
|
61
|
+
assert_equal [true, true, true, true, true], @capability.update(:add, update_type, capabilities)
|
62
|
+
assert_equal CapNG::Result::PARTIAL, @capability.have_capabilities?(:caps)
|
63
|
+
assert_nothing_raised do
|
64
|
+
@capability.apply(:caps)
|
65
|
+
end
|
66
|
+
assert_equal CapNG::Result::NONE, @capability.have_capabilities?(:bounds)
|
67
|
+
capabilities.each do |capability|
|
68
|
+
assert_true @capability.have_capability?(:effective, capability)
|
69
|
+
assert_true @capability.have_capability?(:inheritable, capability)
|
70
|
+
assert_true @capability.have_capability?(:permitted, capability)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|