mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/kube-vip/kube-vip.git
synced 2026-09-20 08:03:47 +08:00
Signed-off-by: Patryk Strusiewicz-Surmacki <patryk.pawel.strusiewicz-surmacki@external.telekom.de>
82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
const (
|
|
IPv4Family = "IPv4"
|
|
IPv6Family = "IPv6"
|
|
DualFamily = "dual"
|
|
)
|
|
|
|
// LookupHost resolves dnsName and return an IP or an error
|
|
func LookupHost(dnsName, dnsMode string, requireDualStack bool) ([]string, error) {
|
|
result, err := net.LookupHost(dnsName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(result) == 0 {
|
|
return nil, errors.Errorf("empty address for %s", dnsName)
|
|
}
|
|
addrs := []string{}
|
|
switch dnsMode {
|
|
case strings.ToLower(IPv4Family), strings.ToLower(IPv6Family), DualFamily:
|
|
a, err := getIPbyFamily(result, dnsMode, requireDualStack)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
addrs = append(addrs, a...)
|
|
default:
|
|
addrs = append(addrs, result[0])
|
|
}
|
|
|
|
return addrs, nil
|
|
}
|
|
|
|
func getIPbyFamily(addresses []string, family string, requireDualStack bool) ([]string, error) {
|
|
var checkers []func(string) bool
|
|
families := []string{}
|
|
if family == DualFamily || family == strings.ToLower(IPv4Family) {
|
|
checkers = append(checkers, IsIPv4)
|
|
families = append(families, IPv4Family)
|
|
}
|
|
if family == DualFamily || family == strings.ToLower(IPv6Family) {
|
|
checkers = append(checkers, IsIPv6)
|
|
families = append(families, IPv6Family)
|
|
}
|
|
|
|
addrs := []string{}
|
|
for i, c := range checkers {
|
|
addr, err := getIPbyChecker(addresses, c)
|
|
if err != nil {
|
|
if len(checkers) > 1 && !requireDualStack {
|
|
slog.Warn("no address found", "family", families[i])
|
|
continue
|
|
}
|
|
return nil, fmt.Errorf("error getting %s address: %w", families[i], err)
|
|
}
|
|
addrs = append(addrs, addr)
|
|
}
|
|
|
|
if len(addrs) == 0 {
|
|
return nil, fmt.Errorf("no addresses found")
|
|
}
|
|
|
|
return addrs, nil
|
|
}
|
|
|
|
func getIPbyChecker(addresses []string, checker func(string) bool) (string, error) {
|
|
for _, addr := range addresses {
|
|
if checker(addr) {
|
|
return addr, nil
|
|
}
|
|
}
|
|
return "", fmt.Errorf("address not found")
|
|
}
|