diff --git a/main.go b/main.go index e0244ec..4f06ab4 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,9 @@ import ( "net/url" "os" "time" - + "fmt" + "golang.org/x/term" + "strings" "github.com/erikgeiser/promptkit/confirmation" "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/flavors" log "github.com/sirupsen/logrus" @@ -83,6 +85,22 @@ var rootCmd = &cobra.Command{ log.SetLevel(log.DebugLevel) } + if password == "" { + if !term.IsTerminal(int(os.Stdin.Fd())) { + return fmt.Errorf("password is required but terminal is not interactive; please provide --vmware-password flag") + } + fmt.Print("Enter VMware Password: ") + + // ReadPassword hides the user's typing for security + bytePassword, err := term.ReadPassword(int(os.Stdin.Fd())) + if err != nil { + fmt.Fprintf(os.Stderr, "Error reading password: %v\n", err) + return err + } + password = strings.TrimSpace(string(bytePassword)) + fmt.Println() // Add a newline since ReadPassword doesn't print one + } + endpointUrl := &url.URL{ Scheme: "https", Host: endpoint, @@ -335,7 +353,6 @@ func init() { rootCmd.MarkPersistentFlagRequired("vmware-username") rootCmd.PersistentFlags().StringVar(&password, "vmware-password", "", "VMware password") - rootCmd.MarkPersistentFlagRequired("vmware-password") rootCmd.PersistentFlags().StringVar(&path, "vmware-path", "", "VMware VM path (e.g. '/Datacenter/vm/VM')") rootCmd.MarkPersistentFlagRequired("vmware-path")