github.com/bigcommerce/nomad@v0.9.3-bc/helper/discover/discover.go (about) 1 package discover 2 3 import ( 4 "fmt" 5 "os" 6 "os/exec" 7 "path/filepath" 8 "runtime" 9 "strings" 10 ) 11 12 // Checks the current executable, then $GOPATH/bin, and finally the CWD, in that 13 // order. If it can't be found, an error is returned. 14 func NomadExecutable() (string, error) { 15 nomadExe := "nomad" 16 if runtime.GOOS == "windows" { 17 nomadExe = "nomad.exe" 18 } 19 20 // Check the current executable. 21 bin, err := os.Executable() 22 if err != nil { 23 return "", fmt.Errorf("Failed to determine the nomad executable: %v", err) 24 } 25 26 if _, err := os.Stat(bin); err == nil && isNomad(bin, nomadExe) { 27 return bin, nil 28 } 29 30 // Check the $PATH 31 if bin, err := exec.LookPath(nomadExe); err == nil { 32 return bin, nil 33 } 34 35 // Check the $GOPATH. 36 bin = filepath.Join(os.Getenv("GOPATH"), "bin", nomadExe) 37 if _, err := os.Stat(bin); err == nil { 38 return bin, nil 39 } 40 41 // Check the CWD. 42 pwd, err := os.Getwd() 43 if err != nil { 44 return "", fmt.Errorf("Could not find Nomad executable (%v): %v", nomadExe, err) 45 } 46 47 bin = filepath.Join(pwd, nomadExe) 48 if _, err := os.Stat(bin); err == nil { 49 return bin, nil 50 } 51 52 // Check CWD/bin 53 bin = filepath.Join(pwd, "bin", nomadExe) 54 if _, err := os.Stat(bin); err == nil { 55 return bin, nil 56 } 57 58 return "", fmt.Errorf("Could not find Nomad executable (%v)", nomadExe) 59 } 60 61 func isNomad(path, nomadExe string) bool { 62 if strings.HasSuffix(path, ".test") || strings.HasSuffix(path, ".test.exe") { 63 return false 64 } 65 return true 66 }