fluentd 1.20.0-aarch64-mingw-ucrt
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rubocop.yml +116 -0
- data/ADOPTERS.md +5 -0
- data/AGENTS.md +46 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +3324 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +19 -0
- data/README.md +73 -0
- data/Rakefile +89 -0
- data/SECURITY.md +47 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_sd.conf +17 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +385 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +144 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +117 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +721 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/basic_parser.rb +122 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +44 -0
- data/lib/fluent/config/literal_parser.rb +305 -0
- data/lib/fluent/config/parser.rb +119 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +257 -0
- data/lib/fluent/config/v1_parser.rb +200 -0
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +124 -0
- data/lib/fluent/config/yaml_parser/parser.rb +179 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +202 -0
- data/lib/fluent/counter/base_socket.rb +44 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +14 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +269 -0
- data/lib/fluent/env.rb +45 -0
- data/lib/fluent/error.rb +37 -0
- data/lib/fluent/event.rb +369 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +33 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +775 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +88 -0
- data/lib/fluent/plugin/base.rb +219 -0
- data/lib/fluent/plugin/buf_file.rb +256 -0
- data/lib/fluent/plugin/buf_file_single.rb +272 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +313 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +1063 -0
- data/lib/fluent/plugin/compressable.rb +87 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/extractor.rb +132 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/filter.rb +119 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +124 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +92 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +62 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +55 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +124 -0
- data/lib/fluent/plugin/in_forward.rb +489 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +737 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +148 -0
- data/lib/fluent/plugin/in_syslog.rb +346 -0
- data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
- data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
- data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
- data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
- data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
- data/lib/fluent/plugin/in_tail.rb +917 -0
- data/lib/fluent/plugin/in_tcp.rb +230 -0
- data/lib/fluent/plugin/in_udp.rb +101 -0
- data/lib/fluent/plugin/in_unix.rb +197 -0
- data/lib/fluent/plugin/input.rb +71 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +179 -0
- data/lib/fluent/plugin/out_buffer.rb +40 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +371 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
- data/lib/fluent/plugin/out_forward.rb +865 -0
- data/lib/fluent/plugin/out_http.rb +419 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +148 -0
- data/lib/fluent/plugin/out_stdout.rb +81 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1688 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +124 -0
- data/lib/fluent/plugin/parser_json.rb +118 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +72 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +543 -0
- data/lib/fluent/plugin/parser_tsv.rb +47 -0
- data/lib/fluent/plugin/sd_file.rb +157 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +166 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +199 -0
- data/lib/fluent/plugin_helper/child_process.rb +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +129 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +136 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +219 -0
- data/lib/fluent/plugin_helper/server.rb +840 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +468 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/source_only_buffer_agent.rb +102 -0
- data/lib/fluent/static_config_analysis.rb +195 -0
- data/lib/fluent/supervisor.rb +1347 -0
- data/lib/fluent/system_config.rb +213 -0
- data/lib/fluent/test/base.rb +83 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +61 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +138 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +44 -0
- data/lib/fluent/test.rb +61 -0
- data/lib/fluent/time.rb +513 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +105 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +130 -0
- data/templates/new_gem/.gitignore +8 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +7 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- metadata +996 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require 'strscan'
|
|
18
|
+
require 'uri'
|
|
19
|
+
|
|
20
|
+
require 'fluent/config/error'
|
|
21
|
+
require 'fluent/config/basic_parser'
|
|
22
|
+
require 'fluent/config/literal_parser'
|
|
23
|
+
require 'fluent/config/element'
|
|
24
|
+
|
|
25
|
+
module Fluent
|
|
26
|
+
module Config
|
|
27
|
+
class V1Parser < LiteralParser
|
|
28
|
+
ELEMENT_NAME = /[a-zA-Z0-9_]+/
|
|
29
|
+
|
|
30
|
+
def self.parse(data, fname, basepath = Dir.pwd, eval_context = nil, on_file_parsed: nil)
|
|
31
|
+
ss = StringScanner.new(data)
|
|
32
|
+
ps = V1Parser.new(ss, basepath, fname, eval_context, on_file_parsed: on_file_parsed)
|
|
33
|
+
ps.parse!
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def initialize(strscan, include_basepath, fname, eval_context, on_file_parsed: nil)
|
|
37
|
+
super(strscan, eval_context)
|
|
38
|
+
@include_basepath = include_basepath
|
|
39
|
+
@fname = fname
|
|
40
|
+
@logger = defined?($log) ? $log : nil
|
|
41
|
+
@on_file_parsed = on_file_parsed
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def parse!
|
|
45
|
+
attrs, elems = parse_element(true, nil)
|
|
46
|
+
root = Element.new('ROOT', '', attrs, elems)
|
|
47
|
+
root.v1_config = true
|
|
48
|
+
|
|
49
|
+
spacing
|
|
50
|
+
unless eof?
|
|
51
|
+
parse_error! "expected EOF"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
return root
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
ELEM_SYMBOLS = ['match', 'source', 'filter', 'system']
|
|
58
|
+
RESERVED_PARAMS = %W(@type @id @label @log_level)
|
|
59
|
+
|
|
60
|
+
def parse_element(root_element, elem_name, attrs = {}, elems = [])
|
|
61
|
+
while true
|
|
62
|
+
spacing
|
|
63
|
+
if eof?
|
|
64
|
+
if root_element
|
|
65
|
+
break
|
|
66
|
+
end
|
|
67
|
+
parse_error! "expected end tag '</#{elem_name}>' but got end of file"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if skip(/\<\//)
|
|
71
|
+
e_name = scan(ELEMENT_NAME)
|
|
72
|
+
spacing
|
|
73
|
+
unless skip(/\>/)
|
|
74
|
+
parse_error! "expected character in tag name"
|
|
75
|
+
end
|
|
76
|
+
unless line_end
|
|
77
|
+
parse_error! "expected end of line after end tag"
|
|
78
|
+
end
|
|
79
|
+
if e_name != elem_name
|
|
80
|
+
parse_error! "unmatched end tag"
|
|
81
|
+
end
|
|
82
|
+
break
|
|
83
|
+
|
|
84
|
+
elsif skip(/\</)
|
|
85
|
+
e_name = scan(ELEMENT_NAME)
|
|
86
|
+
spacing
|
|
87
|
+
e_arg = scan_string(/(?:#{ZERO_OR_MORE_SPACING}\>)/o)
|
|
88
|
+
spacing
|
|
89
|
+
unless skip(/\>/)
|
|
90
|
+
parse_error! "expected '>'"
|
|
91
|
+
end
|
|
92
|
+
unless line_end
|
|
93
|
+
parse_error! "expected end of line after tag"
|
|
94
|
+
end
|
|
95
|
+
e_arg ||= ''
|
|
96
|
+
# call parse_element recursively
|
|
97
|
+
e_attrs, e_elems = parse_element(false, e_name)
|
|
98
|
+
new_e = Element.new(e_name, e_arg, e_attrs, e_elems)
|
|
99
|
+
new_e.v1_config = true
|
|
100
|
+
elems << new_e
|
|
101
|
+
|
|
102
|
+
elsif root_element && skip(/(\@include|include)#{SPACING}/o)
|
|
103
|
+
if !prev_match.start_with?('@')
|
|
104
|
+
@logger.warn "'include' is deprecated. Use '@include' instead" if @logger
|
|
105
|
+
end
|
|
106
|
+
parse_include(attrs, elems)
|
|
107
|
+
|
|
108
|
+
else
|
|
109
|
+
k = scan_string(SPACING)
|
|
110
|
+
spacing_without_comment
|
|
111
|
+
if prev_match.include?("\n") || eof? # support 'tag_mapped' like "without value" configuration
|
|
112
|
+
attrs[k] = ""
|
|
113
|
+
else
|
|
114
|
+
if k == '@include'
|
|
115
|
+
parse_include(attrs, elems)
|
|
116
|
+
elsif RESERVED_PARAMS.include?(k)
|
|
117
|
+
v = parse_literal
|
|
118
|
+
unless line_end
|
|
119
|
+
parse_error! "expected end of line"
|
|
120
|
+
end
|
|
121
|
+
attrs[k] = v
|
|
122
|
+
else
|
|
123
|
+
if k.start_with?('@')
|
|
124
|
+
if root_element || ELEM_SYMBOLS.include?(elem_name)
|
|
125
|
+
parse_error! "'@' is the system reserved prefix. Don't use '@' prefix parameter in the configuration: #{k}"
|
|
126
|
+
else
|
|
127
|
+
# TODO: This is for backward compatibility. It will throw an error in the future.
|
|
128
|
+
@logger.warn "'@' is the system reserved prefix. It works in the nested configuration for now but it will be rejected: #{k}" if @logger
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
v = parse_literal
|
|
133
|
+
unless line_end
|
|
134
|
+
parse_error! "expected end of line"
|
|
135
|
+
end
|
|
136
|
+
attrs[k] = v
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
@on_file_parsed&.call(File.expand_path(File.join(@include_basepath, @fname))) if root_element
|
|
143
|
+
|
|
144
|
+
return attrs, elems
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def parse_include(attrs, elems)
|
|
148
|
+
uri = scan_string(LINE_END)
|
|
149
|
+
eval_include(attrs, elems, uri)
|
|
150
|
+
line_end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def eval_include(attrs, elems, uri)
|
|
154
|
+
# replace space(s)(' ') with '+' to prevent invalid uri due to space(s).
|
|
155
|
+
# See: https://github.com/fluent/fluentd/pull/2780#issuecomment-576081212
|
|
156
|
+
u = URI.parse(uri.tr(' ', '+'))
|
|
157
|
+
if u.scheme == 'file' || (!u.scheme.nil? && u.scheme.length == 1) || u.path == uri.tr(' ', '+') # file path
|
|
158
|
+
# When the Windows absolute path then u.scheme.length == 1
|
|
159
|
+
# e.g. C:
|
|
160
|
+
path = URI.decode_www_form_component(u.path)
|
|
161
|
+
if path[0] != ?/
|
|
162
|
+
pattern = File.expand_path("#{@include_basepath}/#{path}")
|
|
163
|
+
else
|
|
164
|
+
pattern = path
|
|
165
|
+
end
|
|
166
|
+
Dir.glob(pattern).sort.each { |entry|
|
|
167
|
+
basepath = File.dirname(entry)
|
|
168
|
+
fname = File.basename(entry)
|
|
169
|
+
suspicious_backup_extensions = %w(bak old backup orig prev conf tmp temp debug wip)
|
|
170
|
+
if path.end_with?('*.conf') and
|
|
171
|
+
suspicious_backup_extensions.any? { |ext| fname.end_with?(".#{ext}.conf", "_#{ext}.conf") }
|
|
172
|
+
@logger.warn "There is a possibility that '@include #{uri}' includes duplicated backed-up config file such as <#{fname}>" if @logger
|
|
173
|
+
end
|
|
174
|
+
data = File.read(entry)
|
|
175
|
+
data.force_encoding('UTF-8')
|
|
176
|
+
ss = StringScanner.new(data)
|
|
177
|
+
V1Parser.new(ss, basepath, fname, @eval_context, on_file_parsed: @on_file_parsed).parse_element(true, nil, attrs, elems)
|
|
178
|
+
}
|
|
179
|
+
else
|
|
180
|
+
require 'open-uri'
|
|
181
|
+
basepath = '/'
|
|
182
|
+
fname = path
|
|
183
|
+
data = u.open { |f| f.read }
|
|
184
|
+
data.force_encoding('UTF-8')
|
|
185
|
+
ss = StringScanner.new(data)
|
|
186
|
+
V1Parser.new(ss, basepath, fname, @eval_context, on_file_parsed: @on_file_parsed).parse_element(true, nil, attrs, elems)
|
|
187
|
+
end
|
|
188
|
+
rescue SystemCallError => e
|
|
189
|
+
cpe = ConfigParseError.new("include error #{uri} - #{e}")
|
|
190
|
+
cpe.set_backtrace(e.backtrace)
|
|
191
|
+
raise cpe
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# override
|
|
195
|
+
def error_sample
|
|
196
|
+
"#{@fname} #{super}"
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
module Fluent
|
|
18
|
+
module Config
|
|
19
|
+
module YamlParser
|
|
20
|
+
module FluentValue
|
|
21
|
+
JsonValue = Struct.new(:val) do
|
|
22
|
+
def to_s
|
|
23
|
+
val.to_json
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_element
|
|
27
|
+
to_s
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
StringValue = Struct.new(:val, :context) do
|
|
32
|
+
def to_s
|
|
33
|
+
context.instance_eval("\"#{val}\"")
|
|
34
|
+
rescue Fluent::SetNil => _
|
|
35
|
+
''
|
|
36
|
+
rescue Fluent::SetDefault => _
|
|
37
|
+
':default'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def to_element
|
|
41
|
+
to_s
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require 'psych'
|
|
18
|
+
require 'json'
|
|
19
|
+
require 'fluent/config/error'
|
|
20
|
+
require 'fluent/config/yaml_parser/fluent_value'
|
|
21
|
+
|
|
22
|
+
# Based on https://github.com/eagletmt/hako/blob/34cdde06fe8f3aeafd794be830180c3cedfbb4dc/lib/hako/yaml_loader.rb
|
|
23
|
+
|
|
24
|
+
module Fluent
|
|
25
|
+
module Config
|
|
26
|
+
module YamlParser
|
|
27
|
+
class Loader
|
|
28
|
+
INCLUDE_TAG = 'tag:include'.freeze
|
|
29
|
+
FLUENT_JSON_TAG = 'tag:fluent/json'.freeze
|
|
30
|
+
FLUENT_STR_TAG = 'tag:fluent/s'.freeze
|
|
31
|
+
SHOVEL = '<<'.freeze
|
|
32
|
+
|
|
33
|
+
def initialize(context = Kernel.binding, on_file_parsed: nil)
|
|
34
|
+
@context = context
|
|
35
|
+
@current_path = nil
|
|
36
|
+
@on_file_parsed = on_file_parsed
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param [String] path
|
|
40
|
+
# @return [Hash]
|
|
41
|
+
def load(path)
|
|
42
|
+
class_loader = Psych::ClassLoader.new
|
|
43
|
+
scanner = Psych::ScalarScanner.new(class_loader)
|
|
44
|
+
|
|
45
|
+
visitor = Visitor.new(scanner, class_loader)
|
|
46
|
+
|
|
47
|
+
visitor._register_domain(INCLUDE_TAG) do |_, val|
|
|
48
|
+
eval_include(Pathname.new(val), path.parent)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
visitor._register_domain(FLUENT_JSON_TAG) do |_, val|
|
|
52
|
+
Fluent::Config::YamlParser::FluentValue::JsonValue.new(val)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
visitor._register_domain(FLUENT_STR_TAG) do |_, val|
|
|
56
|
+
Fluent::Config::YamlParser::FluentValue::StringValue.new(val, @context)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
config = path.open do |f|
|
|
60
|
+
visitor.accept(Psych.parse(f))
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
@on_file_parsed&.call(File.expand_path(path.to_s))
|
|
64
|
+
|
|
65
|
+
config
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def eval_include(path, parent)
|
|
69
|
+
if path.relative?
|
|
70
|
+
pattern = parent.join(path)
|
|
71
|
+
else
|
|
72
|
+
pattern = path
|
|
73
|
+
end
|
|
74
|
+
# A single file keeps its own shape; only glob matches are aggregated.
|
|
75
|
+
return load(pattern) if File.file?(pattern)
|
|
76
|
+
|
|
77
|
+
result = []
|
|
78
|
+
Dir.glob(pattern).sort.each do |path|
|
|
79
|
+
loaded = load(Pathname.new(path))
|
|
80
|
+
if loaded.is_a?(Hash)
|
|
81
|
+
result.push(loaded)
|
|
82
|
+
else
|
|
83
|
+
result.concat(loaded)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
result
|
|
87
|
+
rescue SystemCallError => e
|
|
88
|
+
parse_error = ConfigParseError.new("include error #{path} - #{e}")
|
|
89
|
+
parse_error.set_backtrace(e.backtrace)
|
|
90
|
+
raise parse_error
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
class Visitor < Psych::Visitors::ToRuby
|
|
94
|
+
def initialize(scanner, class_loader)
|
|
95
|
+
super(scanner, class_loader)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def _register_domain(name, &block)
|
|
99
|
+
@domain_types.merge!({ name => [name, block] })
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def revive_hash(hash, o)
|
|
103
|
+
super(hash, o).tap do |r|
|
|
104
|
+
if r[SHOVEL].is_a?(Array) && r[SHOVEL].all?(Hash)
|
|
105
|
+
r[SHOVEL] = r[SHOVEL].reverse_each.reduce({}) { |a, e| a.merge!(e) }
|
|
106
|
+
end
|
|
107
|
+
if r[SHOVEL].is_a?(Hash)
|
|
108
|
+
h2 = {}
|
|
109
|
+
r.each do |k, v|
|
|
110
|
+
if k == SHOVEL
|
|
111
|
+
h2.merge!(v)
|
|
112
|
+
else
|
|
113
|
+
h2[k] = v
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
r.replace(h2)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
require 'fluent/config/yaml_parser/section_builder'
|
|
18
|
+
|
|
19
|
+
module Fluent
|
|
20
|
+
module Config
|
|
21
|
+
module YamlParser
|
|
22
|
+
class Parser
|
|
23
|
+
def initialize(config, indent: 2)
|
|
24
|
+
@base_indent = indent
|
|
25
|
+
@config = config
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def build
|
|
29
|
+
s = @config['system'] && system_config_build(@config['system'])
|
|
30
|
+
c = @config['config'] && config_build(@config['config'], root: true)
|
|
31
|
+
RootBuilder.new(s, c)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def system_config_build(config)
|
|
37
|
+
section_build('system', config)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def config_build(config, indent: 0, root: false)
|
|
41
|
+
sb = SectionBodyBuilder.new(indent, root: root)
|
|
42
|
+
config.each do |c|
|
|
43
|
+
if (lc = c.delete('label'))
|
|
44
|
+
sb.add_section(label_build(lc, indent: indent))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
if (sc = c.delete('source'))
|
|
48
|
+
sb.add_section(source_build(sc, indent: indent))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
if (fc = c.delete('filter'))
|
|
52
|
+
sb.add_section(filter_build(fc, indent: indent))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
if (mc = c.delete('match'))
|
|
56
|
+
sb.add_section(match_build(mc, indent: indent))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if (wc = c.delete('worker'))
|
|
60
|
+
sb.add_section(worker_build(wc, indent: indent))
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
included_sections_build(c, sb, indent: indent)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
sb
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def label_build(config, indent: 0)
|
|
70
|
+
config = config.dup
|
|
71
|
+
name = config.delete('$name')
|
|
72
|
+
c = config.delete('config')
|
|
73
|
+
SectionBuilder.new('label', config_build(c, indent: indent + @base_indent), indent, name)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def worker_build(config, indent: 0)
|
|
77
|
+
config = config.dup
|
|
78
|
+
num = config.delete('$arg')
|
|
79
|
+
c = config.delete('config')
|
|
80
|
+
SectionBuilder.new('worker', config_build(c, indent: indent + @base_indent), indent, num)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def source_build(config, indent: 0)
|
|
84
|
+
section_build('source', config, indent: indent)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def filter_build(config, indent: 0)
|
|
88
|
+
config = config.dup
|
|
89
|
+
tag = config.delete('$tag')
|
|
90
|
+
if tag.is_a?(Array)
|
|
91
|
+
section_build('filter', config, indent: indent, arg: tag&.join(','))
|
|
92
|
+
else
|
|
93
|
+
section_build('filter', config, indent: indent, arg: tag)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def match_build(config, indent: 0)
|
|
98
|
+
config = config.dup
|
|
99
|
+
tag = config.delete('$tag')
|
|
100
|
+
if tag.is_a?(Array)
|
|
101
|
+
section_build('match', config, indent: indent, arg: tag&.join(','))
|
|
102
|
+
else
|
|
103
|
+
section_build('match', config, indent: indent, arg: tag)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def included_sections_build(config, section_builder, indent: 0)
|
|
108
|
+
config.each_entry do |e|
|
|
109
|
+
e.keys.each do |k|
|
|
110
|
+
cc = e.delete(k)
|
|
111
|
+
case k
|
|
112
|
+
when 'label'
|
|
113
|
+
section_builder.add_section(label_build(cc, indent: indent))
|
|
114
|
+
when 'worker'
|
|
115
|
+
section_builder.add_section(worker_build(cc, indent: indent))
|
|
116
|
+
when 'source'
|
|
117
|
+
section_builder.add_section(source_build(cc, indent: indent))
|
|
118
|
+
when 'filter'
|
|
119
|
+
section_builder.add_section(filter_build(cc, indent: indent))
|
|
120
|
+
when 'match'
|
|
121
|
+
section_builder.add_section(match_build(cc, indent: indent))
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def section_build(name, config, indent: 0, arg: nil)
|
|
128
|
+
sb = SectionBodyBuilder.new(indent + @base_indent)
|
|
129
|
+
|
|
130
|
+
if (v = config.delete('$type'))
|
|
131
|
+
sb.add_line('@type', v)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
if (v = config.delete('$label'))
|
|
135
|
+
sb.add_line('@label', v)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
if (v = config.delete('$id'))
|
|
139
|
+
sb.add_line('@id', v)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
if (v = config.delete('$log_level'))
|
|
143
|
+
sb.add_line('@log_level', v)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
config.each do |key, val|
|
|
147
|
+
if val.is_a?(Array)
|
|
148
|
+
if section?(val.first)
|
|
149
|
+
val.each do |v|
|
|
150
|
+
sb.add_section(section_build(key, v, indent: indent + @base_indent))
|
|
151
|
+
end
|
|
152
|
+
else
|
|
153
|
+
sb.add_line(key, val)
|
|
154
|
+
end
|
|
155
|
+
elsif val.is_a?(Hash)
|
|
156
|
+
harg = val.delete('$arg')
|
|
157
|
+
if harg.is_a?(Array)
|
|
158
|
+
# To prevent to generate invalid configuration for arg.
|
|
159
|
+
# "arg" should be String object and concatenated by ","
|
|
160
|
+
# when two or more objects are specified there.
|
|
161
|
+
sb.add_section(section_build(key, val, indent: indent + @base_indent, arg: harg&.join(',')))
|
|
162
|
+
else
|
|
163
|
+
sb.add_section(section_build(key, val, indent: indent + @base_indent, arg: harg))
|
|
164
|
+
end
|
|
165
|
+
else
|
|
166
|
+
sb.add_line(key, val)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
SectionBuilder.new(name, sb, indent, arg)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def section?(value)
|
|
174
|
+
value.is_a?(Array) or value.is_a?(Hash)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Fluentd
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
module Fluent
|
|
18
|
+
module Config
|
|
19
|
+
module YamlParser
|
|
20
|
+
SectionBuilder = Struct.new(:name, :body, :indent_size, :arg) do
|
|
21
|
+
def to_s
|
|
22
|
+
indent = ' ' * indent_size
|
|
23
|
+
|
|
24
|
+
if arg && !arg.to_s.empty?
|
|
25
|
+
"#{indent}<#{name} #{arg}>\n#{body}\n#{indent}</#{name}>"
|
|
26
|
+
else
|
|
27
|
+
"#{indent}<#{name}>\n#{body}\n#{indent}</#{name}>"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_element
|
|
32
|
+
elem = body.to_element
|
|
33
|
+
elem.name = name
|
|
34
|
+
elem.arg = arg.to_s if arg
|
|
35
|
+
elem.v1_config = true
|
|
36
|
+
elem
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class RootBuilder
|
|
41
|
+
def initialize(system, conf)
|
|
42
|
+
@system = system
|
|
43
|
+
@conf = conf
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
attr_reader :system, :conf
|
|
47
|
+
|
|
48
|
+
def to_element
|
|
49
|
+
Fluent::Config::Element.new('ROOT', '', {}, [@system, @conf].compact.map(&:to_element).flatten)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def to_s
|
|
53
|
+
s = StringIO.new(+'')
|
|
54
|
+
s.puts(@system.to_s) if @system
|
|
55
|
+
s.puts(@conf.to_s) if @conf
|
|
56
|
+
|
|
57
|
+
s.string
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class SectionBodyBuilder
|
|
62
|
+
Row = Struct.new(:key, :value, :indent) do
|
|
63
|
+
def to_s
|
|
64
|
+
"#{indent}#{key} #{value}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def initialize(indent, root: false)
|
|
69
|
+
@indent = ' ' * indent
|
|
70
|
+
@bodies = []
|
|
71
|
+
@root = root
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def add_line(k, v)
|
|
75
|
+
@bodies << Row.new(k, v, @indent)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def add_section(section)
|
|
79
|
+
@bodies << section
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def to_element
|
|
83
|
+
if @root
|
|
84
|
+
return @bodies.map(&:to_element)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
not_section, section = @bodies.partition { |e| e.is_a?(Row) }
|
|
88
|
+
r = {}
|
|
89
|
+
not_section.each do |e|
|
|
90
|
+
v = e.value
|
|
91
|
+
r[e.key] = v.respond_to?(:to_element) ? v.to_element : v
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
if @root
|
|
95
|
+
section.map(&:to_element)
|
|
96
|
+
else
|
|
97
|
+
Fluent::Config::Element.new('', '', r, section.map(&:to_element))
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def to_s
|
|
102
|
+
@bodies.map(&:to_s).join("\n")
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|