diff --git a/main.go b/main.go index e9a7613..40a096d 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "errors" "flag" "fmt" + "log" "os" "os/exec" "os/user" @@ -46,13 +47,20 @@ var ErrAddUserFailExit = errors.New("useradd command returned no-zero exit code" var ErrAddGroupFailExit = errors.New("groupadd command returned no-zero exit code") func AddUser(username string, uid string) error { - cmd := exec.Command( - "useradd", - "--no-create-home", + commandArgs := []string{ "--uid", uid, "--user-group", username, - ) + } + + if os.Getenv("WORKSPACE_OS") == "darwin" { + log.Println(fmt.Sprintf("Note: Workspce OS is \"%s\"", os.Getenv("WORKSPACE_OS"))) + commandArgs = append(commandArgs, "--create-home") + } else { + commandArgs = append(commandArgs, "--no-create-home") + } + + cmd := exec.Command("useradd", commandArgs...) output, err := cmd.CombinedOutput() if err != nil { @@ -161,57 +169,44 @@ func Run(detach bool, mounts []string, command []string) error { } home := os.Getenv("HOME") - dockerGroup, err := user.LookupGroup("docker") - if err != nil { - return err - } + hostOS := "darwin" dockerCommand := []string{ "/bin/docker", "run", "--network=host", "--workdir=" + workDir, "--rm", - "-e", "DISPLAY=" + os.Getenv("DISPLAY"), - "-e", "WORKSPACE_USER=" + curUser.Uid, - "-e", "WORKSPACE_USERNAME=" + curUser.Username, - "-e", "WORKSPACE_DOCKER_GID=" + dockerGroup.Gid, - "-e", "HOME=" + home, - "-h", os.Getenv("HOSTNAME"), - "-v", "/var/run/docker.sock:/var/run/docker.sock", - "-v", "/etc/hosts:/etc/hosts:ro", - "-v", "/etc/resolv.conf:/etc/resolv.conf:ro", - "-v", home + ":" + home, - "-e", "SSH_AGENT_LAUNCHER=" + os.Getenv("SSH_AGENT_LAUNCHER"), - "-e", "SSH_AUTH_SOCK=" + os.Getenv("SSH_AUTH_SOCK"), - "-e", "PULSE_SERVER=unix:/run/user/" + curUser.Uid + "/pulse/native", - "-e", "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/" + curUser.Uid + "/bus", - "-e", "TERM=" + os.Getenv("TERM"), - "-v", "/tmp/.X11-unix:/tmp/.X11-unix", - "-v", "/run/user/" + curUser.Uid + ":/run/user/" + curUser.Uid, - "-v", "/dev/snd", + "-e", "WORKSPACE_OS=" + hostOS, } - if detach { - dockerCommand = append(dockerCommand, "--detach") - } - - if fileInfo, _ := os.Stdout.Stat(); (fileInfo.Mode() & os.ModeCharDevice) != 0 { - dockerCommand = append(dockerCommand, "-ti") - } - - for _, mount := range mounts { - dockerCommand = append(dockerCommand, "-v", mount+":"+mount) - } + if hostOS != "darwin" { + dockerGroup, err := user.LookupGroup("docker") + if err != nil { + return err + } - fileInfo, err := os.Lstat(home) - if err != nil { - return fmt.Errorf( - "Failed to determine whether home directory is a symbolic link: %w", - err, + dockerCommand = append( + dockerCommand, + "-e", "WORKSPACE_DOCKER_GID="+dockerGroup.Gid, + "-v", "/var/run/docker.sock:/var/run/docker.sock", + "-v", "/etc/hosts:/etc/hosts:ro", + "-v", "/etc/resolv.conf:/etc/resolv.conf:ro", + "-v", home+":"+home, + "-e", "SSH_AGENT_LAUNCHER="+os.Getenv("SSH_AGENT_LAUNCHER"), + "-e", "SSH_AUTH_SOCK="+os.Getenv("SSH_AUTH_SOCK"), + "-e", "PULSE_SERVER=unix:/run/user/"+curUser.Uid+"/pulse/native", + "-e", "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"+curUser.Uid+"/bus", + "-v", "/tmp/.X11-unix:/tmp/.X11-unix", + "-v", "/run/user/"+curUser.Uid+":/run/user/"+curUser.Uid, + "-v", "/dev/snd", + "-e", "DISPLAY="+os.Getenv("DISPLAY"), + "-e", "WORKSPACE_USER="+curUser.Uid, + "-e", "WORKSPACE_USERNAME="+curUser.Username, + "-e", "HOME="+home, + "-h", os.Getenv("HOSTNAME"), + "-e", "TERM="+os.Getenv("TERM"), ) - } - if fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink { - destination, err := os.Readlink(home) + fileInfo, err := os.Lstat(home) if err != nil { return fmt.Errorf( "Failed to determine whether home directory is a symbolic link: %w", @@ -219,7 +214,38 @@ func Run(detach bool, mounts []string, command []string) error { ) } - dockerCommand = append(dockerCommand, "-v", destination+":"+destination) + if fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink { + destination, err := os.Readlink(home) + if err != nil { + return fmt.Errorf( + "Failed to determine whether home directory is a symbolic link: %w", + err, + ) + } + + dockerCommand = append(dockerCommand, "-v", destination+":"+destination) + } + } else { + dockerCommand = append( + dockerCommand, + "-e", "WORKSPACE_DOCKER_GID=1001", + "-v", workDir+":"+workDir, + "-e", "WORKSPACE_USER=1000", + "-e", "WORKSPACE_USERNAME="+curUser.Username+"-workspace", + "-e", "HOME=/home/"+curUser.Username+"-workspace", + ) + } + + if detach { + dockerCommand = append(dockerCommand, "--detach") + } + + if fileInfo, _ := os.Stdout.Stat(); (fileInfo.Mode() & os.ModeCharDevice) != 0 { + dockerCommand = append(dockerCommand, "-ti") + } + + for _, mount := range mounts { + dockerCommand = append(dockerCommand, "-v", mount+":"+mount) } dockerCommand = append(dockerCommand, "hugotty/workspace:latest")