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.

Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +9 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +4 -1
  5. data/app/assets/javascripts/vue/fluent_log.js +4 -4
  6. data/app/assets/javascripts/vue/in_tail_format.js +43 -49
  7. data/app/assets/javascripts/{alert.js → vue/notification.js} +21 -7
  8. data/app/assets/javascripts/vue/settings.js +121 -0
  9. data/app/assets/javascripts/vue/treeview.js +3 -3
  10. data/app/assets/stylesheets/common.css.scss +7 -1
  11. data/app/controllers/api/settings_controller.rb +55 -0
  12. data/app/controllers/api_controller.rb +6 -2
  13. data/app/controllers/concerns/setting_concern.rb +2 -2
  14. data/app/controllers/fluentd/settings_controller.rb +17 -2
  15. data/app/models/fluentd/setting/config.rb +39 -0
  16. data/app/views/api/settings/_element.json.jbuilder +6 -0
  17. data/app/views/api/settings/index.json.jbuilder +3 -0
  18. data/app/views/api/settings/show.json.jbuilder +1 -0
  19. data/app/views/fluentd/settings/edit.html.haml +3 -0
  20. data/app/views/fluentd/settings/source_and_output.html.haml +19 -2
  21. data/app/views/layouts/application.html.erb +1 -30
  22. data/app/views/shared/vue/_in_tail_format.html.erb +11 -36
  23. data/app/views/shared/vue/_notification.html.erb +31 -0
  24. data/app/views/shared/vue/_setting.html.erb +23 -0
  25. data/app/views/shared/vue/_treeview.html.erb +2 -2
  26. data/bower.json +1 -1
  27. data/config/application.rb +1 -0
  28. data/config/locales/translation_en.yml +11 -7
  29. data/config/locales/translation_ja.yml +4 -0
  30. data/config/routes.rb +2 -0
  31. data/lib/fluentd-ui/version.rb +1 -1
  32. data/spec/features/fluentd/setting/source_and_output_spec.rb +157 -0
  33. data/spec/spec_helper.rb +1 -0
  34. data/spec/support/javascript_macro.rb +21 -0
  35. data/vendor/assets/javascripts/bower/vue/.bower.json +7 -7
  36. data/vendor/assets/javascripts/bower/vue/LICENSE +1 -1
  37. data/vendor/assets/javascripts/bower/vue/dist/vue.js +7822 -4768
  38. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -7
  39. data/vendor/assets/javascripts/bower/vue/src/api/child.js +53 -0
  40. data/vendor/assets/javascripts/bower/vue/src/api/data.js +161 -0
  41. data/vendor/assets/javascripts/bower/vue/src/api/dom.js +211 -0
  42. data/vendor/assets/javascripts/bower/vue/src/api/events.js +176 -0
  43. data/vendor/assets/javascripts/bower/vue/src/api/global.js +146 -0
  44. data/vendor/assets/javascripts/bower/vue/src/api/lifecycle.js +144 -0
  45. data/vendor/assets/javascripts/bower/vue/src/batcher.js +52 -32
  46. data/vendor/assets/javascripts/bower/vue/src/cache.js +112 -0
  47. data/vendor/assets/javascripts/bower/vue/src/compiler/compile.js +549 -0
  48. data/vendor/assets/javascripts/bower/vue/src/compiler/transclude.js +163 -0
  49. data/vendor/assets/javascripts/bower/vue/src/config.js +74 -14
  50. data/vendor/assets/javascripts/bower/vue/src/directive.js +179 -219
  51. data/vendor/assets/javascripts/bower/vue/src/directives/attr.js +32 -0
  52. data/vendor/assets/javascripts/bower/vue/src/directives/class.js +18 -0
  53. data/vendor/assets/javascripts/bower/vue/src/directives/cloak.js +12 -0
  54. data/vendor/assets/javascripts/bower/vue/src/directives/component.js +214 -0
  55. data/vendor/assets/javascripts/bower/vue/src/directives/el.js +13 -0
  56. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +30 -34
  57. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +77 -46
  58. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +22 -129
  59. data/vendor/assets/javascripts/bower/vue/src/directives/model/checkbox.js +25 -0
  60. data/vendor/assets/javascripts/bower/vue/src/directives/model/default.js +123 -0
  61. data/vendor/assets/javascripts/bower/vue/src/directives/model/index.js +56 -0
  62. data/vendor/assets/javascripts/bower/vue/src/directives/model/radio.js +26 -0
  63. data/vendor/assets/javascripts/bower/vue/src/directives/model/select.js +166 -0
  64. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +51 -50
  65. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +36 -42
  66. data/vendor/assets/javascripts/bower/vue/src/directives/ref.js +24 -0
  67. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +477 -226
  68. data/vendor/assets/javascripts/bower/vue/src/directives/show.js +8 -0
  69. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +49 -37
  70. data/vendor/assets/javascripts/bower/vue/src/directives/text.js +15 -0
  71. data/vendor/assets/javascripts/bower/vue/src/directives/transition.js +12 -0
  72. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +38 -41
  73. data/vendor/assets/javascripts/bower/vue/src/filters/array-filters.js +87 -0
  74. data/vendor/assets/javascripts/bower/vue/src/filters/index.js +135 -0
  75. data/vendor/assets/javascripts/bower/vue/src/instance/compile.js +71 -0
  76. data/vendor/assets/javascripts/bower/vue/src/instance/events.js +122 -0
  77. data/vendor/assets/javascripts/bower/vue/src/instance/init.js +76 -0
  78. data/vendor/assets/javascripts/bower/vue/src/instance/scope.js +217 -0
  79. data/vendor/assets/javascripts/bower/vue/src/observer/array.js +90 -0
  80. data/vendor/assets/javascripts/bower/vue/src/observer/dep.js +50 -0
  81. data/vendor/assets/javascripts/bower/vue/src/observer/index.js +235 -0
  82. data/vendor/assets/javascripts/bower/vue/src/observer/object.js +75 -0
  83. data/vendor/assets/javascripts/bower/vue/src/parsers/directive.js +159 -0
  84. data/vendor/assets/javascripts/bower/vue/src/parsers/expression.js +226 -0
  85. data/vendor/assets/javascripts/bower/vue/src/parsers/path.js +300 -0
  86. data/vendor/assets/javascripts/bower/vue/src/parsers/template.js +246 -0
  87. data/vendor/assets/javascripts/bower/vue/src/parsers/text.js +178 -0
  88. data/vendor/assets/javascripts/bower/vue/src/transition/css.js +189 -0
  89. data/vendor/assets/javascripts/bower/vue/src/transition/index.js +151 -0
  90. data/vendor/assets/javascripts/bower/vue/src/transition/js.js +43 -0
  91. data/vendor/assets/javascripts/bower/vue/src/util/debug.js +50 -0
  92. data/vendor/assets/javascripts/bower/vue/src/util/dom.js +176 -0
  93. data/vendor/assets/javascripts/bower/vue/src/util/env.js +74 -0
  94. data/vendor/assets/javascripts/bower/vue/src/util/filter.js +72 -0
  95. data/vendor/assets/javascripts/bower/vue/src/util/index.js +8 -0
  96. data/vendor/assets/javascripts/bower/vue/src/util/lang.js +175 -0
  97. data/vendor/assets/javascripts/bower/vue/src/util/merge-option.js +258 -0
  98. data/vendor/assets/javascripts/bower/vue/src/vue.js +84 -0
  99. data/vendor/assets/javascripts/bower/vue/src/watcher.js +240 -0
  100. metadata +65 -20
  101. data/app/assets/javascripts/setting_format.js +0 -15
  102. data/vendor/assets/javascripts/bower/vue/src/binding.js +0 -103
  103. data/vendor/assets/javascripts/bower/vue/src/compiler.js +0 -1037
  104. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +0 -65
  105. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +0 -174
  106. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +0 -56
  107. data/vendor/assets/javascripts/bower/vue/src/emitter.js +0 -97
  108. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +0 -190
  109. data/vendor/assets/javascripts/bower/vue/src/filters.js +0 -191
  110. data/vendor/assets/javascripts/bower/vue/src/fragment.js +0 -67
  111. data/vendor/assets/javascripts/bower/vue/src/main.js +0 -188
  112. data/vendor/assets/javascripts/bower/vue/src/observer.js +0 -446
  113. data/vendor/assets/javascripts/bower/vue/src/template-parser.js +0 -46
  114. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +0 -96
  115. data/vendor/assets/javascripts/bower/vue/src/transition.js +0 -228
  116. data/vendor/assets/javascripts/bower/vue/src/utils.js +0 -326
  117. 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: e8a878149540a61f5a1c3332f91c788ba07658a0
4
- data.tar.gz: b3ffe587af20b8d6feeb79ea48b2ab684a851fe2
3
+ metadata.gz: 19e7e14601e3423f3f3fd3cf77d39ffa135fd2be
4
+ data.tar.gz: 2dd240927a8bb79dd6bd2382d081c323a9a15833
5
5
  SHA512:
6
- metadata.gz: 9e467bd3ae13cb3c600a63c9a5bd7e76d2d1be168ddfc1bd39a9fb3e529b04f9650a140f535ced690630363745f6f7543c559e87acbc7fa58d528ff24e8bfa73
7
- data.tar.gz: 77f4eb293166a4511e38076e46047326040c08537668a37c6f13ce137ffa9a631452beeaff001026f5f474d8260412064977ce044a124b72a17964d845efab65
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
@@ -7,6 +7,7 @@ gemspec
7
7
  group :development, :test do
8
8
  gem "rake"
9
9
  gem "pry"
10
+ gem "pry-rails"
10
11
  gem "rspec-rails", "~> 2.99"
11
12
  end
12
13
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluentd-ui (0.3.8)
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
- created: function(){
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: ["formatOptions", "initialSelected", "targetFile", "paramsJson"],
26
+ paramAttributes: ["formatOptionsJson", "initialSelected", "targetFile", "paramsJson"],
10
27
  data: {
11
- regexp: "",
12
- grok_str: "",
13
- time_format: "",
14
28
  previewProcessing: false,
15
- highlightedLines: null
29
+ format: "",
30
+ highlightedLines: null,
16
31
  },
17
32
 
18
- created: function(){
19
- this.formatOptions = JSON.parse(this.formatOptions);
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(ev){
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
- var updateGrokPreview = _.debounce(_.bind(this.generateRegexp, this), 256);
35
- this.$watch('grok_str', updateGrokPreview);
36
- },
37
-
38
- computed: {
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
- format: self.formatType == "regexp" ? "regexp" : self.format,
119
- time_format: self.time_format,
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.time_format = result.time_format;
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($('#alert').length === 0) return;
7
+ if($('#vue-notification').length === 0) return;
8
8
 
9
9
  var alert = new Vue({
10
- el: "#alert",
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
- clearInterval(timer); // signed out
30
+ // signed out
23
31
  }
24
32
  if(xhr.status === 0) {
25
- clearInterval(timer); // server unreachable (maybe down)
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
- $get: function(){ return this.alerts.length; }
49
+ get: function(){ return this.alerts.length; }
36
50
  },
37
51
  hasAlerts: {
38
- $get: function(){ return this.alertsCount > 0; }
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
- initialPath: "/var/log",
12
+ path: "",
13
13
  paths: []
14
14
  },
15
15
 
16
- created: function(){
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
- #alert {
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