fluentd-ui 0.3.10 → 0.3.11

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.

Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/ChangeLog +3 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/fluentd/settings/histories_controller.rb +26 -0
  5. data/app/controllers/fluentd/settings/running_backup_controller.rb +19 -0
  6. data/app/controllers/fluentd/settings_controller.rb +5 -0
  7. data/app/models/fluentd.rb +0 -8
  8. data/app/models/fluentd/agent.rb +0 -1
  9. data/app/models/fluentd/agent/common.rb +28 -0
  10. data/app/models/fluentd/agent/fluentd_gem.rb +5 -1
  11. data/app/models/fluentd/agent/local_common.rb +33 -0
  12. data/app/models/fluentd/agent/td_agent/macosx.rb +3 -1
  13. data/app/models/fluentd/agent/td_agent/unix.rb +3 -1
  14. data/app/models/fluentd/setting/backup_file.rb +41 -0
  15. data/app/models/fluentd/setting/config.rb +2 -1
  16. data/app/views/fluentd/settings/histories/_list.html.haml +6 -0
  17. data/app/views/fluentd/settings/histories/index.html.haml +3 -0
  18. data/app/views/fluentd/settings/histories/show.html.haml +11 -0
  19. data/app/views/fluentd/settings/running_backup/show.html.haml +15 -0
  20. data/app/views/fluentd/settings/show.html.haml +13 -0
  21. data/config/application.yml +2 -0
  22. data/config/locales/translation_en.yml +15 -0
  23. data/config/locales/translation_ja.yml +15 -0
  24. data/config/routes.rb +8 -0
  25. data/lib/fluentd-ui/version.rb +1 -1
  26. data/spec/features/fluentd/setting/hisotries_spec.rb +48 -0
  27. data/spec/features/fluentd/setting/ranning_backup_spec.rb +48 -0
  28. data/spec/features/setting_spec.rb +17 -0
  29. data/spec/models/fluentd/agent/local_common_spec.rb +45 -0
  30. data/spec/models/fluentd/agent_spec.rb +43 -1
  31. data/spec/spec_helper.rb +1 -0
  32. data/spec/support/config_histories.rb +57 -0
  33. metadata +57 -91
  34. data/app/models/fluentd/agent/remote.rb +0 -7
  35. data/app/models/fluentd/api.rb +0 -6
  36. data/app/models/fluentd/api/http.rb +0 -26
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ea1ab2d5ce725a63c27f10c40a0327cc35f7b430
4
+ data.tar.gz: 5b61d101c19bec0e603c0497debbb5e89fb012a0
5
+ SHA512:
6
+ metadata.gz: 048827d25bbb3e971bdc13dfda18165718ab6babda3da181fc16ad76fb9ce6f0067a87a1bbf6b4fa2219511e2923cd5621b2bf0f08f7a10a0effe6194a20c666
7
+ data.tar.gz: d24f8c0065fd5ecd5d62a23dffff0dbeece212bcc0effd442b1f2ca545d54176a6eb7ff7594bb3914d2a039a74244dac817a1942244533cea028b35152ec3263
data/ChangeLog CHANGED
@@ -1,3 +1,6 @@
1
+ Release 0.3.11 - 2014/12/19
2
+ * [improve] Save config history. Now any saved config files can be restored to the current.
3
+
1
4
  Release 0.3.10 - 2014/12/17
2
5
  * [maintenance] Update components.
3
6
  * [improve] Add fluentd default plugin settings.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluentd-ui (0.3.10)
4
+ fluentd-ui (0.3.11)
5
5
  addressable
6
6
  bundler
7
7
  draper (~> 1.3)
@@ -0,0 +1,26 @@
1
+ class Fluentd::Settings::HistoriesController < ApplicationController
2
+ before_action :login_required
3
+ before_action :find_fluentd
4
+ before_action :find_backup_file, only: [:show, :reuse]
5
+
6
+ def index
7
+ @backup_files = @fluentd.agent.backup_files_in_new_order.map do |file_path|
8
+ Fluentd::Setting::BackupFile.new(file_path)
9
+ end
10
+ end
11
+
12
+ def show
13
+ end
14
+
15
+ def reuse
16
+ @fluentd.agent.config_write @backup_file.content
17
+ redirect_to daemon_setting_path, flash: { success: t('messages.config_successfully_copied', brand: fluentd_ui_brand) }
18
+ end
19
+
20
+ private
21
+
22
+ def find_backup_file
23
+ #Do not use BackupFile.new(params[:id]) because params[:id] can be any path.
24
+ @backup_file = Fluentd::Setting::BackupFile.find_by_file_id(@fluentd.agent.config_backup_dir, params[:id])
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ class Fluentd::Settings::RunningBackupController < ApplicationController
2
+ before_action :login_required
3
+ before_action :find_fluentd
4
+ before_action :find_backup_file, only: [:show, :reuse]
5
+
6
+ def show
7
+ end
8
+
9
+ def reuse
10
+ @fluentd.agent.config_write @backup_file.content
11
+ redirect_to daemon_setting_path, flash: { success: t('messages.config_successfully_copied', brand: fluentd_ui_brand) }
12
+ end
13
+
14
+ private
15
+
16
+ def find_backup_file
17
+ @backup_file = Fluentd::Setting::BackupFile.new(@fluentd.agent.running_config_backup_file)
18
+ end
19
+ end
@@ -6,6 +6,11 @@ class Fluentd::SettingsController < ApplicationController
6
6
  before_action :set_config, only: [:show, :edit, :update]
7
7
 
8
8
  def show
9
+ @backup_files = @fluentd.agent.backup_files_in_new_order.first(Settings.histories_count_in_preview).map do |file_path|
10
+ Fluentd::Setting::BackupFile.new(file_path)
11
+ end
12
+
13
+ @running_backedup_file = Fluentd::Setting::BackupFile.new(@fluentd.agent.running_config_backup_file)
9
14
  end
10
15
 
11
16
  def edit
@@ -73,14 +73,6 @@ class Fluentd
73
73
  end
74
74
  end
75
75
 
76
- def api
77
- Api::Http.new(api_endpoint)
78
- end
79
-
80
- def api_endpoint
81
- # TODO: autodetect from parsed configuration, but unused for now
82
- end
83
-
84
76
  def label
85
77
  "fluentd" # NOTE: for multiple fluentd management, but only single fluentd manage now
86
78
  end
@@ -5,7 +5,6 @@ require 'fluent/supervisor'
5
5
  require "fluentd/agent/common"
6
6
  require "fluentd/agent/fluentd_gem"
7
7
  require "fluentd/agent/td_agent"
8
- require "fluentd/agent/remote"
9
8
 
10
9
  class Fluentd
11
10
  class Agent
@@ -57,6 +57,21 @@ class Fluentd
57
57
  extra_options[:config_file] || self.class.default_options[:config_file]
58
58
  end
59
59
 
60
+ def config_backup_dir
61
+ dir = File.join(FluentdUI.data_dir, "#{Rails.env}_confg_backups")
62
+ FileUtils.mkdir_p(dir)
63
+ dir
64
+ end
65
+
66
+ def running_config_backup_dir
67
+ dir = File.join(FluentdUI.data_dir, "#{Rails.env}_running_confg_backup")
68
+ FileUtils.mkdir_p(dir)
69
+ dir
70
+ end
71
+
72
+ def running_config_backup_file
73
+ File.join(running_config_backup_dir, "running.conf")
74
+ end
60
75
 
61
76
  # define these methods on each Agent class
62
77
 
@@ -71,6 +86,19 @@ class Fluentd
71
86
  raise NotImplementedError, "'#{method}' method is required to be defined"
72
87
  end
73
88
  end
89
+
90
+ private
91
+
92
+ def backup_running_config
93
+ #back up config file only when start success
94
+ return unless yield
95
+
96
+ return unless File.exists? config_file
97
+
98
+ FileUtils.cp config_file, running_config_backup_file
99
+
100
+ true
101
+ end
74
102
  end
75
103
  end
76
104
  end
@@ -15,7 +15,10 @@ class Fluentd
15
15
  # return value is status_after_this_method_called == started
16
16
  def start
17
17
  return true if running?
18
- actual_start
18
+
19
+ backup_running_config do
20
+ actual_start
21
+ end
19
22
  end
20
23
 
21
24
  # return value is status_after_this_method_called == stopped
@@ -67,6 +70,7 @@ class Fluentd
67
70
  Bundler.with_clean_env do
68
71
  spawn("fluentd #{options_to_argv}")
69
72
  end
73
+
70
74
  wait_starting
71
75
  end
72
76
 
@@ -20,12 +20,14 @@ class Fluentd
20
20
  end
21
21
 
22
22
  def config_write(content)
23
+ backup_config
23
24
  File.open(config_file, "w") do |f|
24
25
  f.write content
25
26
  end
26
27
  end
27
28
 
28
29
  def config_append(content)
30
+ backup_config
29
31
  File.open(config_file, "a") do |f|
30
32
  f.write "\n"
31
33
  f.write content
@@ -59,8 +61,39 @@ class Fluentd
59
61
  File.read(pid_file).to_i rescue nil
60
62
  end
61
63
 
64
+ def backup_files
65
+ Dir.glob(File.join("#{config_backup_dir}", "*.conf"))
66
+ end
67
+
68
+ def backup_files_in_old_order
69
+ backup_files.sort
70
+ end
71
+
72
+ def backup_files_in_new_order
73
+ backup_files_in_old_order.reverse
74
+ end
75
+
62
76
  private
63
77
 
78
+ def backup_config
79
+ return unless File.exists? config_file
80
+
81
+ FileUtils.cp config_file, File.join(config_backup_dir, "#{Time.zone.now.strftime('%Y%m%d_%H%M%S')}.conf")
82
+
83
+ remove_over_backup_files
84
+ end
85
+
86
+ def remove_over_backup_files
87
+ over_file_count = backup_files.size - ::Settings.max_backup_files_count
88
+
89
+ return if over_file_count <= 0
90
+
91
+ backup_files_in_old_order.first(over_file_count).each do |file|
92
+ next unless File.exist? file
93
+ FileUtils.rm(file)
94
+ end
95
+ end
96
+
64
97
  def logged_errors(&block)
65
98
  return [] unless File.exist?(log_file)
66
99
  buf = []
@@ -4,7 +4,9 @@ class Fluentd
4
4
  module Macosx
5
5
 
6
6
  def start
7
- detached_command("launchctl load #{plist}") && pid_from_launchctl
7
+ backup_running_config do
8
+ detached_command("launchctl load #{plist}") && pid_from_launchctl
9
+ end
8
10
  end
9
11
 
10
12
  def stop
@@ -3,7 +3,9 @@ class Fluentd
3
3
  class TdAgent
4
4
  module Unix
5
5
  def start
6
- detached_command('/etc/init.d/td-agent start')
6
+ backup_running_config do
7
+ detached_command('/etc/init.d/td-agent start')
8
+ end
7
9
  end
8
10
 
9
11
  def stop
@@ -0,0 +1,41 @@
1
+ class Fluentd
2
+ module Setting
3
+ class BackupFile
4
+ attr_accessor :file_path
5
+
6
+ def self.find_by_file_id(backup_dir, file_id)
7
+ file_path = Pathname.new(backup_dir).join("#{file_id}.conf")
8
+ raise "No such a file #{file_path}" unless File.exist?(file_path)
9
+
10
+ new(file_path)
11
+ end
12
+
13
+ def initialize(file_path)
14
+ @file_path = file_path
15
+ end
16
+
17
+ def file_id
18
+ @file_id ||= with_file { name.gsub(/.conf\Z/,'') }
19
+ end
20
+
21
+ def name
22
+ @name ||= with_file { File.basename(file_path) }
23
+ end
24
+
25
+ def content
26
+ @content ||= with_file { File.open(file_path, "r") { |f| f.read } }
27
+ end
28
+
29
+ def ctime
30
+ with_file { File.ctime(file_path) }
31
+ end
32
+
33
+ private
34
+
35
+ def with_file
36
+ return nil unless file_path && File.exist?(file_path)
37
+ yield
38
+ end
39
+ end
40
+ end
41
+ end
@@ -28,7 +28,8 @@ class Fluentd
28
28
  end
29
29
 
30
30
  def write_to_file
31
- File.open(file, "w"){|f| f.write formatted }
31
+ return unless Fluentd.instance
32
+ Fluentd.instance.agent.config_write formatted
32
33
  end
33
34
 
34
35
  def formatted
@@ -0,0 +1,6 @@
1
+ %ul
2
+ - @backup_files.each do |file|
3
+ %li
4
+ = link_to(file.name, daemon_setting_history_path(id: file.file_id))
5
+ %label= t('terms.backup_time')
6
+ = file.ctime.strftime(I18n.t 'time.formats.default')
@@ -0,0 +1,3 @@
1
+ - page_title t('.page_title', label: @fluentd.label)
2
+
3
+ = render 'list'
@@ -0,0 +1,11 @@
1
+ - page_title t('.page_title', label: @fluentd.label) do
2
+ - link_to reuse_daemon_setting_history_path(id: @backup_file.file_id), method: 'post', class: "btn btn-primary pull-right" do
3
+ = icon('fa-pencil')
4
+ = t("terms.reuse")
5
+
6
+ .row
7
+ .col-xs-12
8
+ %pre
9
+ = preserve do
10
+ = @backup_file.content
11
+
@@ -0,0 +1,15 @@
1
+ - page_title t('.page_title', label: @fluentd.label) do
2
+ - if @backup_file.content
3
+ - link_to reuse_daemon_setting_running_backup_path, method: 'post', class: "btn btn-primary pull-right" do
4
+ = icon('fa-pencil')
5
+ = t("terms.reuse")
6
+
7
+ .row
8
+ .col-xs-12
9
+ - if @backup_file.content
10
+ %pre
11
+ = preserve do
12
+ = @backup_file.content
13
+ - else
14
+ %p
15
+ =t('fluentd.common.never_started_yet', brand: fluentd_ui_brand)
@@ -8,3 +8,16 @@
8
8
  %pre
9
9
  = preserve do
10
10
  = @config
11
+
12
+ .row
13
+ .col-xs-12
14
+ %h3= link_to(t('fluentd.settings.running_backup.title'), daemon_setting_running_backup_path)
15
+ %p
16
+ %label= t('terms.backup_time')
17
+ = @running_backedup_file.ctime.try(:strftime, I18n.t('time.formats.default')) || t('fluentd.common.never_started_yet', brand: fluentd_ui_brand)
18
+
19
+ .row
20
+ .col-xs-12
21
+ %h3= t('fluentd.settings.history')
22
+ = render '/fluentd/settings/histories/list'
23
+ .link= link_to t('.link_to_histories'), daemon_setting_histories_path
@@ -1,6 +1,8 @@
1
1
  defaults: &defaults
2
2
  default_password: changeme
3
3
  default_log_tail_count: 30
4
+ histories_count_in_preview: 5
5
+ max_backup_files_count: 100
4
6
  recommended_plugins:
5
7
  - category: filter
6
8
  name: "rewrite-tag-filter"
@@ -11,6 +11,7 @@ en:
11
11
  password_successfully_updated: "Your password has been changed successfully."
12
12
  fluentd_status_running: Running
13
13
  fluentd_status_stopped: Stopped
14
+ config_successfully_copied: "Config has been copied successfully. Please restart %{brand} to use the new config"
14
15
 
15
16
  terms: &terms
16
17
  name: Name
@@ -58,6 +59,8 @@ en:
58
59
  notice_restart_for_config_edit: "NOTICE: running %{brand} will restart after update config"
59
60
  lines: Lines
60
61
  languages: Language
62
+ backup_time: Backed up at
63
+ reuse: reuse
61
64
 
62
65
  plugins:
63
66
  view_on_rubygems_org: View on rubygems.org
@@ -117,6 +120,7 @@ en:
117
120
  Delete %{brand} setting.
118
121
 
119
122
  <p>Running %{brand} will be stopped, but log and config file are still exists.</p>
123
+ never_started_yet: "%{brand} had never been started yet."
120
124
  show:
121
125
  page_title: Dashboard
122
126
  new:
@@ -138,6 +142,7 @@ en:
138
142
  show:
139
143
  page_title: Config File
140
144
  in_out_head: In/Out setting
145
+ link_to_histories: See more histories
141
146
  edit:
142
147
  page_title: Edit Config File
143
148
  out_forward:
@@ -245,6 +250,16 @@ en:
245
250
  page_title: "Config Parameters"
246
251
  confirm:
247
252
  page_title: "Confirmation"
253
+ history: "Setting History"
254
+ histories:
255
+ index:
256
+ page_title: "Setting Histories"
257
+ show:
258
+ page_title: "Reuse Setting History"
259
+ running_backup:
260
+ title: "Running Config"
261
+ show:
262
+ page_title: "Running Config"
248
263
 
249
264
  misc:
250
265
  information:
@@ -11,6 +11,7 @@ ja:
11
11
  password_successfully_updated: "パスワードを変更しました。"
12
12
  fluentd_status_running: 稼働中
13
13
  fluentd_status_stopped: 停止中
14
+ config_successfully_copied: "設定をコピーしました。反映させるには、 %{brand}を再起動してください。"
14
15
 
15
16
  terms: &terms
16
17
  name: アカウント名
@@ -58,6 +59,8 @@ ja:
58
59
  notice_restart_for_config_edit: "※更新すると稼働中の%{brand}が再起動されます"
59
60
  lines: 行
60
61
  languages: 言語
62
+ backup_time: バックアップ日時
63
+ reuse: 再利用
61
64
 
62
65
  plugins:
63
66
  view_on_rubygems_org: rubygems.orgで見る
@@ -116,6 +119,7 @@ ja:
116
119
  %{brand}の設定を削除します。
117
120
 
118
121
  <p>起動中の%{brand}は停止し、ログや設定ファイルはそのまま残存します。</p>
122
+ never_started_yet: "%{brand} は起動されたことがありません。"
119
123
  show:
120
124
  page_title: "ダッシュボード"
121
125
  new:
@@ -136,6 +140,7 @@ ja:
136
140
  setting_empty: 設定されていません
137
141
  show:
138
142
  page_title: 設定ファイルの編集
143
+ link_to_histories: さらに過去の履歴をみる
139
144
  edit:
140
145
  page_title: 設定ファイルの編集
141
146
  out_forward:
@@ -250,6 +255,16 @@ ja:
250
255
  page_title: "ファイル読み込み | その他の設定"
251
256
  confirm:
252
257
  page_title: "ファイル読み込み | 確認"
258
+ history: 設定履歴
259
+ histories:
260
+ index:
261
+ page_title: "設定履歴 | 一覧"
262
+ show:
263
+ page_title: "設定履歴 | 詳細"
264
+ running_backup:
265
+ title: "使用中の設定"
266
+ show:
267
+ page_title: "使用中の設定"
253
268
 
254
269
  misc:
255
270
  information: