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  }