lib/gdk/diagnostic/status.rb (36 lines of code) (raw):
# frozen_string_literal: true
module GDK
module Diagnostic
class Status < Base
TITLE = 'GDK Status'
RED_TRIANGLE_DOWN_ICON = "\u{1f53b}"
def success?
down_services.empty?
end
def detail
return if success?
lines = ['The following services are not running but should be:']
down_services.each do |service|
service_name = service.split('/').last.split(':').first
log_details = fetch_service_log(service_name)
last_error = extract_error_message(log_details)
lines << (" #{RED_TRIANGLE_DOWN_ICON} #{service_name} → #{last_error}")
end
lines.join("\n")
end
private
def gdk_status_command
@gdk_status_command ||= Shellout.new('gdk status').execute(display_output: false, display_error: false)
end
def down_services
@down_services ||= gdk_status_command.read_stdout.split("\n").grep(/\Adown: .+, want up;.+\z/)
end
def fetch_service_log(service_name)
log_path = Pathname.new(GDK.root).join('log', service_name.to_s, 'current')
return "Log file not found for #{service_name}" unless log_path.exist?
File.open(log_path, 'r') do |file|
file.each_line.reverse_each.find { |line| !line.strip.empty? }&.strip
end
end
def extract_error_message(log_content)
error_patterns = {
/bind.*can't assign requested address/i => "The service couldn't use the required address. This could be due to another application using it or the network is not set up correctly."
}
error_patterns.each do |pattern, message|
return message if log_content.match?(pattern)
end
log_content
end
end
end
end