blob: a291080cc3dd79c5272d4b7d25964cd20d3b3e1d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# frozen_string_literal: true
require 'net/dns'
require 'resolv'
module Gitlab
module Database
module LoadBalancing
class Resolver
UnresolvableNameserverError = Class.new(StandardError)
def initialize(nameserver)
@nameserver = nameserver
end
def resolve
address = ip_address || ip_address_from_hosts_file ||
ip_address_from_dns
unless address
raise UnresolvableNameserverError,
"could not resolve #{@nameserver}"
end
address
end
private
def ip_address
IPAddr.new(@nameserver)
rescue IPAddr::InvalidAddressError
end
def ip_address_from_hosts_file
ip = Resolv::Hosts.new.getaddress(@nameserver)
IPAddr.new(ip)
rescue Resolv::ResolvError
end
def ip_address_from_dns
answer = Net::DNS::Resolver.start(@nameserver, Net::DNS::A).answer
return if answer.empty?
answer.first.address
rescue Net::DNS::Resolver::NoResponseError
raise UnresolvableNameserverError, "no response from DNS server(s)"
end
end
end
end
end
|