aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/internal/vespa/find_home.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/go/internal/vespa/find_home.go')
-rw-r--r--client/go/internal/vespa/find_home.go90
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
+}