fluentd-ui 0.3.11 → 0.3.12
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 +4 -4
- data/ChangeLog +11 -0
- data/Gemfile.lock +1 -1
- data/app/assets/stylesheets/common.css.scss +4 -0
- data/app/controllers/application_controller.rb +25 -15
- data/app/controllers/concerns/setting_history_concern.rb +28 -0
- data/app/controllers/fluentd/agents_controller.rb +13 -15
- data/app/controllers/fluentd/settings/histories_controller.rb +3 -13
- data/app/controllers/fluentd/settings/notes_controller.rb +16 -0
- data/app/controllers/fluentd/settings/running_backup_controller.rb +2 -12
- data/app/controllers/fluentd/settings_controller.rb +2 -2
- data/app/controllers/misc_controller.rb +27 -18
- data/app/controllers/polling_controller.rb +10 -13
- data/app/helpers/settings_helper.rb +67 -29
- data/app/models/{fluentd/setting/backup_file.rb → concerns/fluentd/setting_archive/archivable.rb} +11 -11
- data/app/models/fluent_gem.rb +1 -1
- data/app/models/fluentd/agent/fluentd_gem.rb +7 -3
- data/app/models/fluentd/agent/local_common.rb +44 -9
- data/app/models/fluentd/agent/td_agent/macosx.rb +5 -2
- data/app/models/fluentd/agent/td_agent/unix.rb +4 -0
- data/app/models/fluentd/setting/out_s3.rb +3 -3
- data/app/models/fluentd/setting_archive/backup_file.rb +20 -0
- data/app/models/fluentd/setting_archive/note.rb +28 -0
- data/app/models/plugin.rb +12 -6
- data/app/views/fluentd/settings/histories/_list.html.haml +17 -6
- data/app/views/fluentd/settings/histories/show.html.haml +12 -2
- data/app/views/fluentd/settings/running_backup/show.html.haml +8 -3
- data/app/views/layouts/application.html.erb +1 -1
- data/app/views/plugins/updated.html.haml +21 -19
- data/app/views/shared/_flash.html.haml +3 -0
- data/config/locales/translation_en.yml +5 -0
- data/config/locales/translation_ja.yml +5 -0
- data/config/routes.rb +4 -0
- data/lib/file_reverse_reader.rb +38 -13
- data/lib/fluentd-ui/version.rb +1 -1
- data/spec/controllers/application_controller_spec.rb +88 -0
- data/spec/controllers/fluentd/agents_controller_spec.rb +45 -0
- data/spec/controllers/misc_controller_spec.rb +68 -0
- data/spec/controllers/polling_controller_spec.rb +34 -0
- data/spec/features/fluentd/setting/histories_spec.rb +87 -0
- data/spec/features/fluentd/setting/notes_spec.rb +27 -0
- data/spec/features/fluentd/setting/out_forward_spec.rb +40 -0
- data/spec/features/fluentd/setting/{ranning_backup_spec.rb → running_backup_spec.rb} +36 -0
- data/spec/features/setting_spec.rb +2 -2
- data/spec/models/fluentd/agent_spec.rb +49 -0
- data/spec/support/fixtures/error3.log +7 -0
- data/spec/support/fluentd_agent_common_behavior.rb +14 -0
- metadata +23 -13
- data/app/helpers/miscs_helper.rb +0 -2
- data/db/seeds.rb +0 -7
- data/spec/controllers/plugins_controller_spec.rb +0 -5
- data/spec/controllers/tutorials_controller_spec.rb +0 -5
- data/spec/features/fluentd/setting/hisotries_spec.rb +0 -48
@@ -12,6 +12,8 @@ ja:
|
|
12
12
|
fluentd_status_running: 稼働中
|
13
13
|
fluentd_status_stopped: 停止中
|
14
14
|
config_successfully_copied: "設定をコピーしました。反映させるには、 %{brand}を再起動してください。"
|
15
|
+
note_updating_success: "メモを更新しました。"
|
16
|
+
dryrun_is_passed: この設定でのdry-runが成功しました
|
15
17
|
|
16
18
|
terms: &terms
|
17
19
|
name: アカウント名
|
@@ -59,8 +61,11 @@ ja:
|
|
59
61
|
notice_restart_for_config_edit: "※更新すると稼働中の%{brand}が再起動されます"
|
60
62
|
lines: 行
|
61
63
|
languages: 言語
|
64
|
+
backup_file: バックアップファイル
|
62
65
|
backup_time: バックアップ日時
|
66
|
+
note: メモ
|
63
67
|
reuse: 再利用
|
68
|
+
configtest: この設定を検証する(dry-run)
|
64
69
|
|
65
70
|
plugins:
|
66
71
|
view_on_rubygems_org: rubygems.orgで見る
|
data/config/routes.rb
CHANGED
@@ -66,10 +66,14 @@ Rails.application.routes.draw do
|
|
66
66
|
|
67
67
|
resources :histories, only: [:index, :show], module: :settings, controller: :histories do
|
68
68
|
post "reuse", action: 'reuse', on: :member, as: 'reuse'
|
69
|
+
post "configtest" , action: "configtest", on: :member, as: "configtest"
|
69
70
|
end
|
70
71
|
|
72
|
+
resources :notes, only: [:update], module: :settings, controller: :notes
|
73
|
+
|
71
74
|
resource :running_backup, only: [:show], module: :settings, controller: :running_backup do
|
72
75
|
post "reuse", action: 'reuse', on: :member, as: 'reuse'
|
76
|
+
post "configtest" , action: "configtest", on: :member, as: "configtest"
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
data/lib/file_reverse_reader.rb
CHANGED
@@ -7,26 +7,24 @@ class FileReverseReader
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def each_line(&block)
|
10
|
+
#read from the end of file
|
10
11
|
io.seek(0, IO::SEEK_END)
|
11
12
|
buf = ""
|
12
13
|
loop do
|
13
14
|
if reach_start_of_file?
|
14
|
-
|
15
|
-
io.seek(0, IO::SEEK_SET)
|
16
|
-
buf.insert(0, io.read(last_pos))
|
17
|
-
split_each_line(buf, &block)
|
15
|
+
read_rest(buf, &block)
|
18
16
|
break
|
19
17
|
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
read_to_buf_by_step(buf)
|
20
|
+
|
21
|
+
#if buffer dose not include multi lines, seek more.
|
22
|
+
if buf[$/].nil?
|
23
|
+
next
|
24
|
+
else
|
25
|
+
split_only_whole_lines(buf, &block)
|
26
|
+
buf = ""
|
27
|
+
end
|
30
28
|
end
|
31
29
|
end
|
32
30
|
|
@@ -43,6 +41,33 @@ class FileReverseReader
|
|
43
41
|
|
44
42
|
private
|
45
43
|
|
44
|
+
def read_rest(buf, &block)
|
45
|
+
last_pos = io.pos
|
46
|
+
io.seek(0, IO::SEEK_SET)
|
47
|
+
buf.insert(0, io.read(last_pos))
|
48
|
+
split_each_line(buf, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def read_to_buf_by_step(buf)
|
52
|
+
#move up file pointer by one step
|
53
|
+
io.seek(-1 * step, IO::SEEK_CUR) #point[A]
|
54
|
+
#read strings by one step from the pointer, and insert to buffer
|
55
|
+
#(on io.read, file pointer returns down to the point before [A])
|
56
|
+
buf.insert(0, io.read(step))
|
57
|
+
#forword file pointer to [A]
|
58
|
+
io.seek(-1 * step, IO::SEEK_CUR)
|
59
|
+
end
|
60
|
+
|
61
|
+
def split_only_whole_lines(buf, &block)
|
62
|
+
#if budder includes multi lines,
|
63
|
+
gap = buf.index($/)
|
64
|
+
#cut off first line (*first* line because it's seeking from end of file, and first line may be broken-line)
|
65
|
+
buf.gsub!(/\A.*?\n/, "")
|
66
|
+
split_each_line(buf, &block)
|
67
|
+
#move file pointer to the gap(= the end of *first* line)
|
68
|
+
io.seek(gap, IO::SEEK_CUR)
|
69
|
+
end
|
70
|
+
|
46
71
|
def split_each_line(buf, &block)
|
47
72
|
return unless buf.force_encoding('utf-8').valid_encoding?
|
48
73
|
buf.split($/).reverse.each do |line|
|
data/lib/fluentd-ui/version.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class DummyController < ApplicationController; end
|
4
|
+
|
5
|
+
describe DummyController do
|
6
|
+
controller DummyController do
|
7
|
+
skip_before_action :login_required
|
8
|
+
def index
|
9
|
+
render :text => "Hello World"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#set_locale' do
|
14
|
+
let!(:default_locale) { :en }
|
15
|
+
let!(:available_locales) { [:en, :ja] }
|
16
|
+
|
17
|
+
before do
|
18
|
+
I18n.stub(:default_locale).and_return(default_locale)
|
19
|
+
I18n.stub(:available_locales).and_return(available_locales)
|
20
|
+
|
21
|
+
I18n.locale = I18n.default_locale #initialize
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with params[:lang]' do
|
25
|
+
before do
|
26
|
+
get 'index', lang: param_lang
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'and in available_locales' do
|
30
|
+
let(:param_lang) { :ja }
|
31
|
+
|
32
|
+
it 'params[:lang] will be set as locale' do
|
33
|
+
expect(I18n.locale).to eq :ja
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'and out of available_locales' do
|
38
|
+
let(:param_lang) { :ka }
|
39
|
+
|
40
|
+
it 'defalut locale will be set as locale' do
|
41
|
+
expect(I18n.locale).to eq default_locale
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with session[:prefer_lang]' do
|
47
|
+
before do
|
48
|
+
controller.session[:prefer_lang] = :ja
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'session[:prefer_lang] will be set as locale' do
|
52
|
+
get 'index'
|
53
|
+
expect(I18n.locale).to eq :ja
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with request.env["HTTP_ACCEPT_LANGUAGE"]' do
|
58
|
+
before do
|
59
|
+
request.stub(:env).and_return({ "HTTP_ACCEPT_LANGUAGE" => accept_language })
|
60
|
+
get 'index'
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'accept_language is available' do
|
64
|
+
let(:accept_language) { 'ja' }
|
65
|
+
|
66
|
+
it 'session[:prefer_lang] will be set as locale' do
|
67
|
+
expect(I18n.locale).to eq :ja
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'accept_language is not available but start with en' do
|
72
|
+
let(:accept_language) { 'en-us' }
|
73
|
+
|
74
|
+
it ':en will be set as locale' do
|
75
|
+
expect(I18n.locale).to eq :en
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'accept_language is not available' do
|
80
|
+
let(:accept_language) { 'ka' }
|
81
|
+
|
82
|
+
it 'default_locale will be set as locale' do
|
83
|
+
expect(I18n.locale).to eq default_locale
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Fluentd::AgentsController do
|
4
|
+
before do
|
5
|
+
allow(controller).to receive(:current_user).and_return true
|
6
|
+
allow(controller).to receive(:find_fluentd).and_return(nil)
|
7
|
+
controller.instance_variable_set(:@fluentd, double(agent: @agent = double(:agent)))
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when the action succeeds" do
|
11
|
+
it "stops" do
|
12
|
+
expect(@agent).to receive(:stop).and_return true
|
13
|
+
put :stop
|
14
|
+
end
|
15
|
+
|
16
|
+
it "starts" do
|
17
|
+
expect(@agent).to receive(:start).and_return true
|
18
|
+
put :start
|
19
|
+
end
|
20
|
+
|
21
|
+
it "restarts" do
|
22
|
+
expect(@agent).to receive(:restart).and_return true
|
23
|
+
put :restart
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "when the action does not succeed" do
|
28
|
+
it "stops" do
|
29
|
+
expect(@agent).to receive(:stop).and_return false
|
30
|
+
put :stop
|
31
|
+
end
|
32
|
+
|
33
|
+
it "starts" do
|
34
|
+
expect(@agent).to receive(:start).and_return false
|
35
|
+
expect(@agent).to receive(:log_tail).with(1).and_return ["some message"]
|
36
|
+
put :start
|
37
|
+
end
|
38
|
+
|
39
|
+
it "restarts" do
|
40
|
+
expect(@agent).to receive(:restart).and_return false
|
41
|
+
expect(@agent).to receive(:log_tail).with(1).and_return ["some message"]
|
42
|
+
put :restart
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MiscController do
|
4
|
+
let(:instance) { Fluentd.new(id: nil, variant: "fluentd_gem", log_file: "dummy.log", pid_file: "dummy.pid", config_file: "dummy.conf") }
|
5
|
+
|
6
|
+
class DummyAagent
|
7
|
+
def log
|
8
|
+
"dummy_log_content"
|
9
|
+
end
|
10
|
+
|
11
|
+
def version
|
12
|
+
"dummy version"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
let!(:dummy_agent) { DummyAagent.new }
|
17
|
+
let!(:fluentd_log_content) { dummy_agent.log }
|
18
|
+
let!(:fluentd_version) { dummy_agent.version }
|
19
|
+
let(:fluentd_ui_log_content) { <<-LOG.strip_heredoc }
|
20
|
+
log1
|
21
|
+
log2
|
22
|
+
log3
|
23
|
+
LOG
|
24
|
+
|
25
|
+
let!(:dummy_log_path) { "tmp/dummy.log" }
|
26
|
+
let!(:expand_dir) { Rails.root.join("tmp/system_info") }
|
27
|
+
|
28
|
+
before do
|
29
|
+
allow(controller).to receive(:current_user).and_return true
|
30
|
+
|
31
|
+
#dummy log for fluentd-ui.log
|
32
|
+
File.open(dummy_log_path, 'w') { |file| file.write(fluentd_ui_log_content) }
|
33
|
+
controller.stub(:log_path) { dummy_log_path }
|
34
|
+
|
35
|
+
instance.stub(:agent).and_return(dummy_agent)
|
36
|
+
Fluentd.stub(:instance).and_return(instance)
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'download_info' do
|
40
|
+
before do
|
41
|
+
get 'download_info'
|
42
|
+
|
43
|
+
#expand files in zip
|
44
|
+
Zip::File.open(Rails.root.join("tmp/system_info.zip")) do |zip_file|
|
45
|
+
FileUtils.mkdir_p(expand_dir)
|
46
|
+
|
47
|
+
zip_file.each do |f|
|
48
|
+
f_path = File.join(expand_dir, f.name)
|
49
|
+
zip_file.extract(f, f_path) unless File.exist?(f_path)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#remove all temp files for this spec
|
55
|
+
after do
|
56
|
+
FileUtils.rm Rails.root.join("tmp/system_info.zip")
|
57
|
+
FileUtils.rm_r expand_dir
|
58
|
+
FileUtils.rm dummy_log_path
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'write files' do
|
62
|
+
expect(File.read(File.join(expand_dir, "fluentd.log"))).to eq "#{fluentd_log_content}\n"
|
63
|
+
expect(File.read(File.join(expand_dir, "fluentd-ui.log"))).to eq "#{fluentd_ui_log_content}"
|
64
|
+
expect(File.read(File.join(expand_dir, "env.txt"))).to match "RAILS_ENV=test"
|
65
|
+
expect(File.read(File.join(expand_dir, "versions.txt"))).to match "fluentd: #{fluentd_version}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,5 +1,39 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PollingController do
|
4
|
+
describe 'polling for alerts' do
|
5
|
+
before do
|
6
|
+
allow(controller).to receive(:current_user).and_return true
|
7
|
+
end
|
4
8
|
|
9
|
+
after do
|
10
|
+
response.should be_success
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'may find nothing' do
|
14
|
+
expect(controller).to receive(:uninstalling_gems).and_return []
|
15
|
+
expect(controller).to receive(:installing_gems).and_return []
|
16
|
+
get :alerts
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'may find gems being uninstalled' do
|
20
|
+
expect(controller).to receive(:uninstalling_gems).and_return [
|
21
|
+
double(gem_name: "foobar", version: "1.0.0")
|
22
|
+
]
|
23
|
+
|
24
|
+
allow(controller).to receive(:installing_gems).and_return []
|
25
|
+
|
26
|
+
get :alerts
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'may find gems being installed' do
|
30
|
+
expect(controller).to receive(:installing_gems).and_return [
|
31
|
+
double(gem_name: "bazbang", version: "0.0.1")
|
32
|
+
]
|
33
|
+
|
34
|
+
allow(controller).to receive(:uninstalling_gems).and_return []
|
35
|
+
|
36
|
+
get :alerts
|
37
|
+
end
|
38
|
+
end
|
5
39
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "histories", stub: :daemon do
|
4
|
+
let!(:exists_user) { build(:user) }
|
5
|
+
include_context 'daemon has some config histories'
|
6
|
+
|
7
|
+
before do
|
8
|
+
login_with exists_user
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'index' do
|
12
|
+
before do
|
13
|
+
visit '/daemon/setting/histories'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'show histories#index' do
|
17
|
+
page.should have_css('h1', text: I18n.t('fluentd.settings.histories.index.page_title'))
|
18
|
+
expect(all('.row tr').count).to eq 9 + 1 # links to hisotries#show + 1 table header
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'will go to histories#show' do
|
22
|
+
all('.row tr td a').first.click
|
23
|
+
|
24
|
+
page.should have_css('h1', text: I18n.t('fluentd.settings.histories.show.page_title'))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'show' do
|
29
|
+
let(:last_backup_file) { Fluentd::SettingArchive::BackupFile.new(daemon.agent.backup_files_in_new_order.first) }
|
30
|
+
|
31
|
+
before do
|
32
|
+
visit "/daemon/setting/histories/#{last_backup_file.file_id}"
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'show histories#show' do
|
36
|
+
page.should have_css('h1', text: I18n.t('fluentd.settings.histories.show.page_title'))
|
37
|
+
page.should have_text(last_backup_file.content)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'update config and redirect to setting#show' do
|
41
|
+
click_link I18n.t("terms.reuse")
|
42
|
+
|
43
|
+
page.should have_css('h1', text: I18n.t('fluentd.settings.show.page_title'))
|
44
|
+
page.should have_text(I18n.t('messages.config_successfully_copied', brand: 'fluentd') )
|
45
|
+
page.should have_text(last_backup_file.content)
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "configtest" do
|
49
|
+
let(:daemon) { build(:fluentd, variant: "fluentd_gem") } # To use fluentd_gem for real dry-run checking
|
50
|
+
before do
|
51
|
+
daemon.agent.config_write config
|
52
|
+
daemon.agent.config_write "# dummy"
|
53
|
+
backup = Fluentd::SettingArchive::BackupFile.new(daemon.agent.backup_files_in_new_order.first)
|
54
|
+
visit "/daemon/setting/histories/#{backup.file_id}"
|
55
|
+
click_link I18n.t("terms.configtest")
|
56
|
+
end
|
57
|
+
|
58
|
+
context "invalid configfile" do
|
59
|
+
let(:config) { <<-CONFIG }
|
60
|
+
<source>
|
61
|
+
type aaaaaaaaaaaa
|
62
|
+
</source>
|
63
|
+
CONFIG
|
64
|
+
|
65
|
+
it do
|
66
|
+
page.should_not have_css('.alert-success')
|
67
|
+
page.should have_css('.alert-danger')
|
68
|
+
page.should have_text(%Q|Unknown input plugin 'aaaaaaaaaaaa'|)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "valid configfile" do
|
73
|
+
let(:config) { <<-CONFIG }
|
74
|
+
<source>
|
75
|
+
type syslog
|
76
|
+
tag syslog
|
77
|
+
</source>
|
78
|
+
CONFIG
|
79
|
+
|
80
|
+
it do
|
81
|
+
page.should have_css('.alert-success')
|
82
|
+
page.should_not have_css('.alert-danger')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "notes", stub: :daemon do
|
4
|
+
let!(:exists_user) { build(:user) }
|
5
|
+
include_context 'daemon has some config histories'
|
6
|
+
|
7
|
+
before { login_with exists_user }
|
8
|
+
|
9
|
+
describe 'update' do
|
10
|
+
let(:note_field) { ".note-content" }
|
11
|
+
let(:updating_content) { "This config file is for ..." }
|
12
|
+
|
13
|
+
before do
|
14
|
+
visit '/daemon/setting/histories'
|
15
|
+
within first("form") do
|
16
|
+
first(note_field).set updating_content
|
17
|
+
click_button(I18n.t('terms.save'))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "update a content of a note" do
|
22
|
+
within first("form") do
|
23
|
+
first(note_field).value.should eq updating_content
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|