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.
- checksums.yaml +7 -0
- data/.bowerrc +3 -0
- data/.gitignore +31 -0
- data/.rspec +1 -0
- data/ChangeLog +3 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +247 -0
- data/Gemfile.production +3 -0
- data/README.md +53 -0
- data/Rakefile +8 -0
- data/app/assets/images/.keep +0 -0
- data/app/assets/javascripts/alert.js +51 -0
- data/app/assets/javascripts/application.js +22 -0
- data/app/assets/javascripts/nested_setting.js +41 -0
- data/app/assets/javascripts/setting_format.js +15 -0
- data/app/assets/javascripts/tutorial.js +58 -0
- data/app/assets/javascripts/vue/fluent_log.js +64 -0
- data/app/assets/javascripts/vue/in_tail_format.js +153 -0
- data/app/assets/javascripts/vue/treeview.js +97 -0
- data/app/assets/javascripts/vue_common.js +4 -0
- data/app/assets/stylesheets/application.css +18 -0
- data/app/assets/stylesheets/common.css.scss +152 -0
- data/app/controllers/api_controller.rb +37 -0
- data/app/controllers/application_controller.rb +110 -0
- data/app/controllers/concerns/.keep +0 -0
- data/app/controllers/fluentd/agents_controller.rb +35 -0
- data/app/controllers/fluentd/settings/in_syslog_controller.rb +34 -0
- data/app/controllers/fluentd/settings/in_tail_controller.rb +57 -0
- data/app/controllers/fluentd/settings/out_forward_controller.rb +42 -0
- data/app/controllers/fluentd/settings/out_mongo_controller.rb +36 -0
- data/app/controllers/fluentd/settings/out_s3_controller.rb +36 -0
- data/app/controllers/fluentd/settings/out_td_controller.rb +36 -0
- data/app/controllers/fluentd/settings_controller.rb +18 -0
- data/app/controllers/fluentd_controller.rb +62 -0
- data/app/controllers/misc_controller.rb +69 -0
- data/app/controllers/plugins_controller.rb +44 -0
- data/app/controllers/polling_controller.rb +20 -0
- data/app/controllers/sessions_controller.rb +45 -0
- data/app/controllers/tutorials_controller.rb +40 -0
- data/app/controllers/users_controller.rb +28 -0
- data/app/controllers/welcome_controller.rb +5 -0
- data/app/helpers/application_helper.rb +55 -0
- data/app/helpers/fluentd/settings_helper.rb +2 -0
- data/app/helpers/miscs_helper.rb +2 -0
- data/app/helpers/settings_helper.rb +43 -0
- data/app/mailers/.keep +0 -0
- data/app/models/.keep +0 -0
- data/app/models/concerns/.keep +0 -0
- data/app/models/fluentd.rb +178 -0
- data/app/models/fluentd/agent.rb +28 -0
- data/app/models/fluentd/agent/common.rb +76 -0
- data/app/models/fluentd/agent/configuration.rb +35 -0
- data/app/models/fluentd/agent/fluentd_gem.rb +104 -0
- data/app/models/fluentd/agent/local_common.rb +101 -0
- data/app/models/fluentd/agent/remote.rb +7 -0
- data/app/models/fluentd/agent/td_agent.rb +44 -0
- data/app/models/fluentd/api.rb +6 -0
- data/app/models/fluentd/api/http.rb +26 -0
- data/app/models/fluentd/setting.rb +4 -0
- data/app/models/fluentd/setting/common.rb +185 -0
- data/app/models/fluentd/setting/in_syslog.rb +16 -0
- data/app/models/fluentd/setting/in_tail.rb +107 -0
- data/app/models/fluentd/setting/out_forward.rb +70 -0
- data/app/models/fluentd/setting/out_mongo.rb +35 -0
- data/app/models/fluentd/setting/out_s3.rb +29 -0
- data/app/models/fluentd/setting/out_td.rb +26 -0
- data/app/models/plugin.rb +193 -0
- data/app/models/settings.rb +4 -0
- data/app/models/user.rb +52 -0
- data/app/views/fluentd/_form.html.haml +31 -0
- data/app/views/fluentd/edit.html.haml +3 -0
- data/app/views/fluentd/errors.html.haml +19 -0
- data/app/views/fluentd/log.html.haml +9 -0
- data/app/views/fluentd/new.html.haml +3 -0
- data/app/views/fluentd/settings/_form.html.haml +43 -0
- data/app/views/fluentd/settings/edit.html.haml +7 -0
- data/app/views/fluentd/settings/in_syslog/_form.html.haml +9 -0
- data/app/views/fluentd/settings/in_syslog/show.html.haml +6 -0
- data/app/views/fluentd/settings/in_tail/_form.html.haml +42 -0
- data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +19 -0
- data/app/views/fluentd/settings/in_tail/after_format.html.haml +10 -0
- data/app/views/fluentd/settings/in_tail/confirm.html.haml +13 -0
- data/app/views/fluentd/settings/in_tail/show.html.haml +5 -0
- data/app/views/fluentd/settings/out_forward/_form.html.haml +22 -0
- data/app/views/fluentd/settings/out_forward/show.html.haml +6 -0
- data/app/views/fluentd/settings/out_mongo/_form.html.haml +30 -0
- data/app/views/fluentd/settings/out_mongo/finish.html.haml +4 -0
- data/app/views/fluentd/settings/out_mongo/show.html.haml +6 -0
- data/app/views/fluentd/settings/out_s3/_form.html.haml +39 -0
- data/app/views/fluentd/settings/out_s3/show.html.haml +6 -0
- data/app/views/fluentd/settings/out_td/_form.html.haml +18 -0
- data/app/views/fluentd/settings/out_td/show.html.haml +6 -0
- data/app/views/fluentd/settings/show.html.haml +10 -0
- data/app/views/fluentd/settings/source_and_output.html.haml +45 -0
- data/app/views/fluentd/show.html.haml +60 -0
- data/app/views/layouts/application.html.erb +102 -0
- data/app/views/layouts/sign_in.html.erb +28 -0
- data/app/views/misc/information.html.haml +75 -0
- data/app/views/misc/update_fluentd_ui.html.haml +45 -0
- data/app/views/plugins/installed.html.haml +67 -0
- data/app/views/plugins/recommended.html.haml +59 -0
- data/app/views/plugins/updated.html.haml +29 -0
- data/app/views/sessions/new.html.haml +13 -0
- data/app/views/shared/_error.html.haml +3 -0
- data/app/views/shared/_flash.html.haml +10 -0
- data/app/views/shared/_fluentd_nav.html.haml +12 -0
- data/app/views/shared/_global_nav.html.erb +80 -0
- data/app/views/shared/_initial_setup.html.haml +13 -0
- data/app/views/shared/_modal.html.erb +25 -0
- data/app/views/shared/_setting_errors.html.haml +5 -0
- data/app/views/shared/vue/_fluent_log.html.erb +25 -0
- data/app/views/shared/vue/_in_tail_format.html.erb +53 -0
- data/app/views/shared/vue/_treeview.html.erb +30 -0
- data/app/views/tutorials/chapter1.html.erb +31 -0
- data/app/views/tutorials/chapter2.html.haml +12 -0
- data/app/views/tutorials/chapter3.html.haml +12 -0
- data/app/views/tutorials/chapter4.html.haml +12 -0
- data/app/views/tutorials/chapter5.html.haml +10 -0
- data/app/views/tutorials/index.html.haml +26 -0
- data/app/views/users/show.html.haml +22 -0
- data/app/workers/all_plugin_check_update.rb +14 -0
- data/app/workers/fluentd_ui_restart.rb +41 -0
- data/app/workers/fluentd_ui_update_check.rb +15 -0
- data/app/workers/gem_installer.rb +17 -0
- data/app/workers/gem_uninstaller.rb +15 -0
- data/app/workers/gem_update_check.rb +10 -0
- data/bin/bundle +3 -0
- data/bin/fluentd-ui +13 -0
- data/bin/fluentd-ui-restart +12 -0
- data/bin/rails +8 -0
- data/bin/rake +8 -0
- data/bin/spring +18 -0
- data/bower.json +10 -0
- data/circle.yml +8 -0
- data/config.ru +4 -0
- data/config/application.rb +48 -0
- data/config/application.yml +211 -0
- data/config/boot.rb +4 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +36 -0
- data/config/environments/production.rb +69 -0
- data/config/environments/test.rb +40 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/cookies_serializer.rb +3 -0
- data/config/initializers/filter_parameter_logging.rb +4 -0
- data/config/initializers/inflections.rb +16 -0
- data/config/initializers/mime_types.rb +4 -0
- data/config/initializers/prefetch_gem_updates.rb +1 -0
- data/config/initializers/session_store.rb +3 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/en.yml +204 -0
- data/config/locales/ja.yml +194 -0
- data/config/locales/translation_en.yml +255 -0
- data/config/locales/translation_ja.yml +255 -0
- data/config/locales/tutorial_en.yml +117 -0
- data/config/locales/tutorial_ja.yml +120 -0
- data/config/routes.rb +93 -0
- data/config/secrets.yml +22 -0
- data/db/schema.rb +0 -0
- data/db/seeds.rb +11 -0
- data/fluentd-ui-ss01.png +0 -0
- data/fluentd-ui-ss02.png +0 -0
- data/fluentd-ui-ss03.png +0 -0
- data/fluentd-ui-ss04.png +0 -0
- data/fluentd-ui-ss05.png +0 -0
- data/fluentd-ui.gemspec +46 -0
- data/lib/assets/.keep +0 -0
- data/lib/file_reverse_reader.rb +56 -0
- data/lib/fluentd-ui.rb +22 -0
- data/lib/fluentd-ui/command.rb +52 -0
- data/lib/fluentd-ui/version.rb +3 -0
- data/lib/grok_converter.rb +39 -0
- data/lib/regexp_preview.rb +48 -0
- data/lib/tasks/.keep +0 -0
- data/lib/treeview.rb +45 -0
- data/log/.keep +0 -0
- data/public/404.html +67 -0
- data/public/422.html +67 -0
- data/public/500.html +66 -0
- data/public/favicon.ico +0 -0
- data/public/fluentd-logo-right-text.png +0 -0
- data/public/fluentd-logo.png +0 -0
- data/public/fluentd.png +0 -0
- data/public/robots.txt +5 -0
- data/spec/controllers/plugins_controller_spec.rb +5 -0
- data/spec/controllers/polling_controller_spec.rb +5 -0
- data/spec/controllers/sessions_controller_spec.rb +5 -0
- data/spec/controllers/tutorials_controller_spec.rb +5 -0
- data/spec/factories/fluentd.rb +11 -0
- data/spec/factories/plugins.rb +8 -0
- data/spec/factories/user.rb +6 -0
- data/spec/features/fluentd/setting/out_forward_spec.rb +45 -0
- data/spec/features/fluentd/setting/out_td_spec.rb +35 -0
- data/spec/features/sessions_spec.rb +55 -0
- data/spec/features/shared_examples/login_required.rb +4 -0
- data/spec/features/users_spec.rb +9 -0
- data/spec/grok_converter_spec.rb +50 -0
- data/spec/lib/file_reverse_reader_spec.rb +73 -0
- data/spec/lib/fluentd-ui_spec.rb +35 -0
- data/spec/models/fluentd/agent_spec.rb +91 -0
- data/spec/models/fluentd/setting/common_spec.rb +178 -0
- data/spec/models/fluentd/setting/in_syslog_spec.rb +35 -0
- data/spec/models/fluentd/setting/out_mongo_spec.rb +40 -0
- data/spec/models/fluentd/setting/out_td_spec.rb +38 -0
- data/spec/models/fluentd_spec.rb +166 -0
- data/spec/models/plugin_spec.rb +191 -0
- data/spec/models/user_spec.rb +15 -0
- data/spec/spec_helper.rb +58 -0
- data/spec/support/fixtures/error0.log +12 -0
- data/spec/support/fixtures/error2.log +130 -0
- data/spec/support/fluentd_agent_common_behavior.rb +114 -0
- data/spec/support/fluentd_agent_restart_strategy.rb +94 -0
- data/tmp/.gitkeep +0 -0
- data/vendor/assets/javascripts/.keep +0 -0
- data/vendor/assets/javascripts/bower/es6-promise/.bower.json +15 -0
- data/vendor/assets/javascripts/bower/es6-promise/bower.json +5 -0
- data/vendor/assets/javascripts/bower/es6-promise/promise.js +684 -0
- data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +1 -0
- data/vendor/assets/javascripts/bower/lodash/.bower.json +33 -0
- data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +22 -0
- data/vendor/assets/javascripts/bower/lodash/bower.json +23 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +7157 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +61 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +6785 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +56 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +4979 -0
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +39 -0
- data/vendor/assets/javascripts/bower/vue/.bower.json +29 -0
- data/vendor/assets/javascripts/bower/vue/LICENSE +21 -0
- data/vendor/assets/javascripts/bower/vue/dist/vue.js +4713 -0
- data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -0
- data/vendor/assets/javascripts/bower/vue/src/batcher.js +45 -0
- data/vendor/assets/javascripts/bower/vue/src/binding.js +103 -0
- data/vendor/assets/javascripts/bower/vue/src/compiler.js +1037 -0
- data/vendor/assets/javascripts/bower/vue/src/config.js +19 -0
- data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +65 -0
- data/vendor/assets/javascripts/bower/vue/src/directive.js +258 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/html.js +41 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/if.js +56 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/index.js +129 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model.js +174 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/on.js +56 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +246 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/style.js +40 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/view.js +56 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/with.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/emitter.js +97 -0
- data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +190 -0
- data/vendor/assets/javascripts/bower/vue/src/filters.js +190 -0
- data/vendor/assets/javascripts/bower/vue/src/fragment.js +84 -0
- data/vendor/assets/javascripts/bower/vue/src/main.js +186 -0
- data/vendor/assets/javascripts/bower/vue/src/observer.js +446 -0
- data/vendor/assets/javascripts/bower/vue/src/text-parser.js +96 -0
- data/vendor/assets/javascripts/bower/vue/src/transition.js +228 -0
- data/vendor/assets/javascripts/bower/vue/src/utils.js +321 -0
- data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +180 -0
- data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +1951 -0
- data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +6 -0
- data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +117 -0
- data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +1242 -0
- data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +155 -0
- data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +6 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +245 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +14013 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +1 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +2599 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +750 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +60 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +12 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +45 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +1888 -0
- data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +10 -0
- data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +18 -0
- data/vendor/assets/stylesheets/.keep +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +5830 -0
- data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +7 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +1338 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +4 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/FontAwesome.otf +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.svg +414 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_bordered-pulled.scss +16 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +12 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +6 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +412 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +13 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +19 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +20 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +14 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +9 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +30 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +20 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +381 -0
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +17 -0
- data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.eot +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.svg +229 -0
- data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.woff +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.css +233 -0
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +2 -0
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +68 -0
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +144 -0
- data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +329 -0
- data/vendor/patterns/firewalls +60 -0
- data/vendor/patterns/grok-patterns +94 -0
- data/vendor/patterns/haproxy +37 -0
- data/vendor/patterns/java +3 -0
- data/vendor/patterns/junos +9 -0
- data/vendor/patterns/linux-syslog +16 -0
- data/vendor/patterns/mcollective +1 -0
- data/vendor/patterns/mcollective-patterns +4 -0
- data/vendor/patterns/mongodb +4 -0
- data/vendor/patterns/nagios +108 -0
- data/vendor/patterns/postgresql +3 -0
- data/vendor/patterns/redis +3 -0
- data/vendor/patterns/ruby +2 -0
- metadata +659 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ApplicationHelper
|
4
|
+
def has_td_agent_system?
|
5
|
+
File.exist?("/etc/init.d/td-agent")
|
6
|
+
end
|
7
|
+
|
8
|
+
def fluentd_ui_logo
|
9
|
+
image_tag(ENV["FLUENTD_UI_LOGO"] || "/fluentd-logo-right-text.png")
|
10
|
+
end
|
11
|
+
|
12
|
+
def language_name(locale)
|
13
|
+
# NOTE: these are fixed terms, not i18n-ed
|
14
|
+
{
|
15
|
+
en: "English",
|
16
|
+
ja: "日本語",
|
17
|
+
}[locale] || locale
|
18
|
+
end
|
19
|
+
|
20
|
+
def language_menu
|
21
|
+
html = ""
|
22
|
+
I18n.available_locales.each do |locale|
|
23
|
+
text = (locale == current_locale ? icon("fa-check") : "")
|
24
|
+
text << language_name(locale)
|
25
|
+
html << %Q|<li>#{link_to text , "?lang=#{locale}"}</li>|
|
26
|
+
end
|
27
|
+
raw html
|
28
|
+
end
|
29
|
+
|
30
|
+
def link_to_other(text, path)
|
31
|
+
if current_page?(path)
|
32
|
+
# NOTE: sb-admin set style for element name instead of class name, such as ".nav a". So use "a" element even if it isn't a link.
|
33
|
+
content_tag(:a, text, class: "current")
|
34
|
+
else
|
35
|
+
link_to text, path
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def icon(classes, inner=nil)
|
40
|
+
%Q!<i class="fa #{classes}">#{inner}</i> !.html_safe
|
41
|
+
end
|
42
|
+
|
43
|
+
def page_title(title, &block)
|
44
|
+
content_for(:page_title) do
|
45
|
+
title
|
46
|
+
end
|
47
|
+
page_head(title, &block) unless content_for?(:page_head)
|
48
|
+
end
|
49
|
+
|
50
|
+
def page_head(head, &block)
|
51
|
+
content_for(:page_head) do
|
52
|
+
head.html_safe + block.try(:call).to_s
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module SettingsHelper
|
2
|
+
def field(form, key, opts = {})
|
3
|
+
html = '<div class="form-group">'
|
4
|
+
|
5
|
+
case form.object.column_type(key)
|
6
|
+
when :hidden
|
7
|
+
return form.hidden_field(key)
|
8
|
+
when :boolean, :flag
|
9
|
+
html << form.check_box(key, {}, "true", "false")
|
10
|
+
html << " " # NOTE: Adding space for padding
|
11
|
+
html << h(form.label(key))
|
12
|
+
when :choice
|
13
|
+
html << h(form.label(key))
|
14
|
+
html << " " # NOTE: Adding space for padding
|
15
|
+
html << form.select(key, form.object.values_of(key), opts)
|
16
|
+
when :nested
|
17
|
+
child_data = form.object.class.children[key]
|
18
|
+
klass = child_data[:class]
|
19
|
+
options = child_data[:options]
|
20
|
+
children = form.object.send(key) || {"0" => {}}
|
21
|
+
children.each_pair do |index, child|
|
22
|
+
html << %Q!<div class="js-nested-column #{options[:multiple] ? "js-multiple" : ""} well well-sm">!
|
23
|
+
if options[:multiple]
|
24
|
+
html << %Q!<a class="btn btn-xs btn-default js-append">#{icon('fa-plus')}</a> !
|
25
|
+
html << %Q!<a class="btn btn-xs btn-default js-remove" style="display:none">#{icon('fa-minus')}</a> !
|
26
|
+
end
|
27
|
+
html << h(form.label(key))
|
28
|
+
form.fields_for("#{key}[#{index}]", klass.new(child)) do |ff|
|
29
|
+
klass::KEYS.each do |k|
|
30
|
+
html << field(ff, k)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
html << "</div>"
|
34
|
+
end
|
35
|
+
else
|
36
|
+
html << h(form.label(key))
|
37
|
+
html << form.text_field(key, class: "form-control")
|
38
|
+
end
|
39
|
+
|
40
|
+
html << "</div>"
|
41
|
+
html.html_safe
|
42
|
+
end
|
43
|
+
end
|
data/app/mailers/.keep
ADDED
File without changes
|
data/app/models/.keep
ADDED
File without changes
|
File without changes
|
@@ -0,0 +1,178 @@
|
|
1
|
+
class Fluentd
|
2
|
+
include ActiveModel::Model
|
3
|
+
include ActiveModel::Validations::Callbacks
|
4
|
+
|
5
|
+
validates :variant, inclusion: { in: proc { Fluentd.variants } }
|
6
|
+
validates :log_file, presence: true
|
7
|
+
validates :pid_file, presence: true
|
8
|
+
validates :config_file, presence: true
|
9
|
+
validate :validate_permissions
|
10
|
+
|
11
|
+
before_validation :expand_paths
|
12
|
+
|
13
|
+
COLUMNS = [:id, :variant, :log_file, :pid_file, :config_file]
|
14
|
+
DEFAULT_CONF = <<-CONF.strip_heredoc
|
15
|
+
<source>
|
16
|
+
# http://docs.fluentd.org/articles/in_forward
|
17
|
+
type forward
|
18
|
+
port 24224
|
19
|
+
</source>
|
20
|
+
|
21
|
+
<source>
|
22
|
+
# http://docs.fluentd.org/articles/in_http
|
23
|
+
type http
|
24
|
+
port 9880
|
25
|
+
</source>
|
26
|
+
|
27
|
+
<source>
|
28
|
+
type monitor_agent
|
29
|
+
port 24220
|
30
|
+
</source>
|
31
|
+
<source>
|
32
|
+
type debug_agent
|
33
|
+
port 24230
|
34
|
+
</source>
|
35
|
+
|
36
|
+
<match debug.*>
|
37
|
+
# http://docs.fluentd.org/articles/out_stdout
|
38
|
+
type stdout
|
39
|
+
</match>
|
40
|
+
CONF
|
41
|
+
|
42
|
+
attr_accessor(*COLUMNS)
|
43
|
+
|
44
|
+
def self.variants
|
45
|
+
%w(fluentd_gem td-agent)
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.json_path
|
49
|
+
if ENV["FLUENTD_UI_DATA_DIR"].present?
|
50
|
+
dir = ENV["FLUENTD_UI_DATA_DIR"]
|
51
|
+
else
|
52
|
+
dir = ENV["HOME"] + "/.fluentd-ui/core_data"
|
53
|
+
end
|
54
|
+
FileUtils.mkdir_p(dir)
|
55
|
+
dir + "/#{Rails.env}-fluentd.json"
|
56
|
+
end
|
57
|
+
|
58
|
+
def fluentd?
|
59
|
+
variant == "fluentd_gem"
|
60
|
+
end
|
61
|
+
alias :fluentd_gem? :fluentd?
|
62
|
+
|
63
|
+
def td_agent?
|
64
|
+
variant == "td-agent"
|
65
|
+
end
|
66
|
+
|
67
|
+
def agent
|
68
|
+
klass = variant.underscore.camelize
|
69
|
+
Agent.const_get(klass).new({
|
70
|
+
:pid_file => pid_file,
|
71
|
+
:log_file => log_file,
|
72
|
+
:config_file => config_file,
|
73
|
+
})
|
74
|
+
end
|
75
|
+
|
76
|
+
def load_settings_from_agent_default
|
77
|
+
agent.class.default_options.each_pair do |key, value|
|
78
|
+
send("#{key}=", value)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def api
|
83
|
+
Api::Http.new(api_endpoint)
|
84
|
+
end
|
85
|
+
|
86
|
+
def api_endpoint
|
87
|
+
# TODO: autodetect from parsed configuration, but unused for now
|
88
|
+
end
|
89
|
+
|
90
|
+
def label
|
91
|
+
"fluentd" # NOTE: for multiple fluentd management, but only single fluentd manage now
|
92
|
+
end
|
93
|
+
|
94
|
+
def expand_paths
|
95
|
+
%w(pid_file log_file config_file).each do |column|
|
96
|
+
path = send(column)
|
97
|
+
next if path.blank?
|
98
|
+
self.send("#{column}=", File.expand_path(path))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def validate_permissions
|
103
|
+
%w(pid_file log_file config_file).each do |column|
|
104
|
+
check_permission(column)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def check_permission(column)
|
109
|
+
path = send(column)
|
110
|
+
return if path.blank? # if empty, presence: true will catch it
|
111
|
+
|
112
|
+
begin
|
113
|
+
FileUtils.mkdir_p(File.dirname(path))
|
114
|
+
rescue Errno::EACCES
|
115
|
+
errors.add(column, :lack_write_permission)
|
116
|
+
return
|
117
|
+
end
|
118
|
+
|
119
|
+
if File.exist?(path)
|
120
|
+
if File.directory?(path)
|
121
|
+
errors.add(column, :is_a_directory)
|
122
|
+
end
|
123
|
+
|
124
|
+
unless File.writable?(path)
|
125
|
+
errors.add(column, :lack_write_permission)
|
126
|
+
end
|
127
|
+
unless File.readable?(path)
|
128
|
+
errors.add(column, :lack_read_permission)
|
129
|
+
end
|
130
|
+
else
|
131
|
+
unless File.writable?(File.dirname(path))
|
132
|
+
errors.add(column, :lack_write_permission)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def ensure_default_config_file
|
138
|
+
return true if File.size?(config_file)
|
139
|
+
|
140
|
+
File.open(config_file, "w") do |f|
|
141
|
+
f.write DEFAULT_CONF
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
# ActiveRecord mimic
|
147
|
+
|
148
|
+
def self.instance
|
149
|
+
return unless exists?
|
150
|
+
attr = JSON.parse(File.read(json_path))
|
151
|
+
Fluentd.new(attr)
|
152
|
+
end
|
153
|
+
|
154
|
+
def self.exists?
|
155
|
+
File.exists?(json_path)
|
156
|
+
end
|
157
|
+
|
158
|
+
def update_attributes(params)
|
159
|
+
params.each_pair do |k, v|
|
160
|
+
send("#{k}=", v)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def save
|
165
|
+
return false unless valid?
|
166
|
+
json = COLUMNS.inject({}) do |result, col|
|
167
|
+
result[col] = send(col)
|
168
|
+
result
|
169
|
+
end.to_json
|
170
|
+
File.open(self.class.json_path, "w") do |f|
|
171
|
+
f.write json
|
172
|
+
end && ensure_default_config_file
|
173
|
+
end
|
174
|
+
|
175
|
+
def destroy
|
176
|
+
File.unlink(self.class.json_path)
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'fluent/log'
|
2
|
+
require 'fluent/env'
|
3
|
+
require 'fluent/version'
|
4
|
+
require 'fluent/supervisor'
|
5
|
+
require "fluentd/agent/common"
|
6
|
+
require "fluentd/agent/fluentd_gem"
|
7
|
+
require "fluentd/agent/td_agent"
|
8
|
+
require "fluentd/agent/remote"
|
9
|
+
|
10
|
+
class Fluentd
|
11
|
+
class Agent
|
12
|
+
# pidfile
|
13
|
+
# td-agent: /var/run/td-agent/td-agent.pid
|
14
|
+
# - https://github.com/treasure-data/td-agent/blob/master/td-agent.logrotate#L10
|
15
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L25
|
16
|
+
# fluentd: nothing (or --daemon PIDFILE)
|
17
|
+
#
|
18
|
+
# logfile
|
19
|
+
# td-agent: /var/log/td-agent/td-agent.log
|
20
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L28
|
21
|
+
# fluentd: stdout (or --log LOGFILE)
|
22
|
+
#
|
23
|
+
# config file
|
24
|
+
# td-agent: /etc/td-agent/td-agent.conf
|
25
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.postinst#L69
|
26
|
+
# fluentd: /etc/fluent/fluent.conf (by fluentd -s)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# pidfile
|
2
|
+
# td-agent: /var/run/td-agent/td-agent.pid
|
3
|
+
# - https://github.com/treasure-data/td-agent/blob/master/td-agent.logrotate#L10
|
4
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L25
|
5
|
+
# fluentd: nothing (or --daemon PIDFILE)
|
6
|
+
#
|
7
|
+
# logfile
|
8
|
+
# td-agent: /var/log/td-agent/td-agent.log
|
9
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.init#L28
|
10
|
+
# fluentd: stdout (or --log LOGFILE)
|
11
|
+
#
|
12
|
+
# config file
|
13
|
+
# td-agent: /etc/td-agent/td-agent.conf
|
14
|
+
# - https://github.com/treasure-data/td-agent/blob/master/debian/td-agent.postinst#L69
|
15
|
+
# fluentd: /etc/fluent/fluent.conf (by fluentd -s)
|
16
|
+
|
17
|
+
class Fluentd
|
18
|
+
class Agent
|
19
|
+
module Common
|
20
|
+
attr_reader :extra_options
|
21
|
+
|
22
|
+
def initialize(options = {})
|
23
|
+
@extra_options = options
|
24
|
+
end
|
25
|
+
|
26
|
+
def wait_process_starting_seconds
|
27
|
+
10.seconds # wait time for fluentd pidfile created
|
28
|
+
end
|
29
|
+
|
30
|
+
def errors_since(since = 1.day.ago)
|
31
|
+
errors = []
|
32
|
+
logged_errors do |error|
|
33
|
+
break if Time.parse(error[:subject]) < since
|
34
|
+
errors << error
|
35
|
+
end
|
36
|
+
errors
|
37
|
+
end
|
38
|
+
|
39
|
+
def recent_errors(limit = 3)
|
40
|
+
errors = []
|
41
|
+
logged_errors do |error|
|
42
|
+
errors << error
|
43
|
+
break if errors.length >= limit
|
44
|
+
end
|
45
|
+
errors
|
46
|
+
end
|
47
|
+
|
48
|
+
def pid_file
|
49
|
+
extra_options[:pid_file] || self.class.default_options[:pid_file]
|
50
|
+
end
|
51
|
+
|
52
|
+
def log_file
|
53
|
+
extra_options[:log_file] || self.class.default_options[:log_file]
|
54
|
+
end
|
55
|
+
|
56
|
+
def config_file
|
57
|
+
extra_options[:config_file] || self.class.default_options[:config_file]
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
# define these methods on each Agent class
|
62
|
+
|
63
|
+
%w(start stop restart).each do |method|
|
64
|
+
define_method(method) do
|
65
|
+
raise NotImplementedError, "'#{method}' method is required to be defined"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
%w(running? version log config config_write config_append log_tail configuration).each do |method|
|
70
|
+
define_method(method) do
|
71
|
+
raise NotImplementedError, "'#{method}' method is required to be defined"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "fluent/config/v1_parser"
|
2
|
+
|
3
|
+
class Fluentd
|
4
|
+
class Agent
|
5
|
+
class Configuration
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
attr_reader :file
|
9
|
+
|
10
|
+
def initialize(config_file)
|
11
|
+
@file = config_file
|
12
|
+
end
|
13
|
+
|
14
|
+
def config
|
15
|
+
@config ||= ::Fluent::Config::V1Parser.parse(File.read(file), File.basename(file), File.dirname(file))
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
config.to_s.gsub(/\A<ROOT>\n/, "").gsub(/<\/ROOT>\n\z/, "").gsub(/^ {2}/, "")
|
20
|
+
end
|
21
|
+
|
22
|
+
def each(&block)
|
23
|
+
config.each_element(&block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def sources
|
27
|
+
find_all{|e| e.name == "source"}
|
28
|
+
end
|
29
|
+
|
30
|
+
def matches
|
31
|
+
find_all{|e| e.name == "match"}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
class Fluentd
|
2
|
+
class Agent
|
3
|
+
class FluentdGem
|
4
|
+
include Common
|
5
|
+
include LocalCommon
|
6
|
+
|
7
|
+
def self.default_options
|
8
|
+
{
|
9
|
+
:pid_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.pid",
|
10
|
+
:log_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.log",
|
11
|
+
:config_file => "#{ENV["HOME"]}/.fluentd-ui/fluent.conf",
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
# return value is status_after_this_method_called == started
|
16
|
+
def start
|
17
|
+
return true if running?
|
18
|
+
actual_start
|
19
|
+
end
|
20
|
+
|
21
|
+
# return value is status_after_this_method_called == stopped
|
22
|
+
def stop
|
23
|
+
return true unless running?
|
24
|
+
actual_stop
|
25
|
+
end
|
26
|
+
|
27
|
+
# return value is status_after_this_method_called == started
|
28
|
+
def restart
|
29
|
+
if running?
|
30
|
+
validate_fluentd_options && stop && start
|
31
|
+
else
|
32
|
+
# NOTE: no path to here from browser operations for now
|
33
|
+
start
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def reload # NOTE: does not used currently, and td-agent has no reload command
|
38
|
+
return false unless running?
|
39
|
+
actual_reload
|
40
|
+
end
|
41
|
+
|
42
|
+
def version
|
43
|
+
Bundler.with_clean_env do
|
44
|
+
`fluentd --version`.strip
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def options_to_argv
|
51
|
+
argv = ""
|
52
|
+
argv << " --use-v1-config"
|
53
|
+
argv << " -c #{config_file}"
|
54
|
+
argv << " -d #{pid_file}"
|
55
|
+
argv << " -o #{log_file}"
|
56
|
+
argv
|
57
|
+
end
|
58
|
+
|
59
|
+
def validate_fluentd_options
|
60
|
+
Bundler.with_clean_env do
|
61
|
+
system("fluentd --dry-run #{options_to_argv}")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def actual_start
|
66
|
+
return unless validate_fluentd_options
|
67
|
+
Bundler.with_clean_env do
|
68
|
+
spawn("fluentd #{options_to_argv}")
|
69
|
+
end
|
70
|
+
wait_starting
|
71
|
+
end
|
72
|
+
|
73
|
+
def actual_stop
|
74
|
+
if Process.kill(:TERM, pid)
|
75
|
+
File.unlink(pid_file)
|
76
|
+
true
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def actual_reload
|
81
|
+
Process.kill(:HUP, pid)
|
82
|
+
end
|
83
|
+
|
84
|
+
def wait_starting
|
85
|
+
begin
|
86
|
+
timeout(wait_process_starting_seconds) do
|
87
|
+
loop do
|
88
|
+
break if pid && Process.kill(0, pid)
|
89
|
+
sleep 0.01
|
90
|
+
end
|
91
|
+
end
|
92
|
+
true
|
93
|
+
rescue Errno::ESRCH
|
94
|
+
# successful to create pidfile, but process not exists.
|
95
|
+
# any error occured at booting process that after create pidfile. such as readling config, loading plugins, etc
|
96
|
+
# https://github.com/fluent/fluentd/blob/master/lib/fluent/supervisor.rb#L106
|
97
|
+
false
|
98
|
+
rescue TimeoutError
|
99
|
+
false
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|