2018-12-13 13:39:08 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
module SystemCheck
|
|
|
|
# Base class for Checks. You must inherit from here
|
|
|
|
# and implement the methods below when necessary
|
|
|
|
class BaseCheck
|
|
|
|
include ::SystemCheck::Helpers
|
|
|
|
|
|
|
|
# Define a custom term for when check passed
|
|
|
|
#
|
|
|
|
# @param [String] term used when check passed (default: 'yes')
|
|
|
|
def self.set_check_pass(term)
|
|
|
|
@check_pass = term
|
|
|
|
end
|
|
|
|
|
|
|
|
# Define a custom term for when check failed
|
|
|
|
#
|
|
|
|
# @param [String] term used when check failed (default: 'no')
|
|
|
|
def self.set_check_fail(term)
|
|
|
|
@check_fail = term
|
|
|
|
end
|
|
|
|
|
|
|
|
# Define the name of the SystemCheck that will be displayed during execution
|
|
|
|
#
|
|
|
|
# @param [String] name of the check
|
|
|
|
def self.set_name(name)
|
|
|
|
@name = name
|
|
|
|
end
|
|
|
|
|
|
|
|
# Define the reason why we skipped the SystemCheck
|
|
|
|
#
|
|
|
|
# This is only used if subclass implements `#skip?`
|
|
|
|
#
|
|
|
|
# @param [String] reason to be displayed
|
|
|
|
def self.set_skip_reason(reason)
|
|
|
|
@skip_reason = reason
|
|
|
|
end
|
|
|
|
|
|
|
|
# Term to be displayed when check passed
|
|
|
|
#
|
|
|
|
# @return [String] term when check passed ('yes' if not re-defined in a subclass)
|
|
|
|
def self.check_pass
|
|
|
|
call_or_return(@check_pass) || 'yes'
|
|
|
|
end
|
|
|
|
|
|
|
|
## Term to be displayed when check failed
|
|
|
|
#
|
|
|
|
# @return [String] term when check failed ('no' if not re-defined in a subclass)
|
|
|
|
def self.check_fail
|
|
|
|
call_or_return(@check_fail) || 'no'
|
|
|
|
end
|
|
|
|
|
|
|
|
# Name of the SystemCheck defined by the subclass
|
|
|
|
#
|
|
|
|
# @return [String] the name
|
|
|
|
def self.display_name
|
|
|
|
call_or_return(@name) || self.name
|
|
|
|
end
|
|
|
|
|
|
|
|
# Skip reason defined by the subclass
|
|
|
|
#
|
|
|
|
# @return [String] the reason
|
|
|
|
def self.skip_reason
|
|
|
|
call_or_return(@skip_reason) || 'skipped'
|
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
# Define a reason why we skipped the SystemCheck (during runtime)
|
|
|
|
#
|
|
|
|
# This is used when you need dynamic evaluation like when you have
|
|
|
|
# multiple reasons why a check can fail
|
|
|
|
#
|
|
|
|
# @param [String] reason to be displayed
|
2019-03-02 22:35:43 +05:30
|
|
|
attr_writer :skip_reason
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
# Skip reason defined during runtime
|
|
|
|
#
|
|
|
|
# This value have precedence over the one defined in the subclass
|
|
|
|
#
|
|
|
|
# @return [String] the reason
|
2019-03-02 22:35:43 +05:30
|
|
|
attr_reader :skip_reason
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
# Does the check support automatically repair routine?
|
|
|
|
#
|
|
|
|
# @return [Boolean] whether check implemented `#repair!` method or not
|
|
|
|
def can_repair?
|
|
|
|
self.class.instance_methods(false).include?(:repair!)
|
|
|
|
end
|
|
|
|
|
|
|
|
def can_skip?
|
|
|
|
self.class.instance_methods(false).include?(:skip?)
|
|
|
|
end
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
def multi_check?
|
2017-09-10 17:25:29 +05:30
|
|
|
self.class.instance_methods(false).include?(:multi_check)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Execute the check routine
|
|
|
|
#
|
|
|
|
# This is where you should implement the main logic that will return
|
|
|
|
# a boolean at the end
|
|
|
|
#
|
|
|
|
# You should not print any output to STDOUT here, use the specific methods instead
|
|
|
|
#
|
|
|
|
# @return [Boolean] whether check passed or failed
|
|
|
|
def check?
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
# Execute a custom check that cover multiple unities
|
|
|
|
#
|
|
|
|
# When using multi_check you have to provide the output yourself
|
|
|
|
def multi_check
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
# Prints troubleshooting instructions
|
|
|
|
#
|
|
|
|
# This is where you should print detailed information for any error found during #check?
|
|
|
|
#
|
|
|
|
# You may use helper methods to help format the output:
|
|
|
|
#
|
|
|
|
# @see #try_fixing_it
|
|
|
|
# @see #fix_and_rerun
|
|
|
|
# @see #for_more_infromation
|
|
|
|
def show_error
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
# When implemented by a subclass, will attempt to fix the issue automatically
|
|
|
|
def repair!
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
# When implemented by a subclass, will evaluate whether check should be skipped or not
|
|
|
|
#
|
|
|
|
# @return [Boolean] whether or not this check should be skipped
|
|
|
|
def skip?
|
|
|
|
raise NotImplementedError
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.call_or_return(input)
|
|
|
|
input.respond_to?(:call) ? input.call : input
|
|
|
|
end
|
|
|
|
private_class_method :call_or_return
|
|
|
|
end
|
|
|
|
end
|