diff options
author | Arnstein Ressem <aressem@gmail.com> | 2023-02-27 11:06:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-27 11:06:36 +0100 |
commit | 694fb53d3bd0c1646fce7f42c98bbb71d3232ebb (patch) | |
tree | 26c02d54f1fbc62e020520cfb806f8cfda0462fc /client | |
parent | 89bcb33930ad6f04e21a8699f7a7544b3cee9a5b (diff) |
Revert "remove complicated code trying to find a good hostname"
Diffstat (limited to 'client')
-rw-r--r-- | client/go/internal/vespa/detect_hostname.go | 72 | ||||
-rw-r--r-- | client/go/internal/vespa/detect_hostname_test.go | 14 |
2 files changed, 84 insertions, 2 deletions
diff --git a/client/go/internal/vespa/detect_hostname.go b/client/go/internal/vespa/detect_hostname.go index 9d32ae1a2fd..9729fd80400 100644 --- a/client/go/internal/vespa/detect_hostname.go +++ b/client/go/internal/vespa/detect_hostname.go @@ -4,10 +4,14 @@ package vespa import ( + "fmt" "net" "os" + "strings" "github.com/vespa-engine/vespa/client/go/internal/admin/envvars" + "github.com/vespa-engine/vespa/client/go/internal/admin/trace" + "github.com/vespa-engine/vespa/client/go/internal/util" ) // detect if this host is IPv6-only, in which case we want to pass @@ -52,8 +56,76 @@ func FindOurHostname() (string, error) { if err != nil { name = "localhost" } + name, err = findOurHostnameFrom(name) if err == nil { os.Setenv(envvars.VESPA_HOSTNAME, name) } return name, err } + +func validateHostname(name string) bool { + ipAddrs, _ := net.LookupIP(name) + trace.Debug("lookupIP", name, "=>", ipAddrs) + if len(ipAddrs) < 1 { + return false + } + myIpAddresses := make(map[string]bool) + interfaceAddrs, _ := net.InterfaceAddrs() + for _, ifAddr := range interfaceAddrs { + // note: ifAddr.String() is typically "127.0.0.1/8" + if ipnet, ok := ifAddr.(*net.IPNet); ok { + myIpAddresses[ipnet.IP.String()] = true + } + } + trace.Debug("validate with interfaces =>", myIpAddresses) + someGood := false + for _, addr := range ipAddrs { + if len(myIpAddresses) == 0 { + // no validation possible, assume OK + return true + } + if myIpAddresses[addr.String()] { + someGood = true + } else { + return false + } + } + return someGood +} + +func goodHostname(name string) (result string, good bool) { + result = strings.TrimSpace(name) + result = strings.TrimSuffix(result, ".") + if name != result { + trace.Trace("trimmed hostname", name, "=>", result) + } + good = strings.Contains(result, ".") && validateHostname(result) + trace.Debug("hostname:", result, "good =>", good) + return +} + +func findOurHostnameFrom(name string) (string, error) { + trimmed, good := goodHostname(name) + if good { + return trimmed, nil + } + backticks := util.BackTicksIgnoreStderr + out, err := backticks.Run("vespa-detect-hostname") + if err != nil { + out, err = backticks.Run("hostname", "-f") + } + if err != nil { + out, err = backticks.Run("hostname") + } + alternate, good := goodHostname(out) + if err == nil && good { + return alternate, nil + } + if validateHostname(trimmed) { + return trimmed, nil + } + if validateHostname(alternate) { + return alternate, nil + } + return "localhost", fmt.Errorf("fallback to localhost [os.Hostname was '%s']", name) +} diff --git a/client/go/internal/vespa/detect_hostname_test.go b/client/go/internal/vespa/detect_hostname_test.go index 4afb139743d..324701efb6f 100644 --- a/client/go/internal/vespa/detect_hostname_test.go +++ b/client/go/internal/vespa/detect_hostname_test.go @@ -4,6 +4,7 @@ package vespa import ( "fmt" "os" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -17,7 +18,16 @@ func TestDetectHostname(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "foo.bar", got) os.Unsetenv("VESPA_HOSTNAME") - got, _ = FindOurHostname() + got, err = findOurHostnameFrom("bar.foo.123") + fmt.Fprintln(os.Stderr, "findOurHostname from bar.foo.123 returns:", got, "with error:", err) assert.NotEqual(t, "", got) - fmt.Fprintln(os.Stderr, "FindOurHostname() returns:", got, "with error:", err) + parts := strings.Split(got, ".") + if len(parts) > 1 { + expanded, err2 := findOurHostnameFrom(parts[0]) + fmt.Fprintln(os.Stderr, "findOurHostname from", parts[0], "returns:", expanded, "with error:", err2) + assert.Equal(t, got, expanded) + } + got, err = findOurHostnameFrom("") + assert.NotEqual(t, "", got) + fmt.Fprintln(os.Stderr, "findOurHostname('') returns:", got, "with error:", err) } |