fluentd-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (320) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +31 -0
  4. data/.rspec +1 -0
  5. data/ChangeLog +3 -0
  6. data/Gemfile +21 -0
  7. data/Gemfile.lock +247 -0
  8. data/Gemfile.production +3 -0
  9. data/README.md +53 -0
  10. data/Rakefile +8 -0
  11. data/app/assets/images/.keep +0 -0
  12. data/app/assets/javascripts/alert.js +51 -0
  13. data/app/assets/javascripts/application.js +22 -0
  14. data/app/assets/javascripts/nested_setting.js +41 -0
  15. data/app/assets/javascripts/setting_format.js +15 -0
  16. data/app/assets/javascripts/tutorial.js +58 -0
  17. data/app/assets/javascripts/vue/fluent_log.js +64 -0
  18. data/app/assets/javascripts/vue/in_tail_format.js +153 -0
  19. data/app/assets/javascripts/vue/treeview.js +97 -0
  20. data/app/assets/javascripts/vue_common.js +4 -0
  21. data/app/assets/stylesheets/application.css +18 -0
  22. data/app/assets/stylesheets/common.css.scss +152 -0
  23. data/app/controllers/api_controller.rb +37 -0
  24. data/app/controllers/application_controller.rb +110 -0
  25. data/app/controllers/concerns/.keep +0 -0
  26. data/app/controllers/fluentd/agents_controller.rb +35 -0
  27. data/app/controllers/fluentd/settings/in_syslog_controller.rb +34 -0
  28. data/app/controllers/fluentd/settings/in_tail_controller.rb +57 -0
  29. data/app/controllers/fluentd/settings/out_forward_controller.rb +42 -0
  30. data/app/controllers/fluentd/settings/out_mongo_controller.rb +36 -0
  31. data/app/controllers/fluentd/settings/out_s3_controller.rb +36 -0
  32. data/app/controllers/fluentd/settings/out_td_controller.rb +36 -0
  33. data/app/controllers/fluentd/settings_controller.rb +18 -0
  34. data/app/controllers/fluentd_controller.rb +62 -0
  35. data/app/controllers/misc_controller.rb +69 -0
  36. data/app/controllers/plugins_controller.rb +44 -0
  37. data/app/controllers/polling_controller.rb +20 -0
  38. data/app/controllers/sessions_controller.rb +45 -0
  39. data/app/controllers/tutorials_controller.rb +40 -0
  40. data/app/controllers/users_controller.rb +28 -0
  41. data/app/controllers/welcome_controller.rb +5 -0
  42. data/app/helpers/application_helper.rb +55 -0
  43. data/app/helpers/fluentd/settings_helper.rb +2 -0
  44. data/app/helpers/miscs_helper.rb +2 -0
  45. data/app/helpers/settings_helper.rb +43 -0
  46. data/app/mailers/.keep +0 -0
  47. data/app/models/.keep +0 -0
  48. data/app/models/concerns/.keep +0 -0
  49. data/app/models/fluentd.rb +178 -0
  50. data/app/models/fluentd/agent.rb +28 -0
  51. data/app/models/fluentd/agent/common.rb +76 -0
  52. data/app/models/fluentd/agent/configuration.rb +35 -0
  53. data/app/models/fluentd/agent/fluentd_gem.rb +104 -0
  54. data/app/models/fluentd/agent/local_common.rb +101 -0
  55. data/app/models/fluentd/agent/remote.rb +7 -0
  56. data/app/models/fluentd/agent/td_agent.rb +44 -0
  57. data/app/models/fluentd/api.rb +6 -0
  58. data/app/models/fluentd/api/http.rb +26 -0
  59. data/app/models/fluentd/setting.rb +4 -0
  60. data/app/models/fluentd/setting/common.rb +185 -0
  61. data/app/models/fluentd/setting/in_syslog.rb +16 -0
  62. data/app/models/fluentd/setting/in_tail.rb +107 -0
  63. data/app/models/fluentd/setting/out_forward.rb +70 -0
  64. data/app/models/fluentd/setting/out_mongo.rb +35 -0
  65. data/app/models/fluentd/setting/out_s3.rb +29 -0
  66. data/app/models/fluentd/setting/out_td.rb +26 -0
  67. data/app/models/plugin.rb +193 -0
  68. data/app/models/settings.rb +4 -0
  69. data/app/models/user.rb +52 -0
  70. data/app/views/fluentd/_form.html.haml +31 -0
  71. data/app/views/fluentd/edit.html.haml +3 -0
  72. data/app/views/fluentd/errors.html.haml +19 -0
  73. data/app/views/fluentd/log.html.haml +9 -0
  74. data/app/views/fluentd/new.html.haml +3 -0
  75. data/app/views/fluentd/settings/_form.html.haml +43 -0
  76. data/app/views/fluentd/settings/edit.html.haml +7 -0
  77. data/app/views/fluentd/settings/in_syslog/_form.html.haml +9 -0
  78. data/app/views/fluentd/settings/in_syslog/show.html.haml +6 -0
  79. data/app/views/fluentd/settings/in_tail/_form.html.haml +42 -0
  80. data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +19 -0
  81. data/app/views/fluentd/settings/in_tail/after_format.html.haml +10 -0
  82. data/app/views/fluentd/settings/in_tail/confirm.html.haml +13 -0
  83. data/app/views/fluentd/settings/in_tail/show.html.haml +5 -0
  84. data/app/views/fluentd/settings/out_forward/_form.html.haml +22 -0
  85. data/app/views/fluentd/settings/out_forward/show.html.haml +6 -0
  86. data/app/views/fluentd/settings/out_mongo/_form.html.haml +30 -0
  87. data/app/views/fluentd/settings/out_mongo/finish.html.haml +4 -0
  88. data/app/views/fluentd/settings/out_mongo/show.html.haml +6 -0
  89. data/app/views/fluentd/settings/out_s3/_form.html.haml +39 -0
  90. data/app/views/fluentd/settings/out_s3/show.html.haml +6 -0
  91. data/app/views/fluentd/settings/out_td/_form.html.haml +18 -0
  92. data/app/views/fluentd/settings/out_td/show.html.haml +6 -0
  93. data/app/views/fluentd/settings/show.html.haml +10 -0
  94. data/app/views/fluentd/settings/source_and_output.html.haml +45 -0
  95. data/app/views/fluentd/show.html.haml +60 -0
  96. data/app/views/layouts/application.html.erb +102 -0
  97. data/app/views/layouts/sign_in.html.erb +28 -0
  98. data/app/views/misc/information.html.haml +75 -0
  99. data/app/views/misc/update_fluentd_ui.html.haml +45 -0
  100. data/app/views/plugins/installed.html.haml +67 -0
  101. data/app/views/plugins/recommended.html.haml +59 -0
  102. data/app/views/plugins/updated.html.haml +29 -0
  103. data/app/views/sessions/new.html.haml +13 -0
  104. data/app/views/shared/_error.html.haml +3 -0
  105. data/app/views/shared/_flash.html.haml +10 -0
  106. data/app/views/shared/_fluentd_nav.html.haml +12 -0
  107. data/app/views/shared/_global_nav.html.erb +80 -0
  108. data/app/views/shared/_initial_setup.html.haml +13 -0
  109. data/app/views/shared/_modal.html.erb +25 -0
  110. data/app/views/shared/_setting_errors.html.haml +5 -0
  111. data/app/views/shared/vue/_fluent_log.html.erb +25 -0
  112. data/app/views/shared/vue/_in_tail_format.html.erb +53 -0
  113. data/app/views/shared/vue/_treeview.html.erb +30 -0
  114. data/app/views/tutorials/chapter1.html.erb +31 -0
  115. data/app/views/tutorials/chapter2.html.haml +12 -0
  116. data/app/views/tutorials/chapter3.html.haml +12 -0
  117. data/app/views/tutorials/chapter4.html.haml +12 -0
  118. data/app/views/tutorials/chapter5.html.haml +10 -0
  119. data/app/views/tutorials/index.html.haml +26 -0
  120. data/app/views/users/show.html.haml +22 -0
  121. data/app/workers/all_plugin_check_update.rb +14 -0
  122. data/app/workers/fluentd_ui_restart.rb +41 -0
  123. data/app/workers/fluentd_ui_update_check.rb +15 -0
  124. data/app/workers/gem_installer.rb +17 -0
  125. data/app/workers/gem_uninstaller.rb +15 -0
  126. data/app/workers/gem_update_check.rb +10 -0
  127. data/bin/bundle +3 -0
  128. data/bin/fluentd-ui +13 -0
  129. data/bin/fluentd-ui-restart +12 -0
  130. data/bin/rails +8 -0
  131. data/bin/rake +8 -0
  132. data/bin/spring +18 -0
  133. data/bower.json +10 -0
  134. data/circle.yml +8 -0
  135. data/config.ru +4 -0
  136. data/config/application.rb +48 -0
  137. data/config/application.yml +211 -0
  138. data/config/boot.rb +4 -0
  139. data/config/environment.rb +5 -0
  140. data/config/environments/development.rb +36 -0
  141. data/config/environments/production.rb +69 -0
  142. data/config/environments/test.rb +40 -0
  143. data/config/initializers/backtrace_silencers.rb +7 -0
  144. data/config/initializers/cookies_serializer.rb +3 -0
  145. data/config/initializers/filter_parameter_logging.rb +4 -0
  146. data/config/initializers/inflections.rb +16 -0
  147. data/config/initializers/mime_types.rb +4 -0
  148. data/config/initializers/prefetch_gem_updates.rb +1 -0
  149. data/config/initializers/session_store.rb +3 -0
  150. data/config/initializers/wrap_parameters.rb +14 -0
  151. data/config/locales/en.yml +204 -0
  152. data/config/locales/ja.yml +194 -0
  153. data/config/locales/translation_en.yml +255 -0
  154. data/config/locales/translation_ja.yml +255 -0
  155. data/config/locales/tutorial_en.yml +117 -0
  156. data/config/locales/tutorial_ja.yml +120 -0
  157. data/config/routes.rb +93 -0
  158. data/config/secrets.yml +22 -0
  159. data/db/schema.rb +0 -0
  160. data/db/seeds.rb +11 -0
  161. data/fluentd-ui-ss01.png +0 -0
  162. data/fluentd-ui-ss02.png +0 -0
  163. data/fluentd-ui-ss03.png +0 -0
  164. data/fluentd-ui-ss04.png +0 -0
  165. data/fluentd-ui-ss05.png +0 -0
  166. data/fluentd-ui.gemspec +46 -0
  167. data/lib/assets/.keep +0 -0
  168. data/lib/file_reverse_reader.rb +56 -0
  169. data/lib/fluentd-ui.rb +22 -0
  170. data/lib/fluentd-ui/command.rb +52 -0
  171. data/lib/fluentd-ui/version.rb +3 -0
  172. data/lib/grok_converter.rb +39 -0
  173. data/lib/regexp_preview.rb +48 -0
  174. data/lib/tasks/.keep +0 -0
  175. data/lib/treeview.rb +45 -0
  176. data/log/.keep +0 -0
  177. data/public/404.html +67 -0
  178. data/public/422.html +67 -0
  179. data/public/500.html +66 -0
  180. data/public/favicon.ico +0 -0
  181. data/public/fluentd-logo-right-text.png +0 -0
  182. data/public/fluentd-logo.png +0 -0
  183. data/public/fluentd.png +0 -0
  184. data/public/robots.txt +5 -0
  185. data/spec/controllers/plugins_controller_spec.rb +5 -0
  186. data/spec/controllers/polling_controller_spec.rb +5 -0
  187. data/spec/controllers/sessions_controller_spec.rb +5 -0
  188. data/spec/controllers/tutorials_controller_spec.rb +5 -0
  189. data/spec/factories/fluentd.rb +11 -0
  190. data/spec/factories/plugins.rb +8 -0
  191. data/spec/factories/user.rb +6 -0
  192. data/spec/features/fluentd/setting/out_forward_spec.rb +45 -0
  193. data/spec/features/fluentd/setting/out_td_spec.rb +35 -0
  194. data/spec/features/sessions_spec.rb +55 -0
  195. data/spec/features/shared_examples/login_required.rb +4 -0
  196. data/spec/features/users_spec.rb +9 -0
  197. data/spec/grok_converter_spec.rb +50 -0
  198. data/spec/lib/file_reverse_reader_spec.rb +73 -0
  199. data/spec/lib/fluentd-ui_spec.rb +35 -0
  200. data/spec/models/fluentd/agent_spec.rb +91 -0
  201. data/spec/models/fluentd/setting/common_spec.rb +178 -0
  202. data/spec/models/fluentd/setting/in_syslog_spec.rb +35 -0
  203. data/spec/models/fluentd/setting/out_mongo_spec.rb +40 -0
  204. data/spec/models/fluentd/setting/out_td_spec.rb +38 -0
  205. data/spec/models/fluentd_spec.rb +166 -0
  206. data/spec/models/plugin_spec.rb +191 -0
  207. data/spec/models/user_spec.rb +15 -0
  208. data/spec/spec_helper.rb +58 -0
  209. data/spec/support/fixtures/error0.log +12 -0
  210. data/spec/support/fixtures/error2.log +130 -0
  211. data/spec/support/fluentd_agent_common_behavior.rb +114 -0
  212. data/spec/support/fluentd_agent_restart_strategy.rb +94 -0
  213. data/tmp/.gitkeep +0 -0
  214. data/vendor/assets/javascripts/.keep +0 -0
  215. data/vendor/assets/javascripts/bower/es6-promise/.bower.json +15 -0
  216. data/vendor/assets/javascripts/bower/es6-promise/bower.json +5 -0
  217. data/vendor/assets/javascripts/bower/es6-promise/promise.js +684 -0
  218. data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +1 -0
  219. data/vendor/assets/javascripts/bower/lodash/.bower.json +33 -0
  220. data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +22 -0
  221. data/vendor/assets/javascripts/bower/lodash/bower.json +23 -0
  222. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +7157 -0
  223. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +61 -0
  224. data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +6785 -0
  225. data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +56 -0
  226. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +4979 -0
  227. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +39 -0
  228. data/vendor/assets/javascripts/bower/vue/.bower.json +29 -0
  229. data/vendor/assets/javascripts/bower/vue/LICENSE +21 -0
  230. data/vendor/assets/javascripts/bower/vue/dist/vue.js +4713 -0
  231. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -0
  232. data/vendor/assets/javascripts/bower/vue/src/batcher.js +45 -0
  233. data/vendor/assets/javascripts/bower/vue/src/binding.js +103 -0
  234. data/vendor/assets/javascripts/bower/vue/src/compiler.js +1037 -0
  235. data/vendor/assets/javascripts/bower/vue/src/config.js +19 -0
  236. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +65 -0
  237. data/vendor/assets/javascripts/bower/vue/src/directive.js +258 -0
  238. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +41 -0
  239. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +56 -0
  240. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +129 -0
  241. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +174 -0
  242. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +56 -0
  243. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +50 -0
  244. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +246 -0
  245. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +40 -0
  246. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +56 -0
  247. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +50 -0
  248. data/vendor/assets/javascripts/bower/vue/src/emitter.js +97 -0
  249. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +190 -0
  250. data/vendor/assets/javascripts/bower/vue/src/filters.js +190 -0
  251. data/vendor/assets/javascripts/bower/vue/src/fragment.js +84 -0
  252. data/vendor/assets/javascripts/bower/vue/src/main.js +186 -0
  253. data/vendor/assets/javascripts/bower/vue/src/observer.js +446 -0
  254. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +96 -0
  255. data/vendor/assets/javascripts/bower/vue/src/transition.js +228 -0
  256. data/vendor/assets/javascripts/bower/vue/src/utils.js +321 -0
  257. data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +180 -0
  258. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +1951 -0
  259. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +6 -0
  260. data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +117 -0
  261. data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +1242 -0
  262. data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +155 -0
  263. data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +6 -0
  264. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +245 -0
  265. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +14013 -0
  266. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +1 -0
  267. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +2599 -0
  268. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +750 -0
  269. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +60 -0
  270. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +12 -0
  271. data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +45 -0
  272. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +1888 -0
  273. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +10 -0
  274. data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +18 -0
  275. data/vendor/assets/stylesheets/.keep +0 -0
  276. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +5830 -0
  277. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +7 -0
  278. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +1338 -0
  279. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +4 -0
  280. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/FontAwesome.otf +0 -0
  281. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  282. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.svg +414 -0
  283. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  284. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  285. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_bordered-pulled.scss +16 -0
  286. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +12 -0
  287. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +6 -0
  288. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +412 -0
  289. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +13 -0
  290. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +19 -0
  291. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +20 -0
  292. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +14 -0
  293. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +9 -0
  294. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +30 -0
  295. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +20 -0
  296. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +381 -0
  297. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +17 -0
  298. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.eot +0 -0
  299. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.svg +229 -0
  300. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.ttf +0 -0
  301. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.woff +0 -0
  302. data/vendor/assets/stylesheets/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.css +233 -0
  303. data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +2 -0
  304. data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +68 -0
  305. data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +144 -0
  306. data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +329 -0
  307. data/vendor/patterns/firewalls +60 -0
  308. data/vendor/patterns/grok-patterns +94 -0
  309. data/vendor/patterns/haproxy +37 -0
  310. data/vendor/patterns/java +3 -0
  311. data/vendor/patterns/junos +9 -0
  312. data/vendor/patterns/linux-syslog +16 -0
  313. data/vendor/patterns/mcollective +1 -0
  314. data/vendor/patterns/mcollective-patterns +4 -0
  315. data/vendor/patterns/mongodb +4 -0
  316. data/vendor/patterns/nagios +108 -0
  317. data/vendor/patterns/postgresql +3 -0
  318. data/vendor/patterns/redis +3 -0
  319. data/vendor/patterns/ruby +2 -0
  320. metadata +659 -0
@@ -0,0 +1,101 @@
1
+ class Fluentd
2
+ class Agent
3
+ module LocalCommon
4
+ def running?
5
+ begin
6
+ pid && Process.kill(0, pid)
7
+ rescue Errno::ESRCH
8
+ File.unlink(pid_file) # no needed any more
9
+ false
10
+ end
11
+ end
12
+
13
+ def log
14
+ return "" unless File.exists?(log_file)
15
+ File.read(log_file) # TODO: large log file
16
+ end
17
+
18
+ def config
19
+ File.read(config_file)
20
+ end
21
+
22
+ def config_write(content)
23
+ File.open(config_file, "w") do |f|
24
+ f.write content
25
+ end
26
+ end
27
+
28
+ def config_append(content)
29
+ File.open(config_file, "a") do |f|
30
+ f.write "\n"
31
+ f.write content
32
+ end
33
+ end
34
+
35
+ def log_tail(limit = nil)
36
+ return [] unless File.exists?(log_file)
37
+
38
+ limit = limit.to_i rescue 0
39
+ limit = limit.zero? ? Settings.default_log_tail_count : limit
40
+ io = File.open(log_file)
41
+ buf = []
42
+ reader = ::FileReverseReader.new(io)
43
+ reader.each_line do |line|
44
+ buf << line
45
+ break if buf.length >= limit
46
+ end
47
+ buf
48
+ end
49
+
50
+ def configuration
51
+ if File.exists? config_file
52
+ ::Fluentd::Agent::Configuration.new(config_file)
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def pid
59
+ return unless File.exists?(pid_file)
60
+ File.read(pid_file).to_i rescue nil
61
+ end
62
+
63
+ def logged_errors(&block)
64
+ return [] unless File.exist?(log_file)
65
+ buf = []
66
+ io = File.open(log_file)
67
+ reader = ::FileReverseReader.new(io)
68
+ reader.each_line do |line|
69
+ unless line["error"]
70
+ if buf.present?
71
+ # NOTE: if a following log is given
72
+ # 2014-06-30 11:24:08 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: Address already in use - bind(2) for 0.0.0.0:24220>
73
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:206:in `bind'
74
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:206:in `listen'
75
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:461:in `block in tcp_server_sockets'
76
+ # the first line become a "subject", trailing lines are "notes"
77
+ # {
78
+ # subject: "2014-06-30 11:24:08 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: Address already in use - bind(2) for 0.0.0.0:24220>",
79
+ # notes: [
80
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:206:in `bind'
81
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:206:in `listen'
82
+ # 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:461:in `block in tcp_server_sockets'
83
+ # ]
84
+ # }
85
+ subject, *notes = *buf.reverse
86
+ block.call({
87
+ subject: subject,
88
+ notes: notes,
89
+ })
90
+ end
91
+ buf = []
92
+ next
93
+ end
94
+ buf << line
95
+ end
96
+ ensure
97
+ io && io.close
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,7 @@
1
+ class Fluentd
2
+ class Agent
3
+ class Remote # TODO
4
+ include Common
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,44 @@
1
+ class Fluentd
2
+ class Agent
3
+ class TdAgent
4
+ include Common
5
+ include LocalCommon
6
+
7
+ def self.default_options
8
+ {
9
+ :pid_file => "/var/run/td-agent/td-agent.pid",
10
+ :log_file => "/var/log/td-agent/td-agent.log",
11
+ :config_file => "/etc/td-agent/td-agent.conf",
12
+ }
13
+ end
14
+
15
+ def start
16
+ detached_command('/etc/init.d/td-agent start')
17
+ end
18
+
19
+ def stop
20
+ detached_command('/etc/init.d/td-agent stop')
21
+ end
22
+
23
+ def restart
24
+ # NOTE: td-agent has no reload command
25
+ # https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L156
26
+ detached_command('/etc/init.d/td-agent restart')
27
+ end
28
+
29
+ def version
30
+ `/usr/sbin/td-agent --version`.strip
31
+ end
32
+
33
+ private
34
+
35
+ def detached_command(cmd)
36
+ Bundler.with_clean_env do
37
+ pid = spawn(cmd)
38
+ Process.detach(pid)
39
+ end
40
+ sleep 1 # NOTE/FIXME: too early return will be caused incorrect status report, "sleep 1" is a adhoc hack
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ require "fluentd/api/http"
2
+
3
+ class Fluentd
4
+ class Api
5
+ end
6
+ end
@@ -0,0 +1,26 @@
1
+ require "httpclient"
2
+ require "addressable/uri"
3
+
4
+ class Fluentd
5
+ class Api
6
+ class Http
7
+ def initialize(endpoint)
8
+ @endpoint = Addressable::URI.parse(endpoint)
9
+ end
10
+
11
+ def config
12
+ request("/api/config.json")
13
+ end
14
+
15
+ private
16
+
17
+ def request(path)
18
+ uri = @endpoint.dup
19
+ uri.path = path
20
+ res = HTTPClient.get(uri)
21
+ JSON.parse res.body
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,4 @@
1
+ class Fluentd
2
+ module Setting
3
+ end
4
+ end
@@ -0,0 +1,185 @@
1
+ class Fluentd
2
+ module Setting
3
+ module Common
4
+ extend ActiveSupport::Concern
5
+ include ActiveModel::Model
6
+
7
+ module ClassMethods
8
+ attr_accessor :values, :types, :children, :hidden_values
9
+
10
+ def choice(key, values)
11
+ @values ||= {}
12
+ @values[key] = values
13
+ set_type(:choice, [key])
14
+ end
15
+
16
+ def hidden(key)
17
+ set_type(:hidden, [key])
18
+ end
19
+
20
+ def nested(key, klass, options = {})
21
+ # e.g.:
22
+ # <match>
23
+ # type forward
24
+ # <server>
25
+ # ..
26
+ # </server>
27
+ # </match>
28
+ @children ||= {}
29
+ @children[key] = {
30
+ class: klass,
31
+ options: options,
32
+ }
33
+ set_type(:nested, [key])
34
+ end
35
+
36
+ def booleans(*keys)
37
+ # e.g.:
38
+ # use_ssl true
39
+ # include_time_key false
40
+ set_type(:boolean, keys)
41
+ end
42
+
43
+ def flags(*keys)
44
+ # e.g.:
45
+ # tag_mapped
46
+ # utc
47
+ set_type(:flag, keys)
48
+ end
49
+
50
+ private
51
+
52
+ def set_type(type, keys)
53
+ @types ||= {}
54
+ keys.each do |key|
55
+ @types[key] = type
56
+ end
57
+ end
58
+ end
59
+
60
+ def children_of(key)
61
+ meta = self.class.children[key]
62
+ return unless meta
63
+ klass = meta[:class]
64
+ data = send(key) || {"0" => {}}
65
+ children = []
66
+ data.each_pair do |index, attrs|
67
+ children << klass.new(attrs)
68
+ end
69
+ children
70
+ end
71
+
72
+ def child_class(key)
73
+ self.class.children[key][:class]
74
+ end
75
+
76
+ def values_of(key)
77
+ self.class.values.try(:[], key) || []
78
+ end
79
+
80
+ def column_type(key)
81
+ self.class.types.try(:[], key) || "string"
82
+ end
83
+
84
+ def conf(key)
85
+ case column_type(key)
86
+ when :boolean
87
+ boolenan(key)
88
+ when :flag
89
+ flag(key)
90
+ when :nested
91
+ return "" unless send(key)
92
+ klass = child_class(key)
93
+ send(key).map do |(_, child)|
94
+ # send("servers")
95
+ #
96
+ # "servers" => {
97
+ # "0" => {
98
+ # "name" => "foo",
99
+ # "host" => "bar",
100
+ # ..
101
+ # },
102
+ # "1" => {
103
+ # ..
104
+ # }
105
+ # }
106
+ child_instance = klass.new(child)
107
+ unless child_instance.empty_value?
108
+ "\n" + child_instance.to_config(key).gsub(/^/m, " ")
109
+ end
110
+ end.join
111
+ else # including :hidden
112
+ print_if_present(key)
113
+ end
114
+ end
115
+
116
+ def plugin_type_name
117
+ # Fluentd::Setting::OutS3 -> s3
118
+ # Override this method if not above style
119
+ try(:plugin_name) || self.class.to_s.split("::").last.sub(/(In|Out)/, "").downcase
120
+ end
121
+
122
+ def print_if_present(key)
123
+ # e.g.:
124
+ # path /var/log/td/aaa
125
+ # user nobody
126
+ # retry_limit 3
127
+ send(key).present? ? "#{key} #{send(key)}" : ""
128
+ end
129
+
130
+ def boolenan(key)
131
+ send(key).presence == "true" ? "#{key} true" : "#{key} false"
132
+ end
133
+
134
+ def flag(key)
135
+ send(key).presence == "true" ? key.to_s : ""
136
+ end
137
+
138
+ def empty_value?
139
+ config = ""
140
+ self.class.const_get(:KEYS).each do |key|
141
+ config << conf(key)
142
+ end
143
+ config.empty?
144
+ end
145
+
146
+ def input_plugin?
147
+ self.class.to_s.match(/::In|^In/)
148
+ end
149
+
150
+ def output_plugin?
151
+ not input_plugin?
152
+ end
153
+
154
+ def to_config(elm_name = nil)
155
+ indent = " "
156
+ if elm_name
157
+ config = "<#{elm_name}>\n"
158
+ else
159
+ if input_plugin?
160
+ config = "<source>\n"
161
+ else
162
+ config = "<match #{match}>\n"
163
+ end
164
+ config << "#{indent}type #{plugin_type_name}\n"
165
+ end
166
+ self.class.const_get(:KEYS).each do |key|
167
+ next if key == :match
168
+ config << indent
169
+ config << conf(key)
170
+ config << "\n"
171
+ end
172
+ if elm_name
173
+ config << "</#{elm_name}>\n"
174
+ else
175
+ if input_plugin?
176
+ config << "</source>\n"
177
+ else
178
+ config << "</match>\n"
179
+ end
180
+ end
181
+ config.gsub(/^[ ]*\n/m, "")
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,16 @@
1
+ class Fluentd
2
+ module Setting
3
+ class InSyslog
4
+ include ActiveModel::Model
5
+ include Common
6
+
7
+ KEYS = [
8
+ :port, :bind, :tag, :types
9
+ ].freeze
10
+
11
+ attr_accessor(*KEYS)
12
+
13
+ validates :tag, presence: true
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,107 @@
1
+ class Fluentd
2
+ module Setting
3
+ class InTail
4
+ include ActiveModel::Model
5
+ attr_accessor :path, :tag, :format, :regexp, :time_format, :rotate_wait, :pos_file, :read_from_head, :refresh_interval
6
+
7
+ validates :path, presence: true
8
+ validates :tag, presence: true
9
+ #validates :format, presence: true
10
+
11
+ def self.known_formats
12
+ {
13
+ :apache2 => [:time_format],
14
+ :nginx => [:time_format],
15
+ :syslog => [:time_format],
16
+ :tsv => [:keys, :time_key],
17
+ :csv => [:keys, :time_key],
18
+ :ltsv => [:delimiter, :time_key],
19
+ :json => [:time_key],
20
+ :regexp => [:time_format],
21
+ # TODO: Grok could generate Regexp including \d, \s, etc. fluentd config parser raise error with them for escape sequence check.
22
+ # TBD How to handle Grok/Regexp later, just comment out for hide
23
+ # :grok => [:grok_str],
24
+ }
25
+ end
26
+ attr_accessor *known_formats.values.flatten.compact
27
+
28
+ def known_formats
29
+ self.class.known_formats
30
+ end
31
+
32
+ def guess_format
33
+ case path
34
+ when /\.json$/
35
+ :json
36
+ when /\.csv$/
37
+ :csv
38
+ when /\.tsv$/
39
+ :tsv
40
+ when /\.ltsv$/
41
+ :ltsv
42
+ when /nginx/
43
+ :nginx
44
+ when /apache/
45
+ :apache2
46
+ when %r|/var/log|
47
+ :syslog
48
+ else
49
+ :regexp
50
+ end
51
+ end
52
+
53
+ def extra_format_options
54
+ self.class.known_formats[format.to_sym] || []
55
+ end
56
+
57
+ def format_specific_conf
58
+ return "" if %w(grok regexp).include?(format)
59
+
60
+ indent = " " * 2
61
+ format_specific_conf = ""
62
+ extra_format_options.each do |key|
63
+ format_specific_conf << "#{indent}#{key} #{send(key)}\n"
64
+ end
65
+ format_specific_conf
66
+ end
67
+
68
+ def certain_format_line
69
+ case format
70
+ when "grok"
71
+ "format /#{grok.convert_to_regexp(grok_str).source.gsub("/", "\\/")}/ # grok: '#{grok_str}'"
72
+ when "regexp"
73
+ "format /#{regexp}/"
74
+ else
75
+ "format #{format}"
76
+ end
77
+ end
78
+
79
+ def grok
80
+ @grok ||=
81
+ begin
82
+ grok = GrokConverter.new
83
+ grok.load_patterns
84
+ grok
85
+ end
86
+ end
87
+
88
+ def to_conf
89
+ # NOTE: Using strip_heredoc makes more complex for format_specific_conf indent
90
+ <<-XML.gsub(/^[ ]*\n/m, "")
91
+ <source>
92
+ type tail
93
+ path #{path}
94
+ tag #{tag}
95
+ #{certain_format_line}
96
+ #{format_specific_conf}
97
+
98
+ #{read_from_head.to_i.zero? ? "" : "read_from_head true"}
99
+ #{pos_file.present? ? "pos_file #{pos_file}" : ""}
100
+ #{rotate_wait.present? ? "rotate_wait #{rotate_wait}" : ""}
101
+ #{refresh_interval.present? ? "refresh_interval #{refresh_interval}" : ""}
102
+ </source>
103
+ XML
104
+ end
105
+ end
106
+ end
107
+ end