fluentd-ui 0.3.8 → 0.3.9
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 +4 -4
- data/ChangeLog +9 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +4 -1
- data/app/assets/javascripts/vue/fluent_log.js +4 -4
- data/app/assets/javascripts/vue/in_tail_format.js +43 -49
- data/app/assets/javascripts/{alert.js → vue/notification.js} +21 -7
- data/app/assets/javascripts/vue/settings.js +121 -0
- data/app/assets/javascripts/vue/treeview.js +3 -3
- data/app/assets/stylesheets/common.css.scss +7 -1
- data/app/controllers/api/settings_controller.rb +55 -0
- data/app/controllers/api_controller.rb +6 -2
- data/app/controllers/concerns/setting_concern.rb +2 -2
- data/app/controllers/fluentd/settings_controller.rb +17 -2
- data/app/models/fluentd/setting/config.rb +39 -0
- data/app/views/api/settings/_element.json.jbuilder +6 -0
- data/app/views/api/settings/index.json.jbuilder +3 -0
- data/app/views/api/settings/show.json.jbuilder +1 -0
- data/app/views/fluentd/settings/edit.html.haml +3 -0
- data/app/views/fluentd/settings/source_and_output.html.haml +19 -2
- data/app/views/layouts/application.html.erb +1 -30
- data/app/views/shared/vue/_in_tail_format.html.erb +11 -36
- data/app/views/shared/vue/_notification.html.erb +31 -0
- data/app/views/shared/vue/_setting.html.erb +23 -0
- data/app/views/shared/vue/_treeview.html.erb +2 -2
- data/bower.json +1 -1
- data/config/application.rb +1 -0
- data/config/locales/translation_en.yml +11 -7
- data/config/locales/translation_ja.yml +4 -0
- data/config/routes.rb +2 -0
- data/lib/fluentd-ui/version.rb +1 -1
- data/spec/features/fluentd/setting/source_and_output_spec.rb +157 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/javascript_macro.rb +21 -0
- data/vendor/assets/javascripts/bower/vue/.bower.json +7 -7
- data/vendor/assets/javascripts/bower/vue/LICENSE +1 -1
- data/vendor/assets/javascripts/bower/vue/dist/vue.js +7822 -4768
- data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -7
- data/vendor/assets/javascripts/bower/vue/src/api/child.js +53 -0
- data/vendor/assets/javascripts/bower/vue/src/api/data.js +161 -0
- data/vendor/assets/javascripts/bower/vue/src/api/dom.js +211 -0
- data/vendor/assets/javascripts/bower/vue/src/api/events.js +176 -0
- data/vendor/assets/javascripts/bower/vue/src/api/global.js +146 -0
- data/vendor/assets/javascripts/bower/vue/src/api/lifecycle.js +144 -0
- data/vendor/assets/javascripts/bower/vue/src/batcher.js +52 -32
- data/vendor/assets/javascripts/bower/vue/src/cache.js +112 -0
- data/vendor/assets/javascripts/bower/vue/src/compiler/compile.js +549 -0
- data/vendor/assets/javascripts/bower/vue/src/compiler/transclude.js +163 -0
- data/vendor/assets/javascripts/bower/vue/src/config.js +74 -14
- data/vendor/assets/javascripts/bower/vue/src/directive.js +179 -219
- data/vendor/assets/javascripts/bower/vue/src/directives/attr.js +32 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/class.js +18 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/cloak.js +12 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/component.js +214 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/el.js +13 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/html.js +30 -34
- data/vendor/assets/javascripts/bower/vue/src/directives/if.js +77 -46
- data/vendor/assets/javascripts/bower/vue/src/directives/index.js +22 -129
- data/vendor/assets/javascripts/bower/vue/src/directives/model/checkbox.js +25 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/default.js +123 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/index.js +56 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/radio.js +26 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/model/select.js +166 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/on.js +51 -50
- data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +36 -42
- data/vendor/assets/javascripts/bower/vue/src/directives/ref.js +24 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +477 -226
- data/vendor/assets/javascripts/bower/vue/src/directives/show.js +8 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/style.js +49 -37
- data/vendor/assets/javascripts/bower/vue/src/directives/text.js +15 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/transition.js +12 -0
- data/vendor/assets/javascripts/bower/vue/src/directives/with.js +38 -41
- data/vendor/assets/javascripts/bower/vue/src/filters/array-filters.js +87 -0
- data/vendor/assets/javascripts/bower/vue/src/filters/index.js +135 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/compile.js +71 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/events.js +122 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/init.js +76 -0
- data/vendor/assets/javascripts/bower/vue/src/instance/scope.js +217 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/array.js +90 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/dep.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/index.js +235 -0
- data/vendor/assets/javascripts/bower/vue/src/observer/object.js +75 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/directive.js +159 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/expression.js +226 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/path.js +300 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/template.js +246 -0
- data/vendor/assets/javascripts/bower/vue/src/parsers/text.js +178 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/css.js +189 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/index.js +151 -0
- data/vendor/assets/javascripts/bower/vue/src/transition/js.js +43 -0
- data/vendor/assets/javascripts/bower/vue/src/util/debug.js +50 -0
- data/vendor/assets/javascripts/bower/vue/src/util/dom.js +176 -0
- data/vendor/assets/javascripts/bower/vue/src/util/env.js +74 -0
- data/vendor/assets/javascripts/bower/vue/src/util/filter.js +72 -0
- data/vendor/assets/javascripts/bower/vue/src/util/index.js +8 -0
- data/vendor/assets/javascripts/bower/vue/src/util/lang.js +175 -0
- data/vendor/assets/javascripts/bower/vue/src/util/merge-option.js +258 -0
- data/vendor/assets/javascripts/bower/vue/src/vue.js +84 -0
- data/vendor/assets/javascripts/bower/vue/src/watcher.js +240 -0
- metadata +65 -20
- data/app/assets/javascripts/setting_format.js +0 -15
- data/vendor/assets/javascripts/bower/vue/src/binding.js +0 -103
- data/vendor/assets/javascripts/bower/vue/src/compiler.js +0 -1037
- data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +0 -65
- data/vendor/assets/javascripts/bower/vue/src/directives/model.js +0 -174
- data/vendor/assets/javascripts/bower/vue/src/directives/view.js +0 -56
- data/vendor/assets/javascripts/bower/vue/src/emitter.js +0 -97
- data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +0 -190
- data/vendor/assets/javascripts/bower/vue/src/filters.js +0 -191
- data/vendor/assets/javascripts/bower/vue/src/fragment.js +0 -67
- data/vendor/assets/javascripts/bower/vue/src/main.js +0 -188
- data/vendor/assets/javascripts/bower/vue/src/observer.js +0 -446
- data/vendor/assets/javascripts/bower/vue/src/template-parser.js +0 -46
- data/vendor/assets/javascripts/bower/vue/src/text-parser.js +0 -96
- data/vendor/assets/javascripts/bower/vue/src/transition.js +0 -228
- data/vendor/assets/javascripts/bower/vue/src/utils.js +0 -326
- data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +0 -190
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19e7e14601e3423f3f3fd3cf77d39ffa135fd2be
|
4
|
+
data.tar.gz: 2dd240927a8bb79dd6bd2382d081c323a9a15833
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d42635a64bb104a7dd728feabd2c831b37082278a11b55e7b30ec0cbef633f7a12a73b9d25b89ee220cad51e5708cbe5240b300063ef7b68ff9b5f53114262c
|
7
|
+
data.tar.gz: 7bb20b2a62e0cd1fdcc75bc8d8da6309038e4e2c0f62bd1a2bec5996ca29d453e1ea3ae57a855b898c0c8733e0ef63d0f84e546608c9899a91cd9888503cd6a1
|
data/ChangeLog
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Release 0.3.9 - 2014/12/01
|
2
|
+
|
3
|
+
* [improve] Display current setting for each section.
|
4
|
+
https://github.com/fluent/fluentd-ui/pull/103
|
5
|
+
* [improve] Instantly current setting changing.
|
6
|
+
https://github.com/fluent/fluentd-ui/pull/105
|
7
|
+
* [improve] Reduce polling access for notification fetching.
|
8
|
+
|
9
|
+
|
1
10
|
Release 0.3.8 - 2014/11/19
|
2
11
|
|
3
12
|
* [improve] Recommended plugins are updated.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluentd-ui (0.3.
|
4
|
+
fluentd-ui (0.3.9)
|
5
5
|
addressable
|
6
6
|
bundler
|
7
7
|
draper (~> 1.3)
|
@@ -149,6 +149,8 @@ GEM
|
|
149
149
|
coderay (~> 1.1.0)
|
150
150
|
method_source (~> 0.8.1)
|
151
151
|
slop (~> 3.4)
|
152
|
+
pry-rails (0.3.2)
|
153
|
+
pry (>= 0.9.10)
|
152
154
|
puma (2.9.2)
|
153
155
|
rack (>= 1.1, < 2.0)
|
154
156
|
rack (1.5.2)
|
@@ -244,6 +246,7 @@ DEPENDENCIES
|
|
244
246
|
i18n_generators (= 1.2.1)
|
245
247
|
poltergeist
|
246
248
|
pry
|
249
|
+
pry-rails
|
247
250
|
rake
|
248
251
|
rspec-rails (~> 2.99)
|
249
252
|
simplecov (~> 0.7.1)
|
@@ -14,10 +14,7 @@
|
|
14
14
|
"processing": false
|
15
15
|
},
|
16
16
|
|
17
|
-
|
18
|
-
if(this.initialAutoReload) {
|
19
|
-
this.autoFetch = true;
|
20
|
-
}
|
17
|
+
compiled: function(){
|
21
18
|
this.fetchLogs();
|
22
19
|
|
23
20
|
var self = this;
|
@@ -33,6 +30,9 @@
|
|
33
30
|
clearInterval(timer);
|
34
31
|
}
|
35
32
|
});
|
33
|
+
if(this.initialAutoReload) {
|
34
|
+
this.autoFetch = true;
|
35
|
+
}
|
36
36
|
},
|
37
37
|
|
38
38
|
computed: {
|
@@ -4,45 +4,57 @@
|
|
4
4
|
$(function(){
|
5
5
|
if($('#in_tail_format').length === 0) return;
|
6
6
|
|
7
|
+
var FormatBundle = Vue.component('format-bundle', {
|
8
|
+
inherit: true,
|
9
|
+
template: "#format-bundle",
|
10
|
+
computed: {
|
11
|
+
options: {
|
12
|
+
get: function(){
|
13
|
+
return this.formatOptions[this.format];
|
14
|
+
},
|
15
|
+
},
|
16
|
+
selectableFormats: {
|
17
|
+
get: function() {
|
18
|
+
return Object.keys(this.formatOptions);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
});
|
23
|
+
|
7
24
|
new Vue({
|
8
25
|
el: "#in_tail_format",
|
9
|
-
paramAttributes: ["
|
26
|
+
paramAttributes: ["formatOptionsJson", "initialSelected", "targetFile", "paramsJson"],
|
10
27
|
data: {
|
11
|
-
regexp: "",
|
12
|
-
grok_str: "",
|
13
|
-
time_format: "",
|
14
28
|
previewProcessing: false,
|
15
|
-
|
29
|
+
format: "",
|
30
|
+
highlightedLines: null,
|
16
31
|
},
|
17
32
|
|
18
|
-
|
19
|
-
this.
|
20
|
-
this.formats = Object.keys(this.formatOptions);
|
21
|
-
this.format = this.initialSelected;
|
22
|
-
this.params = JSON.parse(this.paramsJson);
|
23
|
-
if(this.params && this.params.setting) {
|
24
|
-
this.grok_str = this.params.setting.grok_str;
|
25
|
-
this.regexp = this.params.setting.regexp;
|
26
|
-
}
|
27
|
-
this.$watch('regexp', function(ev){
|
33
|
+
compiled: function(){
|
34
|
+
this.$watch('params.setting.regexp', function(){
|
28
35
|
this.preview();
|
29
36
|
});
|
30
|
-
this.$watch('format', function(
|
37
|
+
this.$watch('format', function(){
|
31
38
|
this.preview();
|
32
39
|
});
|
40
|
+
this.$set("formatOptions", JSON.parse(this.formatOptionsJson));
|
41
|
+
this.format = this.initialSelected;
|
33
42
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
options: function(){
|
40
|
-
return this.formatOptions[this.format];
|
41
|
-
},
|
42
|
-
|
43
|
-
selectableFormats: function() {
|
44
|
-
return _.filter(this.formats, function(format){ return format !== "regexp"; });
|
43
|
+
// initialize params
|
44
|
+
// NOTE: if `params.setting.foo` is undefined, Vue can't binding with v-model="params.setting.foo"
|
45
|
+
var params = JSON.parse(this.paramsJson);
|
46
|
+
if(!params.setting) {
|
47
|
+
params.setting = {};
|
45
48
|
}
|
49
|
+
_.each(this.formatOptions, function(options){
|
50
|
+
_.each(options, function(key){
|
51
|
+
if(!params.setting.hasOwnProperty(key)){
|
52
|
+
params.setting[key] = "";
|
53
|
+
}
|
54
|
+
});
|
55
|
+
});
|
56
|
+
this.$set('params', params);
|
57
|
+
this.$emit("data-loaded");
|
46
58
|
},
|
47
59
|
|
48
60
|
methods: {
|
@@ -114,38 +126,20 @@
|
|
114
126
|
method: "POST",
|
115
127
|
url: "/api/regexp_preview",
|
116
128
|
data: {
|
117
|
-
regexp: self.regexp,
|
118
|
-
|
119
|
-
|
129
|
+
regexp: self.params.setting.regexp,
|
130
|
+
time_format: self.params.setting.time_format,
|
131
|
+
format: _.isEmpty(self.format) ? "regexp" : self.format,
|
120
132
|
file: self.targetFile
|
121
133
|
}
|
122
134
|
}).done(resolve).fail(reject);
|
123
135
|
}).then(function(result){
|
124
|
-
self.
|
136
|
+
self.params = _.merge(self.params, result.params);
|
125
137
|
self.regexpMatches = result.matches;
|
126
138
|
self.updateHighlightedLines();
|
127
139
|
})["catch"](function(error){
|
128
140
|
console.error(error.stack);
|
129
141
|
});
|
130
142
|
},
|
131
|
-
|
132
|
-
generateRegexp: function() {
|
133
|
-
// for grok
|
134
|
-
var self = this;
|
135
|
-
new Promise(function(resolve, reject) {
|
136
|
-
$.ajax({
|
137
|
-
method: "POST",
|
138
|
-
url: "/api/grok_to_regexp",
|
139
|
-
data: {
|
140
|
-
grok_str: self.grok_str
|
141
|
-
}
|
142
|
-
}).done(resolve).fail(reject);
|
143
|
-
}).then(function(regexp){
|
144
|
-
self.regexp = regexp;
|
145
|
-
}).catch(function(e){
|
146
|
-
console.error(e);
|
147
|
-
});
|
148
|
-
},
|
149
143
|
}
|
150
144
|
});
|
151
145
|
});
|
@@ -4,38 +4,52 @@
|
|
4
4
|
var POLLING_URL = "/polling/alerts";
|
5
5
|
|
6
6
|
$(function(){
|
7
|
-
if($('#
|
7
|
+
if($('#vue-notification').length === 0) return;
|
8
8
|
|
9
9
|
var alert = new Vue({
|
10
|
-
el: "#
|
10
|
+
el: "#vue-notification",
|
11
11
|
data: {
|
12
12
|
"alerts": []
|
13
13
|
},
|
14
14
|
|
15
15
|
created: function(){
|
16
|
+
var timer;
|
16
17
|
var self = this;
|
18
|
+
var currentInterval = POLLING_INTERVAL;
|
17
19
|
var fetch = function(){
|
18
20
|
self.fetchAlertsData().then(function(alerts){
|
21
|
+
if(self.alerts.toString() == alerts.toString()) {
|
22
|
+
currentInterval *= 1.1;
|
23
|
+
} else {
|
24
|
+
currentInterval = POLLING_INTERVAL;
|
25
|
+
}
|
19
26
|
self.alerts = alerts;
|
27
|
+
timer = setTimeout(fetch, currentInterval);
|
20
28
|
})["catch"](function(xhr){
|
21
29
|
if(xhr.status === 401) {
|
22
|
-
|
30
|
+
// signed out
|
23
31
|
}
|
24
32
|
if(xhr.status === 0) {
|
25
|
-
|
33
|
+
// server unreachable (maybe down)
|
26
34
|
}
|
27
35
|
});
|
28
36
|
};
|
37
|
+
window.addEventListener('focus', function(ev){
|
38
|
+
currentInterval = POLLING_INTERVAL;
|
39
|
+
timer = setTimeout(fetch, currentInterval);
|
40
|
+
}, false);
|
41
|
+
window.addEventListener('blur', function(ev){
|
42
|
+
clearTimeout(timer);
|
43
|
+
}, false);
|
29
44
|
fetch();
|
30
|
-
var timer = setInterval(fetch, POLLING_INTERVAL);
|
31
45
|
},
|
32
46
|
|
33
47
|
computed: {
|
34
48
|
alertsCount: {
|
35
|
-
|
49
|
+
get: function(){ return this.alerts.length; }
|
36
50
|
},
|
37
51
|
hasAlerts: {
|
38
|
-
|
52
|
+
get: function(){ return this.alertsCount > 0; }
|
39
53
|
}
|
40
54
|
},
|
41
55
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
;(function(){
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
$(function(){
|
5
|
+
var el = document.querySelector("#vue-setting");
|
6
|
+
if(!el) return;
|
7
|
+
|
8
|
+
new Vue({
|
9
|
+
el: el,
|
10
|
+
data: function(){
|
11
|
+
return {
|
12
|
+
loaded: false,
|
13
|
+
loading: false,
|
14
|
+
sections: {
|
15
|
+
sources: [],
|
16
|
+
matches: []
|
17
|
+
}
|
18
|
+
};
|
19
|
+
},
|
20
|
+
ready: function() {
|
21
|
+
this.update();
|
22
|
+
},
|
23
|
+
components: {
|
24
|
+
section: {
|
25
|
+
inherit: true,
|
26
|
+
template: "#vue-setting-section",
|
27
|
+
data: function(){
|
28
|
+
return {
|
29
|
+
mode: "default",
|
30
|
+
processing: false,
|
31
|
+
editContent: null
|
32
|
+
};
|
33
|
+
},
|
34
|
+
created: function(){
|
35
|
+
this.initialState();
|
36
|
+
},
|
37
|
+
computed: {
|
38
|
+
endpoint: function(){
|
39
|
+
return "/api/settings/" + this.id;
|
40
|
+
}
|
41
|
+
},
|
42
|
+
methods: {
|
43
|
+
onCancel: function(ev) {
|
44
|
+
this.initialState();
|
45
|
+
},
|
46
|
+
onEdit: function(ev) {
|
47
|
+
this.mode = "edit";
|
48
|
+
},
|
49
|
+
onDelete: function(ev) {
|
50
|
+
if(!confirm("really?")) return;
|
51
|
+
this.destroy();
|
52
|
+
},
|
53
|
+
onSubmit: function(ev) {
|
54
|
+
this.processing = true;
|
55
|
+
var self = this;
|
56
|
+
$.ajax({
|
57
|
+
url: this.endpoint,
|
58
|
+
method: "POST",
|
59
|
+
data: {
|
60
|
+
_method: "PATCH",
|
61
|
+
id: this.id,
|
62
|
+
content: this.editContent
|
63
|
+
}
|
64
|
+
}).then(function(data){
|
65
|
+
// NOTE: self.$data = data doesn't work as well, so using _.each
|
66
|
+
// whole $data swapping breaks mode switching..
|
67
|
+
_.each(data, function(v,k){
|
68
|
+
self[k] = v;
|
69
|
+
});
|
70
|
+
self.initialState();
|
71
|
+
}).always(function(){
|
72
|
+
self.processing = false;
|
73
|
+
});
|
74
|
+
},
|
75
|
+
initialState: function(){
|
76
|
+
this.$set('processing', false);
|
77
|
+
this.$set('mode', 'default');
|
78
|
+
this.$set('editContent', this.content);
|
79
|
+
},
|
80
|
+
destroy: function(){
|
81
|
+
var self = this;
|
82
|
+
$.ajax({
|
83
|
+
url: this.endpoint,
|
84
|
+
method: "POST",
|
85
|
+
data: {
|
86
|
+
_method: "DELETE",
|
87
|
+
id: this.id
|
88
|
+
}
|
89
|
+
}).then(function(){
|
90
|
+
self.$parent.update();
|
91
|
+
});
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
},
|
96
|
+
methods: {
|
97
|
+
update: function() {
|
98
|
+
this.loading = true;
|
99
|
+
var self = this;
|
100
|
+
$.getJSON("/api/settings", function(data){
|
101
|
+
var sources = [];
|
102
|
+
var matches = [];
|
103
|
+
data.forEach(function(v){
|
104
|
+
if(v.name === "source"){
|
105
|
+
sources.push(v);
|
106
|
+
}else{
|
107
|
+
matches.push(v);
|
108
|
+
}
|
109
|
+
});
|
110
|
+
self.sections.sources = sources;
|
111
|
+
self.sections.matches = matches;
|
112
|
+
self.loaded = true;
|
113
|
+
setTimeout(function(){
|
114
|
+
self.loading = false;
|
115
|
+
}, 500);
|
116
|
+
});
|
117
|
+
}
|
118
|
+
}
|
119
|
+
});
|
120
|
+
});
|
121
|
+
})();
|
@@ -6,14 +6,14 @@
|
|
6
6
|
|
7
7
|
new Vue({
|
8
8
|
el: "#treeview",
|
9
|
-
paramAttributes: [],
|
9
|
+
paramAttributes: ["initialPath"],
|
10
10
|
data: {
|
11
11
|
preview: "",
|
12
|
-
|
12
|
+
path: "",
|
13
13
|
paths: []
|
14
14
|
},
|
15
15
|
|
16
|
-
|
16
|
+
compiled: function(){
|
17
17
|
this.path = this.initialPath;
|
18
18
|
this.fetchTree();
|
19
19
|
this.$watch("path", this.fetchTree);
|
@@ -40,7 +40,7 @@ label {
|
|
40
40
|
|
41
41
|
|
42
42
|
|
43
|
-
#
|
43
|
+
#vue-notification {
|
44
44
|
.nothing {
|
45
45
|
padding: 1em 0;
|
46
46
|
}
|
@@ -150,3 +150,9 @@ label {
|
|
150
150
|
.nav > li > a.section {
|
151
151
|
color: #777;
|
152
152
|
}
|
153
|
+
|
154
|
+
|
155
|
+
#vue-setting textarea {
|
156
|
+
min-height: 12em;
|
157
|
+
resize: both;
|
158
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class Api::SettingsController < ApplicationController
|
2
|
+
before_action :login_required
|
3
|
+
before_action :find_fluentd
|
4
|
+
before_action :set_config
|
5
|
+
before_action :set_section, only: [:show, :update, :destroy]
|
6
|
+
helper_method :element_id
|
7
|
+
respond_to :json
|
8
|
+
|
9
|
+
def index
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
coming = Fluent::Config::V1Parser.parse(params[:content], @fluentd.config_file)
|
14
|
+
current = @section
|
15
|
+
index = @config.elements.index current
|
16
|
+
unless index
|
17
|
+
render_404
|
18
|
+
return
|
19
|
+
end
|
20
|
+
@config.elements[index] = coming.elements.first
|
21
|
+
@config.write_to_file
|
22
|
+
redirect_to api_setting_path(id: element_id(coming.elements.first))
|
23
|
+
end
|
24
|
+
|
25
|
+
def destroy
|
26
|
+
unless @config.elements.index(@section)
|
27
|
+
render_404
|
28
|
+
return
|
29
|
+
end
|
30
|
+
@config.elements.delete @section
|
31
|
+
@config.write_to_file
|
32
|
+
head :no_content # 204
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def set_config
|
38
|
+
@config = Fluentd::Setting::Config.new(@fluentd.config_file)
|
39
|
+
end
|
40
|
+
|
41
|
+
def set_section
|
42
|
+
@section = @config.elements.find do |elm|
|
43
|
+
element_id(elm) == params[:id]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def element_id(element)
|
48
|
+
index = @config.elements.index(element)
|
49
|
+
"#{"%06d" % index}#{Digest::MD5.hexdigest(element.to_s)}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def render_404
|
53
|
+
render nothing: true, status: 404
|
54
|
+
end
|
55
|
+
end
|