Commit 3f187751 authored by Gabriel Mazetto's avatar Gabriel Mazetto

Fixed and improved some existing checks and SystemCheck library

parent bca56037
......@@ -9,22 +9,13 @@ module SystemCheck
#
# @param [String] component name of the component relative to the checks being executed
# @param [Array<BaseCheck>] checks classes of corresponding checks to be executed in the same order
# @param [BaseExecutor] executor_klass optionally specifiy a different executor class
def self.run(component, checks = [], executor_klass = SimpleExecutor)
unless executor_klass < BaseExecutor
raise ArgumentError, 'Invalid executor'
end
prepare(component, checks, executor_klass).execute
end
def self.run(component, checks = [])
executor = SimpleExecutor.new(component)
def self.prepare(component, checks = [], executor_klass = SimpleExecutor)
executor = executor_klass.new(component)
checks.each do |check|
executor << check
end
executor
executor.execute
end
private_class_method :prepare
end
......@@ -15,17 +15,11 @@ module SystemCheck
'Check that the information in config/database.yml is correct'
)
for_more_information(
see_database_guide,
'doc/install/databases.md',
'http://guides.rubyonrails.org/getting_started.html#configuring-a-database'
)
fix_and_rerun
end
private
def see_database_guide
'doc/install/databases.md'
end
end
end
end
......@@ -5,7 +5,7 @@ module SystemCheck
'core.autocrlf' => 'input'
}.freeze
set_name 'Git configured with autocrlf=input?'
set_name 'Git configured correctly?'
def check?
correct_options = OPTIONS.map do |name, value|
......@@ -15,8 +15,18 @@ module SystemCheck
correct_options.all?
end
# Tries to configure git itself
#
# Returns true if all subcommands were successful (according to their exit code)
# Returns false if any or all subcommands failed.
def repair!
auto_fix_git_config(OPTIONS)
return false unless is_gitlab_user?
command_success = OPTIONS.map do |name, value|
system(*%W(#{Gitlab.config.git.bin_path} config --global #{name} #{value}))
end
command_success.all?
end
def show_error
......@@ -27,24 +37,6 @@ module SystemCheck
see_installation_guide_section 'GitLab'
)
end
private
# Tries to configure git itself
#
# Returns true if all subcommands were successfull (according to their exit code)
# Returns false if any or all subcommands failed.
def auto_fix_git_config(options)
if !@warned_user_not_gitlab
command_success = options.map do |name, value|
system(*%W(#{Gitlab.config.git.bin_path} config --global #{name} #{value}))
end
command_success.all?
else
false
end
end
end
end
end
module SystemCheck
module App
class GitlabConfigNotOutdatedCheck < SystemCheck::BaseCheck
set_name 'GitLab config outdated?'
set_check_pass 'no'
set_check_fail 'yes'
class GitlabConfigUpToDateCheck < SystemCheck::BaseCheck
set_name 'GitLab config up to date?'
set_skip_reason "can't check because of previous errors"
def skip?
......@@ -18,7 +16,7 @@ module SystemCheck
def show_error
try_fixing_it(
'Backup your config/gitlab.yml',
'Back-up your config/gitlab.yml',
'Copy config/gitlab.yml.example to config/gitlab.yml',
'Update config/gitlab.yml to match your setup'
)
......
module SystemCheck
module App
class ProjectsHaveNamespaceCheck < SystemCheck::BaseCheck
set_name 'projects have namespace: '
set_name 'Projects have namespace:'
set_skip_reason "can't check, you have no projects"
def skip?
......
......@@ -5,7 +5,7 @@ module SystemCheck
set_check_pass -> { "yes (#{self.current_version})" }
def self.required_version
@required_version ||= Gitlab::VersionInfo.new(2, 1, 0)
@required_version ||= Gitlab::VersionInfo.new(2, 3, 3)
end
def self.current_version
......
require 'tasks/gitlab/task_helpers'
module SystemCheck
# Base class for Checks. You must inherit from here
# and implement the methods below when necessary
class BaseCheck
include ::Gitlab::TaskHelpers
include ::SystemCheck::Helpers
# Define a custom term for when check passed
......
require 'tasks/gitlab/task_helpers'
module SystemCheck
module Helpers
include ::Gitlab::TaskHelpers
# Display a message telling to fix and rerun the checks
def fix_and_rerun
$stdout.puts ' Please fix the error above and rerun the checks.'.color(:red)
......@@ -9,8 +13,6 @@ module SystemCheck
#
# @param [Array<String>] sources one or more references (documentation or links)
def for_more_information(*sources)
sources = sources.shift if sources.first.is_a?(Array)
$stdout.puts ' For more information see:'.color(:blue)
sources.each do |source|
$stdout.puts " #{source}"
......@@ -73,5 +75,12 @@ module SystemCheck
def sudo_gitlab(command)
"sudo -u #{gitlab_user} -H #{command}"
end
def is_gitlab_user?
return @is_gitlab_user unless @is_gitlab_user.nil?
current_user = run_command(%w(whoami)).chomp
@is_gitlab_user = current_user == gitlab_user
end
end
end
......@@ -18,32 +18,32 @@ module SystemCheck
# Executes a single check
#
# @param [SystemCheck::BaseCheck] check
def run_check(check)
$stdout.print "#{check.display_name} ... "
# @param [SystemCheck::BaseCheck] check_klass
def run_check(check_klass)
$stdout.print "#{check_klass.display_name} ... "
c = check.new
check = check_klass.new
# When implements skip method, we run it first, and if true, skip the check
if c.can_skip? && c.skip?
$stdout.puts check.skip_reason.color(:magenta)
if check.can_skip? && check.skip?
$stdout.puts check_klass.skip_reason.color(:magenta)
return
end
# When implements a multi check, we don't control the output
if c.is_multi_check?
c.multi_check
if check.is_multi_check?
check.multi_check
return
end
if c.check?
$stdout.puts check.check_pass.color(:green)
if check.check?
$stdout.puts check_klass.check_pass.color(:green)
else
$stdout.puts check.check_fail.color(:red)
$stdout.puts check_klass.check_fail.color(:red)
if c.can_repair?
if check.can_repair?
$stdout.print 'Trying to fix error automatically. ...'
if c.repair!
if check.repair!
$stdout.puts 'Success'.color(:green)
return
else
......@@ -51,7 +51,7 @@ module SystemCheck
end
end
c.show_error
check.show_error
end
end
......
......@@ -21,7 +21,7 @@ namespace :gitlab do
SystemCheck::App::MigrationsAreUpCheck,
SystemCheck::App::OrphanedGroupMembersCheck,
SystemCheck::App::GitlabConfigExistsCheck,
SystemCheck::App::GitlabConfigNotOutdatedCheck,
SystemCheck::App::GitlabConfigUpToDateCheck,
SystemCheck::App::LogWritableCheck,
SystemCheck::App::TmpWritableCheck,
SystemCheck::App::UploadsDirectoryExistsCheck,
......
......@@ -99,16 +99,17 @@ module Gitlab
end
def warn_user_is_not_gitlab
unless @warned_user_not_gitlab
gitlab_user = Gitlab.config.gitlab.user
return if @warned_user_not_gitlab
unless is_gitlab_user?
current_user = run_command(%w(whoami)).chomp
unless current_user == gitlab_user
puts " Warning ".color(:black).background(:yellow)
puts " You are running as user #{current_user.color(:magenta)}, we hope you know what you are doing."
puts " Things may work\/fail for the wrong reasons."
puts " For correct results you should run this as user #{gitlab_user.color(:magenta)}."
puts ""
end
puts " Warning ".color(:black).background(:yellow)
puts " You are running as user #{current_user.color(:magenta)}, we hope you know what you are doing."
puts " Things may work\/fail for the wrong reasons."
puts " For correct results you should run this as user #{gitlab_user.color(:magenta)}."
puts ""
@warned_user_not_gitlab = true
end
end
......
......@@ -26,7 +26,7 @@ describe SystemCheck::BaseExecutor, lib: true do
subject << SimpleCheck
end
it 'returns an array of classes' do
it 'returns a set of classes' do
expect(subject.checks).to include(SimpleCheck)
end
end
......@@ -39,12 +39,14 @@ describe SystemCheck::BaseExecutor, lib: true do
it 'appends a new check to the Set' do
subject << OtherCheck
stored_checks = subject.checks.to_a
expect(stored_checks.first).to eq(SimpleCheck)
expect(stored_checks.last).to eq(OtherCheck)
end
it 'inserts unique itens only' do
subject << SimpleCheck
expect(subject.checks.size).to eq(1)
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment