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,308 @@
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 "erb"
18
+ require "optparse"
19
+ require "pathname"
20
+ require "fluent/plugin"
21
+ require "fluent/env"
22
+ require "fluent/engine"
23
+ require "fluent/system_config"
24
+ require "fluent/config/element"
25
+ require 'fluent/version'
26
+
27
+ class FluentPluginConfigFormatter
28
+
29
+ AVAILABLE_FORMATS = [:markdown, :txt, :json]
30
+ SUPPORTED_TYPES = [
31
+ "input", "output", "filter",
32
+ "buffer", "parser", "formatter", "storage",
33
+ "service_discovery"
34
+ ]
35
+
36
+ DOCS_BASE_URL = "https://docs.fluentd.org/v/1.0"
37
+ DOCS_PLUGIN_HELPER_BASE_URL = "#{DOCS_BASE_URL}/plugin-helper-overview/"
38
+
39
+ def initialize(argv = ARGV)
40
+ @argv = argv
41
+
42
+ @compact = false
43
+ @format = :markdown
44
+ @verbose = false
45
+ @libs = []
46
+ @plugin_dirs = []
47
+ @table = false
48
+ @options = {}
49
+
50
+ prepare_option_parser
51
+ end
52
+
53
+ def call
54
+ parse_options!
55
+ init_libraries
56
+ @plugin = Fluent::Plugin.__send__("new_#{@plugin_type}", @plugin_name)
57
+ dumped_config = {}
58
+ if @plugin.class.respond_to?(:plugin_helpers)
59
+ dumped_config[:plugin_helpers] = @plugin.class.plugin_helpers
60
+ end
61
+ @plugin.class.ancestors.reverse_each do |plugin_class|
62
+ next unless plugin_class.respond_to?(:dump_config_definition)
63
+ unless @verbose
64
+ next if plugin_class.name =~ /::PluginHelper::/
65
+ end
66
+ dumped_config_definition = plugin_class.dump_config_definition
67
+ dumped_config[plugin_class.name] = dumped_config_definition unless dumped_config_definition.empty?
68
+ end
69
+ case @format
70
+ when :txt
71
+ puts dump_txt(dumped_config)
72
+ when :markdown
73
+ puts dump_markdown(dumped_config)
74
+ when :json
75
+ puts dump_json(dumped_config)
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def dump_txt(dumped_config)
82
+ dumped = ""
83
+ plugin_helpers = dumped_config.delete(:plugin_helpers)
84
+ if plugin_helpers && !plugin_helpers.empty?
85
+ dumped << "helpers: #{plugin_helpers.join(',')}\n"
86
+ end
87
+ if @verbose
88
+ dumped_config.each do |name, config|
89
+ dumped << "#{name}\n"
90
+ dumped << dump_section_txt(config)
91
+ end
92
+ else
93
+ configs = dumped_config.values
94
+ root_section = configs.shift
95
+ configs.each do |config|
96
+ root_section.update(config)
97
+ end
98
+ dumped << dump_section_txt(root_section)
99
+ end
100
+ dumped
101
+ end
102
+
103
+ def dump_section_txt(base_section, level = 0)
104
+ dumped = ""
105
+ indent = " " * level
106
+ if base_section[:section]
107
+ sections = []
108
+ params = base_section
109
+ else
110
+ sections, params = base_section.partition {|_name, value| value[:section] }
111
+ end
112
+ params.each do |name, config|
113
+ next if name == :section
114
+ dumped << "#{indent}#{name}: #{config[:type]}: (#{config[:default].inspect})"
115
+ dumped << " # #{config[:description]}" if config.key?(:description)
116
+ dumped << "\n"
117
+ end
118
+ sections.each do |section_name, sub_section|
119
+ required = sub_section.delete(:required)
120
+ multi = sub_section.delete(:multi)
121
+ alias_name = sub_section.delete(:alias)
122
+ required_label = required ? "required" : "optional"
123
+ multi_label = multi ? "multiple" : "single"
124
+ alias_label = "alias: #{alias_name}"
125
+ dumped << "#{indent}<#{section_name}>: #{required_label}, #{multi_label}"
126
+ if alias_name
127
+ dumped << ", #{alias_label}\n"
128
+ else
129
+ dumped << "\n"
130
+ end
131
+ sub_section.delete(:section)
132
+ dumped << dump_section_txt(sub_section, level + 1)
133
+ end
134
+ dumped
135
+ end
136
+
137
+ def dump_markdown(dumped_config)
138
+ dumped = ""
139
+ plugin_helpers = dumped_config.delete(:plugin_helpers)
140
+ if plugin_helpers && !plugin_helpers.empty?
141
+ dumped = "## Plugin helpers\n\n"
142
+ plugin_helpers.each do |plugin_helper|
143
+ dumped << "* #{plugin_helper_markdown_link(plugin_helper)}\n"
144
+ end
145
+ dumped << "\n"
146
+ end
147
+ dumped_config.each do |name, config|
148
+ if name == @plugin.class.name
149
+ dumped << "## #{name}\n\n"
150
+ dumped << dump_section_markdown(config)
151
+ else
152
+ dumped << "* See also: #{plugin_overview_markdown_link(name)}\n\n"
153
+ end
154
+ end
155
+ dumped
156
+ end
157
+
158
+ def dump_section_markdown(base_section, level = 0)
159
+ dumped = ""
160
+ if base_section[:section]
161
+ sections = []
162
+ params = base_section
163
+ else
164
+ sections, params = base_section.partition {|_name, value| value[:section] }
165
+ end
166
+ if @table && (not params.empty?)
167
+ dumped << "### Configuration\n\n"
168
+ dumped << "|parameter|type|description|default|\n"
169
+ dumped << "|---|---|---|---|\n"
170
+ end
171
+ params.each do |name, config|
172
+ next if name == :section
173
+ template_name = if @compact
174
+ "param.md-compact.erb"
175
+ elsif @table
176
+ "param.md-table.erb"
177
+ else
178
+ "param.md.erb"
179
+ end
180
+ template = template_path(template_name).read
181
+ dumped <<
182
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
183
+ ERB.new(template, trim_mode: "-")
184
+ else
185
+ ERB.new(template, nil, "-")
186
+ end.result(binding)
187
+ end
188
+ dumped << "\n"
189
+ sections.each do |section_name, sub_section|
190
+ required = sub_section.delete(:required)
191
+ multi = sub_section.delete(:multi)
192
+ alias_name = sub_section.delete(:alias)
193
+ sub_section.delete(:section)
194
+ template = template_path("section.md.erb").read
195
+ dumped <<
196
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
197
+ ERB.new(template, trim_mode: "-")
198
+ else
199
+ ERB.new(template, nil, "-")
200
+ end.result(binding)
201
+ end
202
+ dumped
203
+ end
204
+
205
+ def dump_json(dumped_config)
206
+ if @compact
207
+ JSON.generate(dumped_config)
208
+ else
209
+ JSON.pretty_generate(dumped_config)
210
+ end
211
+ end
212
+
213
+ def plugin_helper_url(plugin_helper)
214
+ "#{DOCS_PLUGIN_HELPER_BASE_URL}api-plugin-helper-#{plugin_helper}"
215
+ end
216
+
217
+ def plugin_helper_markdown_link(plugin_helper)
218
+ "[#{plugin_helper}](#{plugin_helper_url(plugin_helper)})"
219
+ end
220
+
221
+ def plugin_overview_url(class_name)
222
+ plugin_type = class_name.slice(/::(\w+)\z/, 1).downcase
223
+ "#{DOCS_BASE_URL}/#{plugin_type}#overview"
224
+ end
225
+
226
+ def plugin_overview_markdown_link(class_name)
227
+ plugin_type = class_name.slice(/::(\w+)\z/, 1)
228
+ "[#{plugin_type} Plugin Overview](#{plugin_overview_url(class_name)})"
229
+ end
230
+
231
+ def usage(message = nil)
232
+ puts @parser.to_s
233
+ puts
234
+ puts "Error: #{message}" if message
235
+ exit(false)
236
+ end
237
+
238
+ def prepare_option_parser
239
+ @parser = OptionParser.new
240
+ @parser.version = Fluent::VERSION
241
+ @parser.banner = <<BANNER
242
+ Usage: #{$0} [options] <type> <name>
243
+
244
+ Output plugin config definitions
245
+
246
+ Arguments:
247
+ \ttype: #{SUPPORTED_TYPES.join(",")}
248
+ \tname: registered plugin name
249
+
250
+ Options:
251
+ BANNER
252
+ @parser.on("--verbose", "Be verbose") do
253
+ @verbose = true
254
+ end
255
+ @parser.on("-c", "--compact", "Compact output") do
256
+ @compact = true
257
+ end
258
+ @parser.on("-f", "--format=FORMAT", "Specify format. (#{AVAILABLE_FORMATS.join(',')})") do |s|
259
+ format = s.to_sym
260
+ usage("Unsupported format: #{s}") unless AVAILABLE_FORMATS.include?(format)
261
+ @format = format
262
+ end
263
+ @parser.on("-I PATH", "Add PATH to $LOAD_PATH") do |s|
264
+ $LOAD_PATH.unshift(s)
265
+ end
266
+ @parser.on("-r NAME", "Load library") do |s|
267
+ @libs << s
268
+ end
269
+ @parser.on("-p", "--plugin=DIR", "Add plugin directory") do |s|
270
+ @plugin_dirs << s
271
+ end
272
+ @parser.on("-t", "--table", "Use table syntax to dump parameters") do
273
+ @table = true
274
+ end
275
+ end
276
+
277
+ def parse_options!
278
+ @parser.parse!(@argv)
279
+
280
+ raise "Must specify plugin type and name" unless @argv.size == 2
281
+
282
+ @plugin_type, @plugin_name = @argv
283
+ @options = {
284
+ compact: @compact,
285
+ format: @format,
286
+ verbose: @verbose,
287
+ }
288
+ rescue => e
289
+ usage(e)
290
+ end
291
+
292
+ def init_libraries
293
+ @libs.each do |lib|
294
+ require lib
295
+ end
296
+
297
+ @plugin_dirs.each do |dir|
298
+ if Dir.exist?(dir)
299
+ dir = File.expand_path(dir)
300
+ Fluent::Plugin.add_plugin_dir(dir)
301
+ end
302
+ end
303
+ end
304
+
305
+ def template_path(name)
306
+ (Pathname(__dir__) + "../../../templates/plugin_config_formatter/#{name}").realpath
307
+ end
308
+ end
@@ -0,0 +1,365 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "optparse"
18
+ require "pathname"
19
+ require "fileutils"
20
+ require "erb"
21
+ require "open-uri"
22
+
23
+ require "fluent/registry"
24
+ require 'fluent/version'
25
+
26
+ class FluentPluginGenerator
27
+ attr_reader :type, :name
28
+ attr_reader :license_name
29
+
30
+ SUPPORTED_TYPES = ["input", "output", "filter", "parser", "formatter", "storage"]
31
+
32
+ def initialize(argv = ARGV)
33
+ @argv = argv
34
+ @parser = prepare_parser
35
+
36
+ @license_name = "Apache-2.0"
37
+ @overwrite_all = false
38
+ end
39
+
40
+ def call
41
+ parse_options!
42
+ FileUtils.mkdir_p(gem_name)
43
+ Dir.chdir(gem_name) do
44
+ copy_license
45
+ template_directory.find do |path|
46
+ next if path.directory?
47
+ dest_dir = path.dirname.sub(/\A#{Regexp.quote(template_directory.to_s)}\/?/, "")
48
+ dest_file = dest_filename(path)
49
+ if path.extname == ".erb"
50
+ if path.fnmatch?("*/plugin/*")
51
+ next unless path.basename.fnmatch?("*#{type}*")
52
+ end
53
+ template(path, dest_dir + dest_file)
54
+ else
55
+ file(path, dest_dir + dest_file)
56
+ end
57
+ end
58
+ pid = spawn("git", "init", ".")
59
+ Process.wait(pid)
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def template_directory
66
+ (Pathname(__dir__) + "../../../templates/new_gem").realpath
67
+ end
68
+
69
+ def template_file(filename)
70
+ template_directory + filename
71
+ end
72
+
73
+ def template(source, dest)
74
+ dest.dirname.mkpath
75
+ contents =
76
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
77
+ ERB.new(source.read, trim_mode: "-")
78
+ else
79
+ ERB.new(source.read, nil, "-")
80
+ end.result(binding)
81
+ label = create_label(dest, contents)
82
+ puts "\t#{label} #{dest}"
83
+ if label == "conflict"
84
+ return unless overwrite?(dest)
85
+ end
86
+ File.write(dest, contents)
87
+ end
88
+
89
+ def file(source, dest)
90
+ label = create_label(dest, source.read)
91
+ puts "\t#{label} #{dest}"
92
+ if label == "conflict"
93
+ return unless overwrite?(dest)
94
+ end
95
+ FileUtils.cp(source, dest)
96
+ end
97
+
98
+ def prepare_parser
99
+ @parser = OptionParser.new
100
+ @parser.version = Fluent::VERSION
101
+ @parser.banner = <<BANNER
102
+ Usage: fluent-plugin-generate [options] <type> <name>
103
+
104
+ Generate a project skeleton for creating a Fluentd plugin
105
+
106
+ Arguments:
107
+ \ttype: #{SUPPORTED_TYPES.join(",")}
108
+ \tname: Your plugin name (fluent-plugin- prefix will be added to <name>)
109
+
110
+ Options:
111
+ BANNER
112
+
113
+ @parser.on("--[no-]license=NAME", "Specify license name (default: Apache-2.0)") do |v|
114
+ @license_name = v || "no-license"
115
+ end
116
+ @parser
117
+ end
118
+
119
+ def parse_options!
120
+ @parser.parse!(@argv)
121
+ unless @argv.size == 2
122
+ raise ArgumentError, "Missing arguments"
123
+ end
124
+ @type, @name = @argv
125
+ rescue => e
126
+ usage("#{e.class}:#{e.message}")
127
+ end
128
+
129
+ def usage(message = "")
130
+ puts message
131
+ puts
132
+ puts @parser.help
133
+ exit(false)
134
+ end
135
+
136
+ def user_name
137
+ v = `git config --get user.name`.chomp
138
+ v.empty? ? "TODO: Write your name" : v
139
+ end
140
+
141
+ def user_email
142
+ v = `git config --get user.email`.chomp
143
+ v.empty? ? "TODO: Write your email" : v
144
+ end
145
+
146
+ def gem_name
147
+ "fluent-plugin-#{dash_name}"
148
+ end
149
+
150
+ def plugin_name
151
+ underscore_name
152
+ end
153
+
154
+ def gem_file_path
155
+ File.expand_path(File.join(File.dirname(__FILE__),
156
+ "../../../",
157
+ "Gemfile"))
158
+ end
159
+
160
+ def lock_file_path
161
+ File.expand_path(File.join(File.dirname(__FILE__),
162
+ "../../../",
163
+ "Gemfile.lock"))
164
+ end
165
+
166
+ def locked_gem_version(gem_name)
167
+ if File.exist?(lock_file_path)
168
+ d = Bundler::Definition.build(gem_file_path, lock_file_path, false)
169
+ d.locked_gems.dependencies[gem_name].requirement.requirements.first.last.version
170
+ else
171
+ # fallback even though Fluentd is installed without bundler
172
+ Gem::Specification.find_by_name(gem_name).version.version
173
+ end
174
+ end
175
+
176
+ def rake_version
177
+ locked_gem_version("rake")
178
+ end
179
+
180
+ def test_unit_version
181
+ locked_gem_version("test-unit")
182
+ end
183
+
184
+ def bundler_version
185
+ if File.exist?(lock_file_path)
186
+ d = Bundler::Definition.build(gem_file_path, lock_file_path, false)
187
+ d.locked_gems.bundler_version.version
188
+ else
189
+ # fallback even though Fluentd is installed without bundler
190
+ Gem::Specification.find_by_name("bundler").version.version
191
+ end
192
+ end
193
+
194
+ def class_name
195
+ "#{capitalized_name}#{type.capitalize}"
196
+ end
197
+
198
+ def plugin_filename
199
+ case type
200
+ when "input"
201
+ "in_#{underscore_name}.rb"
202
+ when "output"
203
+ "out_#{underscore_name}.rb"
204
+ else
205
+ "#{type}_#{underscore_name}.rb"
206
+ end
207
+ end
208
+
209
+ def test_filename
210
+ case type
211
+ when "input"
212
+ "test_in_#{underscore_name}.rb"
213
+ when "output"
214
+ "test_out_#{underscore_name}.rb"
215
+ else
216
+ "test_#{type}_#{underscore_name}.rb"
217
+ end
218
+ end
219
+
220
+ def dest_filename(path)
221
+ case path.to_s
222
+ when %r!\.gemspec!
223
+ "#{gem_name}.gemspec"
224
+ when %r!lib/fluent/plugin!
225
+ plugin_filename
226
+ when %r!test/plugin!
227
+ test_filename
228
+ else
229
+ path.basename.sub_ext("")
230
+ end
231
+ end
232
+
233
+ def capitalized_name
234
+ @capitalized_name ||= name.split(/[-_]/).map(&:capitalize).join
235
+ end
236
+
237
+ def underscore_name
238
+ @underscore_name ||= name.tr("-", "_")
239
+ end
240
+
241
+ def dash_name
242
+ @dash_name ||= name.tr("_", "-")
243
+ end
244
+
245
+ def preamble
246
+ @license.preamble(user_name)
247
+ end
248
+
249
+ def copy_license
250
+ # in gem_name directory
251
+ return unless license_name
252
+ puts "License: #{license_name}"
253
+ license_class = self.class.lookup_license(license_name)
254
+ @license = license_class.new
255
+ Pathname("LICENSE").write(@license.text) unless @license.text.empty?
256
+ rescue Fluent::ConfigError
257
+ usage("Unknown license: #{license_name}")
258
+ rescue => ex
259
+ usage("#{ex.class}: #{ex.message}")
260
+ end
261
+
262
+ def create_label(dest, contents)
263
+ if dest.exist?
264
+ if dest.read == contents
265
+ "identical"
266
+ else
267
+ "conflict"
268
+ end
269
+ else
270
+ "create"
271
+ end
272
+ end
273
+
274
+ def overwrite?(dest)
275
+ return true if @overwrite_all
276
+ loop do
277
+ print "Overwrite #{dest}? (enter \"h\" for help) [Ynaqh]"
278
+ answer = $stdin.gets.chomp
279
+ return true if /\Ay\z/i =~ answer || answer.empty?
280
+ case answer
281
+ when "n"
282
+ return false
283
+ when "a"
284
+ @overwrite_all = true
285
+ return true
286
+ when "q"
287
+ exit
288
+ when "h"
289
+ puts <<HELP
290
+ \tY - yes, overwrite
291
+ \tn - no, do not overwrite
292
+ \ta - all, overwrite this and all others
293
+ \tq - quit, abort
294
+ \th - help, show this help
295
+ HELP
296
+ end
297
+ puts "Retrying..."
298
+ end
299
+ end
300
+
301
+ class NoLicense
302
+ attr_reader :name, :full_name, :text
303
+
304
+ def initialize
305
+ @name = ""
306
+ @full_name = ""
307
+ @text = ""
308
+ end
309
+
310
+ def preamble(usename)
311
+ ""
312
+ end
313
+ end
314
+
315
+ class ApacheLicense
316
+ LICENSE_URL = "http://www.apache.org/licenses/LICENSE-2.0.txt"
317
+
318
+ attr_reader :text
319
+
320
+ def initialize
321
+ @text = ""
322
+ @preamble_source = ""
323
+ @preamble = nil
324
+ uri = URI.parse(LICENSE_URL)
325
+ uri.open do |io|
326
+ @text = io.read
327
+ end
328
+ @preamble_source = @text[/^(\s*Copyright.+)/m, 1]
329
+ end
330
+
331
+ def name
332
+ "Apache-2.0"
333
+ end
334
+
335
+ def full_name
336
+ "Apache License, Version 2.0"
337
+ end
338
+
339
+ def preamble(user_name)
340
+ @preamble ||= @preamble_source.dup.tap do |source|
341
+ source.gsub!(/\[yyyy\]/, "#{Date.today.year}-")
342
+ source.gsub!(/\[name of copyright owner\]/, user_name)
343
+ source.gsub!(/^ {2}|^$/, "#")
344
+ source.chomp!
345
+ end
346
+ end
347
+ end
348
+
349
+ LICENSE_REGISTRY = Fluent::Registry.new(:license, "")
350
+
351
+ def self.register_license(license, klass)
352
+ LICENSE_REGISTRY.register(license, klass)
353
+ end
354
+
355
+ def self.lookup_license(license)
356
+ LICENSE_REGISTRY.lookup(license)
357
+ end
358
+
359
+ {
360
+ "no-license" => NoLicense,
361
+ "Apache-2.0" => ApacheLicense
362
+ }.each do |license, klass|
363
+ register_license(license, klass)
364
+ end
365
+ end