lib/gdk/diagnostic/gitlab.rb (106 lines of code) (raw):
# frozen_string_literal: true
require 'pathname'
module GDK
module Diagnostic
class Gitlab < Base
TITLE = 'GitLab'
def success?
gitlab_shell_secret_diagnostic.success? && gitlab_log_dir_diagnostic.success?
end
def detail
return if success?
output = []
output << gitlab_shell_secret_diagnostic.detail unless gitlab_shell_secret_diagnostic.success?
output << gitlab_log_dir_diagnostic.detail unless gitlab_log_dir_diagnostic.success?
output.compact.join("\n")
end
private
def gitlab_shell_secret_diagnostic
@gitlab_shell_secret_diagnostic ||= GitlabShellSecretDiagnostic.new(config)
end
def gitlab_log_dir_diagnostic
@gitlab_log_dir_diagnostic ||= GitlabLogDirDiagnostic.new(config)
end
class GitlabShellSecretDiagnostic
GITLAB_SHELL_SECRET_FILE = '.gitlab_shell_secret'
def initialize(config)
@config = config
end
def success?
both_files_exist? && contents_match?
end
def detail
return if success?
if !both_files_exist?
file_doesnt_exist_detail + solution_detail
elsif !contents_match?
contents_match_detail + solution_detail
end
end
private
attr_reader :config
def solution_detail
<<~SOLUTION_MESSAGE
The typical solution is to run 'gdk reconfigure'
SOLUTION_MESSAGE
end
def both_files_exist?
gitlab_shell_secret_in_gitlab.exist? && gitlab_shell_secret_in_gitlab_shell.exist?
end
def file_doesnt_exist_detail
output = ["The following #{GITLAB_SHELL_SECRET_FILE} files don't exist but need to:", '']
output << " #{gitlab_shell_secret_in_gitlab}" unless gitlab_shell_secret_in_gitlab.exist?
output << " #{gitlab_shell_secret_in_gitlab_shell}" unless gitlab_shell_secret_in_gitlab_shell.exist?
"#{output.join("\n")}\n"
end
def contents_match?
gitlab_shell_secret_in_gitlab_contents == gitlab_shell_secret_in_gitlab_shell_contents
end
def contents_match_detail
<<~CONTENT_MISMATCH_MESSSGE
The gitlab-shell secret files need to match but they don't:
#{gitlab_shell_secret_in_gitlab}
#{'-' * gitlab_shell_secret_in_gitlab.to_s.length}
#{gitlab_shell_secret_in_gitlab_contents}
#{gitlab_shell_secret_in_gitlab_shell}
#{'-' * gitlab_shell_secret_in_gitlab_shell.to_s.length}
#{gitlab_shell_secret_in_gitlab_shell_contents}
CONTENT_MISMATCH_MESSSGE
end
def gitlab_shell_secret_in_gitlab
config.gitlab.dir.join(GITLAB_SHELL_SECRET_FILE)
end
def gitlab_shell_secret_in_gitlab_contents
@gitlab_shell_secret_in_gitlab_contents ||= gitlab_shell_secret_in_gitlab.read.chomp
end
def gitlab_shell_secret_in_gitlab_shell
config.gitlab_shell.dir.join(GITLAB_SHELL_SECRET_FILE)
end
def gitlab_shell_secret_in_gitlab_shell_contents
@gitlab_shell_secret_in_gitlab_shell_contents ||= gitlab_shell_secret_in_gitlab_shell.read.chomp
end
end
class GitlabLogDirDiagnostic
LOG_DIR_SIZE_NOT_OK_MB = 1024
BYTES_TO_MEGABYTES = 1_048_576
def initialize(config)
@config = config
end
def success?
log_dir_size_ok?
end
def detail
return if success?
<<~LOG_DIR_SIZE_NOT_OK
Your gitlab/log/ directory is #{log_dir_size}MB. You can truncate the log files if you wish
by running:
cd #{config.gdk_root} && rake gitlab:truncate_logs
LOG_DIR_SIZE_NOT_OK
end
private
attr_reader :config
def log_dir_size_ok?
return true unless config.gitlab.log_dir.exist?
log_dir_size <= LOG_DIR_SIZE_NOT_OK_MB
end
def log_dir_size
@log_dir_size ||= config.gitlab.log_dir.glob('*').sum(&:size) / 1_048_576
end
end
end
end
end