cryptcheck/lib/cryptcheck/host.rb

85 lines
2.2 KiB
Ruby
Raw Normal View History

2020-02-22 16:07:45 +00:00
require 'awesome_print'
require 'timeout'
module CryptCheck
class Host
MAX_ANALYSIS_DURATION = 600
attr_reader :servers, :error
def initialize(hostname, port)
@hostname, @port = hostname, port
first = true
@servers = resolve.collect do |args|
_, ip = args
first ? (first = false) : Logger.info { '' }
result = begin
server = ::Timeout.timeout MAX_ANALYSIS_DURATION do
server(*args)
end
Logger.info ''
Logger.info { "Grade : #{server.grade.to_s.colorize server.grade_status}" }
Logger.info { server.states.ai }
server
rescue => e
Logger.error { e }
raise if ENV['DEV_MODE']
e
end
[[@hostname, ip, @port], result]
end.to_h
rescue => e
Logger.error { e }
@error = e
raise if CryptCheck.dev?
end
def key
{ hostname: @hostname, port: @port }
end
def to_h
if @error
target = [self.key.merge(error: @error.to_s)]
else
target = @servers.collect do |host, server|
hostname, ip, port = host
host = {
hostname: hostname,
ip: ip,
port: port
}
case server
when Server
host[:handshakes] = server.to_h
host[:states] = server.states
host[:grade] = server.grade
else
host[:error] = server.to_s
end
host
end
end
target
end
private
def resolve
begin
begin
ip = IPAddr.new @hostname
return [[nil, ip.to_s, ip.family, @port]]
rescue IPAddr::InvalidAddressError
end
::Addrinfo.getaddrinfo(@hostname, nil, nil, :STREAM)
.collect { |a| [@hostname, a.ip_address, a.afamily, @port] }
2020-05-10 15:19:17 +00:00
end.reject do |_1, _2, family, *_3|
2020-02-22 16:07:45 +00:00
(ENV['DISABLE_IPv6'] && family == Socket::AF_INET6) ||
(ENV['DISABLE_IPv4'] && family == Socket::AF_INET)
end
end
end
end