2021-10-18 20:16:29 +00:00
|
|
|
package dns
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-11-13 22:04:58 +00:00
|
|
|
"net"
|
2021-10-18 20:16:29 +00:00
|
|
|
)
|
|
|
|
|
2021-11-13 22:04:58 +00:00
|
|
|
// EnsureIPv4 ensures that an ipv4 address is set for a domain name
|
|
|
|
func EnsureIPv4(domainName string) (string, error) {
|
2023-10-04 01:24:30 +00:00
|
|
|
ipv4, err := net.ResolveIPAddr("ip4", domainName)
|
2021-11-13 22:04:58 +00:00
|
|
|
if err != nil {
|
2023-01-31 15:09:09 +00:00
|
|
|
return "", err
|
2021-11-13 22:04:58 +00:00
|
|
|
}
|
|
|
|
|
2023-10-04 01:24:30 +00:00
|
|
|
// NOTE(d1): e.g. when there is only an ipv6 record available
|
|
|
|
if ipv4 == nil {
|
|
|
|
return "", fmt.Errorf("unable to resolve ipv4 address for %s", domainName)
|
|
|
|
}
|
|
|
|
|
2023-01-31 15:09:09 +00:00
|
|
|
return ipv4.String(), nil
|
2021-11-13 22:04:58 +00:00
|
|
|
}
|
2021-11-14 21:45:49 +00:00
|
|
|
|
|
|
|
// EnsureDomainsResolveSameIPv4 ensures that domains resolve to the same ipv4 address
|
|
|
|
func EnsureDomainsResolveSameIPv4(domainName, server string) (string, error) {
|
2022-08-14 20:20:17 +00:00
|
|
|
if server == "default" || server == "local" {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
|
2021-11-14 21:45:49 +00:00
|
|
|
var ipv4 string
|
|
|
|
|
|
|
|
domainIPv4, err := EnsureIPv4(domainName)
|
|
|
|
if err != nil {
|
|
|
|
return ipv4, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if domainIPv4 == "" {
|
|
|
|
return ipv4, fmt.Errorf("cannot resolve ipv4 for %s?", domainName)
|
|
|
|
}
|
|
|
|
|
|
|
|
serverIPv4, err := EnsureIPv4(server)
|
|
|
|
if err != nil {
|
|
|
|
return ipv4, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if serverIPv4 == "" {
|
|
|
|
return ipv4, fmt.Errorf("cannot resolve ipv4 for %s?", server)
|
|
|
|
}
|
|
|
|
|
|
|
|
if domainIPv4 != serverIPv4 {
|
|
|
|
err := "app domain %s (%s) does not appear to resolve to app server %s (%s)?"
|
|
|
|
return ipv4, fmt.Errorf(err, domainName, domainIPv4, server, serverIPv4)
|
|
|
|
}
|
|
|
|
|
|
|
|
return ipv4, nil
|
|
|
|
}
|