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,22 @@
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/compat/string_util'
18
+
19
+ module Fluent
20
+ # obsolete
21
+ StringUtil = Fluent::Compat::StringUtil
22
+ end
@@ -0,0 +1,206 @@
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/registry'
18
+ require 'fluent/config/error'
19
+
20
+ module Fluent
21
+ module Plugin
22
+ SEARCH_PATHS = []
23
+
24
+ # plugins for fluentd: fluent/plugin/type_NAME.rb
25
+ # plugins for fluentd plugins: fluent/plugin/type/NAME.rb
26
+ # ex: storage, buffer chunk, ...
27
+
28
+ # first class plugins (instantiated by Engine)
29
+ INPUT_REGISTRY = Registry.new(:input, 'fluent/plugin/in_', dir_search_prefix: 'in_')
30
+ OUTPUT_REGISTRY = Registry.new(:output, 'fluent/plugin/out_', dir_search_prefix: 'out_')
31
+ FILTER_REGISTRY = Registry.new(:filter, 'fluent/plugin/filter_', dir_search_prefix: 'filter_')
32
+
33
+ # feature plugin: second class plugins (instantiated by Plugins or Helpers)
34
+ BUFFER_REGISTRY = Registry.new(:buffer, 'fluent/plugin/buf_', dir_search_prefix: 'buf_')
35
+ PARSER_REGISTRY = Registry.new(:parser, 'fluent/plugin/parser_', dir_search_prefix: 'parser_')
36
+ FORMATTER_REGISTRY = Registry.new(:formatter, 'fluent/plugin/formatter_', dir_search_prefix: 'formatter_')
37
+ STORAGE_REGISTRY = Registry.new(:storage, 'fluent/plugin/storage_', dir_search_prefix: 'storage_')
38
+ SD_REGISTRY = Registry.new(:sd, 'fluent/plugin/sd_', dir_search_prefix: 'sd_')
39
+ METRICS_REGISTRY = Registry.new(:metrics, 'fluent/plugin/metrics_', dir_search_prefix: 'metrics_')
40
+
41
+ REGISTRIES = [INPUT_REGISTRY, OUTPUT_REGISTRY, FILTER_REGISTRY, BUFFER_REGISTRY, PARSER_REGISTRY, FORMATTER_REGISTRY, STORAGE_REGISTRY, SD_REGISTRY, METRICS_REGISTRY]
42
+
43
+ def self.register_input(type, klass)
44
+ register_impl('input', INPUT_REGISTRY, type, klass)
45
+ end
46
+
47
+ def self.register_output(type, klass)
48
+ register_impl('output', OUTPUT_REGISTRY, type, klass)
49
+ end
50
+
51
+ def self.register_filter(type, klass)
52
+ register_impl('filter', FILTER_REGISTRY, type, klass)
53
+ end
54
+
55
+ def self.register_buffer(type, klass)
56
+ register_impl('buffer', BUFFER_REGISTRY, type, klass)
57
+ end
58
+
59
+ def self.register_sd(type, klass)
60
+ register_impl('sd', SD_REGISTRY, type, klass)
61
+ end
62
+
63
+ def self.register_metrics(type, klass)
64
+ register_impl('metrics', METRICS_REGISTRY, type, klass)
65
+ end
66
+
67
+ def self.register_parser(type, klass_or_proc)
68
+ if klass_or_proc.is_a?(Regexp)
69
+ # This usage is not recommended for new API
70
+ require 'fluent/parser'
71
+ register_impl('parser', PARSER_REGISTRY, type, Proc.new { Fluent::TextParser::RegexpParser.new(klass_or_proc) })
72
+ else
73
+ register_impl('parser', PARSER_REGISTRY, type, klass_or_proc)
74
+ end
75
+ end
76
+
77
+ def self.register_formatter(type, klass_or_proc)
78
+ if klass_or_proc.respond_to?(:call) && klass_or_proc.arity == 3 # Proc.new { |tag, time, record| }
79
+ # This usage is not recommended for new API
80
+ require 'fluent/formatter'
81
+ register_impl('formatter', FORMATTER_REGISTRY, type, Proc.new { Fluent::TextFormatter::ProcWrappedFormatter.new(klass_or_proc) })
82
+ else
83
+ register_impl('formatter', FORMATTER_REGISTRY, type, klass_or_proc)
84
+ end
85
+ end
86
+
87
+ def self.register_storage(type, klass)
88
+ register_impl('storage', STORAGE_REGISTRY, type, klass)
89
+ end
90
+
91
+ def self.lookup_type_from_class(klass_or_its_name)
92
+ klass = if klass_or_its_name.is_a? Class
93
+ klass_or_its_name
94
+ elsif klass_or_its_name.is_a? String
95
+ eval(klass_or_its_name) # const_get can't handle qualified klass name (ex: A::B)
96
+ else
97
+ raise ArgumentError, "invalid argument type #{klass_or_its_name.class}: #{klass_or_its_name}"
98
+ end
99
+ REGISTRIES.reduce(nil){|a, r| a || r.reverse_lookup(klass) }
100
+ end
101
+
102
+ def self.add_plugin_dir(dir)
103
+ REGISTRIES.each do |r|
104
+ r.paths.push(dir)
105
+ end
106
+ nil
107
+ end
108
+
109
+ def self.new_input(type)
110
+ new_impl('input', INPUT_REGISTRY, type)
111
+ end
112
+
113
+ def self.new_output(type)
114
+ new_impl('output', OUTPUT_REGISTRY, type)
115
+ end
116
+
117
+ def self.new_filter(type)
118
+ new_impl('filter', FILTER_REGISTRY, type)
119
+ end
120
+
121
+ def self.new_buffer(type, parent: nil)
122
+ new_impl('buffer', BUFFER_REGISTRY, type, parent)
123
+ end
124
+
125
+ def self.new_sd(type, parent: nil)
126
+ new_impl('sd', SD_REGISTRY, type, parent)
127
+ end
128
+
129
+ def self.new_metrics(type, parent: nil)
130
+ new_impl('metrics', METRICS_REGISTRY, type, parent)
131
+ end
132
+
133
+ class << self
134
+ # This should be defined for fluent-plugin-config-formatter type arguments.
135
+ alias_method :new_service_discovery, :new_sd
136
+ end
137
+
138
+ def self.new_parser(type, parent: nil)
139
+ if type[0] == '/' && type[-1] == '/'
140
+ # This usage is not recommended for new API... create RegexpParser directly
141
+ require 'fluent/parser'
142
+ impl = Fluent::TextParser.lookup(type)
143
+ impl.extend FeatureAvailabilityChecker
144
+ impl
145
+ else
146
+ new_impl('parser', PARSER_REGISTRY, type, parent)
147
+ end
148
+ end
149
+
150
+ def self.new_formatter(type, parent: nil)
151
+ new_impl('formatter', FORMATTER_REGISTRY, type, parent)
152
+ end
153
+
154
+ def self.new_storage(type, parent: nil)
155
+ new_impl('storage', STORAGE_REGISTRY, type, parent)
156
+ end
157
+
158
+ def self.register_impl(kind, registry, type, value)
159
+ if !value.is_a?(Class) && !value.respond_to?(:call)
160
+ raise Fluent::ConfigError, "Invalid implementation as #{kind} plugin: '#{type}'. It must be a Class, or callable."
161
+ end
162
+ registry.register(type, value)
163
+ $log.trace "registered #{kind} plugin '#{type}'" if defined?($log)
164
+ nil
165
+ end
166
+
167
+ def self.new_impl(kind, registry, type, parent=nil)
168
+ # "'type' not found" is handled by registry
169
+ obj = registry.lookup(type)
170
+ impl = case
171
+ when obj.is_a?(Class)
172
+ obj.new
173
+ when obj.respond_to?(:call) && obj.arity == 0
174
+ obj.call
175
+ else
176
+ raise Fluent::ConfigError, "#{kind} plugin '#{type}' is not a Class nor callable (without arguments)."
177
+ end
178
+ if parent && impl.respond_to?(:owner=)
179
+ impl.owner = parent
180
+ end
181
+ impl.extend FeatureAvailabilityChecker
182
+ impl
183
+ end
184
+
185
+ module FeatureAvailabilityChecker
186
+ def configure(conf)
187
+ super
188
+
189
+ # extend plugin instance by this module
190
+ # to run this check after all #configure methods of plugins and plugin helpers
191
+ sysconf = if self.respond_to?(:owner) && owner.respond_to?(:system_config)
192
+ owner.system_config
193
+ elsif self.respond_to?(:system_config)
194
+ self.system_config
195
+ else
196
+ nil
197
+ end
198
+
199
+ if sysconf && sysconf.workers > 1 && !self.multi_workers_ready?
200
+ type = Fluent::Plugin.lookup_type_from_class(self.class)
201
+ raise Fluent::ConfigError, "Plugin '#{type}' does not support multi workers configuration (#{self.class})"
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,199 @@
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 'openssl'
18
+ require 'socket'
19
+
20
+ require 'fluent/tls'
21
+
22
+ # this module is only for Socket/Server/HttpServer plugin helpers
23
+ module Fluent
24
+ module PluginHelper
25
+ module CertOption
26
+ def cert_option_create_context(version, insecure, ciphers, conf)
27
+ cert, key, extra = cert_option_server_validate!(conf)
28
+
29
+ ctx = OpenSSL::SSL::SSLContext.new
30
+ # inject OpenSSL::SSL::SSLContext::DEFAULT_PARAMS
31
+ # https://bugs.ruby-lang.org/issues/9424
32
+ ctx.set_params({}) unless insecure
33
+
34
+ if conf.client_cert_auth
35
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
36
+ else
37
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
38
+ end
39
+
40
+ if conf.ensure_fips
41
+ unless OpenSSL.fips_mode
42
+ raise Fluent::ConfigError, "Cannot enable FIPS compliant mode. OpenSSL FIPS configuration is disabled"
43
+ end
44
+ end
45
+
46
+ ctx.ca_file = conf.ca_path
47
+ ctx.cert = cert
48
+ ctx.key = key
49
+ if extra && !extra.empty?
50
+ ctx.extra_chain_cert = extra
51
+ end
52
+ if conf.cert_verifier
53
+ sandbox = Class.new
54
+ ctx.verify_callback = if File.exist?(conf.cert_verifier)
55
+ verifier = File.read(conf.cert_verifier)
56
+ sandbox.instance_eval(verifier, File.basename(conf.cert_verifier))
57
+ else
58
+ sandbox.instance_eval(conf.cert_verifier)
59
+ end
60
+ end
61
+
62
+ Fluent::TLS.set_version_to_context(ctx, version, conf.min_version, conf.max_version)
63
+ ctx.ciphers = ciphers unless insecure
64
+
65
+ ctx
66
+ end
67
+
68
+ def cert_option_server_validate!(conf)
69
+ case
70
+ when conf.cert_path
71
+ raise Fluent::ConfigError, "private_key_path is required when cert_path is specified" unless conf.private_key_path
72
+ log.warn "For security reason, setting private_key_passphrase is recommended when cert_path is specified" unless conf.private_key_passphrase
73
+ cert_option_load(conf.cert_path, conf.private_key_path, conf.private_key_passphrase)
74
+
75
+ when conf.ca_cert_path
76
+ raise Fluent::ConfigError, "ca_private_key_path is required when ca_cert_path is specified" unless conf.ca_private_key_path
77
+ log.warn "For security reason, setting ca_private_key_passphrase is recommended when ca_cert_path is specified" unless conf.ca_private_key_passphrase
78
+ generate_opts = cert_option_cert_generation_opts_from_conf(conf)
79
+ cert_option_generate_server_pair_by_ca(
80
+ conf.ca_cert_path,
81
+ conf.ca_private_key_path,
82
+ conf.ca_private_key_passphrase,
83
+ generate_opts
84
+ )
85
+
86
+ when conf.insecure
87
+ log.warn "insecure TLS communication server is configured (using 'insecure' mode)"
88
+ generate_opts = cert_option_cert_generation_opts_from_conf(conf)
89
+ cert_option_generate_server_pair_self_signed(generate_opts)
90
+
91
+ else
92
+ raise Fluent::ConfigError, "no valid cert options configured. specify either 'cert_path', 'ca_cert_path' or 'insecure'"
93
+ end
94
+ end
95
+
96
+ def cert_option_load(cert_path, private_key_path, private_key_passphrase)
97
+ key = OpenSSL::PKey::read(File.read(private_key_path), private_key_passphrase)
98
+ certs = cert_option_certificates_from_file(cert_path)
99
+ cert = certs.shift
100
+ return cert, key, certs
101
+ end
102
+
103
+ def cert_option_cert_generation_opts_from_conf(conf)
104
+ {
105
+ private_key_length: conf.generate_private_key_length,
106
+ country: conf.generate_cert_country,
107
+ state: conf.generate_cert_state,
108
+ locality: conf.generate_cert_locality,
109
+ common_name: conf.generate_cert_common_name || ::Socket.gethostname,
110
+ expiration: conf.generate_cert_expiration,
111
+ digest: conf.generate_cert_digest,
112
+ }
113
+ end
114
+
115
+ def cert_option_generate_pair(opts, issuer = nil)
116
+ key = OpenSSL::PKey::RSA.generate(opts[:private_key_length])
117
+
118
+ subject = OpenSSL::X509::Name.new
119
+ subject.add_entry('C', opts[:country])
120
+ subject.add_entry('ST', opts[:state])
121
+ subject.add_entry('L', opts[:locality])
122
+ subject.add_entry('CN', opts[:common_name])
123
+
124
+ issuer ||= subject
125
+
126
+ cert = OpenSSL::X509::Certificate.new
127
+ cert.not_before = Time.at(0)
128
+ cert.not_after = Time.now + opts[:expiration]
129
+ cert.public_key = key
130
+ cert.version = 2
131
+ cert.serial = rand(2**(8*10))
132
+ cert.issuer = issuer
133
+ cert.subject = subject
134
+
135
+ return cert, key
136
+ end
137
+
138
+ def cert_option_add_extensions(cert, extensions)
139
+ ef = OpenSSL::X509::ExtensionFactory.new
140
+ extensions.each do |ext|
141
+ oid, value = ext
142
+ cert.add_extension ef.create_extension(oid, value)
143
+ end
144
+ end
145
+
146
+ def cert_option_generate_ca_pair_self_signed(generate_opts)
147
+ cert, key = cert_option_generate_pair(generate_opts)
148
+
149
+ cert_option_add_extensions(cert, [
150
+ ['basicConstraints', 'CA:TRUE']
151
+ ])
152
+
153
+ cert.sign(key, generate_opts[:digest].to_s)
154
+ return cert, key
155
+ end
156
+
157
+ def cert_option_generate_server_pair_by_ca(ca_cert_path, ca_key_path, ca_key_passphrase, generate_opts)
158
+ ca_key = OpenSSL::PKey::read(File.read(ca_key_path), ca_key_passphrase)
159
+ ca_cert = OpenSSL::X509::Certificate.new(File.read(ca_cert_path))
160
+ cert, key = cert_option_generate_pair(generate_opts, ca_cert.subject)
161
+ raise "BUG: certificate digest algorithm not set" unless generate_opts[:digest]
162
+
163
+ cert_option_add_extensions(cert, [
164
+ ['basicConstraints', 'CA:FALSE'],
165
+ ['nsCertType', 'server'],
166
+ ['keyUsage', 'digitalSignature,keyEncipherment'],
167
+ ['extendedKeyUsage', 'serverAuth']
168
+ ])
169
+
170
+ cert.sign(ca_key, generate_opts[:digest].to_s)
171
+ return cert, key, nil
172
+ end
173
+
174
+ def cert_option_generate_server_pair_self_signed(generate_opts)
175
+ cert, key = cert_option_generate_pair(generate_opts)
176
+ raise "BUG: certificate digest algorithm not set" unless generate_opts[:digest]
177
+
178
+ cert_option_add_extensions(cert, [
179
+ ['basicConstraints', 'CA:FALSE'],
180
+ ['nsCertType', 'server']
181
+ ])
182
+
183
+ cert.sign(key, generate_opts[:digest].to_s)
184
+ return cert, key, nil
185
+ end
186
+
187
+ def cert_option_certificates_from_file(path)
188
+ data = File.read(path)
189
+ pattern = Regexp.compile('-+BEGIN CERTIFICATE-+\r?\n(?:[^-]*\r?\n)+-+END CERTIFICATE-+\r?\n?', Regexp::MULTILINE)
190
+ list = []
191
+ data.scan(pattern){|match| list << OpenSSL::X509::Certificate.new(match) }
192
+ if list.length == 0
193
+ raise Fluent::ConfigError, "cert_path does not contain a valid certificate"
194
+ end
195
+ list
196
+ end
197
+ end
198
+ end
199
+ end