fluentd-ui 0.4.5 → 1.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd-ui might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.babelrc +18 -0
- data/.editorconfig +11 -0
- data/.gitignore +7 -0
- data/.postcssrc.yml +3 -0
- data/.travis.yml +20 -4
- data/ChangeLog.md +7 -2
- data/Gemfile +8 -6
- data/Gemfile.lock +177 -178
- data/README.md +15 -10
- data/app/assets/stylesheets/application.css +6 -5
- data/app/controllers/concerns/setting_history_concern.rb +1 -1
- data/app/controllers/fluentd/agents_controller.rb +5 -0
- data/app/controllers/misc_controller.rb +2 -2
- data/app/controllers/plugins_controller.rb +4 -4
- data/app/helpers/application_helper.rb +8 -2
- data/app/helpers/settings_helper.rb +2 -2
- data/app/javascript/packs/application.js +31 -0
- data/app/{assets/javascripts/codemirror_fluentd.js → javascript/packs/codemirror.js} +32 -1
- data/app/javascript/packs/fluent_log.js +63 -0
- data/app/javascript/packs/in_tail_format.js +174 -0
- data/app/javascript/packs/nested_settings.js +40 -0
- data/app/javascript/packs/notification.js +60 -0
- data/app/javascript/packs/settings.js +122 -0
- data/app/javascript/packs/treeview.js +99 -0
- data/{vendor/assets/javascripts/.keep → app/javascript/stylesheets/application.scss} +0 -0
- data/app/jobs/all_plugin_check_update_job.rb +10 -0
- data/app/jobs/application_job.rb +2 -0
- data/app/{workers/fluentd_ui_restart.rb → jobs/fluentd_ui_restart_job.rb} +4 -4
- data/app/jobs/fluentd_ui_update_check_job.rb +11 -0
- data/app/{workers/gem_installer.rb → jobs/gem_installer_job.rb} +4 -5
- data/app/jobs/gem_uninstaller_job.rb +14 -0
- data/app/jobs/gem_update_check_job.rb +9 -0
- data/app/models/fluentd/agent.rb +9 -5
- data/app/models/fluentd/agent/common.rb +10 -6
- data/app/models/fluentd/agent/fluentd_gem.rb +2 -3
- data/app/models/fluentd/agent/td_agent/unix.rb +7 -5
- data/app/models/fluentd/setting/in_tail.rb +2 -2
- data/app/views/fluentd/_form.html.haml +1 -1
- data/app/views/fluentd/errors.html.haml +5 -6
- data/app/views/fluentd/log.html.haml +4 -5
- data/app/views/fluentd/settings/edit.html.haml +2 -1
- data/app/views/fluentd/settings/histories/_list.html.haml +1 -1
- data/app/views/fluentd/settings/histories/show.html.haml +6 -6
- data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +4 -3
- data/app/views/fluentd/settings/in_tail/after_format.html.haml +2 -2
- data/app/views/fluentd/settings/in_tail/confirm.html.haml +3 -3
- data/app/views/fluentd/settings/running_backup/show.html.haml +5 -5
- data/app/views/fluentd/settings/show.html.haml +7 -7
- data/app/views/fluentd/settings/source_and_output.html.haml +31 -18
- data/app/views/fluentd/show.html.haml +16 -15
- data/app/views/layouts/application.html.erb +31 -46
- data/app/views/layouts/sign_in.html.erb +9 -16
- data/app/views/misc/information.html.haml +13 -13
- data/app/views/misc/update_fluentd_ui.html.haml +3 -3
- data/app/views/plugins/installed.html.haml +8 -8
- data/app/views/plugins/recommended.html.haml +5 -5
- data/app/views/plugins/updated.html.haml +5 -5
- data/app/views/sessions/new.html.haml +5 -6
- data/app/views/shared/_global_nav.html.erb +9 -9
- data/app/views/shared/_initial_setup.html.haml +3 -3
- data/app/views/shared/_modal.html.erb +1 -1
- data/app/views/shared/settings/_form.html.haml +9 -8
- data/app/views/shared/settings/show.html.haml +4 -2
- data/app/views/shared/vue/_fluent_log.html.erb +6 -6
- data/app/views/shared/vue/_in_tail_format.html.erb +31 -29
- data/app/views/shared/vue/_notification.html.erb +5 -9
- data/app/views/shared/vue/_setting.html.erb +12 -10
- data/app/views/shared/vue/_treeview.html.erb +13 -10
- data/app/views/tutorials/chapter1.html.erb +3 -4
- data/app/views/tutorials/chapter2.html.haml +2 -2
- data/app/views/tutorials/chapter3.html.haml +2 -2
- data/app/views/tutorials/chapter4.html.haml +2 -2
- data/app/views/users/show.html.haml +1 -1
- data/bin/bundle +1 -1
- data/bin/fluentd-ui +1 -0
- data/bin/rails +1 -1
- data/bin/setup +16 -17
- data/bin/update +28 -0
- data/bin/webpack +15 -0
- data/bin/webpack-dev-server +15 -0
- data/bin/yarn +11 -0
- data/config/application.rb +18 -5
- data/config/boot.rb +2 -1
- data/config/environment.rb +1 -1
- data/config/environments/development.rb +27 -5
- data/config/environments/production.rb +34 -23
- data/config/environments/test.rb +7 -3
- data/config/initializers/application_controller_renderer.rb +8 -0
- data/config/initializers/assets.rb +14 -0
- data/config/initializers/content_security_policy.rb +25 -0
- data/config/initializers/cookies_serializer.rb +2 -0
- data/config/initializers/fluentd_ui_update_check.rb +2 -1
- data/config/initializers/new_framework_defaults_5_2.rb +35 -0
- data/config/initializers/prefetch_gem_updates.rb +4 -1
- data/config/initializers/wrap_parameters.rb +1 -6
- data/config/locales/ja.yml +61 -57
- data/config/routes.rb +1 -0
- data/config/spring.rb +6 -0
- data/config/webpack/development.js +5 -0
- data/config/webpack/environment.js +20 -0
- data/config/webpack/loaders/vue.js +13 -0
- data/config/webpack/production.js +5 -0
- data/config/webpack/test.js +5 -0
- data/config/webpacker.yml +69 -0
- data/fluentd-ui.gemspec +16 -6
- data/lib/fluentd-ui/version.rb +1 -1
- data/lib/regexp_preview/single_line.rb +5 -5
- data/package.json +19 -0
- data/spec/controllers/application_controller_spec.rb +2 -6
- data/spec/controllers/fluentd/agents_controller_spec.rb +12 -0
- data/spec/controllers/polling_controller_spec.rb +1 -1
- data/spec/factories/fluentd.rb +1 -1
- data/spec/factories/plugins.rb +2 -2
- data/spec/factories/user.rb +1 -1
- data/spec/features/fluentd/setting/histories_spec.rb +7 -6
- data/spec/features/fluentd/setting/running_backup_spec.rb +4 -3
- data/spec/features/setting_spec.rb +1 -0
- data/spec/features/source_and_output_spec.rb +16 -16
- data/spec/lib/regexp_preview/single_line_spec.rb +1 -1
- data/spec/models/fluentd_spec.rb +4 -4
- data/spec/spec_helper.rb +16 -4
- data/yarn.lock +6225 -0
- metadata +120 -154
- data/.bowerrc +0 -3
- data/app/assets/javascripts/application.js +0 -24
- data/app/assets/javascripts/codemirror.js +0 -29
- data/app/assets/javascripts/enable_bootstrap_tooltip.js +0 -3
- data/app/assets/javascripts/nested_setting.js +0 -41
- data/app/assets/javascripts/vue/fluent_log.js +0 -64
- data/app/assets/javascripts/vue/in_tail_format.js +0 -177
- data/app/assets/javascripts/vue/notification.js +0 -65
- data/app/assets/javascripts/vue/settings.js +0 -121
- data/app/assets/javascripts/vue/treeview.js +0 -97
- data/app/assets/javascripts/vue_common.js +0 -4
- data/app/workers/all_plugin_check_update.rb +0 -14
- data/app/workers/fluentd_ui_update_check.rb +0 -15
- data/app/workers/gem_uninstaller.rb +0 -15
- data/app/workers/gem_update_check.rb +0 -10
- data/bower.json +0 -11
- data/vendor/assets/javascripts/bower/.gitignore +0 -10
- data/vendor/assets/javascripts/bower/codemirror/.bower.json +0 -29
- data/vendor/assets/javascripts/bower/codemirror/bower.json +0 -16
- data/vendor/assets/javascripts/bower/codemirror/lib/codemirror.css +0 -309
- data/vendor/assets/javascripts/bower/codemirror/lib/codemirror.js +0 -8029
- data/vendor/assets/javascripts/bower/codemirror/theme/3024-day.css +0 -38
- data/vendor/assets/javascripts/bower/codemirror/theme/3024-night.css +0 -37
- data/vendor/assets/javascripts/bower/codemirror/theme/ambiance-mobile.css +0 -5
- data/vendor/assets/javascripts/bower/codemirror/theme/ambiance.css +0 -77
- data/vendor/assets/javascripts/bower/codemirror/theme/base16-dark.css +0 -36
- data/vendor/assets/javascripts/bower/codemirror/theme/base16-light.css +0 -36
- data/vendor/assets/javascripts/bower/codemirror/theme/blackboard.css +0 -30
- data/vendor/assets/javascripts/bower/codemirror/theme/cobalt.css +0 -23
- data/vendor/assets/javascripts/bower/codemirror/theme/eclipse.css +0 -23
- data/vendor/assets/javascripts/bower/codemirror/theme/elegant.css +0 -13
- data/vendor/assets/javascripts/bower/codemirror/theme/erlang-dark.css +0 -32
- data/vendor/assets/javascripts/bower/codemirror/theme/lesser-dark.css +0 -45
- data/vendor/assets/javascripts/bower/codemirror/theme/mbo.css +0 -35
- data/vendor/assets/javascripts/bower/codemirror/theme/mdn-like.css +0 -44
- data/vendor/assets/javascripts/bower/codemirror/theme/midnight.css +0 -45
- data/vendor/assets/javascripts/bower/codemirror/theme/monokai.css +0 -31
- data/vendor/assets/javascripts/bower/codemirror/theme/neat.css +0 -12
- data/vendor/assets/javascripts/bower/codemirror/theme/neo.css +0 -43
- data/vendor/assets/javascripts/bower/codemirror/theme/night.css +0 -26
- data/vendor/assets/javascripts/bower/codemirror/theme/paraiso-dark.css +0 -36
- data/vendor/assets/javascripts/bower/codemirror/theme/paraiso-light.css +0 -36
- data/vendor/assets/javascripts/bower/codemirror/theme/pastel-on-dark.css +0 -50
- data/vendor/assets/javascripts/bower/codemirror/theme/rubyblue.css +0 -23
- data/vendor/assets/javascripts/bower/codemirror/theme/solarized.css +0 -165
- data/vendor/assets/javascripts/bower/codemirror/theme/the-matrix.css +0 -28
- data/vendor/assets/javascripts/bower/codemirror/theme/tomorrow-night-bright.css +0 -35
- data/vendor/assets/javascripts/bower/codemirror/theme/tomorrow-night-eighties.css +0 -36
- data/vendor/assets/javascripts/bower/codemirror/theme/twilight.css +0 -30
- data/vendor/assets/javascripts/bower/codemirror/theme/vibrant-ink.css +0 -32
- data/vendor/assets/javascripts/bower/codemirror/theme/xq-dark.css +0 -51
- data/vendor/assets/javascripts/bower/codemirror/theme/xq-light.css +0 -43
- data/vendor/assets/javascripts/bower/codemirror/theme/zenburn.css +0 -37
- data/vendor/assets/javascripts/bower/es6-promise/.bower.json +0 -15
- data/vendor/assets/javascripts/bower/es6-promise/bower.json +0 -5
- data/vendor/assets/javascripts/bower/es6-promise/promise.js +0 -684
- data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +0 -1
- data/vendor/assets/javascripts/bower/lodash/.bower.json +0 -33
- data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +0 -22
- data/vendor/assets/javascripts/bower/lodash/bower.json +0 -23
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +0 -7157
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +0 -61
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +0 -6785
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +0 -56
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +0 -4979
- data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +0 -39
- data/vendor/assets/javascripts/bower/vue/.bower.json +0 -29
- data/vendor/assets/javascripts/bower/vue/bower.json +0 -17
- data/vendor/assets/javascripts/bower/vue/dist/vue.js +0 -7977
- data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +0 -7
- data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +0 -1951
- data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +0 -6
- data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +0 -117
- data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +0 -1242
- data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +0 -155
- data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +0 -6
- data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +0 -245
- data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +0 -14013
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +0 -1
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +0 -2599
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +0 -750
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +0 -60
- data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +0 -12
- data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +0 -45
- data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +0 -1888
- data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +0 -10
- data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +0 -18
- data/vendor/assets/stylesheets/.keep +0 -0
- data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +0 -5830
- data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +0 -7
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +0 -1338
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +0 -4
- 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 +0 -414
- 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 +0 -16
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +0 -12
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +0 -6
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +0 -412
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +0 -13
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +0 -19
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +0 -20
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +0 -14
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +0 -9
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +0 -30
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +0 -20
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +0 -381
- data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +0 -17
- 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 +0 -229
- 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 +0 -233
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +0 -2
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +0 -68
- data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +0 -144
- data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +0 -329
data/README.md
CHANGED
@@ -16,8 +16,8 @@ fluentd-ui is a browser-based [fluentd](http://www.fluentd.org) and [td-agent](h
|
|
16
16
|
|
17
17
|
## Requirements
|
18
18
|
|
19
|
-
- ruby 2.
|
20
|
-
- fluentd
|
19
|
+
- ruby 2.2.2 or later (since v1.0.0)
|
20
|
+
- fluentd v1.0.0 or later
|
21
21
|
|
22
22
|
Currently, fluentd-ui doesn't support fleuntd v1 and td-agent 3.
|
23
23
|
And some additional packages (Debian / Ubuntu)
|
@@ -33,20 +33,25 @@ And some additional packages (Debian / Ubuntu)
|
|
33
33
|
$ git clone https://github.com/fluent/fluentd-ui
|
34
34
|
$ cd fluentd-ui
|
35
35
|
$ bundle install
|
36
|
-
$
|
36
|
+
$ bin/rails s
|
37
37
|
|
38
|
-
Also you need a
|
38
|
+
Also you need a [chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) or chromiumdriver for test.
|
39
39
|
|
40
|
-
$ npm install -g
|
40
|
+
$ npm install -g chromedriver
|
41
41
|
Or,
|
42
|
-
$ brew install
|
42
|
+
$ brew install chromedriver
|
43
|
+
Or,
|
44
|
+
$ sudo apt install chromium-driver
|
43
45
|
|
44
|
-
NOTE: `
|
46
|
+
NOTE: `chromedriver` executable binary should be located under your `$PATH`.
|
45
47
|
|
46
48
|
## Building fluentd-ui.gem
|
47
49
|
|
48
|
-
|
49
|
-
|
50
|
+
# Generate pre-compiled assets
|
51
|
+
$ RAILS_ENV=production bin/rails assets:precompile
|
52
|
+
|
53
|
+
# fluentd-ui X.X.X built to pkg/fluentd-ui-X.X.X.gem.
|
54
|
+
$ RAILS_ENV=production bin/rails build
|
50
55
|
|
51
|
-
$ bundle exec rake release
|
52
56
|
# Push to rubygems.org
|
57
|
+
$ bin/rails release
|
@@ -10,11 +10,12 @@
|
|
10
10
|
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
11
|
* file per style scope.
|
12
12
|
*
|
13
|
-
*= require
|
14
|
-
*= require
|
15
|
-
*= require
|
16
|
-
*= require
|
17
|
-
*= require
|
13
|
+
*= require font-awesome
|
14
|
+
*= require bootstrap/dist/css/bootstrap
|
15
|
+
*= require startbootstrap-sb-admin/css/sb-admin.css
|
16
|
+
*= require datatables.net-bs4/css/dataTables.bootstrap4.css
|
17
|
+
*= require codemirror/lib/codemirror
|
18
|
+
*= require codemirror/theme/neo
|
18
19
|
*= require_tree .
|
19
20
|
*= require_self
|
20
21
|
*/
|
@@ -16,6 +16,11 @@ class Fluentd::AgentsController < ApplicationController
|
|
16
16
|
redirect_to daemon_path(@fluentd), status: 303 # 303 is change HTTP Verb GET
|
17
17
|
end
|
18
18
|
|
19
|
+
def reload
|
20
|
+
run_action(__method__) { @fluentd.agent.log.tail(1).first }
|
21
|
+
redirect_to daemon_path(@fluentd), status: 303 # 303 is change HTTP Verb GET
|
22
|
+
end
|
23
|
+
|
19
24
|
def log_tail
|
20
25
|
@logs = @fluentd.agent.log.tail(params[:limit]).reverse if @fluentd
|
21
26
|
render json: @logs
|
@@ -19,7 +19,7 @@ class MiscController < ApplicationController
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def upgrading_status
|
22
|
-
if
|
22
|
+
if FluentdUiRestartJob::LOCK.present?
|
23
23
|
return render text: "updating"
|
24
24
|
end
|
25
25
|
|
@@ -73,6 +73,6 @@ class MiscController < ApplicationController
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def update!
|
76
|
-
FluentdUiRestart.
|
76
|
+
FluentdUiRestart.perform_later
|
77
77
|
end
|
78
78
|
end
|
@@ -17,27 +17,27 @@ class PluginsController < ApplicationController
|
|
17
17
|
|
18
18
|
def install
|
19
19
|
params[:plugins].each do |gem_name|
|
20
|
-
|
20
|
+
GemInstallerJob.perform_later(gem_name)
|
21
21
|
end
|
22
22
|
redirect_to plugins_path
|
23
23
|
end
|
24
24
|
|
25
25
|
def uninstall
|
26
26
|
params[:plugins].each do |gem_name|
|
27
|
-
|
27
|
+
GemUninstallerJob.perform_later(gem_name)
|
28
28
|
end
|
29
29
|
redirect_to plugins_path
|
30
30
|
end
|
31
31
|
|
32
32
|
def upgrade
|
33
|
-
|
33
|
+
GemInstallerJob.perform_later(params[:plugins][:name], params[:plugins][:version])
|
34
34
|
redirect_to plugins_path
|
35
35
|
end
|
36
36
|
|
37
37
|
def bulk_upgrade
|
38
38
|
params[:plugins].each do |gem_name|
|
39
39
|
pl = Plugin.new(gem_name: gem_name)
|
40
|
-
|
40
|
+
GemInstallerJob.perform_later(gem_name, pl.latest_version)
|
41
41
|
end
|
42
42
|
redirect_to plugins_path
|
43
43
|
end
|
@@ -37,12 +37,12 @@ module ApplicationHelper
|
|
37
37
|
raw html
|
38
38
|
end
|
39
39
|
|
40
|
-
def link_to_other(text, path)
|
40
|
+
def link_to_other(text, path, **options)
|
41
41
|
if current_page?(path)
|
42
42
|
# 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.
|
43
43
|
content_tag(:a, text, class: "current")
|
44
44
|
else
|
45
|
-
link_to text, path
|
45
|
+
link_to text, path, class: "nav-link"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -62,4 +62,10 @@ module ApplicationHelper
|
|
62
62
|
head.html_safe + block.try(:call).to_s
|
63
63
|
end
|
64
64
|
end
|
65
|
+
|
66
|
+
def add_javascript_pack_tag(name, **options)
|
67
|
+
content_for(:additional_javascript_pack_tag) do
|
68
|
+
javascript_pack_tag(name, **options)
|
69
|
+
end
|
70
|
+
end
|
65
71
|
end
|
@@ -54,8 +54,8 @@ module SettingsHelper
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def append_and_remove_links
|
57
|
-
%Q!<a class="btn btn-
|
58
|
-
%Q!<a class="btn btn-
|
57
|
+
%Q!<a class="btn btn-sm btn-outline-secondary js-append">#{icon('fa-plus')}</a> ! +
|
58
|
+
%Q!<a class="btn btn-sm btn-outline-secondary js-remove" style="display:none">#{icon('fa-minus')}</a> !
|
59
59
|
end
|
60
60
|
|
61
61
|
def child_data(form, key)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/* eslint no-console:0 */
|
2
|
+
// This file is automatically compiled by Webpack, along with any other files
|
3
|
+
// present in this directory. You're encouraged to place your actual application logic in
|
4
|
+
// a relevant structure within app/javascript and only use these pack files to reference
|
5
|
+
// that code so it'll be compiled.
|
6
|
+
//
|
7
|
+
// To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
|
8
|
+
// layout file, like app/views/layouts/application.html.erb
|
9
|
+
|
10
|
+
console.log('Hello World from Webpacker')
|
11
|
+
|
12
|
+
import jQuery from 'jquery/dist/jquery'
|
13
|
+
|
14
|
+
window.$ = jQuery
|
15
|
+
window.jQuery = jQuery
|
16
|
+
|
17
|
+
import 'popper.js/dist/popper'
|
18
|
+
import 'bootstrap/dist/js/bootstrap'
|
19
|
+
import 'datatables.net/js/jquery.dataTables'
|
20
|
+
import 'startbootstrap-sb-admin/js/sb-admin'
|
21
|
+
import 'startbootstrap-sb-admin/js/sb-admin-datatables'
|
22
|
+
|
23
|
+
import Vue from 'vue/dist/vue.esm'
|
24
|
+
|
25
|
+
Vue.filter('to_json', function (value) {
|
26
|
+
return JSON.stringify(value);
|
27
|
+
})
|
28
|
+
|
29
|
+
window.Vue = Vue
|
30
|
+
|
31
|
+
import '../stylesheets/application.scss'
|
@@ -1,7 +1,9 @@
|
|
1
|
+
import CodeMirror from 'codemirror/lib/codemirror'
|
2
|
+
import 'lodash/lodash'
|
3
|
+
|
1
4
|
// See: http://codemirror.net/doc/manual.html#modeapi
|
2
5
|
// and sample mode files: https://github.com/codemirror/CodeMirror/tree/master/mode
|
3
6
|
|
4
|
-
|
5
7
|
CodeMirror.defineMode('fluentd', function(){
|
6
8
|
return {
|
7
9
|
startState: function(aa){
|
@@ -57,3 +59,32 @@ CodeMirror.defineMode('fluentd', function(){
|
|
57
59
|
}
|
58
60
|
};
|
59
61
|
});
|
62
|
+
|
63
|
+
function codemirrorify(el) {
|
64
|
+
return CodeMirror.fromTextArea(el, {
|
65
|
+
theme: "neo",
|
66
|
+
lineNumbers: true,
|
67
|
+
viewportMargin: Infinity,
|
68
|
+
mode: "fluentd"
|
69
|
+
});
|
70
|
+
}
|
71
|
+
|
72
|
+
$(function(){
|
73
|
+
$('.js-fluentd-config-editor').each(function(_, el){
|
74
|
+
codemirrorify(el);
|
75
|
+
});
|
76
|
+
});
|
77
|
+
|
78
|
+
Vue.directive('config-editor', {
|
79
|
+
bind: function(el, binding, vnode, oldVnode){
|
80
|
+
// NOTE: needed delay for waiting CodeMirror setup
|
81
|
+
_.delay(function(textarea){
|
82
|
+
let cm = codemirrorify(textarea);
|
83
|
+
// textarea.codemirror = cm; // for test, but doesn't work for now (working on Chrome, but Poltergeist not)
|
84
|
+
cm.on('change', function(code_mirror){
|
85
|
+
// bridge Vue - CodeMirror world
|
86
|
+
el.dataset.content = code_mirror.getValue();
|
87
|
+
});
|
88
|
+
}, 0, el);
|
89
|
+
}
|
90
|
+
});
|
@@ -0,0 +1,63 @@
|
|
1
|
+
'use strict';
|
2
|
+
$(document).ready(()=> {
|
3
|
+
new Vue({
|
4
|
+
el: "#fluent-log",
|
5
|
+
props: ["logUrl", "initialAutoReload"],
|
6
|
+
data: {
|
7
|
+
"autoFetch": false,
|
8
|
+
"logs": [],
|
9
|
+
"limit": 30,
|
10
|
+
"processing": false
|
11
|
+
},
|
12
|
+
|
13
|
+
beforeMount: function() {
|
14
|
+
this.logUrl = this.$el.attributes.logUrl.nodeValue;
|
15
|
+
this.initialAutoReload = this.$el.attributes.initialAutoReload.nodeValue;
|
16
|
+
},
|
17
|
+
|
18
|
+
mounted: function(){
|
19
|
+
this.fetchLogs();
|
20
|
+
|
21
|
+
var self = this;
|
22
|
+
var timer;
|
23
|
+
this.$watch("autoFetch", function(newValue){
|
24
|
+
if(newValue === true) {
|
25
|
+
timer = setInterval(function(){
|
26
|
+
self.fetchLogs();
|
27
|
+
var $log = $(".log", self.$el);
|
28
|
+
$log.scrollTop($log.innerHeight());
|
29
|
+
}, 1000);
|
30
|
+
} else {
|
31
|
+
clearInterval(timer);
|
32
|
+
}
|
33
|
+
});
|
34
|
+
if(this.initialAutoReload) {
|
35
|
+
this.autoFetch = true;
|
36
|
+
}
|
37
|
+
},
|
38
|
+
|
39
|
+
computed: {
|
40
|
+
isPresentedLogs: function(){
|
41
|
+
return this.logs.length > 0;
|
42
|
+
}
|
43
|
+
},
|
44
|
+
|
45
|
+
methods: {
|
46
|
+
fetchLogs: function() {
|
47
|
+
if(this.processing) return;
|
48
|
+
this.processing = true;
|
49
|
+
var self = this;
|
50
|
+
new Promise(function(resolve, reject) {
|
51
|
+
$.getJSON(self.logUrl + "?limit=" + self.limit, resolve).fail(reject);
|
52
|
+
}).then(function(logs){
|
53
|
+
self.logs = logs;
|
54
|
+
setTimeout(function(){
|
55
|
+
self.processing = false;
|
56
|
+
}, 256); // delay to reduce flicking loading icon
|
57
|
+
})["catch"](function(error){
|
58
|
+
self.processing = false;
|
59
|
+
});
|
60
|
+
}
|
61
|
+
}
|
62
|
+
});
|
63
|
+
});
|
@@ -0,0 +1,174 @@
|
|
1
|
+
'use strict'
|
2
|
+
import 'lodash/lodash'
|
3
|
+
|
4
|
+
window.addEventListener('load', () => {
|
5
|
+
const maxFormatCount = 20;
|
6
|
+
|
7
|
+
new Vue({
|
8
|
+
el: "#in_tail_format",
|
9
|
+
props: ["formatOptionsJson", "initialSelected", "targetFile", "paramsJson"],
|
10
|
+
data: {
|
11
|
+
previewProcessing: false,
|
12
|
+
format: "",
|
13
|
+
highlightedLines: null,
|
14
|
+
},
|
15
|
+
|
16
|
+
computed: {
|
17
|
+
options: {
|
18
|
+
get: function(){
|
19
|
+
return this.formatOptions[this.format];
|
20
|
+
},
|
21
|
+
},
|
22
|
+
selectableFormats: {
|
23
|
+
get: function() {
|
24
|
+
return Object.keys(this.formatOptions);
|
25
|
+
}
|
26
|
+
},
|
27
|
+
useTextArea: function() {
|
28
|
+
return this.format === "multiline";
|
29
|
+
}
|
30
|
+
},
|
31
|
+
|
32
|
+
beforeMount: function() {
|
33
|
+
this.formatOptions = JSON.parse(this.$el.attributes.formatOptionsJson.nodeValue);
|
34
|
+
this.format = this.$el.attributes.initialSelected.nodeValue;
|
35
|
+
|
36
|
+
// initialize params
|
37
|
+
// NOTE: if `params.setting.foo` is undefined, Vue can't binding with v-model="params.setting.foo"
|
38
|
+
var params = JSON.parse(this.$el.attributes.paramsJson.nodeValue);
|
39
|
+
if(!params.setting) {
|
40
|
+
params.setting = {};
|
41
|
+
}
|
42
|
+
|
43
|
+
var formats = _.chain(_.range(1, maxFormatCount + 1)).map(function(i) {return params.setting["format" + String(i)];}).compact().value();
|
44
|
+
params.setting.formats = formats.join("\n");
|
45
|
+
|
46
|
+
_.each(this.formatOptions, function(options){
|
47
|
+
_.each(options, function(key){
|
48
|
+
if(!params.setting.hasOwnProperty(key)){
|
49
|
+
params.setting[key] = "";
|
50
|
+
}
|
51
|
+
});
|
52
|
+
});
|
53
|
+
this.params = params;
|
54
|
+
|
55
|
+
this.targetFile = this.$el.attributes.targetFile.nodeValue;
|
56
|
+
},
|
57
|
+
mounted: function(){
|
58
|
+
this.$emit("data-loaded");
|
59
|
+
},
|
60
|
+
|
61
|
+
watch: {
|
62
|
+
'params.setting.formats': function(formats) {
|
63
|
+
_.range(1, maxFormatCount + 1).forEach(()=> {params.setting["format" + String(i)] = "";});
|
64
|
+
|
65
|
+
_.compact(formats.split("\n")).forEach((formatLine, index)=> {
|
66
|
+
params.setting["format" + String(index + 1)] = formatLine;
|
67
|
+
})
|
68
|
+
},
|
69
|
+
'params.setting.regexp': function() {
|
70
|
+
this.preview();
|
71
|
+
},
|
72
|
+
'format': function() {
|
73
|
+
this.preview();
|
74
|
+
},
|
75
|
+
},
|
76
|
+
|
77
|
+
methods: {
|
78
|
+
onKeyup: function(ev){
|
79
|
+
var el = ev.target;
|
80
|
+
if(el.name.match(/\[format/)){
|
81
|
+
this.preview();
|
82
|
+
}
|
83
|
+
},
|
84
|
+
updateHighlightedLines: function() {
|
85
|
+
if(!this.regexpMatches) {
|
86
|
+
this.highlightedLines = null;
|
87
|
+
return;
|
88
|
+
}
|
89
|
+
|
90
|
+
var $container = jQuery('<div>');
|
91
|
+
_.each(this.regexpMatches, function(match){
|
92
|
+
var colors = [
|
93
|
+
"#ff9", "#cff", "#fcf", "#dfd"
|
94
|
+
];
|
95
|
+
var whole = match.whole;
|
96
|
+
var html = "";
|
97
|
+
var matches = [];
|
98
|
+
|
99
|
+
var lastPos = 0;
|
100
|
+
_.each(match.matches, function(match) {
|
101
|
+
var matched = match.matched;
|
102
|
+
if(!matched) return;
|
103
|
+
if(matched.length === 0) return; // Ignore empty matched with "foobar".match(/foo(.*?)bar/)[1] #=> ""
|
104
|
+
|
105
|
+
// rotated highlight color
|
106
|
+
var currentColor = colors.shift();
|
107
|
+
colors.push(currentColor);
|
108
|
+
|
109
|
+
// create highlighted range HTML
|
110
|
+
var $highlighted = jQuery('<span>').text(matched);
|
111
|
+
$highlighted.attr({
|
112
|
+
"class": "regexp-preview",
|
113
|
+
"data-toggle": "tooltip",
|
114
|
+
"data-placement": "top",
|
115
|
+
"title": match.key,
|
116
|
+
'style': 'background-color:' + currentColor
|
117
|
+
});
|
118
|
+
var highlightedHtml = $highlighted.wrap('<div>').parent().html();
|
119
|
+
|
120
|
+
var pos = {
|
121
|
+
"start": match.pos[0],
|
122
|
+
"end": match.pos[1]
|
123
|
+
};
|
124
|
+
if(pos.start > 0) {
|
125
|
+
html += _.escape(whole.substring(lastPos, pos.start));
|
126
|
+
}
|
127
|
+
html += highlightedHtml;
|
128
|
+
lastPos = pos.end;
|
129
|
+
});
|
130
|
+
html += whole.substring(lastPos);
|
131
|
+
|
132
|
+
$container.append(html);
|
133
|
+
$container.append("<br />");
|
134
|
+
});
|
135
|
+
|
136
|
+
this.highlightedLines = $container.html();
|
137
|
+
},
|
138
|
+
|
139
|
+
preview: function(){
|
140
|
+
if(this.previewAjax) {
|
141
|
+
this.previewAjax.abort();
|
142
|
+
}
|
143
|
+
|
144
|
+
const token = document.getElementsByName("csrf-token")[0].getAttribute('content')
|
145
|
+
|
146
|
+
var self = this;
|
147
|
+
new Promise(function(resolve, reject) {
|
148
|
+
self.previewAjax = $.ajax({
|
149
|
+
method: "POST",
|
150
|
+
url: "/api/regexp_preview",
|
151
|
+
headers: {
|
152
|
+
'X-CSRF-Token': token
|
153
|
+
},
|
154
|
+
data: {
|
155
|
+
regexp: self.params.setting.regexp,
|
156
|
+
time_format: self.params.setting.time_format,
|
157
|
+
format: _.isEmpty(self.format) ? "regexp" : self.format,
|
158
|
+
params: self.params.setting,
|
159
|
+
file: self.targetFile
|
160
|
+
}
|
161
|
+
}).done(resolve).fail(reject);
|
162
|
+
}).then(function(result){
|
163
|
+
self.params = _.merge(self.params, result.params);
|
164
|
+
self.regexpMatches = result.matches;
|
165
|
+
self.updateHighlightedLines();
|
166
|
+
})["catch"](function(error){
|
167
|
+
if(error.stack) {
|
168
|
+
console.error(error.stack);
|
169
|
+
}
|
170
|
+
});
|
171
|
+
},
|
172
|
+
}
|
173
|
+
});
|
174
|
+
});
|