fluentd 1.14.4-x64-mingw-ucrt
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 +7 -0
- data/.deepsource.toml +13 -0
- data/.drone.yml +35 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/issue-auto-closer.yml +12 -0
- data/.github/workflows/linux-test.yaml +36 -0
- data/.github/workflows/macos-test.yaml +30 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.github/workflows/windows-test.yaml +46 -0
- data/.gitignore +30 -0
- data/.gitlab-ci.yml +103 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2409 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/Gemfile +9 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +11 -0
- data/README.md +97 -0
- data/Rakefile +79 -0
- data/SECURITY.md +18 -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/fluentd.gemspec +55 -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 +177 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +374 -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 +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -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 +123 -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 +32 -0
- data/lib/fluent/config/literal_parser.rb +286 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +249 -0
- data/lib/fluent/config/v1_parser.rb +192 -0
- data/lib/fluent/config.rb +76 -0
- data/lib/fluent/configurable.rb +201 -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 +15 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +253 -0
- data/lib/fluent/env.rb +40 -0
- data/lib/fluent/error.rb +34 -0
- data/lib/fluent/event.rb +326 -0
- data/lib/fluent/event_router.rb +297 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +141 -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 +34 -0
- data/lib/fluent/log.rb +713 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +106 -0
- data/lib/fluent/oj_options.rb +62 -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 +104 -0
- data/lib/fluent/plugin/base.rb +197 -0
- data/lib/fluent/plugin/buf_file.rb +213 -0
- data/lib/fluent/plugin/buf_file_single.rb +225 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +240 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +918 -0
- data/lib/fluent/plugin/compressable.rb +96 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/file_wrapper.rb +187 -0
- data/lib/fluent/plugin/filter.rb +127 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +130 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +324 -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 +78 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +59 -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 +53 -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 +110 -0
- data/lib/fluent/plugin/in_forward.rb +473 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +667 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +141 -0
- data/lib/fluent/plugin/in_syslog.rb +276 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1228 -0
- data/lib/fluent/plugin/in_tcp.rb +181 -0
- data/lib/fluent/plugin/in_udp.rb +92 -0
- data/lib/fluent/plugin/in_unix.rb +195 -0
- data/lib/fluent/plugin/input.rb +75 -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 +195 -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 +334 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -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 +140 -0
- data/lib/fluent/plugin/out_forward.rb +826 -0
- data/lib/fluent/plugin/out_http.rb +275 -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 +131 -0
- data/lib/fluent/plugin/out_stdout.rb +74 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1556 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +275 -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 +114 -0
- data/lib/fluent/plugin/parser_json.rb +96 -0
- data/lib/fluent/plugin/parser_ltsv.rb +51 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -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 +496 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/sd_file.rb +156 -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 +162 -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 +191 -0
- data/lib/fluent/plugin_helper/child_process.rb +366 -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 +100 -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 +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
- data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +135 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +129 -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 +209 -0
- data/lib/fluent/plugin_helper/server.rb +801 -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 +277 -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 +116 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1054 -0
- data/lib/fluent/system_config.rb +187 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +225 -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 +57 -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 +134 -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 +46 -0
- data/lib/fluent/test.rb +58 -0
- data/lib/fluent/time.rb +512 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +81 -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/winsvc.rb +103 -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 +27 -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 +8 -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
- data/test/command/test_binlog_reader.rb +362 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_cat.rb +128 -0
- data/test/command/test_ctl.rb +57 -0
- data/test/command/test_fluentd.rb +1106 -0
- data/test/command/test_plugin_config_formatter.rb +398 -0
- data/test/command/test_plugin_generator.rb +109 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +551 -0
- data/test/config/test_configurable.rb +1784 -0
- data/test/config/test_configure_proxy.rb +604 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +518 -0
- data/test/config/test_literal_parser.rb +309 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +191 -0
- data/test/config/test_system_config.rb +199 -0
- data/test/config/test_types.rb +408 -0
- data/test/counter/test_client.rb +563 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/helper.rb +155 -0
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/helpers/process_extenstion.rb +33 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/foo/bar2 +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/data/sd_file/config +11 -0
- data/test/plugin/data/sd_file/config.json +17 -0
- data/test/plugin/data/sd_file/config.yaml +11 -0
- data/test/plugin/data/sd_file/config.yml +11 -0
- data/test/plugin/data/sd_file/invalid_config.yml +7 -0
- data/test/plugin/in_tail/test_fifo.rb +121 -0
- data/test/plugin/in_tail/test_io_handler.rb +140 -0
- data/test/plugin/in_tail/test_position_file.rb +379 -0
- data/test/plugin/out_forward/test_ack_handler.rb +101 -0
- data/test/plugin/out_forward/test_connection_manager.rb +145 -0
- data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
- data/test/plugin/out_forward/test_load_balancer.rb +106 -0
- data/test/plugin/out_forward/test_socket_cache.rb +149 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +1275 -0
- data/test/plugin/test_buf_file_single.rb +833 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1383 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +871 -0
- data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
- data/test/plugin/test_buffer_memory_chunk.rb +339 -0
- data/test/plugin/test_compressable.rb +87 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_file_wrapper.rb +126 -0
- data/test/plugin/test_filter.rb +368 -0
- data/test/plugin/test_filter_grep.rb +697 -0
- data/test/plugin/test_filter_parser.rb +731 -0
- data/test/plugin/test_filter_record_transformer.rb +577 -0
- data/test/plugin/test_filter_stdout.rb +207 -0
- data/test/plugin/test_formatter_csv.rb +136 -0
- data/test/plugin/test_formatter_hash.rb +38 -0
- data/test/plugin/test_formatter_json.rb +61 -0
- data/test/plugin/test_formatter_ltsv.rb +70 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +116 -0
- data/test/plugin/test_formatter_single_value.rb +44 -0
- data/test/plugin/test_formatter_tsv.rb +76 -0
- data/test/plugin/test_in_debug_agent.rb +49 -0
- data/test/plugin/test_in_exec.rb +261 -0
- data/test/plugin/test_in_forward.rb +1180 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1080 -0
- data/test/plugin/test_in_monitor_agent.rb +923 -0
- data/test/plugin/test_in_object_space.rb +60 -0
- data/test/plugin/test_in_sample.rb +190 -0
- data/test/plugin/test_in_syslog.rb +505 -0
- data/test/plugin/test_in_tail.rb +2363 -0
- data/test/plugin/test_in_tcp.rb +243 -0
- data/test/plugin/test_in_udp.rb +268 -0
- data/test/plugin/test_in_unix.rb +181 -0
- data/test/plugin/test_input.rb +137 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_metrics.rb +294 -0
- data/test/plugin/test_metrics_local.rb +96 -0
- data/test/plugin/test_multi_output.rb +204 -0
- data/test/plugin/test_out_copy.rb +308 -0
- data/test/plugin/test_out_exec.rb +312 -0
- data/test/plugin/test_out_exec_filter.rb +606 -0
- data/test/plugin/test_out_file.rb +1037 -0
- data/test/plugin/test_out_forward.rb +1348 -0
- data/test/plugin/test_out_http.rb +428 -0
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +146 -0
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +205 -0
- data/test/plugin/test_out_stream.rb +103 -0
- data/test/plugin/test_output.rb +1065 -0
- data/test/plugin/test_output_as_buffered.rb +2024 -0
- data/test/plugin/test_output_as_buffered_backup.rb +363 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +919 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +399 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +200 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +160 -0
- data/test/plugin/test_parser_multiline.rb +111 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +650 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_sd_file.rb +228 -0
- data/test/plugin/test_sd_srv.rb +230 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
- data/test/plugin_helper/data/cert/empty.pem +0 -0
- data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
- data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
- data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
- data/test/plugin_helper/test_cert_option.rb +25 -0
- data/test/plugin_helper/test_child_process.rb +840 -0
- data/test/plugin_helper/test_compat_parameters.rb +358 -0
- data/test/plugin_helper/test_event_emitter.rb +80 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +372 -0
- data/test/plugin_helper/test_inject.rb +561 -0
- data/test/plugin_helper/test_metrics.rb +137 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +238 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1823 -0
- data/test/plugin_helper/test_service_discovery.rb +165 -0
- data/test/plugin_helper/test_socket.rb +146 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +130 -0
- data/test/scripts/exec_script.rb +32 -0
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_capability.rb +74 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +202 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_daemonizer.rb +91 -0
- data/test/test_engine.rb +203 -0
- data/test/test_event.rb +531 -0
- data/test/test_event_router.rb +331 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +366 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +994 -0
- data/test/test_logger_initializer.rb +46 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +18 -0
- data/test/test_oj_options.rb +55 -0
- data/test/test_output.rb +278 -0
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +370 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +119 -0
- data/test/test_process.rb +14 -0
- data/test/test_root_agent.rb +951 -0
- data/test/test_static_config_analysis.rb +177 -0
- data/test/test_supervisor.rb +601 -0
- data/test/test_test_drivers.rb +136 -0
- data/test/test_time_formatter.rb +301 -0
- data/test/test_time_parser.rb +362 -0
- data/test/test_tls.rb +65 -0
- data/test/test_unique_id.rb +47 -0
- data/test/test_variable_store.rb +65 -0
- metadata +1261 -0
@@ -0,0 +1,265 @@
|
|
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/error'
|
18
|
+
require 'fluent/config/literal_parser'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Config
|
22
|
+
class Element < Hash
|
23
|
+
def initialize(name, arg, attrs, elements, unused = nil)
|
24
|
+
@name = name
|
25
|
+
@arg = arg
|
26
|
+
@elements = elements
|
27
|
+
super()
|
28
|
+
attrs.each { |k, v|
|
29
|
+
self[k] = v
|
30
|
+
}
|
31
|
+
@unused = unused || attrs.keys
|
32
|
+
@v1_config = false
|
33
|
+
@corresponding_proxies = [] # some plugins use flat parameters, e.g. in_http doesn't provide <format> section for parser.
|
34
|
+
@unused_in = nil # if this element is not used in plugins, correspoing plugin name and parent element name is set, e.g. [source, plugin class].
|
35
|
+
|
36
|
+
# it's global logger, not plugin logger: deprecated message should be global warning, not plugin level.
|
37
|
+
@logger = defined?($log) ? $log : nil
|
38
|
+
|
39
|
+
@target_worker_ids = []
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_accessor :name, :arg, :unused, :v1_config, :corresponding_proxies, :unused_in
|
43
|
+
attr_writer :elements
|
44
|
+
attr_reader :target_worker_ids
|
45
|
+
|
46
|
+
RESERVED_PARAMETERS_COMPAT = {
|
47
|
+
'@type' => 'type',
|
48
|
+
'@id' => 'id',
|
49
|
+
'@log_level' => 'log_level',
|
50
|
+
'@label' => nil,
|
51
|
+
}
|
52
|
+
RESERVED_PARAMETERS = RESERVED_PARAMETERS_COMPAT.keys
|
53
|
+
|
54
|
+
def elements(*names, name: nil, arg: nil)
|
55
|
+
raise ArgumentError, "name and names are exclusive" if name && !names.empty?
|
56
|
+
raise ArgumentError, "arg is available only with name" if arg && !name
|
57
|
+
|
58
|
+
if name
|
59
|
+
@elements.select{|e| e.name == name && (!arg || e.arg == arg) }
|
60
|
+
elsif !names.empty?
|
61
|
+
@elements.select{|e| names.include?(e.name) }
|
62
|
+
else
|
63
|
+
@elements
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_element(name, arg = '')
|
68
|
+
e = Element.new(name, arg, {}, [])
|
69
|
+
e.v1_config = @v1_config
|
70
|
+
@elements << e
|
71
|
+
e
|
72
|
+
end
|
73
|
+
|
74
|
+
def inspect
|
75
|
+
attrs = super
|
76
|
+
"name:#{@name}, arg:#{@arg}, " + attrs + ", " + @elements.inspect
|
77
|
+
end
|
78
|
+
|
79
|
+
# Used by PP and Pry
|
80
|
+
def pretty_print(q)
|
81
|
+
q.text(inspect)
|
82
|
+
end
|
83
|
+
|
84
|
+
# This method assumes _o_ is an Element object. Should return false for nil or other object
|
85
|
+
def ==(o)
|
86
|
+
self.name == o.name && self.arg == o.arg &&
|
87
|
+
self.keys.size == o.keys.size &&
|
88
|
+
self.keys.reduce(true){|r, k| r && self[k] == o[k] } &&
|
89
|
+
self.elements.size == o.elements.size &&
|
90
|
+
[self.elements, o.elements].transpose.reduce(true){|r, e| r && e[0] == e[1] }
|
91
|
+
end
|
92
|
+
|
93
|
+
def +(o)
|
94
|
+
e = Element.new(@name.dup, @arg.dup, o.merge(self), @elements + o.elements, (@unused + o.unused).uniq)
|
95
|
+
e.v1_config = @v1_config
|
96
|
+
e
|
97
|
+
end
|
98
|
+
|
99
|
+
# no code in fluentd uses this method
|
100
|
+
def each_element(*names, &block)
|
101
|
+
if names.empty?
|
102
|
+
@elements.each(&block)
|
103
|
+
else
|
104
|
+
@elements.each { |e|
|
105
|
+
if names.include?(e.name)
|
106
|
+
block.yield(e)
|
107
|
+
end
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def has_key?(key)
|
113
|
+
@unused_in = [] # some sections, e.g. <store> in copy, is not defined by config_section so clear unused flag for better warning message in check_not_fetched.
|
114
|
+
@unused.delete(key)
|
115
|
+
super
|
116
|
+
end
|
117
|
+
|
118
|
+
def [](key)
|
119
|
+
@unused_in = [] # ditto
|
120
|
+
@unused.delete(key)
|
121
|
+
|
122
|
+
if RESERVED_PARAMETERS.include?(key) && !has_key?(key) && has_key?(RESERVED_PARAMETERS_COMPAT[key])
|
123
|
+
@logger.warn "'#{RESERVED_PARAMETERS_COMPAT[key]}' is deprecated parameter name. use '#{key}' instead." if @logger
|
124
|
+
return self[RESERVED_PARAMETERS_COMPAT[key]]
|
125
|
+
end
|
126
|
+
|
127
|
+
super
|
128
|
+
end
|
129
|
+
|
130
|
+
def check_not_fetched(&block)
|
131
|
+
each_key { |key|
|
132
|
+
if @unused.include?(key)
|
133
|
+
block.call(key, self)
|
134
|
+
end
|
135
|
+
}
|
136
|
+
@elements.each { |e|
|
137
|
+
e.check_not_fetched(&block)
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
def to_s(nest = 0)
|
142
|
+
indent = " " * nest
|
143
|
+
nindent = " " * (nest + 1)
|
144
|
+
out = ""
|
145
|
+
if @arg.nil? || @arg.empty?
|
146
|
+
out << "#{indent}<#{@name}>\n"
|
147
|
+
else
|
148
|
+
out << "#{indent}<#{@name} #{@arg}>\n"
|
149
|
+
end
|
150
|
+
each_pair { |k, v|
|
151
|
+
out << dump_value(k, v, nindent)
|
152
|
+
}
|
153
|
+
@elements.each { |e|
|
154
|
+
out << e.to_s(nest + 1)
|
155
|
+
}
|
156
|
+
out << "#{indent}</#{@name}>\n"
|
157
|
+
out
|
158
|
+
end
|
159
|
+
|
160
|
+
def to_masked_element
|
161
|
+
new_elems = @elements.map { |e| e.to_masked_element }
|
162
|
+
new_elem = Element.new(@name, @arg, {}, new_elems, @unused)
|
163
|
+
new_elem.v1_config = @v1_config
|
164
|
+
new_elem.corresponding_proxies = @corresponding_proxies
|
165
|
+
each_pair { |k, v|
|
166
|
+
new_elem[k] = secret_param?(k) ? 'xxxxxx' : v
|
167
|
+
}
|
168
|
+
new_elem
|
169
|
+
end
|
170
|
+
|
171
|
+
def secret_param?(key)
|
172
|
+
return false if @corresponding_proxies.empty?
|
173
|
+
|
174
|
+
param_key = key.to_sym
|
175
|
+
@corresponding_proxies.each { |proxy|
|
176
|
+
_block, opts = proxy.params[param_key]
|
177
|
+
if opts && opts.has_key?(:secret)
|
178
|
+
return opts[:secret]
|
179
|
+
end
|
180
|
+
}
|
181
|
+
|
182
|
+
false
|
183
|
+
end
|
184
|
+
|
185
|
+
def param_type(key)
|
186
|
+
return nil if @corresponding_proxies.empty?
|
187
|
+
|
188
|
+
param_key = key.to_sym
|
189
|
+
proxy = @corresponding_proxies.detect do |_proxy|
|
190
|
+
_proxy.params.has_key?(param_key)
|
191
|
+
end
|
192
|
+
return nil unless proxy
|
193
|
+
_block, opts = proxy.params[param_key]
|
194
|
+
opts[:type]
|
195
|
+
end
|
196
|
+
|
197
|
+
def default_value(key)
|
198
|
+
return nil if @corresponding_proxies.empty?
|
199
|
+
|
200
|
+
param_key = key.to_sym
|
201
|
+
proxy = @corresponding_proxies.detect do |_proxy|
|
202
|
+
_proxy.params.has_key?(param_key)
|
203
|
+
end
|
204
|
+
return nil unless proxy
|
205
|
+
proxy.defaults[param_key]
|
206
|
+
end
|
207
|
+
|
208
|
+
def dump_value(k, v, nindent)
|
209
|
+
return "#{nindent}#{k} xxxxxx\n" if secret_param?(k)
|
210
|
+
return "#{nindent}#{k} #{v}\n" unless @v1_config
|
211
|
+
|
212
|
+
# for v1 config
|
213
|
+
if v.nil?
|
214
|
+
"#{nindent}#{k} \n"
|
215
|
+
elsif v == :default
|
216
|
+
"#{nindent}#{k} #{default_value(k)}\n"
|
217
|
+
else
|
218
|
+
case param_type(k)
|
219
|
+
when :string
|
220
|
+
"#{nindent}#{k} \"#{self.class.unescape_parameter(v)}\"\n"
|
221
|
+
when :enum, :integer, :float, :size, :bool, :time
|
222
|
+
"#{nindent}#{k} #{v}\n"
|
223
|
+
when :hash, :array
|
224
|
+
"#{nindent}#{k} #{v}\n"
|
225
|
+
else
|
226
|
+
# Unknown type
|
227
|
+
"#{nindent}#{k} #{v}\n"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.unescape_parameter(v)
|
233
|
+
result = ''
|
234
|
+
v.each_char { |c| result << LiteralParser.unescape_char(c) }
|
235
|
+
result
|
236
|
+
end
|
237
|
+
|
238
|
+
def set_target_worker_id(worker_id)
|
239
|
+
@target_worker_ids = [worker_id]
|
240
|
+
@elements.each { |e|
|
241
|
+
e.set_target_worker_id(worker_id)
|
242
|
+
}
|
243
|
+
end
|
244
|
+
|
245
|
+
def set_target_worker_ids(worker_ids)
|
246
|
+
@target_worker_ids = worker_ids.uniq
|
247
|
+
@elements.each { |e|
|
248
|
+
e.set_target_worker_ids(worker_ids.uniq)
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
def for_every_workers?
|
253
|
+
@target_worker_ids.empty?
|
254
|
+
end
|
255
|
+
|
256
|
+
def for_this_worker?
|
257
|
+
@target_worker_ids.include?(Fluent::Engine.worker_id)
|
258
|
+
end
|
259
|
+
|
260
|
+
def for_another_worker?
|
261
|
+
!@target_worker_ids.empty? && !@target_worker_ids.include?(Fluent::Engine.worker_id)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
@@ -0,0 +1,32 @@
|
|
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
|
+
class ConfigError < StandardError
|
19
|
+
end
|
20
|
+
|
21
|
+
class ConfigParseError < ConfigError
|
22
|
+
end
|
23
|
+
|
24
|
+
class ObsoletedParameterError < ConfigError
|
25
|
+
end
|
26
|
+
|
27
|
+
class SetNil < Exception
|
28
|
+
end
|
29
|
+
|
30
|
+
class SetDefault < Exception
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,286 @@
|
|
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 'stringio'
|
18
|
+
|
19
|
+
require 'json'
|
20
|
+
require 'yajl'
|
21
|
+
require 'socket'
|
22
|
+
require 'ripper'
|
23
|
+
|
24
|
+
require 'fluent/config/basic_parser'
|
25
|
+
|
26
|
+
module Fluent
|
27
|
+
module Config
|
28
|
+
class LiteralParser < BasicParser
|
29
|
+
def self.unescape_char(c)
|
30
|
+
case c
|
31
|
+
when '"'
|
32
|
+
'\"'
|
33
|
+
when "'"
|
34
|
+
"\\'"
|
35
|
+
when '\\'
|
36
|
+
'\\\\'
|
37
|
+
when "\r"
|
38
|
+
'\r'
|
39
|
+
when "\n"
|
40
|
+
'\n'
|
41
|
+
when "\t"
|
42
|
+
'\t'
|
43
|
+
when "\f"
|
44
|
+
'\f'
|
45
|
+
when "\b"
|
46
|
+
'\b'
|
47
|
+
else
|
48
|
+
c
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(strscan, eval_context)
|
53
|
+
super(strscan)
|
54
|
+
@eval_context = eval_context
|
55
|
+
unless @eval_context.respond_to?(:use_nil)
|
56
|
+
def @eval_context.use_nil
|
57
|
+
raise SetNil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
unless @eval_context.respond_to?(:use_default)
|
61
|
+
def @eval_context.use_default
|
62
|
+
raise SetDefault
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_literal(string_boundary_charset = LINE_END)
|
68
|
+
spacing_without_comment
|
69
|
+
|
70
|
+
value = if skip(/\[/)
|
71
|
+
scan_json(true)
|
72
|
+
elsif skip(/\{/)
|
73
|
+
scan_json(false)
|
74
|
+
else
|
75
|
+
scan_string(string_boundary_charset)
|
76
|
+
end
|
77
|
+
value
|
78
|
+
end
|
79
|
+
|
80
|
+
def scan_string(string_boundary_charset = LINE_END)
|
81
|
+
if skip(/\"/)
|
82
|
+
return scan_double_quoted_string
|
83
|
+
elsif skip(/\'/)
|
84
|
+
return scan_single_quoted_string
|
85
|
+
else
|
86
|
+
return scan_nonquoted_string(string_boundary_charset)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def scan_double_quoted_string
|
91
|
+
string = []
|
92
|
+
while true
|
93
|
+
if skip(/\"/)
|
94
|
+
if string.include?(nil)
|
95
|
+
return nil
|
96
|
+
elsif string.include?(:default)
|
97
|
+
return :default
|
98
|
+
else
|
99
|
+
return string.join
|
100
|
+
end
|
101
|
+
elsif check(/[^"]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
|
102
|
+
if s = check(/[^\\]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
|
103
|
+
string << s
|
104
|
+
end
|
105
|
+
skip(/[^"]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
|
106
|
+
elsif s = scan(/\\./)
|
107
|
+
string << eval_escape_char(s[1,1])
|
108
|
+
elsif skip(/\#\{/)
|
109
|
+
string << eval_embedded_code(scan_embedded_code)
|
110
|
+
skip(/\}/)
|
111
|
+
elsif s = scan(/./)
|
112
|
+
string << s
|
113
|
+
else
|
114
|
+
parse_error! "unexpected end of file in a double quoted string"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def scan_single_quoted_string
|
120
|
+
string = []
|
121
|
+
while true
|
122
|
+
if skip(/\'/)
|
123
|
+
return string.join
|
124
|
+
elsif s = scan(/\\'/)
|
125
|
+
string << "'"
|
126
|
+
elsif s = scan(/\\\\/)
|
127
|
+
string << "\\"
|
128
|
+
elsif s = scan(/./)
|
129
|
+
string << s
|
130
|
+
else
|
131
|
+
parse_error! "unexpected end of file in a single quoted string"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def scan_nonquoted_string(boundary_charset = LINE_END)
|
137
|
+
charset = /(?!#{boundary_charset})./
|
138
|
+
|
139
|
+
string = []
|
140
|
+
while true
|
141
|
+
if s = scan(/\#/)
|
142
|
+
string << '#'
|
143
|
+
elsif s = scan(charset)
|
144
|
+
string << s
|
145
|
+
else
|
146
|
+
break
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
if string.empty?
|
151
|
+
return nil
|
152
|
+
end
|
153
|
+
|
154
|
+
string.join
|
155
|
+
end
|
156
|
+
|
157
|
+
def scan_embedded_code
|
158
|
+
src = '"#{'+@ss.rest+"\n=begin\n=end\n}"
|
159
|
+
|
160
|
+
seek = -1
|
161
|
+
while (seek = src.index('}', seek + 1))
|
162
|
+
unless Ripper.sexp(src[0..seek] + '"').nil? # eager parsing until valid expression
|
163
|
+
break
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
unless seek
|
168
|
+
raise Fluent::ConfigParseError, @ss.rest
|
169
|
+
end
|
170
|
+
|
171
|
+
code = src[3, seek-3]
|
172
|
+
|
173
|
+
if @ss.rest.length < code.length
|
174
|
+
@ss.pos += @ss.rest.length
|
175
|
+
parse_error! "expected end of embedded code but $end"
|
176
|
+
end
|
177
|
+
|
178
|
+
@ss.pos += code.length
|
179
|
+
|
180
|
+
'"#{' + code + '}"'
|
181
|
+
end
|
182
|
+
|
183
|
+
def eval_embedded_code(code)
|
184
|
+
if @eval_context.nil?
|
185
|
+
parse_error! "embedded code is not allowed in this file"
|
186
|
+
end
|
187
|
+
# Add hostname and worker_id to code for preventing unused warnings
|
188
|
+
code = <<EOM + code
|
189
|
+
hostname = Socket.gethostname
|
190
|
+
worker_id = ENV['SERVERENGINE_WORKER_ID'] || ''
|
191
|
+
EOM
|
192
|
+
begin
|
193
|
+
@eval_context.instance_eval(code)
|
194
|
+
rescue SetNil => e
|
195
|
+
nil
|
196
|
+
rescue SetDefault => e
|
197
|
+
:default
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def eval_escape_char(c)
|
202
|
+
case c
|
203
|
+
when '"'
|
204
|
+
'"'
|
205
|
+
when "'"
|
206
|
+
"'"
|
207
|
+
when "r"
|
208
|
+
"\r"
|
209
|
+
when "n"
|
210
|
+
"\n"
|
211
|
+
when "t"
|
212
|
+
"\t"
|
213
|
+
when "f"
|
214
|
+
"\f"
|
215
|
+
when "b"
|
216
|
+
"\b"
|
217
|
+
when "0"
|
218
|
+
"\0"
|
219
|
+
when /[a-zA-Z0-9]/
|
220
|
+
parse_error! "unexpected back-slash escape character '#{c}'"
|
221
|
+
else # symbols
|
222
|
+
c
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def scan_json(is_array)
|
227
|
+
result = nil
|
228
|
+
# Yajl does not raise ParseError for incomplete json string, like '[1', '{"h"', '{"h":' or '{"h1":1'
|
229
|
+
# This is the reason to use JSON module.
|
230
|
+
|
231
|
+
buffer = (is_array ? "[" : "{")
|
232
|
+
line_buffer = ""
|
233
|
+
|
234
|
+
until result
|
235
|
+
char = getch
|
236
|
+
|
237
|
+
break if char.nil?
|
238
|
+
|
239
|
+
if char == "#"
|
240
|
+
# If this is out of json string literals, this object can be parsed correctly
|
241
|
+
# '{"foo":"bar", #' -> '{"foo":"bar"}' (to check)
|
242
|
+
parsed = nil
|
243
|
+
begin
|
244
|
+
parsed = JSON.parse(buffer + line_buffer.rstrip.sub(/,$/, '') + (is_array ? "]" : "}"))
|
245
|
+
rescue JSON::ParserError
|
246
|
+
# This '#' is in json string literals
|
247
|
+
end
|
248
|
+
|
249
|
+
if parsed
|
250
|
+
# ignore chars as comment before newline
|
251
|
+
while (char = getch) != "\n"
|
252
|
+
# ignore comment char
|
253
|
+
end
|
254
|
+
buffer << line_buffer + "\n"
|
255
|
+
line_buffer = ""
|
256
|
+
else
|
257
|
+
# '#' is a char in json string
|
258
|
+
line_buffer << char
|
259
|
+
end
|
260
|
+
|
261
|
+
next # This char '#' MUST NOT terminate json object.
|
262
|
+
end
|
263
|
+
|
264
|
+
if char == "\n"
|
265
|
+
buffer << line_buffer + "\n"
|
266
|
+
line_buffer = ""
|
267
|
+
next
|
268
|
+
end
|
269
|
+
|
270
|
+
line_buffer << char
|
271
|
+
begin
|
272
|
+
result = JSON.parse(buffer + line_buffer)
|
273
|
+
rescue JSON::ParserError
|
274
|
+
# Incomplete json string yet
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
unless result
|
279
|
+
parse_error! "got incomplete JSON #{is_array ? 'array' : 'hash'} configuration"
|
280
|
+
end
|
281
|
+
|
282
|
+
JSON.dump(result)
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
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
|
+
require 'uri'
|
18
|
+
|
19
|
+
require 'fluent/config/error'
|
20
|
+
require 'fluent/config/element'
|
21
|
+
|
22
|
+
module Fluent
|
23
|
+
module Config
|
24
|
+
class Parser
|
25
|
+
def self.parse(io, fname, basepath = Dir.pwd)
|
26
|
+
attrs, elems = Parser.new(basepath, io.each_line, fname).parse!(true)
|
27
|
+
Element.new('ROOT', '', attrs, elems)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(basepath, iterator, fname, i = 0)
|
31
|
+
@basepath = basepath
|
32
|
+
@iterator = iterator
|
33
|
+
@i = i
|
34
|
+
@fname = fname
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse!(allow_include, elem_name = nil, attrs = {}, elems = [])
|
38
|
+
while line = @iterator.next
|
39
|
+
line.force_encoding('UTF-8')
|
40
|
+
@i += 1
|
41
|
+
line.lstrip!
|
42
|
+
line.gsub!(/\s*(?:\#.*)?$/,'')
|
43
|
+
if line.empty?
|
44
|
+
next
|
45
|
+
elsif m = /^\<include\s*(.*)\s*\/\>$/.match(line)
|
46
|
+
value = m[1].strip
|
47
|
+
process_include(attrs, elems, value, allow_include)
|
48
|
+
elsif m = /^\<([a-zA-Z0-9_]+)\s*(.+?)?\>$/.match(line)
|
49
|
+
e_name = m[1]
|
50
|
+
e_arg = m[2] || ""
|
51
|
+
e_attrs, e_elems = parse!(false, e_name)
|
52
|
+
elems << Element.new(e_name, e_arg, e_attrs, e_elems)
|
53
|
+
elsif line == "</#{elem_name}>"
|
54
|
+
break
|
55
|
+
elsif m = /^([a-zA-Z0-9_]+)\s*(.*)$/.match(line)
|
56
|
+
key = m[1]
|
57
|
+
value = m[2]
|
58
|
+
if allow_include && key == 'include'
|
59
|
+
process_include(attrs, elems, value)
|
60
|
+
else
|
61
|
+
attrs[key] = value
|
62
|
+
end
|
63
|
+
next
|
64
|
+
else
|
65
|
+
raise ConfigParseError, "parse error at #{@fname} line #{@i}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
return attrs, elems
|
70
|
+
rescue StopIteration
|
71
|
+
return attrs, elems
|
72
|
+
end
|
73
|
+
|
74
|
+
def process_include(attrs, elems, uri, allow_include = true)
|
75
|
+
u = URI.parse(uri)
|
76
|
+
if u.scheme == 'file' || u.path == uri # file path
|
77
|
+
path = u.path
|
78
|
+
if path[0] != ?/
|
79
|
+
pattern = File.expand_path("#{@basepath}/#{path}")
|
80
|
+
else
|
81
|
+
pattern = path
|
82
|
+
end
|
83
|
+
|
84
|
+
Dir.glob(pattern).sort.each { |entry|
|
85
|
+
basepath = File.dirname(entry)
|
86
|
+
fname = File.basename(entry)
|
87
|
+
File.open(entry) { |f|
|
88
|
+
Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
else
|
93
|
+
basepath = '/'
|
94
|
+
fname = path
|
95
|
+
require 'open-uri'
|
96
|
+
URI.open(uri) {|f|
|
97
|
+
Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
rescue SystemCallError => e
|
102
|
+
raise ConfigParseError, "include error at #{@fname} line #{@i}: #{e.to_s}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|