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,265 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/config/error'
18
+ require 'fluent/config/literal_parser'
19
+
20
+ module Fluent
21
+ module Config
22
+ class Element < Hash
23
+ def initialize(name, arg, attrs, elements, unused = nil)
24
+ @name = name
25
+ @arg = arg
26
+ @elements = elements
27
+ super()
28
+ attrs.each { |k, v|
29
+ self[k] = v
30
+ }
31
+ @unused = unused || attrs.keys
32
+ @v1_config = false
33
+ @corresponding_proxies = [] # some plugins use flat parameters, e.g. in_http doesn't provide <format> section for parser.
34
+ @unused_in = nil # if this element is not used in plugins, correspoing plugin name and parent element name is set, e.g. [source, plugin class].
35
+
36
+ # it's global logger, not plugin logger: deprecated message should be global warning, not plugin level.
37
+ @logger = defined?($log) ? $log : nil
38
+
39
+ @target_worker_ids = []
40
+ end
41
+
42
+ attr_accessor :name, :arg, :unused, :v1_config, :corresponding_proxies, :unused_in
43
+ attr_writer :elements
44
+ attr_reader :target_worker_ids
45
+
46
+ RESERVED_PARAMETERS_COMPAT = {
47
+ '@type' => 'type',
48
+ '@id' => 'id',
49
+ '@log_level' => 'log_level',
50
+ '@label' => nil,
51
+ }
52
+ RESERVED_PARAMETERS = RESERVED_PARAMETERS_COMPAT.keys
53
+
54
+ def elements(*names, name: nil, arg: nil)
55
+ raise ArgumentError, "name and names are exclusive" if name && !names.empty?
56
+ raise ArgumentError, "arg is available only with name" if arg && !name
57
+
58
+ if name
59
+ @elements.select{|e| e.name == name && (!arg || e.arg == arg) }
60
+ elsif !names.empty?
61
+ @elements.select{|e| names.include?(e.name) }
62
+ else
63
+ @elements
64
+ end
65
+ end
66
+
67
+ def add_element(name, arg = '')
68
+ e = Element.new(name, arg, {}, [])
69
+ e.v1_config = @v1_config
70
+ @elements << e
71
+ e
72
+ end
73
+
74
+ def inspect
75
+ attrs = super
76
+ "name:#{@name}, arg:#{@arg}, " + attrs + ", " + @elements.inspect
77
+ end
78
+
79
+ # Used by PP and Pry
80
+ def pretty_print(q)
81
+ q.text(inspect)
82
+ end
83
+
84
+ # This method assumes _o_ is an Element object. Should return false for nil or other object
85
+ def ==(o)
86
+ self.name == o.name && self.arg == o.arg &&
87
+ self.keys.size == o.keys.size &&
88
+ self.keys.reduce(true){|r, k| r && self[k] == o[k] } &&
89
+ self.elements.size == o.elements.size &&
90
+ [self.elements, o.elements].transpose.reduce(true){|r, e| r && e[0] == e[1] }
91
+ end
92
+
93
+ def +(o)
94
+ e = Element.new(@name.dup, @arg.dup, o.merge(self), @elements + o.elements, (@unused + o.unused).uniq)
95
+ e.v1_config = @v1_config
96
+ e
97
+ end
98
+
99
+ # no code in fluentd uses this method
100
+ def each_element(*names, &block)
101
+ if names.empty?
102
+ @elements.each(&block)
103
+ else
104
+ @elements.each { |e|
105
+ if names.include?(e.name)
106
+ block.yield(e)
107
+ end
108
+ }
109
+ end
110
+ end
111
+
112
+ def has_key?(key)
113
+ @unused_in = [] # some sections, e.g. <store> in copy, is not defined by config_section so clear unused flag for better warning message in check_not_fetched.
114
+ @unused.delete(key)
115
+ super
116
+ end
117
+
118
+ def [](key)
119
+ @unused_in = [] # ditto
120
+ @unused.delete(key)
121
+
122
+ if RESERVED_PARAMETERS.include?(key) && !has_key?(key) && has_key?(RESERVED_PARAMETERS_COMPAT[key])
123
+ @logger.warn "'#{RESERVED_PARAMETERS_COMPAT[key]}' is deprecated parameter name. use '#{key}' instead." if @logger
124
+ return self[RESERVED_PARAMETERS_COMPAT[key]]
125
+ end
126
+
127
+ super
128
+ end
129
+
130
+ def check_not_fetched(&block)
131
+ each_key { |key|
132
+ if @unused.include?(key)
133
+ block.call(key, self)
134
+ end
135
+ }
136
+ @elements.each { |e|
137
+ e.check_not_fetched(&block)
138
+ }
139
+ end
140
+
141
+ def to_s(nest = 0)
142
+ indent = " " * nest
143
+ nindent = " " * (nest + 1)
144
+ out = ""
145
+ if @arg.nil? || @arg.empty?
146
+ out << "#{indent}<#{@name}>\n"
147
+ else
148
+ out << "#{indent}<#{@name} #{@arg}>\n"
149
+ end
150
+ each_pair { |k, v|
151
+ out << dump_value(k, v, nindent)
152
+ }
153
+ @elements.each { |e|
154
+ out << e.to_s(nest + 1)
155
+ }
156
+ out << "#{indent}</#{@name}>\n"
157
+ out
158
+ end
159
+
160
+ def to_masked_element
161
+ new_elems = @elements.map { |e| e.to_masked_element }
162
+ new_elem = Element.new(@name, @arg, {}, new_elems, @unused)
163
+ new_elem.v1_config = @v1_config
164
+ new_elem.corresponding_proxies = @corresponding_proxies
165
+ each_pair { |k, v|
166
+ new_elem[k] = secret_param?(k) ? 'xxxxxx' : v
167
+ }
168
+ new_elem
169
+ end
170
+
171
+ def secret_param?(key)
172
+ return false if @corresponding_proxies.empty?
173
+
174
+ param_key = key.to_sym
175
+ @corresponding_proxies.each { |proxy|
176
+ _block, opts = proxy.params[param_key]
177
+ if opts && opts.has_key?(:secret)
178
+ return opts[:secret]
179
+ end
180
+ }
181
+
182
+ false
183
+ end
184
+
185
+ def param_type(key)
186
+ return nil if @corresponding_proxies.empty?
187
+
188
+ param_key = key.to_sym
189
+ proxy = @corresponding_proxies.detect do |_proxy|
190
+ _proxy.params.has_key?(param_key)
191
+ end
192
+ return nil unless proxy
193
+ _block, opts = proxy.params[param_key]
194
+ opts[:type]
195
+ end
196
+
197
+ def default_value(key)
198
+ return nil if @corresponding_proxies.empty?
199
+
200
+ param_key = key.to_sym
201
+ proxy = @corresponding_proxies.detect do |_proxy|
202
+ _proxy.params.has_key?(param_key)
203
+ end
204
+ return nil unless proxy
205
+ proxy.defaults[param_key]
206
+ end
207
+
208
+ def dump_value(k, v, nindent)
209
+ return "#{nindent}#{k} xxxxxx\n" if secret_param?(k)
210
+ return "#{nindent}#{k} #{v}\n" unless @v1_config
211
+
212
+ # for v1 config
213
+ if v.nil?
214
+ "#{nindent}#{k} \n"
215
+ elsif v == :default
216
+ "#{nindent}#{k} #{default_value(k)}\n"
217
+ else
218
+ case param_type(k)
219
+ when :string
220
+ "#{nindent}#{k} \"#{self.class.unescape_parameter(v)}\"\n"
221
+ when :enum, :integer, :float, :size, :bool, :time
222
+ "#{nindent}#{k} #{v}\n"
223
+ when :hash, :array
224
+ "#{nindent}#{k} #{v}\n"
225
+ else
226
+ # Unknown type
227
+ "#{nindent}#{k} #{v}\n"
228
+ end
229
+ end
230
+ end
231
+
232
+ def self.unescape_parameter(v)
233
+ result = ''
234
+ v.each_char { |c| result << LiteralParser.unescape_char(c) }
235
+ result
236
+ end
237
+
238
+ def set_target_worker_id(worker_id)
239
+ @target_worker_ids = [worker_id]
240
+ @elements.each { |e|
241
+ e.set_target_worker_id(worker_id)
242
+ }
243
+ end
244
+
245
+ def set_target_worker_ids(worker_ids)
246
+ @target_worker_ids = worker_ids.uniq
247
+ @elements.each { |e|
248
+ e.set_target_worker_ids(worker_ids.uniq)
249
+ }
250
+ end
251
+
252
+ def for_every_workers?
253
+ @target_worker_ids.empty?
254
+ end
255
+
256
+ def for_this_worker?
257
+ @target_worker_ids.include?(Fluent::Engine.worker_id)
258
+ end
259
+
260
+ def for_another_worker?
261
+ !@target_worker_ids.empty? && !@target_worker_ids.include?(Fluent::Engine.worker_id)
262
+ end
263
+ end
264
+ end
265
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Fluent
18
+ class ConfigError < StandardError
19
+ end
20
+
21
+ class ConfigParseError < ConfigError
22
+ end
23
+
24
+ class ObsoletedParameterError < ConfigError
25
+ end
26
+
27
+ class SetNil < Exception
28
+ end
29
+
30
+ class SetDefault < Exception
31
+ end
32
+ end
@@ -0,0 +1,286 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'stringio'
18
+
19
+ require 'json'
20
+ require 'yajl'
21
+ require 'socket'
22
+ require 'ripper'
23
+
24
+ require 'fluent/config/basic_parser'
25
+
26
+ module Fluent
27
+ module Config
28
+ class LiteralParser < BasicParser
29
+ def self.unescape_char(c)
30
+ case c
31
+ when '"'
32
+ '\"'
33
+ when "'"
34
+ "\\'"
35
+ when '\\'
36
+ '\\\\'
37
+ when "\r"
38
+ '\r'
39
+ when "\n"
40
+ '\n'
41
+ when "\t"
42
+ '\t'
43
+ when "\f"
44
+ '\f'
45
+ when "\b"
46
+ '\b'
47
+ else
48
+ c
49
+ end
50
+ end
51
+
52
+ def initialize(strscan, eval_context)
53
+ super(strscan)
54
+ @eval_context = eval_context
55
+ unless @eval_context.respond_to?(:use_nil)
56
+ def @eval_context.use_nil
57
+ raise SetNil
58
+ end
59
+ end
60
+ unless @eval_context.respond_to?(:use_default)
61
+ def @eval_context.use_default
62
+ raise SetDefault
63
+ end
64
+ end
65
+ end
66
+
67
+ def parse_literal(string_boundary_charset = LINE_END)
68
+ spacing_without_comment
69
+
70
+ value = if skip(/\[/)
71
+ scan_json(true)
72
+ elsif skip(/\{/)
73
+ scan_json(false)
74
+ else
75
+ scan_string(string_boundary_charset)
76
+ end
77
+ value
78
+ end
79
+
80
+ def scan_string(string_boundary_charset = LINE_END)
81
+ if skip(/\"/)
82
+ return scan_double_quoted_string
83
+ elsif skip(/\'/)
84
+ return scan_single_quoted_string
85
+ else
86
+ return scan_nonquoted_string(string_boundary_charset)
87
+ end
88
+ end
89
+
90
+ def scan_double_quoted_string
91
+ string = []
92
+ while true
93
+ if skip(/\"/)
94
+ if string.include?(nil)
95
+ return nil
96
+ elsif string.include?(:default)
97
+ return :default
98
+ else
99
+ return string.join
100
+ end
101
+ elsif check(/[^"]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
102
+ if s = check(/[^\\]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
103
+ string << s
104
+ end
105
+ skip(/[^"]#{LINE_END_WITHOUT_SPACING_AND_COMMENT}/)
106
+ elsif s = scan(/\\./)
107
+ string << eval_escape_char(s[1,1])
108
+ elsif skip(/\#\{/)
109
+ string << eval_embedded_code(scan_embedded_code)
110
+ skip(/\}/)
111
+ elsif s = scan(/./)
112
+ string << s
113
+ else
114
+ parse_error! "unexpected end of file in a double quoted string"
115
+ end
116
+ end
117
+ end
118
+
119
+ def scan_single_quoted_string
120
+ string = []
121
+ while true
122
+ if skip(/\'/)
123
+ return string.join
124
+ elsif s = scan(/\\'/)
125
+ string << "'"
126
+ elsif s = scan(/\\\\/)
127
+ string << "\\"
128
+ elsif s = scan(/./)
129
+ string << s
130
+ else
131
+ parse_error! "unexpected end of file in a single quoted string"
132
+ end
133
+ end
134
+ end
135
+
136
+ def scan_nonquoted_string(boundary_charset = LINE_END)
137
+ charset = /(?!#{boundary_charset})./
138
+
139
+ string = []
140
+ while true
141
+ if s = scan(/\#/)
142
+ string << '#'
143
+ elsif s = scan(charset)
144
+ string << s
145
+ else
146
+ break
147
+ end
148
+ end
149
+
150
+ if string.empty?
151
+ return nil
152
+ end
153
+
154
+ string.join
155
+ end
156
+
157
+ def scan_embedded_code
158
+ src = '"#{'+@ss.rest+"\n=begin\n=end\n}"
159
+
160
+ seek = -1
161
+ while (seek = src.index('}', seek + 1))
162
+ unless Ripper.sexp(src[0..seek] + '"').nil? # eager parsing until valid expression
163
+ break
164
+ end
165
+ end
166
+
167
+ unless seek
168
+ raise Fluent::ConfigParseError, @ss.rest
169
+ end
170
+
171
+ code = src[3, seek-3]
172
+
173
+ if @ss.rest.length < code.length
174
+ @ss.pos += @ss.rest.length
175
+ parse_error! "expected end of embedded code but $end"
176
+ end
177
+
178
+ @ss.pos += code.length
179
+
180
+ '"#{' + code + '}"'
181
+ end
182
+
183
+ def eval_embedded_code(code)
184
+ if @eval_context.nil?
185
+ parse_error! "embedded code is not allowed in this file"
186
+ end
187
+ # Add hostname and worker_id to code for preventing unused warnings
188
+ code = <<EOM + code
189
+ hostname = Socket.gethostname
190
+ worker_id = ENV['SERVERENGINE_WORKER_ID'] || ''
191
+ EOM
192
+ begin
193
+ @eval_context.instance_eval(code)
194
+ rescue SetNil => e
195
+ nil
196
+ rescue SetDefault => e
197
+ :default
198
+ end
199
+ end
200
+
201
+ def eval_escape_char(c)
202
+ case c
203
+ when '"'
204
+ '"'
205
+ when "'"
206
+ "'"
207
+ when "r"
208
+ "\r"
209
+ when "n"
210
+ "\n"
211
+ when "t"
212
+ "\t"
213
+ when "f"
214
+ "\f"
215
+ when "b"
216
+ "\b"
217
+ when "0"
218
+ "\0"
219
+ when /[a-zA-Z0-9]/
220
+ parse_error! "unexpected back-slash escape character '#{c}'"
221
+ else # symbols
222
+ c
223
+ end
224
+ end
225
+
226
+ def scan_json(is_array)
227
+ result = nil
228
+ # Yajl does not raise ParseError for incomplete json string, like '[1', '{"h"', '{"h":' or '{"h1":1'
229
+ # This is the reason to use JSON module.
230
+
231
+ buffer = (is_array ? "[" : "{")
232
+ line_buffer = ""
233
+
234
+ until result
235
+ char = getch
236
+
237
+ break if char.nil?
238
+
239
+ if char == "#"
240
+ # If this is out of json string literals, this object can be parsed correctly
241
+ # '{"foo":"bar", #' -> '{"foo":"bar"}' (to check)
242
+ parsed = nil
243
+ begin
244
+ parsed = JSON.parse(buffer + line_buffer.rstrip.sub(/,$/, '') + (is_array ? "]" : "}"))
245
+ rescue JSON::ParserError
246
+ # This '#' is in json string literals
247
+ end
248
+
249
+ if parsed
250
+ # ignore chars as comment before newline
251
+ while (char = getch) != "\n"
252
+ # ignore comment char
253
+ end
254
+ buffer << line_buffer + "\n"
255
+ line_buffer = ""
256
+ else
257
+ # '#' is a char in json string
258
+ line_buffer << char
259
+ end
260
+
261
+ next # This char '#' MUST NOT terminate json object.
262
+ end
263
+
264
+ if char == "\n"
265
+ buffer << line_buffer + "\n"
266
+ line_buffer = ""
267
+ next
268
+ end
269
+
270
+ line_buffer << char
271
+ begin
272
+ result = JSON.parse(buffer + line_buffer)
273
+ rescue JSON::ParserError
274
+ # Incomplete json string yet
275
+ end
276
+ end
277
+
278
+ unless result
279
+ parse_error! "got incomplete JSON #{is_array ? 'array' : 'hash'} configuration"
280
+ end
281
+
282
+ JSON.dump(result)
283
+ end
284
+ end
285
+ end
286
+ end
@@ -0,0 +1,107 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'uri'
18
+
19
+ require 'fluent/config/error'
20
+ require 'fluent/config/element'
21
+
22
+ module Fluent
23
+ module Config
24
+ class Parser
25
+ def self.parse(io, fname, basepath = Dir.pwd)
26
+ attrs, elems = Parser.new(basepath, io.each_line, fname).parse!(true)
27
+ Element.new('ROOT', '', attrs, elems)
28
+ end
29
+
30
+ def initialize(basepath, iterator, fname, i = 0)
31
+ @basepath = basepath
32
+ @iterator = iterator
33
+ @i = i
34
+ @fname = fname
35
+ end
36
+
37
+ def parse!(allow_include, elem_name = nil, attrs = {}, elems = [])
38
+ while line = @iterator.next
39
+ line.force_encoding('UTF-8')
40
+ @i += 1
41
+ line.lstrip!
42
+ line.gsub!(/\s*(?:\#.*)?$/,'')
43
+ if line.empty?
44
+ next
45
+ elsif m = /^\<include\s*(.*)\s*\/\>$/.match(line)
46
+ value = m[1].strip
47
+ process_include(attrs, elems, value, allow_include)
48
+ elsif m = /^\<([a-zA-Z0-9_]+)\s*(.+?)?\>$/.match(line)
49
+ e_name = m[1]
50
+ e_arg = m[2] || ""
51
+ e_attrs, e_elems = parse!(false, e_name)
52
+ elems << Element.new(e_name, e_arg, e_attrs, e_elems)
53
+ elsif line == "</#{elem_name}>"
54
+ break
55
+ elsif m = /^([a-zA-Z0-9_]+)\s*(.*)$/.match(line)
56
+ key = m[1]
57
+ value = m[2]
58
+ if allow_include && key == 'include'
59
+ process_include(attrs, elems, value)
60
+ else
61
+ attrs[key] = value
62
+ end
63
+ next
64
+ else
65
+ raise ConfigParseError, "parse error at #{@fname} line #{@i}"
66
+ end
67
+ end
68
+
69
+ return attrs, elems
70
+ rescue StopIteration
71
+ return attrs, elems
72
+ end
73
+
74
+ def process_include(attrs, elems, uri, allow_include = true)
75
+ u = URI.parse(uri)
76
+ if u.scheme == 'file' || u.path == uri # file path
77
+ path = u.path
78
+ if path[0] != ?/
79
+ pattern = File.expand_path("#{@basepath}/#{path}")
80
+ else
81
+ pattern = path
82
+ end
83
+
84
+ Dir.glob(pattern).sort.each { |entry|
85
+ basepath = File.dirname(entry)
86
+ fname = File.basename(entry)
87
+ File.open(entry) { |f|
88
+ Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
89
+ }
90
+ }
91
+
92
+ else
93
+ basepath = '/'
94
+ fname = path
95
+ require 'open-uri'
96
+ URI.open(uri) {|f|
97
+ Parser.new(basepath, f.each_line, fname).parse!(allow_include, nil, attrs, elems)
98
+ }
99
+ end
100
+
101
+ rescue SystemCallError => e
102
+ raise ConfigParseError, "include error at #{@fname} line #{@i}: #{e.to_s}"
103
+ end
104
+ end
105
+ end
106
+ end
107
+