fluentd 1.14.4-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -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 +57 -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 +134 -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 +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -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/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
@@ -0,0 +1,272 @@
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 'json'
18
+
19
+ require 'fluent/config/error'
20
+ require 'fluent/config/v1_parser'
21
+
22
+ module Fluent
23
+ module Config
24
+ class Section < BasicObject
25
+ def self.name
26
+ 'Fluent::Config::Section'
27
+ end
28
+
29
+ def initialize(params = {}, config_element = nil)
30
+ @klass = 'Fluent::Config::Section'
31
+ @params = params
32
+ @corresponding_config_element = config_element
33
+ end
34
+
35
+ alias :object_id :__id__
36
+
37
+ def corresponding_config_element
38
+ @corresponding_config_element
39
+ end
40
+
41
+ def class
42
+ Section
43
+ end
44
+
45
+ def to_s
46
+ inspect
47
+ end
48
+
49
+ def inspect
50
+ "<Fluent::Config::Section #{@params.to_json}>"
51
+ end
52
+
53
+ # Used by PP and Pry
54
+ def pretty_print(q)
55
+ q.text(inspect)
56
+ end
57
+
58
+ def nil?
59
+ false
60
+ end
61
+
62
+ def to_h
63
+ @params
64
+ end
65
+
66
+ def dup
67
+ Section.new(@params.dup, @corresponding_config_element.dup)
68
+ end
69
+
70
+ def +(other)
71
+ Section.new(self.to_h.merge(other.to_h))
72
+ end
73
+
74
+ def instance_of?(mod)
75
+ @klass == mod.name
76
+ end
77
+
78
+ def kind_of?(mod)
79
+ @klass == mod.name || BasicObject == mod
80
+ end
81
+ alias is_a? kind_of?
82
+
83
+ def [](key)
84
+ @params[key.to_sym]
85
+ end
86
+
87
+ def []=(key, value)
88
+ @params[key.to_sym] = value
89
+ end
90
+
91
+ def respond_to?(symbol, include_all=false)
92
+ case symbol
93
+ when :inspect, :nil?, :to_h, :+, :instance_of?, :kind_of?, :[], :respond_to?, :respond_to_missing?
94
+ true
95
+ when :!, :!= , :==, :equal?, :instance_eval, :instance_exec
96
+ true
97
+ when :method_missing, :singleton_method_added, :singleton_method_removed, :singleton_method_undefined
98
+ include_all
99
+ else
100
+ false
101
+ end
102
+ end
103
+
104
+ def respond_to_missing?(symbol, include_private)
105
+ @params.has_key?(symbol)
106
+ end
107
+
108
+ def method_missing(name, *args)
109
+ if @params.has_key?(name)
110
+ @params[name]
111
+ else
112
+ ::Kernel.raise ::NoMethodError, "undefined method `#{name}' for #{self.inspect}"
113
+ end
114
+ end
115
+ end
116
+
117
+ module SectionGenerator
118
+ def self.generate(proxy, conf, logger, plugin_class, stack = [], strict_config_value = false)
119
+ return nil if conf.nil?
120
+
121
+ section_stack = ""
122
+ unless stack.empty?
123
+ section_stack = ", in section " + stack.join(" > ")
124
+ end
125
+
126
+ section_params = {}
127
+
128
+ proxy.defaults.each_pair do |name, defval|
129
+ varname = name.to_sym
130
+ section_params[varname] = (defval.dup rescue defval)
131
+ end
132
+
133
+ if proxy.argument
134
+ unless conf.arg.nil? || conf.arg.empty?
135
+ key, block, opts = proxy.argument
136
+ opts = opts.merge(strict: true) if strict_config_value
137
+
138
+ if conf.arg == :default
139
+ unless section_params.has_key?(key)
140
+ logger.error "config error in:\n#{conf}" if logger
141
+ raise ConfigError, "'#{key}' doesn't have default value"
142
+ end
143
+ else
144
+ begin
145
+ section_params[key] = self.instance_exec(conf.arg, opts, key, &block)
146
+ rescue ConfigError => e
147
+ logger.error "config error in:\n#{conf}" if logger
148
+ raise e
149
+ end
150
+ end
151
+ end
152
+ unless section_params.has_key?(proxy.argument.first)
153
+ logger.error "config error in:\n#{conf}" if logger # logger should exist, but somethimes it's nil (e.g, in tests)
154
+ raise ConfigError, "'<#{proxy.name} ARG>' section requires argument" + section_stack
155
+ end
156
+ # argument should NOT be deprecated... (argument always has a value: '')
157
+ end
158
+
159
+ proxy.params.each_pair do |name, defval|
160
+ varname = name.to_sym
161
+ block, opts = defval
162
+ opts = opts.merge(strict: true) if strict_config_value
163
+
164
+ if conf.has_key?(name.to_s) || opts[:alias] && conf.has_key?(opts[:alias].to_s)
165
+ val = if conf.has_key?(name.to_s)
166
+ conf[name.to_s]
167
+ else
168
+ conf[opts[:alias].to_s]
169
+ end
170
+
171
+ if val == :default
172
+ # default value is already set if it exists
173
+ unless section_params.has_key?(varname)
174
+ logger.error "config error in:\n#{conf}" if logger
175
+ raise ConfigError, "'#{varname}' doesn't have default value"
176
+ end
177
+ else
178
+ begin
179
+ section_params[varname] = self.instance_exec(val, opts, name, &block)
180
+ rescue ConfigError => e
181
+ logger.error "config error in:\n#{conf}" if logger
182
+ raise e
183
+ end
184
+ end
185
+
186
+ if section_params[varname].nil?
187
+ unless proxy.defaults.has_key?(varname) && proxy.defaults[varname].nil?
188
+ logger.error "config error in:\n#{conf}" if logger
189
+ raise ConfigError, "'#{name}' parameter is required but nil is specified"
190
+ end
191
+ end
192
+
193
+ # Source of definitions of deprecated/obsoleted:
194
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features
195
+ #
196
+ # Deprecated: These deprecated features can still be used, but should be used with caution
197
+ # because they are expected to be removed entirely sometime in the future.
198
+ # Obsoleted: These obsolete features have been entirely removed from JavaScript and can no longer be used.
199
+ if opts[:deprecated]
200
+ logger.warn "'#{name}' parameter is deprecated: #{opts[:deprecated]}" if logger
201
+ end
202
+ if opts[:obsoleted]
203
+ logger.error "config error in:\n#{conf}" if logger
204
+ raise ObsoletedParameterError, "'#{name}' parameter is already removed: #{opts[:obsoleted]}" + section_stack
205
+ end
206
+ end
207
+ unless section_params.has_key?(varname)
208
+ logger.error "config error in:\n#{conf}" if logger
209
+ raise ConfigError, "'#{name}' parameter is required" + section_stack
210
+ end
211
+ end
212
+
213
+ check_unused_section(proxy, conf, plugin_class)
214
+
215
+ proxy.sections.each do |name, subproxy|
216
+ varname = subproxy.variable_name
217
+ elements = (conf.respond_to?(:elements) ? conf.elements : []).select{ |e| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
218
+ if elements.empty? && subproxy.init?
219
+ if subproxy.argument && !subproxy.defaults.has_key?(subproxy.argument.first)
220
+ raise ArgumentError, "#{name}: init is specified, but default value of argument is missing"
221
+ end
222
+ missing_keys = subproxy.params.keys.select{|param_name| !subproxy.defaults.has_key?(param_name)}
223
+ if !missing_keys.empty?
224
+ raise ArgumentError, "#{name}: init is specified, but there're parameters without default values:#{missing_keys.join(',')}"
225
+ end
226
+ elements << Fluent::Config::Element.new(subproxy.name.to_s, '', {}, [])
227
+ end
228
+
229
+ # set subproxy for secret option
230
+ elements.each { |element|
231
+ element.corresponding_proxies << subproxy
232
+ }
233
+
234
+ if subproxy.required? && elements.size < 1
235
+ logger.error "config error in:\n#{conf}" if logger
236
+ raise ConfigError, "'<#{subproxy.name}>' sections are required" + section_stack
237
+ end
238
+ if subproxy.multi?
239
+ section_params[varname] = elements.map{ |e| generate(subproxy, e, logger, plugin_class, stack + [subproxy.name], strict_config_value) }
240
+ else
241
+ if elements.size > 1
242
+ logger.error "config error in:\n#{conf}" if logger
243
+ raise ConfigError, "'<#{subproxy.name}>' section cannot be written twice or more" + section_stack
244
+ end
245
+ section_params[varname] = generate(subproxy, elements.first, logger, plugin_class, stack + [subproxy.name], strict_config_value)
246
+ end
247
+ end
248
+
249
+ Section.new(section_params, conf)
250
+ end
251
+
252
+ def self.check_unused_section(proxy, conf, plugin_class)
253
+ elems = conf.respond_to?(:elements) ? conf.elements : []
254
+ elems.each { |e|
255
+ next if plugin_class.nil? && Fluent::Config::V1Parser::ELEM_SYMBOLS.include?(e.name) # skip pre-defined non-plugin elements because it doesn't have proxy section
256
+ next if e.unused_in && e.unused_in.empty? # the section is used at least once
257
+
258
+ if proxy.sections.any? { |name, subproxy| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
259
+ e.unused_in = []
260
+ else
261
+ parent_name = if conf.arg.empty?
262
+ conf.name
263
+ else
264
+ "#{conf.name} #{conf.arg}"
265
+ end
266
+ e.unused_in = [parent_name, plugin_class]
267
+ end
268
+ }
269
+ end
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,249 @@
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 'json'
18
+
19
+ require 'fluent/config/error'
20
+
21
+ module Fluent
22
+ module Config
23
+ def self.reformatted_value(type, val, opts = {}, name = nil)
24
+ REFORMAT_VALUE.call(type, val, opts, name)
25
+ end
26
+
27
+ def self.size_value(str, opts = {}, name = nil)
28
+ return nil if str.nil?
29
+
30
+ case str.to_s
31
+ when /([0-9]+)k/i
32
+ $~[1].to_i * 1024
33
+ when /([0-9]+)m/i
34
+ $~[1].to_i * (1024 ** 2)
35
+ when /([0-9]+)g/i
36
+ $~[1].to_i * (1024 ** 3)
37
+ when /([0-9]+)t/i
38
+ $~[1].to_i * (1024 ** 4)
39
+ else
40
+ INTEGER_TYPE.call(str, opts, name)
41
+ end
42
+ end
43
+
44
+ def self.time_value(str, opts = {}, name = nil)
45
+ return nil if str.nil?
46
+
47
+ case str.to_s
48
+ when /([0-9]+)s/
49
+ $~[1].to_i
50
+ when /([0-9]+)m/
51
+ $~[1].to_i * 60
52
+ when /([0-9]+)h/
53
+ $~[1].to_i * 60 * 60
54
+ when /([0-9]+)d/
55
+ $~[1].to_i * 24 * 60 * 60
56
+ else
57
+ FLOAT_TYPE.call(str, opts, name)
58
+ end
59
+ end
60
+
61
+ def self.bool_value(str, opts = {}, name = nil)
62
+ return nil if str.nil?
63
+
64
+ case str.to_s
65
+ when 'true', 'yes'
66
+ true
67
+ when 'false', 'no'
68
+ false
69
+ when ''
70
+ true
71
+ else
72
+ # Current parser passes comment without actual values, e.g. "param #foo".
73
+ # parser should pass empty string in this case but changing behaviour may break existing environment so keep parser behaviour. Just ignore comment value in boolean handling for now.
74
+ if str.respond_to?('start_with?') && str.start_with?('#')
75
+ true
76
+ elsif opts[:strict]
77
+ raise Fluent::ConfigError, "#{name}: invalid bool value: #{str}"
78
+ else
79
+ nil
80
+ end
81
+ end
82
+ end
83
+
84
+ def self.regexp_value(str, opts = {}, name = nil)
85
+ return nil unless str
86
+
87
+ return Regexp.compile(str) unless str.start_with?("/")
88
+ right_slash_position = str.rindex("/")
89
+ if right_slash_position < str.size - 3
90
+ raise Fluent::ConfigError, "invalid regexp: missing right slash: #{str}"
91
+ end
92
+ options = str[(right_slash_position + 1)..-1]
93
+ option = 0
94
+ option |= Regexp::IGNORECASE if options.include?("i")
95
+ option |= Regexp::MULTILINE if options.include?("m")
96
+ Regexp.compile(str[1...right_slash_position], option)
97
+ end
98
+
99
+ def self.string_value(val, opts = {}, name = nil)
100
+ return nil if val.nil?
101
+
102
+ v = val.to_s
103
+ v = v.frozen? ? v.dup : v # config_param can't assume incoming string is mutable
104
+ v.force_encoding(Encoding::UTF_8)
105
+ end
106
+
107
+ STRING_TYPE = Proc.new { |val, opts = {}, name = nil|
108
+ Config.string_value(val, opts, name)
109
+ }
110
+
111
+ def self.symbol_value(val, opts = {}, name = nil)
112
+ return nil if val.nil? || val.empty?
113
+
114
+ val.delete_prefix(":").to_sym
115
+ end
116
+
117
+ SYMBOL_TYPE = Proc.new { |val, opts = {}, name = nil|
118
+ Config.symbol_value(val, opts, name)
119
+ }
120
+
121
+ def self.enum_value(val, opts = {}, name = nil)
122
+ return nil if val.nil?
123
+
124
+ s = val.to_sym
125
+ list = opts[:list]
126
+ raise "Plugin BUG: config type 'enum' requires :list of symbols" unless list.is_a?(Array) && list.all?{|v| v.is_a? Symbol }
127
+ unless list.include?(s)
128
+ raise ConfigError, "valid options are #{list.join(',')} but got #{val}"
129
+ end
130
+ s
131
+ end
132
+
133
+ ENUM_TYPE = Proc.new { |val, opts = {}, name = nil|
134
+ Config.enum_value(val, opts, name)
135
+ }
136
+
137
+ INTEGER_TYPE = Proc.new { |val, opts = {}, name = nil|
138
+ if val.nil?
139
+ nil
140
+ elsif opts[:strict]
141
+ begin
142
+ Integer(val)
143
+ rescue ArgumentError, TypeError => e
144
+ raise ConfigError, "#{name}: #{e.message}"
145
+ end
146
+ else
147
+ val.to_i
148
+ end
149
+ }
150
+
151
+ FLOAT_TYPE = Proc.new { |val, opts = {}, name = nil|
152
+ if val.nil?
153
+ nil
154
+ elsif opts[:strict]
155
+ begin
156
+ Float(val)
157
+ rescue ArgumentError, TypeError => e
158
+ raise ConfigError, "#{name}: #{e.message}"
159
+ end
160
+ else
161
+ val.to_f
162
+ end
163
+ }
164
+
165
+ SIZE_TYPE = Proc.new { |val, opts = {}, name = nil|
166
+ Config.size_value(val, opts, name)
167
+ }
168
+
169
+ BOOL_TYPE = Proc.new { |val, opts = {}, name = nil|
170
+ Config.bool_value(val, opts, name)
171
+ }
172
+
173
+ TIME_TYPE = Proc.new { |val, opts = {}, name = nil|
174
+ Config.time_value(val, opts, name)
175
+ }
176
+
177
+ REGEXP_TYPE = Proc.new { |val, opts = {}, name = nil|
178
+ Config.regexp_value(val, opts, name)
179
+ }
180
+
181
+ REFORMAT_VALUE = ->(type, value, opts = {}, name = nil) {
182
+ if value.nil?
183
+ value
184
+ else
185
+ case type
186
+ when :string then value.to_s.force_encoding(Encoding::UTF_8)
187
+ when :integer then INTEGER_TYPE.call(value, opts, name)
188
+ when :float then FLOAT_TYPE.call(value, opts, name)
189
+ when :size then Config.size_value(value, opts, name)
190
+ when :bool then Config.bool_value(value, opts, name)
191
+ when :time then Config.time_value(value, opts, name)
192
+ when :regexp then Config.regexp_value(value, opts, name)
193
+ when :symbol then Config.symbol_value(value, opts, name)
194
+ else
195
+ raise "unknown type in REFORMAT: #{type}"
196
+ end
197
+ end
198
+ }
199
+
200
+ def self.hash_value(val, opts = {}, name = nil)
201
+ return nil if val.nil?
202
+
203
+ param = if val.is_a?(String)
204
+ val.start_with?('{') ? JSON.parse(val) : Hash[val.strip.split(/\s*,\s*/).map{|v| v.split(':', 2)}]
205
+ else
206
+ val
207
+ end
208
+ if param.class != Hash
209
+ raise ConfigError, "hash required but got #{val.inspect}"
210
+ end
211
+ if opts.empty?
212
+ param
213
+ else
214
+ newparam = {}
215
+ param.each_pair do |key, value|
216
+ new_key = opts[:symbolize_keys] ? key.to_sym : key
217
+ newparam[new_key] = opts[:value_type] ? REFORMAT_VALUE.call(opts[:value_type], value, opts, new_key) : value
218
+ end
219
+ newparam
220
+ end
221
+ end
222
+
223
+ HASH_TYPE = Proc.new { |val, opts = {}, name = nil|
224
+ Config.hash_value(val, opts, name)
225
+ }
226
+
227
+ def self.array_value(val, opts = {}, name = nil)
228
+ return nil if val.nil?
229
+
230
+ param = if val.is_a?(String)
231
+ val.start_with?('[') ? JSON.parse(val) : val.strip.split(/\s*,\s*/)
232
+ else
233
+ val
234
+ end
235
+ if param.class != Array
236
+ raise ConfigError, "array required but got #{val.inspect}"
237
+ end
238
+ if opts[:value_type]
239
+ param.map{|v| REFORMAT_VALUE.call(opts[:value_type], v, opts, nil) }
240
+ else
241
+ param
242
+ end
243
+ end
244
+
245
+ ARRAY_TYPE = Proc.new { |val, opts = {}, name = nil|
246
+ Config.array_value(val, opts, name)
247
+ }
248
+ end
249
+ end
@@ -0,0 +1,192 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'strscan'
18
+ require 'uri'
19
+
20
+ require 'fluent/config/error'
21
+ require 'fluent/config/basic_parser'
22
+ require 'fluent/config/literal_parser'
23
+ require 'fluent/config/element'
24
+
25
+ module Fluent
26
+ module Config
27
+ class V1Parser < LiteralParser
28
+ ELEMENT_NAME = /[a-zA-Z0-9_]+/
29
+
30
+ def self.parse(data, fname, basepath = Dir.pwd, eval_context = nil)
31
+ ss = StringScanner.new(data)
32
+ ps = V1Parser.new(ss, basepath, fname, eval_context)
33
+ ps.parse!
34
+ end
35
+
36
+ def initialize(strscan, include_basepath, fname, eval_context)
37
+ super(strscan, eval_context)
38
+ @include_basepath = include_basepath
39
+ @fname = fname
40
+ @logger = defined?($log) ? $log : nil
41
+ end
42
+
43
+ def parse!
44
+ attrs, elems = parse_element(true, nil)
45
+ root = Element.new('ROOT', '', attrs, elems)
46
+ root.v1_config = true
47
+
48
+ spacing
49
+ unless eof?
50
+ parse_error! "expected EOF"
51
+ end
52
+
53
+ return root
54
+ end
55
+
56
+ ELEM_SYMBOLS = ['match', 'source', 'filter', 'system']
57
+ RESERVED_PARAMS = %W(@type @id @label @log_level)
58
+
59
+ def parse_element(root_element, elem_name, attrs = {}, elems = [])
60
+ while true
61
+ spacing
62
+ if eof?
63
+ if root_element
64
+ break
65
+ end
66
+ parse_error! "expected end tag '</#{elem_name}>' but got end of file"
67
+ end
68
+
69
+ if skip(/\<\//)
70
+ e_name = scan(ELEMENT_NAME)
71
+ spacing
72
+ unless skip(/\>/)
73
+ parse_error! "expected character in tag name"
74
+ end
75
+ unless line_end
76
+ parse_error! "expected end of line after end tag"
77
+ end
78
+ if e_name != elem_name
79
+ parse_error! "unmatched end tag"
80
+ end
81
+ break
82
+
83
+ elsif skip(/\</)
84
+ e_name = scan(ELEMENT_NAME)
85
+ spacing
86
+ e_arg = scan_string(/(?:#{ZERO_OR_MORE_SPACING}\>)/)
87
+ spacing
88
+ unless skip(/\>/)
89
+ parse_error! "expected '>'"
90
+ end
91
+ unless line_end
92
+ parse_error! "expected end of line after tag"
93
+ end
94
+ e_arg ||= ''
95
+ # call parse_element recursively
96
+ e_attrs, e_elems = parse_element(false, e_name)
97
+ new_e = Element.new(e_name, e_arg, e_attrs, e_elems)
98
+ new_e.v1_config = true
99
+ elems << new_e
100
+
101
+ elsif root_element && skip(/(\@include|include)#{SPACING}/)
102
+ if !prev_match.start_with?('@')
103
+ @logger.warn "'include' is deprecated. Use '@include' instead" if @logger
104
+ end
105
+ parse_include(attrs, elems)
106
+
107
+ else
108
+ k = scan_string(SPACING)
109
+ spacing_without_comment
110
+ if prev_match.include?("\n") || eof? # support 'tag_mapped' like "without value" configuration
111
+ attrs[k] = ""
112
+ else
113
+ if k == '@include'
114
+ parse_include(attrs, elems)
115
+ elsif RESERVED_PARAMS.include?(k)
116
+ v = parse_literal
117
+ unless line_end
118
+ parse_error! "expected end of line"
119
+ end
120
+ attrs[k] = v
121
+ else
122
+ if k.start_with?('@')
123
+ if root_element || ELEM_SYMBOLS.include?(elem_name)
124
+ parse_error! "'@' is the system reserved prefix. Don't use '@' prefix parameter in the configuration: #{k}"
125
+ else
126
+ # TODO: This is for backward compatibility. It will throw an error in the future.
127
+ @logger.warn "'@' is the system reserved prefix. It works in the nested configuration for now but it will be rejected: #{k}" if @logger
128
+ end
129
+ end
130
+
131
+ v = parse_literal
132
+ unless line_end
133
+ parse_error! "expected end of line"
134
+ end
135
+ attrs[k] = v
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ return attrs, elems
142
+ end
143
+
144
+ def parse_include(attrs, elems)
145
+ uri = scan_string(LINE_END)
146
+ eval_include(attrs, elems, uri)
147
+ line_end
148
+ end
149
+
150
+ def eval_include(attrs, elems, uri)
151
+ # replace space(s)(' ') with '+' to prevent invalid uri due to space(s).
152
+ # See: https://github.com/fluent/fluentd/pull/2780#issuecomment-576081212
153
+ u = URI.parse(uri.gsub(/ /, '+'))
154
+ if u.scheme == 'file' || (!u.scheme.nil? && u.scheme.length == 1) || u.path == uri.gsub(/ /, '+') # file path
155
+ # When the Windows absolute path then u.scheme.length == 1
156
+ # e.g. C:
157
+ path = URI.decode_www_form_component(u.path)
158
+ if path[0] != ?/
159
+ pattern = File.expand_path("#{@include_basepath}/#{path}")
160
+ else
161
+ pattern = path
162
+ end
163
+ Dir.glob(pattern).sort.each { |entry|
164
+ basepath = File.dirname(entry)
165
+ fname = File.basename(entry)
166
+ data = File.read(entry)
167
+ data.force_encoding('UTF-8')
168
+ ss = StringScanner.new(data)
169
+ V1Parser.new(ss, basepath, fname, @eval_context).parse_element(true, nil, attrs, elems)
170
+ }
171
+ else
172
+ require 'open-uri'
173
+ basepath = '/'
174
+ fname = path
175
+ data = URI.open(uri) { |f| f.read }
176
+ data.force_encoding('UTF-8')
177
+ ss = StringScanner.new(data)
178
+ V1Parser.new(ss, basepath, fname, @eval_context).parse_element(true, nil, attrs, elems)
179
+ end
180
+ rescue SystemCallError => e
181
+ cpe = ConfigParseError.new("include error #{uri} - #{e}")
182
+ cpe.set_backtrace(e.backtrace)
183
+ raise cpe
184
+ end
185
+
186
+ # override
187
+ def error_sample
188
+ "#{@fname} #{super}"
189
+ end
190
+ end
191
+ end
192
+ end