diff options
Diffstat (limited to 'client/go/internal/vespa/find_home.go')
-rw-r--r-- | client/go/internal/vespa/find_home.go | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/client/go/internal/vespa/find_home.go b/client/go/internal/vespa/find_home.go new file mode 100644 index 00000000000..672d3d18724 --- /dev/null +++ b/client/go/internal/vespa/find_home.go @@ -0,0 +1,90 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// get or find VESPA_HOME +// Author: arnej + +package vespa + +import ( + "fmt" + "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" +) + +const ( + defaultVespaInstallDir = "/opt/vespa" + scriptUtilsFilename = "libexec/vespa/script-utils" +) + +func FindHome() string { + // use env var if it is set: + if ev := os.Getenv(envvars.VESPA_HOME); ev != "" { + return ev + } + // some helper functions... + var dirName = func(path string) string { + idx := strings.LastIndex(path, "/") + if idx < 0 { + return "" + } + return path[:idx] + } + var findPath = func() string { + myProgName := os.Args[0] + if strings.HasPrefix(myProgName, "/") { + trace.Debug("findPath", myProgName, "=>", dirName(myProgName)) + return dirName(myProgName) + } + if strings.Contains(myProgName, "/") { + curDir, _ := os.Getwd() + path := fmt.Sprintf("%s/%s", curDir, dirName(myProgName)) + trace.Debug("findPath", myProgName, "=>", path) + return path + } + for _, dir := range strings.Split(os.Getenv(envvars.PATH), ":") { + fn := fmt.Sprintf("%s/%s", dir, myProgName) + if util.IsRegularFile(fn) { + trace.Debug("findPath", myProgName, "=>", dir) + return dir + } + } + return "" + } + // detect path from argv[0] + for path := findPath(); path != ""; path = dirName(path) { + mySelf := fmt.Sprintf("%s/%s", path, scriptUtilsFilename) + if util.IsRegularFile(mySelf) { + trace.Debug("found", mySelf, "VH =>", path) + os.Setenv(envvars.VESPA_HOME, path) + return path + } + } + // fallback + os.Setenv(envvars.VESPA_HOME, defaultVespaInstallDir) + return defaultVespaInstallDir +} + +func HasFileUnderVespaHome(fn string) (bool, string) { + fileName := fmt.Sprintf("%s/%s", FindHome(), fn) + file, err := os.Open(fileName) + if file != nil { + file.Close() + if err == nil { + return true, fileName + } + } + return false, "" +} + +func FindAndVerifyVespaHome() string { + vespaHome := FindHome() + myself := fmt.Sprintf("%s/%s", vespaHome, scriptUtilsFilename) + if !util.IsExecutableFile(myself) { + trace.Warning("missing or bad file:", myself) + util.JustExitMsg("Not a valid VESPA_HOME: " + vespaHome) + } + return vespaHome +} |