Implement macos support (hopefully)

master
Hugo Thunnissen 2 years ago
parent 8d0d2cdf4e
commit 55b55c89e0

@ -6,6 +6,7 @@ import (
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
"log"
"os" "os"
"os/exec" "os/exec"
"os/user" "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") var ErrAddGroupFailExit = errors.New("groupadd command returned no-zero exit code")
func AddUser(username string, uid string) error { func AddUser(username string, uid string) error {
cmd := exec.Command( commandArgs := []string{
"useradd",
"--no-create-home",
"--uid", uid, "--uid", uid,
"--user-group", "--user-group",
username, 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() output, err := cmd.CombinedOutput()
if err != nil { if err != nil {
@ -161,57 +169,44 @@ func Run(detach bool, mounts []string, command []string) error {
} }
home := os.Getenv("HOME") home := os.Getenv("HOME")
dockerGroup, err := user.LookupGroup("docker") hostOS := "darwin"
if err != nil {
return err
}
dockerCommand := []string{ dockerCommand := []string{
"/bin/docker", "run", "--network=host", "/bin/docker", "run", "--network=host",
"--workdir=" + workDir, "--workdir=" + workDir,
"--rm", "--rm",
"-e", "DISPLAY=" + os.Getenv("DISPLAY"), "-e", "WORKSPACE_OS=" + hostOS,
"-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",
} }
if detach { if hostOS != "darwin" {
dockerCommand = append(dockerCommand, "--detach") dockerGroup, err := user.LookupGroup("docker")
} if err != nil {
return err
if fileInfo, _ := os.Stdout.Stat(); (fileInfo.Mode() & os.ModeCharDevice) != 0 { }
dockerCommand = append(dockerCommand, "-ti")
}
for _, mount := range mounts {
dockerCommand = append(dockerCommand, "-v", mount+":"+mount)
}
fileInfo, err := os.Lstat(home) dockerCommand = append(
if err != nil { dockerCommand,
return fmt.Errorf( "-e", "WORKSPACE_DOCKER_GID="+dockerGroup.Gid,
"Failed to determine whether home directory is a symbolic link: %w", "-v", "/var/run/docker.sock:/var/run/docker.sock",
err, "-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 { fileInfo, err := os.Lstat(home)
destination, err := os.Readlink(home)
if err != nil { if err != nil {
return fmt.Errorf( return fmt.Errorf(
"Failed to determine whether home directory is a symbolic link: %w", "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") dockerCommand = append(dockerCommand, "hugotty/workspace:latest")

Loading…
Cancel
Save