Skip to content
Snippets Groups Projects
Unverified Commit ffcd7d80 authored by Max Jonas Werner's avatar Max Jonas Werner
Browse files

feat: prompt for access tokens in 'bootstrap' command


This change adds functionality to both, `bootstrap github` and
`bootstrap gitlab` to prompt the user for the personal access tokens
if those can't be derived from the shell environment. Echoing is
turned off for better privacy.

Instead of having to interactively type the token or manually paste it
from the clipboard, users can also pipe it to Flux which comes in
handy e.g. when executing Flux remotely over an SSH connection:

```
$ echo 'asdf' | flux bootstrap github
```

Otherwise, Flux will prompt the user:

```
$ flux bootstrap github
Please type your GitHub personal access token:
```

closes #2011

Signed-off-by: default avatarMax Jonas Werner <mail@makk.es>
parent 4bc4aa13
No related branches found
No related tags found
No related merge requests found
...@@ -111,7 +111,11 @@ func init() { ...@@ -111,7 +111,11 @@ func init() {
func bootstrapGitHubCmdRun(cmd *cobra.Command, args []string) error { func bootstrapGitHubCmdRun(cmd *cobra.Command, args []string) error {
ghToken := os.Getenv(ghTokenEnvVar) ghToken := os.Getenv(ghTokenEnvVar)
if ghToken == "" { if ghToken == "" {
return fmt.Errorf("%s environment variable not found", ghTokenEnvVar) var err error
ghToken, err = readPasswordFromStdin("Please type your GitHub personal access token: ")
if err != nil {
return fmt.Errorf("could not read token: %w", err)
}
} }
if err := bootstrapValidate(); err != nil { if err := bootstrapValidate(); err != nil {
......
...@@ -108,7 +108,11 @@ func init() { ...@@ -108,7 +108,11 @@ func init() {
func bootstrapGitLabCmdRun(cmd *cobra.Command, args []string) error { func bootstrapGitLabCmdRun(cmd *cobra.Command, args []string) error {
glToken := os.Getenv(glTokenEnvVar) glToken := os.Getenv(glTokenEnvVar)
if glToken == "" { if glToken == "" {
return fmt.Errorf("%s environment variable not found", glTokenEnvVar) var err error
glToken, err = readPasswordFromStdin("Please type your GitLab personal access token: ")
if err != nil {
return fmt.Errorf("could not read token: %w", err)
}
} }
if projectNameIsValid, err := regexp.MatchString(gitlabProjectRegex, gitlabArgs.repository); err != nil || !projectNameIsValid { if projectNameIsValid, err := regexp.MatchString(gitlabProjectRegex, gitlabArgs.repository); err != nil || !projectNameIsValid {
......
...@@ -17,12 +17,15 @@ limitations under the License. ...@@ -17,12 +17,15 @@ limitations under the License.
package main package main
import ( import (
"bufio"
"fmt"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"time" "time"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"golang.org/x/term"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
_ "k8s.io/client-go/plugin/pkg/client/auth" _ "k8s.io/client-go/plugin/pkg/client/auth"
...@@ -167,3 +170,22 @@ func homeDir() string { ...@@ -167,3 +170,22 @@ func homeDir() string {
} }
return os.Getenv("USERPROFILE") // windows return os.Getenv("USERPROFILE") // windows
} }
func readPasswordFromStdin(prompt string) (string, error) {
var out string
var err error
fmt.Fprint(os.Stdout, prompt)
stdinFD := int(os.Stdin.Fd())
if term.IsTerminal(stdinFD) {
var inBytes []byte
inBytes, err = term.ReadPassword(int(os.Stdin.Fd()))
out = string(inBytes)
} else {
out, err = bufio.NewReader(os.Stdin).ReadString('\n')
}
if err != nil {
return "", fmt.Errorf("could not read from stdin: %w", err)
}
fmt.Println()
return out, nil
}
...@@ -29,6 +29,7 @@ require ( ...@@ -29,6 +29,7 @@ require (
github.com/spf13/cobra v1.1.3 github.com/spf13/cobra v1.1.3
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d
k8s.io/api v0.22.2 k8s.io/api v0.22.2
k8s.io/apiextensions-apiserver v0.22.2 k8s.io/apiextensions-apiserver v0.22.2
k8s.io/apimachinery v0.22.2 k8s.io/apimachinery v0.22.2
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment