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,180 @@
|
|
|
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 'optparse'
|
|
18
|
+
require 'fluent/env'
|
|
19
|
+
require 'fluent/version'
|
|
20
|
+
if Fluent.windows?
|
|
21
|
+
require 'win32/event'
|
|
22
|
+
require 'win32/service'
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
module Fluent
|
|
26
|
+
class Ctl
|
|
27
|
+
DEFAULT_OPTIONS = {}
|
|
28
|
+
|
|
29
|
+
if Fluent.windows?
|
|
30
|
+
include Windows::ServiceConstants
|
|
31
|
+
include Windows::ServiceStructs
|
|
32
|
+
include Windows::ServiceFunctions
|
|
33
|
+
|
|
34
|
+
COMMAND_MAP = {
|
|
35
|
+
shutdown: "",
|
|
36
|
+
restart: "HUP",
|
|
37
|
+
flush: "USR1",
|
|
38
|
+
reload: "USR2",
|
|
39
|
+
dump: "CONT",
|
|
40
|
+
}
|
|
41
|
+
WINSVC_CONTROL_CODE_MAP = {
|
|
42
|
+
shutdown: SERVICE_CONTROL_STOP,
|
|
43
|
+
# 128 - 255: user-defined control code
|
|
44
|
+
# See https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-controlservice
|
|
45
|
+
restart: 128,
|
|
46
|
+
flush: 129,
|
|
47
|
+
reload: SERVICE_CONTROL_PARAMCHANGE,
|
|
48
|
+
dump: 130,
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
COMMAND_MAP = {
|
|
52
|
+
shutdown: :TERM,
|
|
53
|
+
restart: :HUP,
|
|
54
|
+
flush: :USR1,
|
|
55
|
+
reload: :USR2,
|
|
56
|
+
dump: :CONT,
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def initialize(argv = ARGV)
|
|
61
|
+
@argv = argv
|
|
62
|
+
@options = {}
|
|
63
|
+
@opt_parser = OptionParser.new
|
|
64
|
+
configure_option_parser
|
|
65
|
+
@options.merge!(DEFAULT_OPTIONS)
|
|
66
|
+
parse_options!
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def help_text
|
|
70
|
+
text = "\n"
|
|
71
|
+
if Fluent.windows?
|
|
72
|
+
text << "Usage: #{$PROGRAM_NAME} COMMAND [PID_OR_SVCNAME]\n"
|
|
73
|
+
else
|
|
74
|
+
text << "Usage: #{$PROGRAM_NAME} COMMAND PID\n"
|
|
75
|
+
end
|
|
76
|
+
text << "\n"
|
|
77
|
+
text << "Commands: \n"
|
|
78
|
+
COMMAND_MAP.each do |key, value|
|
|
79
|
+
text << " #{key}\n"
|
|
80
|
+
end
|
|
81
|
+
text
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def usage(msg = nil)
|
|
85
|
+
puts help_text
|
|
86
|
+
if msg
|
|
87
|
+
puts
|
|
88
|
+
puts "Error: #{msg}"
|
|
89
|
+
end
|
|
90
|
+
exit 1
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def call
|
|
94
|
+
if Fluent.windows?
|
|
95
|
+
if /^[0-9]+$/.match?(@pid_or_svcname)
|
|
96
|
+
# Use as PID
|
|
97
|
+
return call_windows_event(@command, "fluentd_#{@pid_or_svcname}")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
unless call_winsvc_control_code(@command, @pid_or_svcname)
|
|
101
|
+
puts "Cannot send control code to #{@pid_or_svcname} service, try to send an event with this name ..."
|
|
102
|
+
call_windows_event(@command, @pid_or_svcname)
|
|
103
|
+
end
|
|
104
|
+
else
|
|
105
|
+
call_signal(@command, @pid_or_svcname)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def call_signal(command, pid)
|
|
112
|
+
signal = COMMAND_MAP[command.to_sym]
|
|
113
|
+
Process.kill(signal, pid.to_i)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def call_winsvc_control_code(command, pid_or_svcname)
|
|
117
|
+
status = SERVICE_STATUS.new
|
|
118
|
+
|
|
119
|
+
begin
|
|
120
|
+
handle_scm = OpenSCManager(nil, nil, SC_MANAGER_CONNECT)
|
|
121
|
+
FFI.raise_windows_error('OpenSCManager') if handle_scm == 0
|
|
122
|
+
|
|
123
|
+
handle_scs = OpenService(handle_scm, "fluentdwinsvc", SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_USER_DEFINED_CONTROL)
|
|
124
|
+
FFI.raise_windows_error('OpenService') if handle_scs == 0
|
|
125
|
+
|
|
126
|
+
control_code = WINSVC_CONTROL_CODE_MAP[command.to_sym]
|
|
127
|
+
|
|
128
|
+
unless ControlService(handle_scs, control_code, status)
|
|
129
|
+
FFI.raise_windows_error('ControlService')
|
|
130
|
+
end
|
|
131
|
+
rescue => e
|
|
132
|
+
puts e
|
|
133
|
+
state = status[:dwCurrentState]
|
|
134
|
+
return state == SERVICE_STOPPED || state == SERVICE_STOP_PENDING
|
|
135
|
+
ensure
|
|
136
|
+
CloseServiceHandle(handle_scs)
|
|
137
|
+
CloseServiceHandle(handle_scm)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
return true
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def call_windows_event(command, pid_or_svcname)
|
|
144
|
+
prefix = pid_or_svcname
|
|
145
|
+
event_name = COMMAND_MAP[command.to_sym]
|
|
146
|
+
suffix = event_name.empty? ? "" : "_#{event_name}"
|
|
147
|
+
|
|
148
|
+
begin
|
|
149
|
+
event = Win32::Event.open("#{prefix}#{suffix}")
|
|
150
|
+
event.set
|
|
151
|
+
event.close
|
|
152
|
+
rescue Errno::ENOENT
|
|
153
|
+
puts "Error: Cannot find the fluentd process with the event name: \"#{prefix}\""
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def configure_option_parser
|
|
158
|
+
@opt_parser.banner = help_text
|
|
159
|
+
@opt_parser.version = Fluent::VERSION
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def parse_options!
|
|
163
|
+
@opt_parser.parse!(@argv)
|
|
164
|
+
|
|
165
|
+
@command = @argv[0]
|
|
166
|
+
@pid_or_svcname = @argv[1] || "fluentdwinsvc"
|
|
167
|
+
|
|
168
|
+
usage("Command isn't specified!") if @command.nil? || @command.empty?
|
|
169
|
+
usage("Unknown command: #{@command}") unless COMMAND_MAP.has_key?(@command.to_sym)
|
|
170
|
+
|
|
171
|
+
if Fluent.windows?
|
|
172
|
+
usage("PID or SVCNAME isn't specified!") if @pid_or_svcname.nil? || @pid_or_svcname.empty?
|
|
173
|
+
else
|
|
174
|
+
usage("PID isn't specified!") if @pid_or_svcname.nil? || @pid_or_svcname.empty?
|
|
175
|
+
usage("Invalid PID: #{pid}") unless /^[0-9]+$/.match?(@pid_or_svcname)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
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 'optparse'
|
|
18
|
+
|
|
19
|
+
op = OptionParser.new
|
|
20
|
+
|
|
21
|
+
host = '127.0.0.1'
|
|
22
|
+
port = 24230
|
|
23
|
+
unix = nil
|
|
24
|
+
|
|
25
|
+
op.on('-h', '--host HOST', "fluent host (default: #{host})") {|s|
|
|
26
|
+
host = s
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
op.on('-p', '--port PORT', "debug_agent tcp port (default: #{port})", Integer) {|i|
|
|
30
|
+
port = i
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
op.on('-u', '--unix PATH', "use unix socket instead of tcp") {|b|
|
|
34
|
+
unix = b
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
singleton_class.module_eval do
|
|
38
|
+
define_method(:usage) do |msg|
|
|
39
|
+
puts op.to_s
|
|
40
|
+
puts "error: #{msg}" if msg
|
|
41
|
+
exit 1
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
begin
|
|
46
|
+
op.parse!(ARGV)
|
|
47
|
+
|
|
48
|
+
if ARGV.length != 0
|
|
49
|
+
usage nil
|
|
50
|
+
end
|
|
51
|
+
rescue
|
|
52
|
+
usage $!.to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
require 'drb/drb'
|
|
56
|
+
|
|
57
|
+
if unix
|
|
58
|
+
uri = "drbunix:#{unix}"
|
|
59
|
+
else
|
|
60
|
+
uri = "druby://#{host}:#{port}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
require 'fluent/log'
|
|
64
|
+
require 'fluent/env'
|
|
65
|
+
require 'fluent/engine'
|
|
66
|
+
require 'fluent/system_config'
|
|
67
|
+
require 'serverengine'
|
|
68
|
+
|
|
69
|
+
include Fluent::SystemConfig::Mixin
|
|
70
|
+
|
|
71
|
+
dl_opts = {}
|
|
72
|
+
dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
|
|
73
|
+
logger = ServerEngine::DaemonLogger.new(STDERR, dl_opts)
|
|
74
|
+
$log = Fluent::Log.new(logger)
|
|
75
|
+
Fluent::Engine.init(system_config)
|
|
76
|
+
|
|
77
|
+
DRb::DRbObject.class_eval do
|
|
78
|
+
undef_method :methods
|
|
79
|
+
undef_method :instance_eval
|
|
80
|
+
undef_method :instance_variables
|
|
81
|
+
undef_method :instance_variable_get
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
remote_engine = DRb::DRbObject.new_with_uri(uri)
|
|
85
|
+
|
|
86
|
+
Fluent.module_eval do
|
|
87
|
+
remove_const(:Engine)
|
|
88
|
+
const_set(:Engine, remote_engine)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
include Fluent
|
|
92
|
+
|
|
93
|
+
puts "Connected to #{uri}."
|
|
94
|
+
puts "Usage:"
|
|
95
|
+
puts " Fluent::Engine.root_agent.event_router.match('some.tag') : get an output plugin instance"
|
|
96
|
+
puts " Fluent::Engine.root_agent.inputs[i] : get input plugin instances"
|
|
97
|
+
puts " Fluent::Plugin::OUTPUT_REGISTRY.lookup(name) : load output plugin class (use this if you get DRb::DRbUnknown)"
|
|
98
|
+
puts ""
|
|
99
|
+
|
|
100
|
+
Encoding.default_internal = nil if Encoding.respond_to?(:default_internal)
|
|
101
|
+
|
|
102
|
+
require 'irb'
|
|
103
|
+
IRB.start
|
|
@@ -0,0 +1,385 @@
|
|
|
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 'optparse'
|
|
18
|
+
|
|
19
|
+
require 'fluent/supervisor'
|
|
20
|
+
require 'fluent/log'
|
|
21
|
+
require 'fluent/env'
|
|
22
|
+
require 'fluent/version'
|
|
23
|
+
|
|
24
|
+
$fluentdargv = Marshal.load(Marshal.dump(ARGV))
|
|
25
|
+
|
|
26
|
+
op = OptionParser.new
|
|
27
|
+
op.version = Fluent::VERSION
|
|
28
|
+
|
|
29
|
+
default_opts = Fluent::Supervisor.default_options
|
|
30
|
+
cmd_opts = {}
|
|
31
|
+
|
|
32
|
+
op.on('-s', "--setup [DIR=#{File.dirname(Fluent::DEFAULT_CONFIG_PATH)}]", "install sample configuration file to the directory") {|s|
|
|
33
|
+
cmd_opts[:setup_path] = s || File.dirname(Fluent::DEFAULT_CONFIG_PATH)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
op.on('-c', '--config PATH', "config file path (default: #{Fluent::DEFAULT_CONFIG_PATH})") {|s|
|
|
37
|
+
cmd_opts[:config_path] = s
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
op.on('--dry-run', "Check fluentd setup is correct or not", TrueClass) {|b|
|
|
41
|
+
cmd_opts[:dry_run] = b
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
op.on('--show-plugin-config=PLUGIN', "[DEPRECATED] Show PLUGIN configuration and exit(ex: input:dummy)") {|plugin|
|
|
45
|
+
cmd_opts[:show_plugin_config] = plugin
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
op.on('-p', '--plugin DIR', "add plugin directory") {|s|
|
|
49
|
+
(cmd_opts[:plugin_dirs] ||= default_opts[:plugin_dirs]) << s
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
op.on('-I PATH', "add library path") {|s|
|
|
53
|
+
$LOAD_PATH << s
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
op.on('-r NAME', "load library") {|s|
|
|
57
|
+
(cmd_opts[:libs] ||= []) << s
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
op.on('-d', '--daemon PIDFILE', "daemonize fluent process") {|s|
|
|
61
|
+
cmd_opts[:daemonize] = s
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
op.on('--under-supervisor', "run fluent worker under supervisor (this option is NOT for users)") {
|
|
65
|
+
cmd_opts[:supervise] = false
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
op.on('--no-supervisor', "run fluent worker without supervisor") {
|
|
69
|
+
cmd_opts[:supervise] = false
|
|
70
|
+
cmd_opts[:standalone_worker] = true
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
op.on('--workers NUM', "specify the number of workers under supervisor") { |i|
|
|
74
|
+
cmd_opts[:workers] = i.to_i
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
op.on('--user USER', "change user") {|s|
|
|
78
|
+
cmd_opts[:chuser] = s
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
op.on('--group GROUP', "change group") {|s|
|
|
82
|
+
cmd_opts[:chgroup] = s
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
op.on('--umask UMASK', "change umask") {|s|
|
|
86
|
+
cmd_opts[:chumask] = s
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
op.on('-o', '--log PATH', "log file path") {|s|
|
|
90
|
+
cmd_opts[:log_path] = s
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
op.on('--log-rotate-age AGE', 'generations to keep rotated log files') {|age|
|
|
94
|
+
if Fluent::Log::LOG_ROTATE_AGE.include?(age)
|
|
95
|
+
cmd_opts[:log_rotate_age] = age
|
|
96
|
+
else
|
|
97
|
+
begin
|
|
98
|
+
cmd_opts[:log_rotate_age] = Integer(age)
|
|
99
|
+
rescue TypeError, ArgumentError
|
|
100
|
+
usage "log-rotate-age should be #{ROTATE_AGE.join(', ')} or a number"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
op.on('--log-rotate-size BYTES', 'sets the byte size to rotate log files') {|s|
|
|
106
|
+
cmd_opts[:log_rotate_size] = s.to_i
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
op.on('--log-event-verbose', 'enable log events during process startup/shutdown') {|b|
|
|
110
|
+
cmd_opts[:log_event_verbose] = b
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
op.on('-i', '--inline-config CONFIG_STRING', "inline config which is appended to the config file on-the-fly") {|s|
|
|
114
|
+
cmd_opts[:inline_config] = s
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
op.on('--emit-error-log-interval SECONDS', "suppress interval seconds of emit error logs") {|s|
|
|
118
|
+
cmd_opts[:suppress_interval] = s.to_i
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
op.on('--suppress-repeated-stacktrace [VALUE]', "suppress repeated stacktrace", TrueClass) {|b|
|
|
122
|
+
b = true if b.nil?
|
|
123
|
+
cmd_opts[:suppress_repeated_stacktrace] = b
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
op.on('--without-source', "invoke a fluentd without input plugins", TrueClass) {|b|
|
|
127
|
+
cmd_opts[:without_source] = b
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
unless Fluent.windows?
|
|
131
|
+
op.on('--with-source-only', "Invoke a fluentd only with input plugins. The data is stored in a temporary buffer. Send SIGWINCH to cancel this mode and process the data (Not supported on Windows).", TrueClass) {|b|
|
|
132
|
+
cmd_opts[:with_source_only] = b
|
|
133
|
+
}
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
op.on('--config-file-type VALUE', 'guessing file type of fluentd configuration. yaml/yml or guess') { |s|
|
|
137
|
+
if (s == 'yaml') || (s == 'yml')
|
|
138
|
+
cmd_opts[:config_file_type] = s.to_sym
|
|
139
|
+
elsif (s == 'guess')
|
|
140
|
+
cmd_opts[:config_file_type] = s.to_sym
|
|
141
|
+
else
|
|
142
|
+
usage '--config-file-type accepts yaml/yml or guess'
|
|
143
|
+
end
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
op.on('--use-v1-config', "Use v1 configuration format (default)", TrueClass) {|b|
|
|
147
|
+
cmd_opts[:use_v1_config] = b
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
op.on('--use-v0-config', "Use v0 configuration format", TrueClass) {|b|
|
|
151
|
+
cmd_opts[:use_v1_config] = !b
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
op.on('--strict-config-value', "Parse config values strictly", TrueClass) {|b|
|
|
155
|
+
cmd_opts[:strict_config_value] = b
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
op.on('--enable-input-metrics', "[DEPRECATED] Enable input plugin metrics on fluentd", TrueClass) {|b|
|
|
159
|
+
cmd_opts[:enable_input_metrics] = b
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
op.on('--disable-input-metrics', "Disable input plugin metrics on fluentd", FalseClass) {|b|
|
|
163
|
+
cmd_opts[:enable_input_metrics] = b
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
op.on('--enable-size-metrics', "Enable plugin record size metrics on fluentd", TrueClass) {|b|
|
|
167
|
+
cmd_opts[:enable_size_metrics] = b
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
op.on('-v', '--verbose', "increase verbose level (-v: debug, -vv: trace)", TrueClass) {|b|
|
|
171
|
+
return unless b
|
|
172
|
+
cur_level = cmd_opts.fetch(:log_level, default_opts[:log_level])
|
|
173
|
+
cmd_opts[:log_level] = [cur_level - 1, Fluent::Log::LEVEL_TRACE].max
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
op.on('-q', '--quiet', "decrease verbose level (-q: warn, -qq: error)", TrueClass) {|b|
|
|
177
|
+
return unless b
|
|
178
|
+
cur_level = cmd_opts.fetch(:log_level, default_opts[:log_level])
|
|
179
|
+
cmd_opts[:log_level] = [cur_level + 1, Fluent::Log::LEVEL_ERROR].min
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
op.on('--suppress-config-dump', "suppress config dumping when fluentd starts", TrueClass) {|b|
|
|
183
|
+
cmd_opts[:suppress_config_dump] = b
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
op.on('-g', '--gemfile GEMFILE', "Gemfile path") {|s|
|
|
187
|
+
cmd_opts[:gemfile] = s
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
op.on('-G', '--gem-path GEM_INSTALL_PATH', "Gemfile install path (default: $(dirname $gemfile)/vendor/bundle)") {|s|
|
|
191
|
+
cmd_opts[:gem_install_path] = s
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
op.on('--conf-encoding ENCODING', "specify configuration file encoding") { |s|
|
|
195
|
+
cmd_opts[:conf_encoding] = s
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
op.on('--disable-shared-socket', "Don't open shared socket for multiple workers") { |b|
|
|
199
|
+
cmd_opts[:disable_shared_socket] = b
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if Fluent.windows?
|
|
203
|
+
cmd_opts.merge!(
|
|
204
|
+
:winsvc_name => 'fluentdwinsvc',
|
|
205
|
+
:winsvc_display_name => 'Fluentd Windows Service',
|
|
206
|
+
:winsvc_desc => 'Fluentd is an event collector system.',
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
op.on('-x', '--signame INTSIGNAME', "an object name which is used for Windows Service signal (Windows only)") {|s|
|
|
210
|
+
cmd_opts[:signame] = s
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
op.on('--reg-winsvc MODE', "install/uninstall as Windows Service. (i: install, u: uninstall) (Windows only)") {|s|
|
|
214
|
+
cmd_opts[:regwinsvc] = s
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
op.on('--[no-]reg-winsvc-auto-start', "Automatically start the Windows Service at boot. (only effective with '--reg-winsvc i') (Windows only)") {|s|
|
|
218
|
+
cmd_opts[:regwinsvcautostart] = s
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
op.on('--[no-]reg-winsvc-delay-start', "Automatically start the Windows Service at boot with delay. (only effective with '--reg-winsvc i' and '--reg-winsvc-auto-start') (Windows only)") {|s|
|
|
222
|
+
cmd_opts[:regwinsvcdelaystart] = s
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
op.on('--reg-winsvc-fluentdopt OPTION', "specify fluentd option parameters for Windows Service. (Windows only)") {|s|
|
|
226
|
+
cmd_opts[:fluentdopt] = s
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
op.on('--winsvc-name NAME', "The Windows Service name to run as (Windows only)") {|s|
|
|
230
|
+
cmd_opts[:winsvc_name] = s
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
op.on('--winsvc-display-name DISPLAY_NAME', "The Windows Service display name (Windows only)") {|s|
|
|
234
|
+
cmd_opts[:winsvc_display_name] = s
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
op.on('--winsvc-desc DESC', "The Windows Service description (Windows only)") {|s|
|
|
238
|
+
cmd_opts[:winsvc_desc] = s
|
|
239
|
+
}
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
singleton_class.module_eval do
|
|
244
|
+
define_method(:usage) do |msg|
|
|
245
|
+
puts op.to_s
|
|
246
|
+
puts "error: #{msg}" if msg
|
|
247
|
+
exit 1
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
begin
|
|
252
|
+
rest = op.parse(ARGV)
|
|
253
|
+
|
|
254
|
+
if rest.length != 0
|
|
255
|
+
usage nil
|
|
256
|
+
end
|
|
257
|
+
rescue
|
|
258
|
+
usage $!.to_s
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
opts = default_opts.merge(cmd_opts)
|
|
262
|
+
|
|
263
|
+
##
|
|
264
|
+
## Bundler injection
|
|
265
|
+
#
|
|
266
|
+
if ENV['FLUENTD_DISABLE_BUNDLER_INJECTION'] != '1' && gemfile = opts[:gemfile]
|
|
267
|
+
ENV['BUNDLE_GEMFILE'] = gemfile
|
|
268
|
+
if path = opts[:gem_install_path]
|
|
269
|
+
ENV['BUNDLE_PATH'] = path
|
|
270
|
+
else
|
|
271
|
+
ENV['BUNDLE_PATH'] = File.expand_path(File.join(File.dirname(gemfile), 'vendor/bundle'))
|
|
272
|
+
end
|
|
273
|
+
ENV['FLUENTD_DISABLE_BUNDLER_INJECTION'] = '1'
|
|
274
|
+
load File.expand_path(File.join(File.dirname(__FILE__), 'bundler_injection.rb'))
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
if setup_path = opts[:setup_path]
|
|
278
|
+
require 'fileutils'
|
|
279
|
+
FileUtils.mkdir_p File.join(setup_path, "plugin")
|
|
280
|
+
confpath = File.join(setup_path, "fluent.conf")
|
|
281
|
+
if File.exist?(confpath)
|
|
282
|
+
puts "#{confpath} already exists."
|
|
283
|
+
else
|
|
284
|
+
File.open(confpath, "w") {|f|
|
|
285
|
+
conf = File.read File.join(File.dirname(__FILE__), "..", "..", "..", "fluent.conf")
|
|
286
|
+
f.write conf
|
|
287
|
+
}
|
|
288
|
+
puts "Installed #{confpath}."
|
|
289
|
+
end
|
|
290
|
+
exit 0
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
early_exit = false
|
|
294
|
+
start_service = false
|
|
295
|
+
if winsvcinstmode = opts[:regwinsvc]
|
|
296
|
+
require 'fileutils'
|
|
297
|
+
require "win32/service"
|
|
298
|
+
require "win32/registry"
|
|
299
|
+
include Win32
|
|
300
|
+
|
|
301
|
+
case winsvcinstmode
|
|
302
|
+
when 'i'
|
|
303
|
+
binary_path = File.join(File.dirname(__FILE__), "..")
|
|
304
|
+
ruby_path = ServerEngine.ruby_bin_path
|
|
305
|
+
start_type = Service::DEMAND_START
|
|
306
|
+
if opts[:regwinsvcautostart]
|
|
307
|
+
start_type = Service::AUTO_START
|
|
308
|
+
start_service = true
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
Service.create(
|
|
313
|
+
service_name: opts[:winsvc_name],
|
|
314
|
+
host: nil,
|
|
315
|
+
service_type: Service::WIN32_OWN_PROCESS,
|
|
316
|
+
description: opts[:winsvc_desc],
|
|
317
|
+
start_type: start_type,
|
|
318
|
+
error_control: Service::ERROR_NORMAL,
|
|
319
|
+
binary_path_name: "\"#{ruby_path}\" -C \"#{binary_path}\" winsvc.rb --service-name #{opts[:winsvc_name]}",
|
|
320
|
+
load_order_group: "",
|
|
321
|
+
dependencies: [""],
|
|
322
|
+
display_name: opts[:winsvc_display_name]
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
if opts[:regwinsvcdelaystart]
|
|
326
|
+
Service.configure(
|
|
327
|
+
service_name: opts[:winsvc_name],
|
|
328
|
+
delayed_start: true
|
|
329
|
+
)
|
|
330
|
+
end
|
|
331
|
+
when 'u'
|
|
332
|
+
if Service.status(opts[:winsvc_name]).current_state != 'stopped'
|
|
333
|
+
begin
|
|
334
|
+
Service.stop(opts[:winsvc_name])
|
|
335
|
+
rescue => ex
|
|
336
|
+
puts "Warning: Failed to stop service: ", ex
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
Service.delete(opts[:winsvc_name])
|
|
340
|
+
else
|
|
341
|
+
# none
|
|
342
|
+
end
|
|
343
|
+
early_exit = true
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
if fluentdopt = opts[:fluentdopt]
|
|
347
|
+
require "win32/registry"
|
|
348
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\#{opts[:winsvc_name]}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
|
|
349
|
+
reg['fluentdopt', Win32::Registry::REG_SZ] = fluentdopt
|
|
350
|
+
end
|
|
351
|
+
early_exit = true
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
if start_service
|
|
355
|
+
Service.start(opts[:winsvc_name])
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
exit 0 if early_exit
|
|
359
|
+
|
|
360
|
+
if opts[:supervise]
|
|
361
|
+
supervisor = Fluent::Supervisor.new(cmd_opts)
|
|
362
|
+
supervisor.configure(supervisor: true)
|
|
363
|
+
supervisor.run_supervisor(dry_run: opts[:dry_run])
|
|
364
|
+
else
|
|
365
|
+
if opts[:standalone_worker] && opts[:workers] && opts[:workers] > 1
|
|
366
|
+
puts "Error: multi workers is not supported with --no-supervisor"
|
|
367
|
+
exit 2
|
|
368
|
+
end
|
|
369
|
+
worker = Fluent::Supervisor.new(cmd_opts)
|
|
370
|
+
worker.configure
|
|
371
|
+
|
|
372
|
+
if opts[:daemonize] && opts[:standalone_worker]
|
|
373
|
+
require 'fluent/daemonizer'
|
|
374
|
+
args = ARGV.dup
|
|
375
|
+
i = args.index('--daemon')
|
|
376
|
+
args.delete_at(i + 1) # value of --daemon
|
|
377
|
+
args.delete_at(i) # --daemon itself
|
|
378
|
+
|
|
379
|
+
Fluent::Daemonizer.daemonize(opts[:daemonize], args) do
|
|
380
|
+
worker.run_worker
|
|
381
|
+
end
|
|
382
|
+
else
|
|
383
|
+
worker.run_worker
|
|
384
|
+
end
|
|
385
|
+
end
|