Skip to content

Commit

Permalink
Merge pull request #29 from stuartleeks/sl/exec-set-user
Browse files Browse the repository at this point in the history
Handle user on exec
  • Loading branch information
stuartleeks committed Oct 16, 2020
2 parents 1d73d87 + 7c221db commit d6baa3f
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 1 deletion.
23 changes: 22 additions & 1 deletion cmd/devcontainer/devcontainer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import (
"fmt"
"os"
"os/exec"
"path"
"sort"
"strings"
"text/tabwriter"

"github.com/spf13/cobra"
"github.com/stuartleeks/devcontainer-cli/internal/pkg/devcontainers"
"github.com/stuartleeks/devcontainer-cli/internal/pkg/wsl"
)

func createListCommand() *cobra.Command {
Expand Down Expand Up @@ -114,7 +117,25 @@ func createExecCommand() *cobra.Command {
return err
}

dockerArgs := []string{"exec", "-it", "--workdir", mountPath, containerID}
wslPath := localPath
if strings.HasPrefix(wslPath, "\\\\wsl$") && wsl.IsWsl() {
wslPath, err = wsl.ConvertWindowsPathToWslPath(wslPath)
if err != nil {
return fmt.Errorf("error converting path: %s", err)
}
}

devcontainerJsonPath := path.Join(wslPath, ".devcontainer/devcontainer.json")
userName, err := devcontainers.GetDevContainerUserName(devcontainerJsonPath)
if err != nil {
return err
}

dockerArgs := []string{"exec", "-it", "--workdir", mountPath}
if userName != "" {
dockerArgs = append(dockerArgs, "--user", userName)
}
dockerArgs = append(dockerArgs, containerID)
dockerArgs = append(dockerArgs, args[1:]...)

dockerCmd := exec.Command("docker", dockerArgs...)
Expand Down
17 changes: 17 additions & 0 deletions internal/pkg/devcontainers/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,3 +117,20 @@ func SetDevcontainerName(devContainerJsonPath string, name string) error {

return nil
}

// "remoteUser": "vscode"

func GetDevContainerUserName(devContainerJsonPath string) (string, error) {
buf, err := ioutil.ReadFile(devContainerJsonPath)
if err != nil {
return "", fmt.Errorf("error reading file %q: %s", devContainerJsonPath, err)
}

r := regexp.MustCompile("\n[^/]*\"remoteUser\"\\s*:\\s*\"([^\"]*)\"")
match := r.FindStringSubmatch(string(buf))

if len(match) <= 0 {
return "", nil
}
return match[1], nil
}
62 changes: 62 additions & 0 deletions internal/pkg/devcontainers/template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,65 @@ func TestSetDevcontainerName(t *testing.T) {
]
}`, string(buf))
}

func TestGetDevContainerUserName_Uncommented(t *testing.T) {

f, err := ioutil.TempFile("", "test.json")
assert.NoError(t, err)
defer os.Remove(f.Name())

_, _ = f.WriteString(`{
"name": "initial",
// here's a comment!
"otherProperties": [
"something",
"here"
],
"remoteUser": "vscode"
}`)

user, err := GetDevContainerUserName(f.Name())
assert.NoError(t, err)
assert.Equal(t, "vscode", user)
}

func TestGetDevContainerUserName_NotSet(t *testing.T) {

f, err := ioutil.TempFile("", "test.json")
assert.NoError(t, err)
defer os.Remove(f.Name())

_, _ = f.WriteString(`{
"name": "initial",
// here's a comment!
"otherProperties": [
"something",
"here"
]
}`)

user, err := GetDevContainerUserName(f.Name())
assert.NoError(t, err)
assert.Equal(t, "", user)
}

func TestGetDevContainerUserName_Commented(t *testing.T) {

f, err := ioutil.TempFile("", "test.json")
assert.NoError(t, err)
defer os.Remove(f.Name())

_, _ = f.WriteString(`{
"name": "initial",
// here's a comment!
"otherProperties": [
"something",
"here"
],
// "remoteUser": "vscode"
}`)

user, err := GetDevContainerUserName(f.Name())
assert.NoError(t, err)
assert.Equal(t, "", user)
}

0 comments on commit d6baa3f

Please sign in to comment.