pkg/mesh: don't let hostname resolution stop mesh

If the hostname fails to resolve, this should not be considered a
blocking error. Most likely, it means that the hostname is simply not
resolvable, which should not be a requirement to run Kilo. In this case,
simply try to find a valid IP from other sources.
This commit is contained in:
Lucas Servén Marín 2019-05-17 18:09:27 +02:00
parent c9969f5be9
commit 51df7fc4e3
No known key found for this signature in database
GPG Key ID: 586FEAF680DA74AD

View File

@ -62,10 +62,7 @@ func getIP(hostname string, ignoreIfaces ...int) (*net.IPNet, *net.IPNet, error)
var hostPriv, hostPub []*net.IPNet var hostPriv, hostPub []*net.IPNet
{ {
// Check IPs to which hostname resolves first. // Check IPs to which hostname resolves first.
ips, err := ipsForHostname(hostname) ips := ipsForHostname(hostname)
if err != nil {
return nil, nil, err
}
for _, ip := range ips { for _, ip := range ips {
ok, mask, err := assignedToInterface(ip) ok, mask, err := assignedToInterface(ip)
if err != nil { if err != nil {
@ -241,19 +238,20 @@ func isPublic(ip *net.IPNet) bool {
// ipsForHostname returns a slice of IPs to which the // ipsForHostname returns a slice of IPs to which the
// given hostname resolves. // given hostname resolves.
func ipsForHostname(hostname string) ([]*net.IPNet, error) { func ipsForHostname(hostname string) []*net.IPNet {
if ip := net.ParseIP(hostname); ip != nil { if ip := net.ParseIP(hostname); ip != nil {
return []*net.IPNet{oneAddressCIDR(ip)}, nil return []*net.IPNet{oneAddressCIDR(ip)}
} }
ips, err := net.LookupIP(hostname) ips, err := net.LookupIP(hostname)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to lookip IPs of hostname: %v", err) // Most likely the hostname is not resolvable.
return nil
} }
nets := make([]*net.IPNet, len(ips)) nets := make([]*net.IPNet, len(ips))
for i := range ips { for i := range ips {
nets[i] = oneAddressCIDR(ips[i]) nets[i] = oneAddressCIDR(ips[i])
} }
return nets, nil return nets
} }
// ipsForAllInterfaces returns a slice of IPs assigned to all the // ipsForAllInterfaces returns a slice of IPs assigned to all the