github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/integration/helpers/command.go (about) 1 package helpers 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "os/exec" 8 "regexp" 9 "strings" 10 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13 . "github.com/onsi/gomega/gexec" 14 ) 15 16 const ( 17 DebugCommandPrefix = "\nCMD>" 18 DebugCommandPrefixWithDir = "\nCMD %s>" 19 DebugOutPrefix = "OUT: " 20 DebugErrPrefix = "ERR: " 21 ) 22 23 var isPass = regexp.MustCompile("(?i)password|token") 24 25 func CF(args ...string) *Session { 26 WriteCommand("", nil, args) 27 session, err := Start( 28 exec.Command("cf", args...), 29 NewPrefixedWriter(DebugOutPrefix, GinkgoWriter), 30 NewPrefixedWriter(DebugErrPrefix, GinkgoWriter)) 31 Expect(err).NotTo(HaveOccurred()) 32 return session 33 } 34 35 type CFEnv struct { 36 WorkingDirectory string 37 EnvVars map[string]string 38 stdin io.Reader 39 } 40 41 func CustomCF(cfEnv CFEnv, args ...string) *Session { 42 command := exec.Command("cf", args...) 43 if cfEnv.stdin != nil { 44 command.Stdin = cfEnv.stdin 45 } 46 if cfEnv.WorkingDirectory != "" { 47 command.Dir = cfEnv.WorkingDirectory 48 } 49 50 if cfEnv.EnvVars != nil { 51 env := os.Environ() 52 for key, val := range cfEnv.EnvVars { 53 env = AddOrReplaceEnvironment(env, key, val) 54 } 55 command.Env = env 56 } 57 58 WriteCommand("", cfEnv.EnvVars, args) 59 session, err := Start( 60 command, 61 NewPrefixedWriter(DebugOutPrefix, GinkgoWriter), 62 NewPrefixedWriter(DebugErrPrefix, GinkgoWriter)) 63 Expect(err).NotTo(HaveOccurred()) 64 return session 65 } 66 67 func DebugCustomCF(cfEnv CFEnv, args ...string) *Session { 68 if cfEnv.EnvVars == nil { 69 cfEnv.EnvVars = map[string]string{} 70 } 71 cfEnv.EnvVars["CF_LOG_LEVEL"] = "debug" 72 73 return CustomCF(cfEnv, args...) 74 } 75 76 func CFWithStdin(stdin io.Reader, args ...string) *Session { 77 WriteCommand("", nil, args) 78 command := exec.Command("cf", args...) 79 command.Stdin = stdin 80 session, err := Start( 81 command, 82 NewPrefixedWriter(DebugOutPrefix, GinkgoWriter), 83 NewPrefixedWriter(DebugErrPrefix, GinkgoWriter)) 84 Expect(err).NotTo(HaveOccurred()) 85 return session 86 } 87 88 func CFWithEnv(envVars map[string]string, args ...string) *Session { 89 return CustomCF(CFEnv{EnvVars: envVars}, args...) 90 } 91 92 func WriteCommand(workingDir string, env map[string]string, args []string) { 93 start := DebugCommandPrefix 94 if workingDir != "" { 95 start = fmt.Sprintf(DebugCommandPrefixWithDir, workingDir) 96 } 97 98 display := []string{ 99 start, 100 } 101 102 for key, val := range env { 103 if isPass.MatchString(key) { 104 val = "*****" 105 } 106 display = append(display, fmt.Sprintf("%s=%s", key, val)) 107 } 108 109 display = append(display, "cf") 110 display = append(display, args...) 111 GinkgoWriter.Write([]byte(strings.Join(append(display, "\n"), " "))) 112 }