fluentd 0.14.4-x86-mingw32

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 (328) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +6 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +45 -0
  5. data/AUTHORS +2 -0
  6. data/CONTRIBUTING.md +35 -0
  7. data/COPYING +14 -0
  8. data/ChangeLog +276 -0
  9. data/Gemfile +9 -0
  10. data/README.md +51 -0
  11. data/Rakefile +53 -0
  12. data/Vagrantfile +17 -0
  13. data/appveyor.yml +41 -0
  14. data/bin/fluent-debug +5 -0
  15. data/example/copy_roundrobin.conf +39 -0
  16. data/example/filter_stdout.conf +22 -0
  17. data/example/in_forward.conf +11 -0
  18. data/example/in_http.conf +14 -0
  19. data/example/in_out_forward.conf +17 -0
  20. data/example/in_syslog.conf +15 -0
  21. data/example/in_tail.conf +14 -0
  22. data/example/in_tcp.conf +13 -0
  23. data/example/in_udp.conf +13 -0
  24. data/example/multi_filters.conf +61 -0
  25. data/example/out_buffered_null.conf +32 -0
  26. data/example/out_copy.conf +20 -0
  27. data/example/out_file.conf +13 -0
  28. data/example/out_forward.conf +35 -0
  29. data/example/out_forward_buf_file.conf +23 -0
  30. data/example/v0_12_filter.conf +78 -0
  31. data/example/v1_literal_example.conf +36 -0
  32. data/fluent.conf +139 -0
  33. data/fluentd.gemspec +51 -0
  34. data/lib/fluent/agent.rb +194 -0
  35. data/lib/fluent/command/bundler_injection.rb +45 -0
  36. data/lib/fluent/command/cat.rb +319 -0
  37. data/lib/fluent/command/debug.rb +102 -0
  38. data/lib/fluent/command/fluentd.rb +273 -0
  39. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  40. data/lib/fluent/compat/exec_util.rb +129 -0
  41. data/lib/fluent/compat/file_util.rb +54 -0
  42. data/lib/fluent/compat/filter.rb +68 -0
  43. data/lib/fluent/compat/formatter.rb +111 -0
  44. data/lib/fluent/compat/formatter_utils.rb +85 -0
  45. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  46. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  47. data/lib/fluent/compat/input.rb +49 -0
  48. data/lib/fluent/compat/output.rb +677 -0
  49. data/lib/fluent/compat/output_chain.rb +60 -0
  50. data/lib/fluent/compat/parser.rb +180 -0
  51. data/lib/fluent/compat/parser_utils.rb +40 -0
  52. data/lib/fluent/compat/propagate_default.rb +62 -0
  53. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  54. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  55. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  56. data/lib/fluent/compat/socket_util.rb +165 -0
  57. data/lib/fluent/compat/string_util.rb +34 -0
  58. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  59. data/lib/fluent/compat/type_converter.rb +90 -0
  60. data/lib/fluent/config.rb +56 -0
  61. data/lib/fluent/config/basic_parser.rb +123 -0
  62. data/lib/fluent/config/configure_proxy.rb +366 -0
  63. data/lib/fluent/config/dsl.rb +149 -0
  64. data/lib/fluent/config/element.rb +218 -0
  65. data/lib/fluent/config/error.rb +26 -0
  66. data/lib/fluent/config/literal_parser.rb +251 -0
  67. data/lib/fluent/config/parser.rb +107 -0
  68. data/lib/fluent/config/section.rb +212 -0
  69. data/lib/fluent/config/types.rb +136 -0
  70. data/lib/fluent/config/v1_parser.rb +190 -0
  71. data/lib/fluent/configurable.rb +176 -0
  72. data/lib/fluent/daemon.rb +15 -0
  73. data/lib/fluent/engine.rb +220 -0
  74. data/lib/fluent/env.rb +27 -0
  75. data/lib/fluent/event.rb +287 -0
  76. data/lib/fluent/event_router.rb +259 -0
  77. data/lib/fluent/filter.rb +21 -0
  78. data/lib/fluent/formatter.rb +23 -0
  79. data/lib/fluent/input.rb +21 -0
  80. data/lib/fluent/label.rb +38 -0
  81. data/lib/fluent/load.rb +36 -0
  82. data/lib/fluent/log.rb +445 -0
  83. data/lib/fluent/match.rb +141 -0
  84. data/lib/fluent/mixin.rb +31 -0
  85. data/lib/fluent/msgpack_factory.rb +62 -0
  86. data/lib/fluent/output.rb +26 -0
  87. data/lib/fluent/output_chain.rb +23 -0
  88. data/lib/fluent/parser.rb +23 -0
  89. data/lib/fluent/plugin.rb +161 -0
  90. data/lib/fluent/plugin/bare_output.rb +63 -0
  91. data/lib/fluent/plugin/base.rb +130 -0
  92. data/lib/fluent/plugin/buf_file.rb +154 -0
  93. data/lib/fluent/plugin/buf_memory.rb +34 -0
  94. data/lib/fluent/plugin/buffer.rb +603 -0
  95. data/lib/fluent/plugin/buffer/chunk.rb +160 -0
  96. data/lib/fluent/plugin/buffer/file_chunk.rb +323 -0
  97. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  98. data/lib/fluent/plugin/exec_util.rb +22 -0
  99. data/lib/fluent/plugin/file_util.rb +22 -0
  100. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  101. data/lib/fluent/plugin/filter.rb +93 -0
  102. data/lib/fluent/plugin/filter_grep.rb +75 -0
  103. data/lib/fluent/plugin/filter_record_transformer.rb +342 -0
  104. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  105. data/lib/fluent/plugin/formatter.rb +45 -0
  106. data/lib/fluent/plugin/formatter_csv.rb +47 -0
  107. data/lib/fluent/plugin/formatter_hash.rb +29 -0
  108. data/lib/fluent/plugin/formatter_json.rb +44 -0
  109. data/lib/fluent/plugin/formatter_ltsv.rb +41 -0
  110. data/lib/fluent/plugin/formatter_msgpack.rb +29 -0
  111. data/lib/fluent/plugin/formatter_out_file.rb +78 -0
  112. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  113. data/lib/fluent/plugin/formatter_stdout.rb +74 -0
  114. data/lib/fluent/plugin/in_debug_agent.rb +64 -0
  115. data/lib/fluent/plugin/in_dummy.rb +135 -0
  116. data/lib/fluent/plugin/in_exec.rb +149 -0
  117. data/lib/fluent/plugin/in_forward.rb +366 -0
  118. data/lib/fluent/plugin/in_gc_stat.rb +52 -0
  119. data/lib/fluent/plugin/in_http.rb +422 -0
  120. data/lib/fluent/plugin/in_monitor_agent.rb +401 -0
  121. data/lib/fluent/plugin/in_object_space.rb +90 -0
  122. data/lib/fluent/plugin/in_syslog.rb +204 -0
  123. data/lib/fluent/plugin/in_tail.rb +838 -0
  124. data/lib/fluent/plugin/in_tcp.rb +41 -0
  125. data/lib/fluent/plugin/in_udp.rb +37 -0
  126. data/lib/fluent/plugin/in_unix.rb +201 -0
  127. data/lib/fluent/plugin/input.rb +33 -0
  128. data/lib/fluent/plugin/multi_output.rb +95 -0
  129. data/lib/fluent/plugin/out_buffered_null.rb +59 -0
  130. data/lib/fluent/plugin/out_buffered_stdout.rb +70 -0
  131. data/lib/fluent/plugin/out_copy.rb +42 -0
  132. data/lib/fluent/plugin/out_exec.rb +114 -0
  133. data/lib/fluent/plugin/out_exec_filter.rb +393 -0
  134. data/lib/fluent/plugin/out_file.rb +167 -0
  135. data/lib/fluent/plugin/out_forward.rb +646 -0
  136. data/lib/fluent/plugin/out_null.rb +27 -0
  137. data/lib/fluent/plugin/out_relabel.rb +28 -0
  138. data/lib/fluent/plugin/out_roundrobin.rb +80 -0
  139. data/lib/fluent/plugin/out_stdout.rb +48 -0
  140. data/lib/fluent/plugin/out_stream.rb +130 -0
  141. data/lib/fluent/plugin/output.rb +1020 -0
  142. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  143. data/lib/fluent/plugin/parser.rb +175 -0
  144. data/lib/fluent/plugin/parser_apache.rb +28 -0
  145. data/lib/fluent/plugin/parser_apache2.rb +84 -0
  146. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  147. data/lib/fluent/plugin/parser_csv.rb +33 -0
  148. data/lib/fluent/plugin/parser_json.rb +79 -0
  149. data/lib/fluent/plugin/parser_ltsv.rb +50 -0
  150. data/lib/fluent/plugin/parser_multiline.rb +104 -0
  151. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  152. data/lib/fluent/plugin/parser_none.rb +36 -0
  153. data/lib/fluent/plugin/parser_regexp.rb +73 -0
  154. data/lib/fluent/plugin/parser_syslog.rb +82 -0
  155. data/lib/fluent/plugin/parser_tsv.rb +37 -0
  156. data/lib/fluent/plugin/socket_util.rb +22 -0
  157. data/lib/fluent/plugin/storage.rb +84 -0
  158. data/lib/fluent/plugin/storage_local.rb +132 -0
  159. data/lib/fluent/plugin/string_util.rb +22 -0
  160. data/lib/fluent/plugin_helper.rb +42 -0
  161. data/lib/fluent/plugin_helper/child_process.rb +298 -0
  162. data/lib/fluent/plugin_helper/compat_parameters.rb +224 -0
  163. data/lib/fluent/plugin_helper/event_emitter.rb +80 -0
  164. data/lib/fluent/plugin_helper/event_loop.rb +118 -0
  165. data/lib/fluent/plugin_helper/formatter.rb +149 -0
  166. data/lib/fluent/plugin_helper/inject.rb +125 -0
  167. data/lib/fluent/plugin_helper/parser.rb +147 -0
  168. data/lib/fluent/plugin_helper/retry_state.rb +177 -0
  169. data/lib/fluent/plugin_helper/storage.rb +331 -0
  170. data/lib/fluent/plugin_helper/thread.rb +147 -0
  171. data/lib/fluent/plugin_helper/timer.rb +90 -0
  172. data/lib/fluent/plugin_id.rb +63 -0
  173. data/lib/fluent/process.rb +504 -0
  174. data/lib/fluent/registry.rb +99 -0
  175. data/lib/fluent/root_agent.rb +314 -0
  176. data/lib/fluent/rpc.rb +94 -0
  177. data/lib/fluent/supervisor.rb +680 -0
  178. data/lib/fluent/system_config.rb +122 -0
  179. data/lib/fluent/test.rb +56 -0
  180. data/lib/fluent/test/base.rb +85 -0
  181. data/lib/fluent/test/driver/base.rb +179 -0
  182. data/lib/fluent/test/driver/base_owned.rb +70 -0
  183. data/lib/fluent/test/driver/base_owner.rb +125 -0
  184. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  185. data/lib/fluent/test/driver/filter.rb +57 -0
  186. data/lib/fluent/test/driver/formatter.rb +30 -0
  187. data/lib/fluent/test/driver/input.rb +31 -0
  188. data/lib/fluent/test/driver/multi_output.rb +52 -0
  189. data/lib/fluent/test/driver/output.rb +76 -0
  190. data/lib/fluent/test/driver/parser.rb +30 -0
  191. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  192. data/lib/fluent/test/filter_test.rb +77 -0
  193. data/lib/fluent/test/formatter_test.rb +65 -0
  194. data/lib/fluent/test/helpers.rb +79 -0
  195. data/lib/fluent/test/input_test.rb +172 -0
  196. data/lib/fluent/test/log.rb +73 -0
  197. data/lib/fluent/test/output_test.rb +156 -0
  198. data/lib/fluent/test/parser_test.rb +70 -0
  199. data/lib/fluent/time.rb +175 -0
  200. data/lib/fluent/timezone.rb +133 -0
  201. data/lib/fluent/unique_id.rb +39 -0
  202. data/lib/fluent/version.rb +21 -0
  203. data/lib/fluent/winsvc.rb +71 -0
  204. data/test/compat/test_calls_super.rb +166 -0
  205. data/test/compat/test_parser.rb +82 -0
  206. data/test/config/assertions.rb +42 -0
  207. data/test/config/test_config_parser.rb +507 -0
  208. data/test/config/test_configurable.rb +1194 -0
  209. data/test/config/test_configure_proxy.rb +386 -0
  210. data/test/config/test_dsl.rb +415 -0
  211. data/test/config/test_element.rb +403 -0
  212. data/test/config/test_literal_parser.rb +297 -0
  213. data/test/config/test_section.rb +184 -0
  214. data/test/config/test_system_config.rb +120 -0
  215. data/test/config/test_types.rb +171 -0
  216. data/test/helper.rb +119 -0
  217. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  218. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  219. data/test/plugin/data/2010/01/20100102.log +0 -0
  220. data/test/plugin/data/log/bar +0 -0
  221. data/test/plugin/data/log/foo/bar.log +0 -0
  222. data/test/plugin/data/log/test.log +0 -0
  223. data/test/plugin/test_bare_output.rb +118 -0
  224. data/test/plugin/test_base.rb +75 -0
  225. data/test/plugin/test_buf_file.rb +571 -0
  226. data/test/plugin/test_buf_memory.rb +42 -0
  227. data/test/plugin/test_buffer.rb +1200 -0
  228. data/test/plugin/test_buffer_chunk.rb +168 -0
  229. data/test/plugin/test_buffer_file_chunk.rb +771 -0
  230. data/test/plugin/test_buffer_memory_chunk.rb +265 -0
  231. data/test/plugin/test_file_util.rb +96 -0
  232. data/test/plugin/test_filter.rb +353 -0
  233. data/test/plugin/test_filter_grep.rb +119 -0
  234. data/test/plugin/test_filter_record_transformer.rb +600 -0
  235. data/test/plugin/test_filter_stdout.rb +211 -0
  236. data/test/plugin/test_formatter_csv.rb +94 -0
  237. data/test/plugin/test_formatter_json.rb +30 -0
  238. data/test/plugin/test_formatter_ltsv.rb +52 -0
  239. data/test/plugin/test_formatter_msgpack.rb +28 -0
  240. data/test/plugin/test_formatter_out_file.rb +95 -0
  241. data/test/plugin/test_formatter_single_value.rb +38 -0
  242. data/test/plugin/test_in_debug_agent.rb +28 -0
  243. data/test/plugin/test_in_dummy.rb +188 -0
  244. data/test/plugin/test_in_exec.rb +133 -0
  245. data/test/plugin/test_in_forward.rb +635 -0
  246. data/test/plugin/test_in_gc_stat.rb +39 -0
  247. data/test/plugin/test_in_http.rb +442 -0
  248. data/test/plugin/test_in_monitor_agent.rb +329 -0
  249. data/test/plugin/test_in_object_space.rb +64 -0
  250. data/test/plugin/test_in_syslog.rb +205 -0
  251. data/test/plugin/test_in_tail.rb +1001 -0
  252. data/test/plugin/test_in_tcp.rb +102 -0
  253. data/test/plugin/test_in_udp.rb +121 -0
  254. data/test/plugin/test_in_unix.rb +126 -0
  255. data/test/plugin/test_input.rb +122 -0
  256. data/test/plugin/test_multi_output.rb +180 -0
  257. data/test/plugin/test_out_buffered_null.rb +79 -0
  258. data/test/plugin/test_out_buffered_stdout.rb +122 -0
  259. data/test/plugin/test_out_copy.rb +160 -0
  260. data/test/plugin/test_out_exec.rb +155 -0
  261. data/test/plugin/test_out_exec_filter.rb +262 -0
  262. data/test/plugin/test_out_file.rb +383 -0
  263. data/test/plugin/test_out_forward.rb +590 -0
  264. data/test/plugin/test_out_null.rb +29 -0
  265. data/test/plugin/test_out_relabel.rb +28 -0
  266. data/test/plugin/test_out_roundrobin.rb +146 -0
  267. data/test/plugin/test_out_stdout.rb +92 -0
  268. data/test/plugin/test_out_stream.rb +93 -0
  269. data/test/plugin/test_output.rb +568 -0
  270. data/test/plugin/test_output_as_buffered.rb +1604 -0
  271. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  272. data/test/plugin/test_output_as_buffered_retries.rb +839 -0
  273. data/test/plugin/test_output_as_buffered_secondary.rb +817 -0
  274. data/test/plugin/test_output_as_standard.rb +374 -0
  275. data/test/plugin/test_owned_by.rb +35 -0
  276. data/test/plugin/test_parser_apache.rb +42 -0
  277. data/test/plugin/test_parser_apache2.rb +38 -0
  278. data/test/plugin/test_parser_apache_error.rb +45 -0
  279. data/test/plugin/test_parser_base.rb +32 -0
  280. data/test/plugin/test_parser_csv.rb +104 -0
  281. data/test/plugin/test_parser_json.rb +107 -0
  282. data/test/plugin/test_parser_labeled_tsv.rb +129 -0
  283. data/test/plugin/test_parser_multiline.rb +100 -0
  284. data/test/plugin/test_parser_nginx.rb +48 -0
  285. data/test/plugin/test_parser_none.rb +53 -0
  286. data/test/plugin/test_parser_regexp.rb +277 -0
  287. data/test/plugin/test_parser_syslog.rb +66 -0
  288. data/test/plugin/test_parser_time.rb +46 -0
  289. data/test/plugin/test_parser_tsv.rb +121 -0
  290. data/test/plugin/test_storage.rb +167 -0
  291. data/test/plugin/test_storage_local.rb +8 -0
  292. data/test/plugin/test_string_util.rb +26 -0
  293. data/test/plugin_helper/test_child_process.rb +608 -0
  294. data/test/plugin_helper/test_compat_parameters.rb +242 -0
  295. data/test/plugin_helper/test_event_emitter.rb +51 -0
  296. data/test/plugin_helper/test_event_loop.rb +52 -0
  297. data/test/plugin_helper/test_formatter.rb +252 -0
  298. data/test/plugin_helper/test_inject.rb +487 -0
  299. data/test/plugin_helper/test_parser.rb +263 -0
  300. data/test/plugin_helper/test_retry_state.rb +399 -0
  301. data/test/plugin_helper/test_storage.rb +521 -0
  302. data/test/plugin_helper/test_thread.rb +164 -0
  303. data/test/plugin_helper/test_timer.rb +131 -0
  304. data/test/scripts/exec_script.rb +32 -0
  305. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  306. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  307. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  308. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  309. data/test/test_config.rb +179 -0
  310. data/test/test_configdsl.rb +148 -0
  311. data/test/test_event.rb +329 -0
  312. data/test/test_event_router.rb +331 -0
  313. data/test/test_event_time.rb +184 -0
  314. data/test/test_filter.rb +121 -0
  315. data/test/test_formatter.rb +319 -0
  316. data/test/test_input.rb +31 -0
  317. data/test/test_log.rb +572 -0
  318. data/test/test_match.rb +137 -0
  319. data/test/test_mixin.rb +351 -0
  320. data/test/test_output.rb +214 -0
  321. data/test/test_plugin_classes.rb +136 -0
  322. data/test/test_plugin_helper.rb +81 -0
  323. data/test/test_process.rb +48 -0
  324. data/test/test_root_agent.rb +278 -0
  325. data/test/test_supervisor.rb +339 -0
  326. data/test/test_time_formatter.rb +186 -0
  327. data/test/test_unique_id.rb +47 -0
  328. metadata +823 -0
@@ -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
+ 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
+
@@ -0,0 +1,212 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'json'
18
+
19
+ require 'fluent/config/error'
20
+ require 'fluent/config/v1_parser'
21
+
22
+ module Fluent
23
+ module Config
24
+ class Section < BasicObject
25
+ def self.name
26
+ 'Fluent::Config::Section'
27
+ end
28
+
29
+ def initialize(params = {}, config_element = nil)
30
+ @klass = 'Fluent::Config::Section'
31
+ @params = params
32
+ @corresponding_config_element = config_element
33
+ end
34
+
35
+ alias :object_id :__id__
36
+
37
+ def corresponding_config_element
38
+ @corresponding_config_element
39
+ end
40
+
41
+ def class
42
+ Section
43
+ end
44
+
45
+ def to_s
46
+ inspect
47
+ end
48
+
49
+ def inspect
50
+ "<Fluent::Config::Section #{@params.to_json}>"
51
+ end
52
+
53
+ def nil?
54
+ false
55
+ end
56
+
57
+ def to_h
58
+ @params
59
+ end
60
+
61
+ def +(other)
62
+ Section.new(self.to_h.merge(other.to_h))
63
+ end
64
+
65
+ def instance_of?(mod)
66
+ @klass == mod.name
67
+ end
68
+
69
+ def kind_of?(mod)
70
+ @klass == mod.name || BasicObject == mod
71
+ end
72
+ alias is_a? kind_of?
73
+
74
+ def [](key)
75
+ @params[key.to_sym]
76
+ end
77
+
78
+ def respond_to?(symbol, include_all=false)
79
+ case symbol
80
+ when :inspect, :nil?, :to_h, :+, :instance_of?, :kind_of?, :[], :respond_to?, :respond_to_missing?
81
+ true
82
+ when :!, :!= , :==, :equal?, :instance_eval, :instance_exec
83
+ true
84
+ when :method_missing, :singleton_method_added, :singleton_method_removed, :singleton_method_undefined
85
+ include_all
86
+ else
87
+ false
88
+ end
89
+ end
90
+
91
+ def respond_to_missing?(symbol, include_private)
92
+ @params.has_key?(symbol)
93
+ end
94
+
95
+ def method_missing(name, *args)
96
+ if @params.has_key?(name)
97
+ @params[name]
98
+ else
99
+ ::Kernel.raise ::NoMethodError, "undefined method `#{name}' for #{self.inspect}"
100
+ end
101
+ end
102
+ end
103
+
104
+ module SectionGenerator
105
+ def self.generate(proxy, conf, logger, plugin_class, stack = [])
106
+ return nil if conf.nil?
107
+
108
+ section_stack = ""
109
+ unless stack.empty?
110
+ section_stack = ", in section " + stack.join(" > ")
111
+ end
112
+
113
+ section_params = {}
114
+
115
+ proxy.defaults.each_pair do |name, defval|
116
+ varname = name.to_sym
117
+ section_params[varname] = (defval.dup rescue defval)
118
+ end
119
+
120
+ if proxy.argument
121
+ unless conf.arg.empty?
122
+ key, block, opts = proxy.argument
123
+ section_params[key] = self.instance_exec(conf.arg, opts, name, &block)
124
+ end
125
+ unless section_params.has_key?(proxy.argument.first)
126
+ logger.error "config error in:\n#{conf}" if logger # logger should exist, but somethimes it's nil (e.g, in tests)
127
+ raise ConfigError, "'<#{proxy.name} ARG>' section requires argument" + section_stack
128
+ end
129
+ # argument should NOT be deprecated... (argument always has a value: '')
130
+ end
131
+
132
+ proxy.params.each_pair do |name, defval|
133
+ varname = name.to_sym
134
+ block, opts = defval
135
+ if conf.has_key?(name.to_s) || opts[:alias] && conf.has_key?(opts[:alias].to_s)
136
+ val = if conf.has_key?(name.to_s)
137
+ conf[name.to_s]
138
+ else
139
+ conf[opts[:alias].to_s]
140
+ end
141
+ section_params[varname] = self.instance_exec(val, opts, name, &block)
142
+
143
+ # Source of definitions of deprecated/obsoleted:
144
+ # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features
145
+ #
146
+ # Deprecated: These deprecated features can still be used, but should be used with caution
147
+ # because they are expected to be removed entirely sometime in the future.
148
+ # Obsoleted: These obsolete features have been entirely removed from JavaScript and can no longer be used.
149
+ if opts[:deprecated]
150
+ logger.warn "'#{name}' parameter is deprecated: #{opts[:deprecated]}"
151
+ end
152
+ if opts[:obsoleted]
153
+ logger.error "config error in:\n#{conf}" if logger
154
+ raise ObsoletedParameterError, "'#{name}' parameter is already removed: #{opts[:obsoleted]}" + section_stack
155
+ end
156
+ end
157
+ unless section_params.has_key?(varname)
158
+ logger.error "config error in:\n#{conf}" if logger
159
+ raise ConfigError, "'#{name}' parameter is required" + section_stack
160
+ end
161
+ end
162
+
163
+ check_unused_section(proxy, conf, plugin_class)
164
+
165
+ proxy.sections.each do |name, subproxy|
166
+ varname = subproxy.variable_name
167
+ elements = (conf.respond_to?(:elements) ? conf.elements : []).select{ |e| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
168
+ if elements.empty? && subproxy.init? && !subproxy.multi?
169
+ elements << Fluent::Config::Element.new(subproxy.name.to_s, '', {}, [])
170
+ end
171
+
172
+ # set subproxy for secret option
173
+ elements.each { |element|
174
+ element.corresponding_proxies << subproxy
175
+ }
176
+
177
+ if subproxy.required? && elements.size < 1
178
+ logger.error "config error in:\n#{conf}" if logger
179
+ raise ConfigError, "'<#{subproxy.name}>' sections are required" + section_stack
180
+ end
181
+ if subproxy.multi?
182
+ section_params[varname] = elements.map{ |e| generate(subproxy, e, logger, plugin_class, stack + [subproxy.name]) }
183
+ else
184
+ if elements.size > 1
185
+ logger.error "config error in:\n#{conf}" if logger
186
+ raise ConfigError, "'<#{subproxy.name}>' section cannot be written twice or more" + section_stack
187
+ end
188
+ section_params[varname] = generate(subproxy, elements.first, logger, plugin_class, stack + [subproxy.name])
189
+ end
190
+ end
191
+
192
+ Section.new(section_params, conf)
193
+ end
194
+
195
+ def self.check_unused_section(proxy, conf, plugin_class)
196
+ elems = conf.respond_to?(:elements) ? conf.elements : []
197
+ elems.each { |e|
198
+ next if plugin_class.nil? && Fluent::Config::V1Parser::ELEM_SYMBOLS.include?(e.name) # skip pre-defined non-plugin elements because it doens't have proxy section
199
+
200
+ unless proxy.sections.any? { |name, subproxy| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
201
+ parent_name = if conf.arg.empty?
202
+ conf.name
203
+ else
204
+ "#{conf.name} #{conf.arg}"
205
+ end
206
+ e.unused_in = [parent_name, plugin_class]
207
+ end
208
+ }
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,136 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'json'
18
+
19
+ require 'fluent/config/error'
20
+
21
+ module Fluent
22
+ module Config
23
+ def self.size_value(str)
24
+ case str.to_s
25
+ when /([0-9]+)k/i
26
+ $~[1].to_i * 1024
27
+ when /([0-9]+)m/i
28
+ $~[1].to_i * (1024 ** 2)
29
+ when /([0-9]+)g/i
30
+ $~[1].to_i * (1024 ** 3)
31
+ when /([0-9]+)t/i
32
+ $~[1].to_i * (1024 ** 4)
33
+ else
34
+ str.to_i
35
+ end
36
+ end
37
+
38
+ def self.time_value(str)
39
+ case str.to_s
40
+ when /([0-9]+)s/
41
+ $~[1].to_i
42
+ when /([0-9]+)m/
43
+ $~[1].to_i * 60
44
+ when /([0-9]+)h/
45
+ $~[1].to_i * 60 * 60
46
+ when /([0-9]+)d/
47
+ $~[1].to_i * 24 * 60 * 60
48
+ else
49
+ str.to_f
50
+ end
51
+ end
52
+
53
+ def self.bool_value(str)
54
+ return nil if str.nil?
55
+ case str.to_s
56
+ when 'true', 'yes'
57
+ true
58
+ when 'false', 'no'
59
+ false
60
+ when ''
61
+ true
62
+ else
63
+ nil
64
+ end
65
+ end
66
+
67
+ STRING_TYPE = Proc.new { |val, opts| val }
68
+ ENUM_TYPE = Proc.new { |val, opts|
69
+ s = val.to_sym
70
+ list = opts[:list]
71
+ raise "Plugin BUG: config type 'enum' requires :list of symbols" unless list.is_a?(Array) && list.all?{|v| v.is_a? Symbol }
72
+ unless list.include?(s)
73
+ raise ConfigError, "valid options are #{list.join(',')} but got #{val}"
74
+ end
75
+ s
76
+ }
77
+ INTEGER_TYPE = Proc.new { |val, opts| val.to_i }
78
+ FLOAT_TYPE = Proc.new { |val, opts| val.to_f }
79
+ SIZE_TYPE = Proc.new { |val, opts| Config.size_value(val) }
80
+ BOOL_TYPE = Proc.new { |val, opts| Config.bool_value(val) }
81
+ TIME_TYPE = Proc.new { |val, opts| Config.time_value(val) }
82
+
83
+ REFORMAT_VALUE = ->(type, value) {
84
+ if value.nil?
85
+ value
86
+ else
87
+ case type
88
+ when :string then value.to_s
89
+ when :integer then value.to_i
90
+ when :float then value.to_f
91
+ when :size then Config.size_value(value)
92
+ when :bool then Config.bool_value(value)
93
+ when :time then Config.time_value(value)
94
+ else
95
+ raise "unknown type in REFORMAT: #{type}"
96
+ end
97
+ end
98
+ }
99
+
100
+ HASH_TYPE = Proc.new { |val, opts|
101
+ param = if val.is_a?(String)
102
+ val.start_with?('{') ? JSON.load(val) : Hash[val.strip.split(/\s*,\s*/).map{|v| v.split(':', 2)}]
103
+ else
104
+ val
105
+ end
106
+ if param.class != Hash
107
+ raise ConfigError, "hash required but got #{val.inspect}"
108
+ end
109
+ if opts.empty?
110
+ param
111
+ else
112
+ newparam = {}
113
+ param.each_pair do |key, value|
114
+ new_key = opts[:symbolize_keys] ? key.to_sym : key
115
+ newparam[new_key] = opts[:value_type] ? REFORMAT_VALUE.call(opts[:value_type], value) : value
116
+ end
117
+ newparam
118
+ end
119
+ }
120
+ ARRAY_TYPE = Proc.new { |val, opts|
121
+ param = if val.is_a?(String)
122
+ val.start_with?('[') ? JSON.load(val) : val.strip.split(/\s*,\s*/)
123
+ else
124
+ val
125
+ end
126
+ if param.class != Array
127
+ raise ConfigError, "array required but got #{val.inspect}"
128
+ end
129
+ if opts[:value_type]
130
+ param.map{|v| REFORMAT_VALUE.call(opts[:value_type], v) }
131
+ else
132
+ param
133
+ end
134
+ }
135
+ end
136
+ end