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.
Files changed (341) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +116 -0
  3. data/ADOPTERS.md +5 -0
  4. data/AGENTS.md +46 -0
  5. data/AUTHORS +2 -0
  6. data/CHANGELOG.md +3324 -0
  7. data/CONTRIBUTING.md +45 -0
  8. data/GOVERNANCE.md +55 -0
  9. data/GithubWorkflow.md +78 -0
  10. data/LICENSE +202 -0
  11. data/MAINTAINERS.md +19 -0
  12. data/README.md +73 -0
  13. data/Rakefile +89 -0
  14. data/SECURITY.md +47 -0
  15. data/bin/fluent-binlog-reader +7 -0
  16. data/bin/fluent-ca-generate +6 -0
  17. data/bin/fluent-cap-ctl +7 -0
  18. data/bin/fluent-cat +5 -0
  19. data/bin/fluent-ctl +7 -0
  20. data/bin/fluent-debug +5 -0
  21. data/bin/fluent-gem +9 -0
  22. data/bin/fluent-plugin-config-format +5 -0
  23. data/bin/fluent-plugin-generate +5 -0
  24. data/bin/fluentd +15 -0
  25. data/code-of-conduct.md +3 -0
  26. data/docs/SECURITY_AUDIT.pdf +0 -0
  27. data/example/copy_roundrobin.conf +39 -0
  28. data/example/counter.conf +18 -0
  29. data/example/filter_stdout.conf +22 -0
  30. data/example/in_forward.conf +14 -0
  31. data/example/in_forward_client.conf +37 -0
  32. data/example/in_forward_shared_key.conf +15 -0
  33. data/example/in_forward_tls.conf +14 -0
  34. data/example/in_forward_users.conf +24 -0
  35. data/example/in_forward_workers.conf +21 -0
  36. data/example/in_http.conf +16 -0
  37. data/example/in_out_forward.conf +17 -0
  38. data/example/in_sample_blocks.conf +17 -0
  39. data/example/in_sample_with_compression.conf +23 -0
  40. data/example/in_syslog.conf +15 -0
  41. data/example/in_tail.conf +14 -0
  42. data/example/in_tcp.conf +13 -0
  43. data/example/in_udp.conf +13 -0
  44. data/example/logevents.conf +25 -0
  45. data/example/multi_filters.conf +61 -0
  46. data/example/out_copy.conf +20 -0
  47. data/example/out_exec_filter.conf +42 -0
  48. data/example/out_file.conf +13 -0
  49. data/example/out_forward.conf +35 -0
  50. data/example/out_forward_buf_file.conf +23 -0
  51. data/example/out_forward_client.conf +109 -0
  52. data/example/out_forward_heartbeat_none.conf +16 -0
  53. data/example/out_forward_sd.conf +17 -0
  54. data/example/out_forward_shared_key.conf +36 -0
  55. data/example/out_forward_tls.conf +18 -0
  56. data/example/out_forward_users.conf +65 -0
  57. data/example/out_null.conf +36 -0
  58. data/example/sd.yaml +8 -0
  59. data/example/secondary_file.conf +42 -0
  60. data/example/suppress_config_dump.conf +7 -0
  61. data/example/v0_12_filter.conf +78 -0
  62. data/example/v1_literal_example.conf +36 -0
  63. data/example/worker_section.conf +36 -0
  64. data/fluent.conf +139 -0
  65. data/lib/fluent/agent.rb +168 -0
  66. data/lib/fluent/capability.rb +87 -0
  67. data/lib/fluent/clock.rb +66 -0
  68. data/lib/fluent/command/binlog_reader.rb +244 -0
  69. data/lib/fluent/command/bundler_injection.rb +45 -0
  70. data/lib/fluent/command/ca_generate.rb +184 -0
  71. data/lib/fluent/command/cap_ctl.rb +174 -0
  72. data/lib/fluent/command/cat.rb +365 -0
  73. data/lib/fluent/command/ctl.rb +180 -0
  74. data/lib/fluent/command/debug.rb +103 -0
  75. data/lib/fluent/command/fluentd.rb +385 -0
  76. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  77. data/lib/fluent/command/plugin_generator.rb +365 -0
  78. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  79. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  80. data/lib/fluent/compat/exec_util.rb +144 -0
  81. data/lib/fluent/compat/file_util.rb +54 -0
  82. data/lib/fluent/compat/filter.rb +68 -0
  83. data/lib/fluent/compat/formatter.rb +117 -0
  84. data/lib/fluent/compat/formatter_utils.rb +85 -0
  85. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  86. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  87. data/lib/fluent/compat/input.rb +49 -0
  88. data/lib/fluent/compat/output.rb +721 -0
  89. data/lib/fluent/compat/output_chain.rb +60 -0
  90. data/lib/fluent/compat/parser.rb +310 -0
  91. data/lib/fluent/compat/parser_utils.rb +40 -0
  92. data/lib/fluent/compat/propagate_default.rb +62 -0
  93. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  94. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  95. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  96. data/lib/fluent/compat/socket_util.rb +165 -0
  97. data/lib/fluent/compat/string_util.rb +34 -0
  98. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  99. data/lib/fluent/compat/type_converter.rb +90 -0
  100. data/lib/fluent/config/basic_parser.rb +122 -0
  101. data/lib/fluent/config/configure_proxy.rb +424 -0
  102. data/lib/fluent/config/dsl.rb +152 -0
  103. data/lib/fluent/config/element.rb +265 -0
  104. data/lib/fluent/config/error.rb +44 -0
  105. data/lib/fluent/config/literal_parser.rb +305 -0
  106. data/lib/fluent/config/parser.rb +119 -0
  107. data/lib/fluent/config/section.rb +272 -0
  108. data/lib/fluent/config/types.rb +257 -0
  109. data/lib/fluent/config/v1_parser.rb +200 -0
  110. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  111. data/lib/fluent/config/yaml_parser/loader.rb +124 -0
  112. data/lib/fluent/config/yaml_parser/parser.rb +179 -0
  113. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  114. data/lib/fluent/config/yaml_parser.rb +56 -0
  115. data/lib/fluent/config.rb +89 -0
  116. data/lib/fluent/configurable.rb +202 -0
  117. data/lib/fluent/counter/base_socket.rb +44 -0
  118. data/lib/fluent/counter/client.rb +297 -0
  119. data/lib/fluent/counter/error.rb +86 -0
  120. data/lib/fluent/counter/mutex_hash.rb +163 -0
  121. data/lib/fluent/counter/server.rb +273 -0
  122. data/lib/fluent/counter/store.rb +205 -0
  123. data/lib/fluent/counter/validator.rb +145 -0
  124. data/lib/fluent/counter.rb +23 -0
  125. data/lib/fluent/daemon.rb +14 -0
  126. data/lib/fluent/daemonizer.rb +88 -0
  127. data/lib/fluent/engine.rb +269 -0
  128. data/lib/fluent/env.rb +45 -0
  129. data/lib/fluent/error.rb +37 -0
  130. data/lib/fluent/event.rb +369 -0
  131. data/lib/fluent/event_router.rb +315 -0
  132. data/lib/fluent/ext_monitor_require.rb +28 -0
  133. data/lib/fluent/file_wrapper.rb +137 -0
  134. data/lib/fluent/filter.rb +21 -0
  135. data/lib/fluent/fluent_log_event_router.rb +139 -0
  136. data/lib/fluent/formatter.rb +23 -0
  137. data/lib/fluent/input.rb +21 -0
  138. data/lib/fluent/label.rb +46 -0
  139. data/lib/fluent/load.rb +33 -0
  140. data/lib/fluent/log/console_adapter.rb +66 -0
  141. data/lib/fluent/log.rb +775 -0
  142. data/lib/fluent/match.rb +187 -0
  143. data/lib/fluent/mixin.rb +31 -0
  144. data/lib/fluent/msgpack_factory.rb +111 -0
  145. data/lib/fluent/oj_options.rb +61 -0
  146. data/lib/fluent/output.rb +29 -0
  147. data/lib/fluent/output_chain.rb +23 -0
  148. data/lib/fluent/parser.rb +23 -0
  149. data/lib/fluent/plugin/bare_output.rb +88 -0
  150. data/lib/fluent/plugin/base.rb +219 -0
  151. data/lib/fluent/plugin/buf_file.rb +256 -0
  152. data/lib/fluent/plugin/buf_file_single.rb +272 -0
  153. data/lib/fluent/plugin/buf_memory.rb +34 -0
  154. data/lib/fluent/plugin/buffer/chunk.rb +313 -0
  155. data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
  156. data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
  157. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  158. data/lib/fluent/plugin/buffer.rb +1063 -0
  159. data/lib/fluent/plugin/compressable.rb +87 -0
  160. data/lib/fluent/plugin/exec_util.rb +22 -0
  161. data/lib/fluent/plugin/extractor.rb +132 -0
  162. data/lib/fluent/plugin/file_util.rb +22 -0
  163. data/lib/fluent/plugin/filter.rb +119 -0
  164. data/lib/fluent/plugin/filter_grep.rb +189 -0
  165. data/lib/fluent/plugin/filter_parser.rb +124 -0
  166. data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
  167. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  168. data/lib/fluent/plugin/formatter.rb +75 -0
  169. data/lib/fluent/plugin/formatter_csv.rb +92 -0
  170. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  171. data/lib/fluent/plugin/formatter_json.rb +62 -0
  172. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  173. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  174. data/lib/fluent/plugin/formatter_out_file.rb +55 -0
  175. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  176. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  177. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  178. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  179. data/lib/fluent/plugin/in_dummy.rb +18 -0
  180. data/lib/fluent/plugin/in_exec.rb +124 -0
  181. data/lib/fluent/plugin/in_forward.rb +489 -0
  182. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  183. data/lib/fluent/plugin/in_http.rb +737 -0
  184. data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
  185. data/lib/fluent/plugin/in_object_space.rb +93 -0
  186. data/lib/fluent/plugin/in_sample.rb +148 -0
  187. data/lib/fluent/plugin/in_syslog.rb +346 -0
  188. data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
  189. data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
  190. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  191. data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
  192. data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
  193. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  194. data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
  195. data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
  196. data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
  197. data/lib/fluent/plugin/in_tail.rb +917 -0
  198. data/lib/fluent/plugin/in_tcp.rb +230 -0
  199. data/lib/fluent/plugin/in_udp.rb +101 -0
  200. data/lib/fluent/plugin/in_unix.rb +197 -0
  201. data/lib/fluent/plugin/input.rb +71 -0
  202. data/lib/fluent/plugin/metrics.rb +119 -0
  203. data/lib/fluent/plugin/metrics_local.rb +96 -0
  204. data/lib/fluent/plugin/multi_output.rb +179 -0
  205. data/lib/fluent/plugin/out_buffer.rb +40 -0
  206. data/lib/fluent/plugin/out_copy.rb +120 -0
  207. data/lib/fluent/plugin/out_exec.rb +105 -0
  208. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  209. data/lib/fluent/plugin/out_file.rb +371 -0
  210. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  211. data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
  212. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  213. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  214. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  215. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  216. data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
  217. data/lib/fluent/plugin/out_forward.rb +865 -0
  218. data/lib/fluent/plugin/out_http.rb +419 -0
  219. data/lib/fluent/plugin/out_null.rb +74 -0
  220. data/lib/fluent/plugin/out_relabel.rb +32 -0
  221. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  222. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  223. data/lib/fluent/plugin/out_stdout.rb +81 -0
  224. data/lib/fluent/plugin/out_stream.rb +130 -0
  225. data/lib/fluent/plugin/output.rb +1688 -0
  226. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  227. data/lib/fluent/plugin/parser.rb +274 -0
  228. data/lib/fluent/plugin/parser_apache.rb +28 -0
  229. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  230. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  231. data/lib/fluent/plugin/parser_csv.rb +124 -0
  232. data/lib/fluent/plugin/parser_json.rb +118 -0
  233. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  234. data/lib/fluent/plugin/parser_msgpack.rb +72 -0
  235. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  236. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  237. data/lib/fluent/plugin/parser_none.rb +36 -0
  238. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  239. data/lib/fluent/plugin/parser_syslog.rb +543 -0
  240. data/lib/fluent/plugin/parser_tsv.rb +47 -0
  241. data/lib/fluent/plugin/sd_file.rb +157 -0
  242. data/lib/fluent/plugin/sd_srv.rb +135 -0
  243. data/lib/fluent/plugin/sd_static.rb +58 -0
  244. data/lib/fluent/plugin/service_discovery.rb +65 -0
  245. data/lib/fluent/plugin/socket_util.rb +22 -0
  246. data/lib/fluent/plugin/storage.rb +84 -0
  247. data/lib/fluent/plugin/storage_local.rb +166 -0
  248. data/lib/fluent/plugin/string_util.rb +22 -0
  249. data/lib/fluent/plugin.rb +206 -0
  250. data/lib/fluent/plugin_helper/cert_option.rb +199 -0
  251. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  252. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  253. data/lib/fluent/plugin_helper/counter.rb +51 -0
  254. data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
  255. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  256. data/lib/fluent/plugin_helper/extract.rb +104 -0
  257. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  258. data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
  259. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  260. data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
  261. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  262. data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
  263. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  264. data/lib/fluent/plugin_helper/http_server.rb +129 -0
  265. data/lib/fluent/plugin_helper/inject.rb +154 -0
  266. data/lib/fluent/plugin_helper/metrics.rb +136 -0
  267. data/lib/fluent/plugin_helper/parser.rb +147 -0
  268. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  269. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  270. data/lib/fluent/plugin_helper/server.rb +840 -0
  271. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  272. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  273. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  274. data/lib/fluent/plugin_helper/socket.rb +288 -0
  275. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  276. data/lib/fluent/plugin_helper/storage.rb +349 -0
  277. data/lib/fluent/plugin_helper/thread.rb +180 -0
  278. data/lib/fluent/plugin_helper/timer.rb +92 -0
  279. data/lib/fluent/plugin_helper.rb +75 -0
  280. data/lib/fluent/plugin_id.rb +93 -0
  281. data/lib/fluent/process.rb +22 -0
  282. data/lib/fluent/registry.rb +117 -0
  283. data/lib/fluent/root_agent.rb +468 -0
  284. data/lib/fluent/rpc.rb +95 -0
  285. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  286. data/lib/fluent/static_config_analysis.rb +195 -0
  287. data/lib/fluent/supervisor.rb +1347 -0
  288. data/lib/fluent/system_config.rb +213 -0
  289. data/lib/fluent/test/base.rb +83 -0
  290. data/lib/fluent/test/driver/base.rb +231 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +61 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +138 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +44 -0
  310. data/lib/fluent/test.rb +61 -0
  311. data/lib/fluent/time.rb +513 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +105 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/win32api.rb +38 -0
  318. data/lib/fluent/winsvc.rb +130 -0
  319. data/templates/new_gem/.gitignore +8 -0
  320. data/templates/new_gem/Gemfile +3 -0
  321. data/templates/new_gem/README.md.erb +43 -0
  322. data/templates/new_gem/Rakefile +13 -0
  323. data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
  324. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  325. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  326. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  327. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  328. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  329. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  330. data/templates/new_gem/test/helper.rb.erb +7 -0
  331. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  337. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  338. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  339. data/templates/plugin_config_formatter/param.md.erb +34 -0
  340. data/templates/plugin_config_formatter/section.md.erb +12 -0
  341. metadata +996 -0
@@ -0,0 +1,489 @@
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
+
18
+ require 'fluent/env'
19
+ require 'fluent/plugin/input'
20
+ require 'fluent/msgpack_factory'
21
+ require 'json'
22
+ require 'digest'
23
+ require 'securerandom'
24
+
25
+ module Fluent::Plugin
26
+ class ForwardInput < Input
27
+ Fluent::Plugin.register_input('forward', self)
28
+
29
+ # See the wiki page below for protocol specification
30
+ # https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1
31
+
32
+ helpers :server
33
+
34
+ LISTEN_PORT = 24224
35
+ OPTION_ACK = 'ack'.freeze
36
+ OPTION_CHUNK = 'chunk'.freeze
37
+ OPTION_COMPRESSED = 'compressed'.freeze
38
+ OPTION_FLUENT_SIGNAL = 'fluent_signal'.freeze
39
+ OPTION_SIZE = 'size'.freeze
40
+ OPTION_TEXT = 'text'.freeze
41
+
42
+ desc 'The port to listen to.'
43
+ config_param :port, :integer, default: LISTEN_PORT
44
+ desc 'The bind address to listen to.'
45
+ config_param :bind, :string, default: '0.0.0.0'
46
+
47
+ config_param :backlog, :integer, default: nil
48
+ # SO_LINGER 0 to send RST rather than FIN to avoid lots of connections sitting in TIME_WAIT at src
49
+ desc 'The timeout time used to set linger option.'
50
+ config_param :linger_timeout, :integer, default: nil, deprecated: "use transport directive"
51
+ # This option is for Cool.io's loop wait timeout to avoid loop stuck at shutdown. Almost users don't need to change this value.
52
+ config_param :blocking_timeout, :time, default: 0.5
53
+ desc 'Try to resolve hostname from IP addresses or not.'
54
+ config_param :resolve_hostname, :bool, default: nil
55
+ desc 'Connections will be disconnected right after receiving first message if this value is true.'
56
+ config_param :deny_keepalive, :bool, default: false
57
+ desc 'Check the remote connection is still available by sending a keepalive packet if this value is true.'
58
+ config_param :send_keepalive_packet, :bool, default: false
59
+
60
+ desc 'Log warning if received chunk size is larger than this value.'
61
+ config_param :chunk_size_warn_limit, :size, default: nil
62
+ desc 'Received chunk is dropped if it is larger than this value.'
63
+ config_param :chunk_size_limit, :size, default: nil
64
+ desc 'The size limit of the decompressed element.'
65
+ config_param :decompression_size_limit, :size, default: 256*1024*1024
66
+ desc 'Skip an event if incoming event is invalid.'
67
+ config_param :skip_invalid_event, :bool, default: true
68
+
69
+ desc "The field name of the client's source address."
70
+ config_param :source_address_key, :string, default: nil
71
+ desc "The field name of the client's hostname."
72
+ config_param :source_hostname_key, :string, default: nil
73
+
74
+ desc "New tag instead of incoming tag"
75
+ config_param :tag, :string, default: nil
76
+ desc "Add prefix to incoming tag"
77
+ config_param :add_tag_prefix, :string, default: nil
78
+
79
+ config_section :security, required: false, multi: false do
80
+ desc 'The hostname'
81
+ config_param :self_hostname, :string
82
+ desc 'Shared key for authentication'
83
+ config_param :shared_key, :string, secret: true
84
+ desc 'If true, use user based authentication'
85
+ config_param :user_auth, :bool, default: false
86
+ desc 'Allow anonymous source. <client> sections required if disabled.'
87
+ config_param :allow_anonymous_source, :bool, default: true
88
+
89
+ ### User based authentication
90
+ config_section :user, param_name: :users, required: false, multi: true do
91
+ desc 'The username for authentication'
92
+ config_param :username, :string
93
+ desc 'The password for authentication'
94
+ config_param :password, :string, secret: true
95
+ end
96
+
97
+ ### Client ip/network authentication & per_host shared key
98
+ config_section :client, param_name: :clients, required: false, multi: true do
99
+ desc 'The IP address or host name of the client'
100
+ config_param :host, :string, default: nil
101
+ desc 'Network address specification'
102
+ config_param :network, :string, default: nil
103
+ desc 'Shared key per client'
104
+ config_param :shared_key, :string, default: nil, secret: true
105
+ desc 'Array of username.'
106
+ config_param :users, :array, default: []
107
+ end
108
+ end
109
+
110
+ def configure(conf)
111
+ super
112
+
113
+ if @source_hostname_key
114
+ # TODO: add test
115
+ if @resolve_hostname.nil?
116
+ @resolve_hostname = true
117
+ elsif !@resolve_hostname # user specifies "false" in config
118
+ raise Fluent::ConfigError, "resolve_hostname must be true with source_hostname_key"
119
+ end
120
+ end
121
+ @enable_field_injection = @source_address_key || @source_hostname_key
122
+
123
+ raise Fluent::ConfigError, "'tag' parameter must not be empty" if @tag && @tag.empty?
124
+ raise Fluent::ConfigError, "'add_tag_prefix' parameter must not be empty" if @add_tag_prefix && @add_tag_prefix.empty?
125
+
126
+ if @security
127
+ if @security.user_auth && @security.users.empty?
128
+ raise Fluent::ConfigError, "<user> sections required if user_auth enabled"
129
+ end
130
+ if !@security.allow_anonymous_source && @security.clients.empty?
131
+ raise Fluent::ConfigError, "<client> sections required if allow_anonymous_source disabled"
132
+ end
133
+
134
+ @nodes = []
135
+
136
+ @security.clients.each do |client|
137
+ if client.host && client.network
138
+ raise Fluent::ConfigError, "both of 'host' and 'network' are specified for client"
139
+ end
140
+ if !client.host && !client.network
141
+ raise Fluent::ConfigError, "Either of 'host' and 'network' must be specified for client"
142
+ end
143
+ source = nil
144
+ if client.host
145
+ begin
146
+ source = IPSocket.getaddress(client.host)
147
+ rescue SocketError
148
+ raise Fluent::ConfigError, "host '#{client.host}' cannot be resolved"
149
+ end
150
+ end
151
+ source_addr = begin
152
+ IPAddr.new(source || client.network)
153
+ rescue ArgumentError
154
+ raise Fluent::ConfigError, "network '#{client.network}' address format is invalid"
155
+ end
156
+ @nodes.push({
157
+ address: source_addr,
158
+ shared_key: (client.shared_key || @security.shared_key),
159
+ users: client.users
160
+ })
161
+ end
162
+ end
163
+
164
+ if @send_keepalive_packet && @deny_keepalive
165
+ raise Fluent::ConfigError, "both 'send_keepalive_packet' and 'deny_keepalive' cannot be set to true"
166
+ end
167
+ end
168
+
169
+ def multi_workers_ready?
170
+ true
171
+ end
172
+
173
+ HEARTBEAT_UDP_PAYLOAD = "\0"
174
+
175
+ def start
176
+ super
177
+
178
+ shared_socket = system_config.workers > 1
179
+
180
+ log.info "listening port", port: @port, bind: @bind
181
+ server_create_connection(
182
+ :in_forward_server, @port,
183
+ bind: @bind,
184
+ shared: shared_socket,
185
+ resolve_name: @resolve_hostname,
186
+ linger_timeout: @linger_timeout,
187
+ send_keepalive_packet: @send_keepalive_packet,
188
+ backlog: @backlog,
189
+ &method(:handle_connection)
190
+ )
191
+
192
+ server_create(:in_forward_server_udp_heartbeat, @port, shared: shared_socket, proto: :udp, bind: @bind, resolve_name: @resolve_hostname, max_bytes: 128) do |data, sock|
193
+ log.trace "heartbeat udp data arrived", host: sock.remote_host, port: sock.remote_port, data: data
194
+ begin
195
+ sock.write HEARTBEAT_UDP_PAYLOAD
196
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINTR
197
+ log.trace "error while heartbeat response", host: sock.remote_host, error: e
198
+ end
199
+ end
200
+ end
201
+
202
+ def handle_connection(conn)
203
+ send_data = ->(serializer, data){ conn.write serializer.call(data) }
204
+
205
+ log.trace "connected fluent socket", addr: conn.remote_addr, port: conn.remote_port
206
+ state = :established
207
+ nonce = nil
208
+ user_auth_salt = nil
209
+
210
+ if @security
211
+ # security enabled session MUST use MessagePack as serialization format
212
+ state = :helo
213
+ nonce = generate_salt
214
+ user_auth_salt = generate_salt
215
+ send_data.call(:to_msgpack.to_proc, generate_helo(nonce, user_auth_salt))
216
+ state = :pingpong
217
+ end
218
+
219
+ log.trace "accepted fluent socket", addr: conn.remote_addr, port: conn.remote_port
220
+
221
+ read_messages(conn) do |msg, chunk_size, serializer|
222
+ case state
223
+ when :pingpong
224
+ success, reason_or_salt, shared_key = check_ping(msg, conn.remote_addr, user_auth_salt, nonce)
225
+ unless success
226
+ conn.on(:write_complete) { |c| c.close_after_write_complete }
227
+ send_data.call(serializer, generate_pong(false, reason_or_salt, nonce, shared_key))
228
+ next
229
+ end
230
+ send_data.call(serializer, generate_pong(true, reason_or_salt, nonce, shared_key))
231
+
232
+ log.debug "connection established", address: conn.remote_addr, port: conn.remote_port
233
+ state = :established
234
+ when :established
235
+ options = on_message(msg, chunk_size, conn)
236
+ if options && r = response(options)
237
+ log.trace "sent response to fluent socket", address: conn.remote_addr, response: r
238
+ conn.on(:write_complete) { |c| c.close } if @deny_keepalive
239
+ send_data.call(serializer, r)
240
+ else
241
+ if @deny_keepalive
242
+ conn.close
243
+ end
244
+ end
245
+ else
246
+ raise "BUG: unknown session state: #{state}"
247
+ end
248
+ end
249
+ end
250
+
251
+ def read_messages(conn, &block)
252
+ feeder = nil
253
+ serializer = nil
254
+ bytes = 0
255
+ conn.data do |data|
256
+ # only for first call of callback
257
+ unless feeder
258
+ first = data[0]
259
+ if first == '{' || first == '[' # json
260
+ parser = JSON::ResumableParser.new(**Fluent::DEFAULT_JSON_PARSE_OPTIONS)
261
+ serializer = :to_json.to_proc
262
+ feeder = ->(d){
263
+ parser << d
264
+ while parser.parse
265
+ block.call(parser.value, bytes, serializer)
266
+ bytes = 0
267
+ end
268
+ }
269
+ else # msgpack
270
+ parser = Fluent::MessagePackFactory.msgpack_unpacker
271
+ serializer = :to_msgpack.to_proc
272
+ feeder = ->(d){
273
+ parser.feed_each(d){|obj|
274
+ block.call(obj, bytes, serializer)
275
+ bytes = 0
276
+ }
277
+ }
278
+ end
279
+ end
280
+
281
+ bytes += data.bytesize
282
+ feeder.call(data)
283
+ end
284
+ end
285
+
286
+ def response(option)
287
+ if option && option[OPTION_CHUNK]
288
+ return { OPTION_ACK => option[OPTION_CHUNK] }
289
+ end
290
+ nil
291
+ end
292
+
293
+ def on_message(msg, chunk_size, conn)
294
+ if msg.nil?
295
+ # for future TCP heartbeat_request
296
+ return
297
+ end
298
+
299
+ # TODO: raise an exception if broken chunk is generated by recoverable situation
300
+ unless msg.is_a?(Array)
301
+ log.warn "incoming chunk is broken:", host: conn.remote_host, msg: msg
302
+ return
303
+ end
304
+
305
+ tag = msg[0]
306
+ entries = msg[1]
307
+
308
+ if @chunk_size_limit && (chunk_size > @chunk_size_limit)
309
+ log.warn "Input chunk size is larger than 'chunk_size_limit', dropped:", tag: tag, host: conn.remote_host, limit: @chunk_size_limit, size: chunk_size
310
+ return
311
+ elsif @chunk_size_warn_limit && (chunk_size > @chunk_size_warn_limit)
312
+ log.warn "Input chunk size is larger than 'chunk_size_warn_limit':", tag: tag, host: conn.remote_host, limit: @chunk_size_warn_limit, size: chunk_size
313
+ end
314
+
315
+ tag = @tag.dup if @tag
316
+ tag = "#{@add_tag_prefix}.#{tag}" if @add_tag_prefix
317
+
318
+ case entries
319
+ when String
320
+ # PackedForward
321
+ option = msg[2] || {}
322
+ size = option[OPTION_SIZE] || 0
323
+ compressed = option[OPTION_COMPRESSED]
324
+
325
+ if compressed && compressed != OPTION_TEXT
326
+ es = Fluent::CompressedMessagePackEventStream.new(entries, nil, size.to_i, compress: compressed.to_sym, decompression_size_limit: @decompression_size_limit)
327
+ else
328
+ es = Fluent::MessagePackEventStream.new(entries, nil, size.to_i)
329
+ end
330
+ if @skip_invalid_event
331
+ es = normalize_event_stream(tag, es, conn.remote_host)
332
+ elsif option[OPTION_FLUENT_SIGNAL] == 0
333
+ es = Fluent::MetadataTimeEventStream.new(es)
334
+ end
335
+ if @enable_field_injection
336
+ es = add_source_info(es, conn)
337
+ end
338
+ router.emit_stream(tag, es)
339
+
340
+ when Array
341
+ # Forward
342
+ es = normalize_event_stream(tag, entries, conn.remote_host)
343
+ if @enable_field_injection
344
+ es = add_source_info(es, conn)
345
+ end
346
+ router.emit_stream(tag, es)
347
+ option = msg[2]
348
+
349
+ else
350
+ # Message
351
+ time = extract_event_time(msg[1])
352
+ record = msg[2]
353
+ if @skip_invalid_event && invalid_event?(tag, time, record)
354
+ log.warn "got invalid event and drop it:", host: conn.remote_host, tag: tag, time: time, record: record
355
+ return msg[3] # retry never succeeded so return ack and drop incoming event.
356
+ end
357
+ return if record.nil?
358
+ time = Fluent::EventTime.now if time.to_i == 0
359
+ if @enable_field_injection
360
+ record[@source_address_key] = conn.remote_addr if @source_address_key
361
+ record[@source_hostname_key] = conn.remote_host if @source_hostname_key
362
+ end
363
+ router.emit(tag, time, record)
364
+ option = msg[3]
365
+ end
366
+
367
+ # return option for response
368
+ option
369
+ end
370
+
371
+ def invalid_event?(tag, time, record)
372
+ time = extract_event_time(time)
373
+ !((time.is_a?(Integer) || time.is_a?(::Fluent::EventTime)) && record.is_a?(Hash) && tag.is_a?(String))
374
+ end
375
+
376
+ def normalize_event_stream(tag, es, remote_host)
377
+ new_es = Fluent::MultiEventStream.new
378
+ es.each { |time, record|
379
+ time = extract_event_time(time)
380
+ if @skip_invalid_event && invalid_event?(tag, time, record)
381
+ log.warn "skip invalid event:", host: remote_host, tag: tag, time: time, record: record
382
+ next
383
+ end
384
+ next if record.nil?
385
+ time = Fluent::EventTime.now if time.nil? || time.to_i == 0 # `to_i == 0` for empty EventTime
386
+ new_es.add(time, record)
387
+ }
388
+ new_es
389
+ end
390
+
391
+ def extract_event_time(time)
392
+ time.is_a?(Array) ? time[0] : time
393
+ end
394
+
395
+ def add_source_info(es, conn)
396
+ new_es = Fluent::MultiEventStream.new
397
+ if @source_address_key && @source_hostname_key
398
+ address = conn.remote_addr
399
+ hostname = conn.remote_host
400
+ es.each { |time, record|
401
+ record[@source_address_key] = address
402
+ record[@source_hostname_key] = hostname
403
+ new_es.add(time, record)
404
+ }
405
+ elsif @source_address_key
406
+ address = conn.remote_addr
407
+ es.each { |time, record|
408
+ record[@source_address_key] = address
409
+ new_es.add(time, record)
410
+ }
411
+ elsif @source_hostname_key
412
+ hostname = conn.remote_host
413
+ es.each { |time, record|
414
+ record[@source_hostname_key] = hostname
415
+ new_es.add(time, record)
416
+ }
417
+ else
418
+ raise "BUG: don't call this method in this case"
419
+ end
420
+ new_es
421
+ end
422
+
423
+ def select_authenticate_users(node, username)
424
+ if node.nil? || node[:users].empty?
425
+ @security.users.select{|u| u.username == username}
426
+ else
427
+ @security.users.select{|u| node[:users].include?(u.username) && u.username == username}
428
+ end
429
+ end
430
+
431
+ def generate_salt
432
+ ::SecureRandom.random_bytes(16)
433
+ end
434
+
435
+ def generate_helo(nonce, user_auth_salt)
436
+ log.debug "generating helo"
437
+ # ['HELO', options(hash)]
438
+ ['HELO', {'nonce' => nonce, 'auth' => (@security ? user_auth_salt : ''), 'keepalive' => !@deny_keepalive}]
439
+ end
440
+
441
+ def check_ping(message, remote_addr, user_auth_salt, nonce)
442
+ log.debug "checking ping"
443
+ # ['PING', self_hostname, shared_key_salt, sha512_hex(shared_key_salt + self_hostname + nonce + shared_key), username || '', sha512_hex(auth_salt + username + password) || '']
444
+ unless message.size == 6 && message[0] == 'PING'
445
+ return false, 'invalid ping message'
446
+ end
447
+ _ping, hostname, shared_key_salt, shared_key_hexdigest, username, password_digest = message
448
+
449
+ node = @nodes.find{|n| n[:address].include?(remote_addr) rescue false }
450
+ if !node && !@security.allow_anonymous_source
451
+ log.warn "Anonymous client disallowed", address: remote_addr, hostname: hostname
452
+ return false, "anonymous source host '#{remote_addr}' denied", nil
453
+ end
454
+
455
+ shared_key = node ? node[:shared_key] : @security.shared_key
456
+ serverside = Digest::SHA512.new.update(shared_key_salt).update(hostname).update(nonce).update(shared_key).hexdigest
457
+ if shared_key_hexdigest != serverside
458
+ log.warn "Shared key mismatch", address: remote_addr, hostname: hostname
459
+ return false, 'shared_key mismatch', nil
460
+ end
461
+
462
+ if @security.user_auth
463
+ users = select_authenticate_users(node, username)
464
+ success = false
465
+ users.each do |user|
466
+ passhash = Digest::SHA512.new.update(user_auth_salt).update(username).update(user[:password]).hexdigest
467
+ success ||= (passhash == password_digest)
468
+ end
469
+ unless success
470
+ log.warn "Authentication failed", address: remote_addr, hostname: hostname, username: username
471
+ return false, 'username/password mismatch', nil
472
+ end
473
+ end
474
+
475
+ return true, shared_key_salt, shared_key
476
+ end
477
+
478
+ def generate_pong(auth_result, reason_or_salt, nonce, shared_key)
479
+ log.debug "generating pong"
480
+ # ['PONG', bool(authentication result), 'reason if authentication failed', self_hostname, sha512_hex(salt + self_hostname + nonce + sharedkey)]
481
+ unless auth_result
482
+ return ['PONG', false, reason_or_salt, '', '']
483
+ end
484
+
485
+ shared_key_digest_hex = Digest::SHA512.new.update(reason_or_salt).update(@security.self_hostname).update(nonce).update(shared_key).hexdigest
486
+ ['PONG', true, '', @security.self_hostname, shared_key_digest_hex]
487
+ end
488
+ end
489
+ end
@@ -0,0 +1,72 @@
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/plugin/input'
18
+
19
+ module Fluent::Plugin
20
+ class GCStatInput < Fluent::Plugin::Input
21
+ Fluent::Plugin.register_input('gc_stat', self)
22
+
23
+ helpers :timer
24
+
25
+ def initialize
26
+ super
27
+ @key_map = nil
28
+ end
29
+
30
+ config_param :emit_interval, :time, default: 60
31
+ config_param :use_symbol_keys, :bool, default: true
32
+ config_param :tag, :string
33
+
34
+ def configure(conf)
35
+ super
36
+
37
+ unless @use_symbol_keys
38
+ @key_map = {}
39
+ GC.stat.each_key { |key|
40
+ @key_map[key] = key.to_s
41
+ }
42
+ end
43
+ end
44
+
45
+ def multi_workers_ready?
46
+ true
47
+ end
48
+
49
+ def start
50
+ super
51
+
52
+ timer_execute(:in_gc_stat, @emit_interval, &method(:on_timer))
53
+ end
54
+
55
+ def shutdown
56
+ super
57
+ end
58
+
59
+ def on_timer
60
+ now = Fluent::EventTime.now
61
+ record = GC.stat
62
+ unless @use_symbol_keys
63
+ new_record = {}
64
+ record.each_pair { |k, v|
65
+ new_record[@key_map[k]] = v
66
+ }
67
+ record = new_record
68
+ end
69
+ router.emit(@tag, now, record)
70
+ end
71
+ end
72
+ end