|
|
|
@ -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")
|
|
|
|
|