Implement macos support (hopefully)

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

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

Loading…
Cancel
Save