diff --git a/.gitignore b/.gitignore index d557404214..686ac83428 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .vagrant docker/docker -dockerd/dockerd .*.swp a.out *.orig diff --git a/client/client.go b/client/client.go deleted file mode 100644 index 30d741f8bd..0000000000 --- a/client/client.go +++ /dev/null @@ -1,53 +0,0 @@ -package client - -import ( - "github.com/dotcloud/docker/future" - "github.com/dotcloud/docker/rcli" - "io" - "log" - "os" -) - -// Run docker in "simple mode": run a single command and return. -func SimpleMode(args []string) error { - var oldState *State - var err error - if IsTerminal(0) && os.Getenv("NORAW") == "" { - oldState, err = MakeRaw(0) - if err != nil { - return err - } - defer Restore(0, oldState) - } - // FIXME: we want to use unix sockets here, but net.UnixConn doesn't expose - // CloseWrite(), which we need to cleanly signal that stdin is closed without - // closing the connection. - // See http://code.google.com/p/go/issues/detail?id=3345 - conn, err := rcli.Call("tcp", "127.0.0.1:4242", args...) - if err != nil { - return err - } - receive_stdout := future.Go(func() error { - _, err := io.Copy(os.Stdout, conn) - return err - }) - send_stdin := future.Go(func() error { - _, err := io.Copy(conn, os.Stdin) - if err := conn.CloseWrite(); err != nil { - log.Printf("Couldn't send EOF: " + err.Error()) - } - return err - }) - if err := <-receive_stdout; err != nil { - return err - } - if oldState != nil { - Restore(0, oldState) - } - if !IsTerminal(0) { - if err := <-send_stdin; err != nil { - return err - } - } - return nil -} diff --git a/server/server.go b/commands/commands.go similarity index 98% rename from server/server.go rename to commands/commands.go index 18dc578190..14649cad1f 100644 --- a/server/server.go +++ b/commands/commands.go @@ -1,4 +1,4 @@ -package server +package commands import ( "bufio" @@ -24,15 +24,6 @@ import ( const VERSION = "0.0.1" -func (srv *Server) ListenAndServe() error { - go rcli.ListenAndServeHTTP("127.0.0.1:8080", srv) - // FIXME: we want to use unix sockets here, but net.UnixConn doesn't expose - // CloseWrite(), which we need to cleanly signal that stdin is closed without - // closing the connection. - // See http://code.google.com/p/go/issues/detail?id=3345 - return rcli.ListenAndServe("tcp", "127.0.0.1:4242", srv) -} - func (srv *Server) Name() string { return "docker" } diff --git a/docker/docker.go b/docker/docker.go index 29a550c7b4..ad121a8f60 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -1,13 +1,93 @@ package main import ( - "github.com/dotcloud/docker/client" + "flag" + "github.com/dotcloud/docker" + "github.com/dotcloud/docker/commands" + "github.com/dotcloud/docker/future" + "github.com/dotcloud/docker/rcli" + "github.com/dotcloud/docker/term" + "io" "log" "os" ) func main() { - if err := client.SimpleMode(os.Args[1:]); err != nil { - log.Fatal(err) + if docker.SelfPath() == "/sbin/init" { + // Running in init mode + docker.SysInit() + return + } + fl_daemon := flag.Bool("d", false, "Daemon mode") + flag.Parse() + if *fl_daemon { + if flag.NArg() != 0 { + flag.Usage() + return + } + if err := daemon(); err != nil { + log.Fatal(err) + } + } else { + if err := runCommand(flag.Args()); err != nil { + log.Fatal(err) + } } } + +func daemon() error { + service, err := commands.New() + if err != nil { + return err + } + return rcli.ListenAndServe("tcp", "127.0.0.1:4242", service) +} + +func runCommand(args []string) error { + var oldState *term.State + var err error + if term.IsTerminal(0) && os.Getenv("NORAW") == "" { + oldState, err = term.MakeRaw(0) + if err != nil { + return err + } + defer term.Restore(0, oldState) + } + // FIXME: we want to use unix sockets here, but net.UnixConn doesn't expose + // CloseWrite(), which we need to cleanly signal that stdin is closed without + // closing the connection. + // See http://code.google.com/p/go/issues/detail?id=3345 + if conn, err := rcli.Call("tcp", "127.0.0.1:4242", args...); err == nil { + receive_stdout := future.Go(func() error { + _, err := io.Copy(os.Stdout, conn) + return err + }) + send_stdin := future.Go(func() error { + _, err := io.Copy(conn, os.Stdin) + if err := conn.CloseWrite(); err != nil { + log.Printf("Couldn't send EOF: " + err.Error()) + } + return err + }) + if err := <-receive_stdout; err != nil { + return err + } + if !term.IsTerminal(0) { + if err := <-send_stdin; err != nil { + return err + } + } + } else { + service, err := commands.New() + if err != nil { + return err + } + if err := rcli.LocalCall(service, os.Stdin, os.Stdout, args...); err != nil { + return err + } + } + if oldState != nil { + term.Restore(0, oldState) + } + return nil +} diff --git a/dockerd/dockerd.go b/dockerd/dockerd.go deleted file mode 100644 index b2337d342c..0000000000 --- a/dockerd/dockerd.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import ( - "flag" - "github.com/dotcloud/docker" - "github.com/dotcloud/docker/server" - "log" -) - -func main() { - if docker.SelfPath() == "/sbin/init" { - // Running in init mode - docker.SysInit() - return - } - flag.Parse() - d, err := server.New() - if err != nil { - log.Fatal(err) - } - if err := d.ListenAndServe(); err != nil { - log.Fatal(err) - } -} diff --git a/rcli/types.go b/rcli/types.go index 52079291b6..2600fe240d 100644 --- a/rcli/types.go +++ b/rcli/types.go @@ -25,7 +25,12 @@ type Service interface { type Cmd func(io.ReadCloser, io.Writer, ...string) error type CmdMethod func(Service, io.ReadCloser, io.Writer, ...string) error +// FIXME: For reverse compatibility func call(service Service, stdin io.ReadCloser, stdout io.Writer, args ...string) error { + return LocalCall(service, stdin, stdout, args...) +} + +func LocalCall(service Service, stdin io.ReadCloser, stdout io.Writer, args ...string) error { if len(args) == 0 { args = []string{"help"} } diff --git a/client/term.go b/term/term.go similarity index 99% rename from client/term.go rename to term/term.go index a988d0d796..fdbe3b9984 100644 --- a/client/term.go +++ b/term/term.go @@ -1,4 +1,4 @@ -package client +package term import ( "syscall" diff --git a/client/termios_darwin.go b/term/termios_darwin.go similarity index 85% rename from client/termios_darwin.go rename to term/termios_darwin.go index 185687920c..26d17b3bb8 100644 --- a/client/termios_darwin.go +++ b/term/termios_darwin.go @@ -1,4 +1,4 @@ -package client +package term import "syscall" diff --git a/client/termios_linux.go b/term/termios_linux.go similarity index 85% rename from client/termios_linux.go rename to term/termios_linux.go index 36957c44a1..1ea26fa5c4 100644 --- a/client/termios_linux.go +++ b/term/termios_linux.go @@ -1,4 +1,4 @@ -package client +package term import "syscall"