From c997143d22ca79e8a14cc693e78584d12d45a870 Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Sat, 14 Feb 2015 09:35:12 -0700 Subject: [PATCH] Start initial support of running in Docker --- init/init.go | 36 +++++++++++++++++-------------- util/term.go | 14 ++++++++++++ util/util.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 util/term.go diff --git a/init/init.go b/init/init.go index e1198a2b..bf8ad055 100644 --- a/init/init.go +++ b/init/init.go @@ -187,25 +187,29 @@ func loadModules(cfg *config.Config) error { } func sysInit(cfg *config.Config) error { - cmd := exec.Command("openvt", "-s", "/sbin/init-sys") - //cmd := exec.Command("/sbin/init-sys") - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout + args := append([]string{"/sbin/init-sys"}, os.Args[1:]...) + + var cmd *exec.Cmd + if util.IsRunningInTty() { + cmd = exec.Command(args[0], args[1:]...) + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + } else { + args = append([]string{"openvt", "-s"}, args...) + cmd = exec.Command(args[0], args[1:]...) + } + if err := cmd.Start(); err != nil { return err } - return nil - - //log.Debug("Launching host console") - //return exec.Command("openvt", "/bin/sh").Run() - - //log.Debug("Launching console") - //return exec.Command("/bin/openvt", "-s", "/bin/console-container.sh").Start() + return os.Stdin.Close() } func execDocker(cfg *config.Config) error { log.Info("Launching Docker") + os.Stdin.Close() return syscall.Exec(cfg.DockerBin, cfg.SystemDockerArgs, os.Environ()) } @@ -237,11 +241,11 @@ func mountState(cfg *config.Config) error { } } - log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER) - err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind") - if err != nil && cfg.StateRequired { - return err - } + //log.Debugf("Bind mounting %s to %s", path.Join(STATE, "docker"), DOCKER) + //err = util.Mount(path.Join(STATE, "docker"), DOCKER, "", "bind") + //if err != nil && cfg.StateRequired { + // return err + //} return nil } diff --git a/util/term.go b/util/term.go new file mode 100644 index 00000000..9a353448 --- /dev/null +++ b/util/term.go @@ -0,0 +1,14 @@ +package util + +import ( + "github.com/kless/term" + + log "github.com/Sirupsen/logrus" +) + +func IsRunningInTty() bool { + log.Infof("Is a tty : %v", term.IsTerminal(0)) + log.Infof("Is a tty : %v", term.IsTerminal(1)) + log.Infof("Is a tty : %v", term.IsTerminal(2)) + return term.IsTerminal(1) +} diff --git a/util/util.go b/util/util.go index b525512f..0bfec733 100644 --- a/util/util.go +++ b/util/util.go @@ -4,6 +4,7 @@ import ( "archive/tar" "fmt" "io" + "math/rand" "os" "path" "syscall" @@ -11,6 +12,10 @@ import ( "github.com/docker/docker/pkg/mount" ) +var ( + letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") +) + func mountProc() error { if _, err := os.Stat("/proc/self/mountinfo"); os.IsNotExist(err) { if _, err := os.Stat("/proc"); os.IsNotExist(err) { @@ -94,3 +99,58 @@ func ExtractTar(archive string, dest string) error { return nil } + +func Contains(values []string, value string) bool { + if len(value) == 0 { + return false + } + + for _, value := range values { + if value == value { + return true + } + } + + return false +} + +type ReturnsErr func() error + +func ShortCircuit(funcs ...ReturnsErr) error { + for _, f := range funcs { + err := f() + if err != nil { + return err + } + } + + return nil +} + +type ErrWriter struct { + w io.Writer + Err error +} + +func NewErrorWriter(w io.Writer) *ErrWriter { + return &ErrWriter{ + w: w, + } +} + +func (e *ErrWriter) Write(buf []byte) *ErrWriter { + if e.Err != nil { + return e + } + + _, e.Err = e.w.Write(buf) + return e +} + +func RandSeq(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +}