summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorArnstein Ressem <aressem@gmail.com>2023-02-27 11:06:36 +0100
committerGitHub <noreply@github.com>2023-02-27 11:06:36 +0100
commit694fb53d3bd0c1646fce7f42c98bbb71d3232ebb (patch)
tree26c02d54f1fbc62e020520cfb806f8cfda0462fc /client
parent89bcb33930ad6f04e21a8699f7a7544b3cee9a5b (diff)
Revert "remove complicated code trying to find a good hostname"
Diffstat (limited to 'client')
-rw-r--r--client/go/internal/vespa/detect_hostname.go72
-rw-r--r--client/go/internal/vespa/detect_hostname_test.go14
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)
}