diff --git a/config.go b/config.go index 40c47e692c..d5f852c26f 100644 --- a/config.go +++ b/config.go @@ -9,7 +9,6 @@ import ( type DaemonConfig struct { Pidfile string Root string - ProtoAddresses []string AutoRestart bool EnableCors bool Dns []string @@ -36,7 +35,6 @@ func ConfigFromJob(job *engine.Job) *DaemonConfig { } else { config.BridgeIface = DefaultNetworkBridge } - config.ProtoAddresses = job.GetenvList("ProtoAddresses") config.DefaultIp = net.ParseIP(job.Getenv("DefaultIp")) config.InterContainerCommunication = job.GetenvBool("InterContainerCommunication") return &config diff --git a/docker/docker.go b/docker/docker.go index c500633a71..2fc864adf4 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -71,7 +71,8 @@ func main() { if err != nil { log.Fatal(err) } - job := eng.Job("serveapi") + // Load plugin: httpapi + job := eng.Job("initapi") job.Setenv("Pidfile", *pidfile) job.Setenv("Root", *flRoot) job.SetenvBool("AutoRestart", *flAutoRestart) @@ -79,12 +80,15 @@ func main() { job.Setenv("Dns", *flDns) job.SetenvBool("EnableIptables", *flEnableIptables) job.Setenv("BridgeIface", *bridgeName) - job.SetenvList("ProtoAddresses", flHosts) job.Setenv("DefaultIp", *flDefaultIp) job.SetenvBool("InterContainerCommunication", *flInterContainerComm) if err := job.Run(); err != nil { log.Fatal(err) } + // Serve api + if err := eng.Job("serveapi", flHosts...).Run(); err != nil { + log.Fatal(err) + } } else { if len(flHosts) > 1 { log.Fatal("Please specify only one -H") diff --git a/server.go b/server.go index 314df0256b..d8b70b88ae 100644 --- a/server.go +++ b/server.go @@ -33,30 +33,20 @@ func (srv *Server) Close() error { } func init() { - engine.Register("serveapi", JobServeApi) + engine.Register("initapi", jobInitApi) } -func JobServeApi(job *engine.Job) string { +// jobInitApi runs the remote api server `srv` as a daemon, +// Only one api server can run at the same time - this is enforced by a pidfile. +// The signals SIGINT, SIGKILL and SIGTERM are intercepted for cleanup. +func jobInitApi(job *engine.Job) string { srv, err := NewServer(ConfigFromJob(job)) if err != nil { return err.Error() } - defer srv.Close() - if err := srv.Daemon(); err != nil { - return err.Error() - } - return "0" -} - -// Daemon runs the remote api server `srv` as a daemon, -// Only one api server can run at the same time - this is enforced by a pidfile. -// The signals SIGINT, SIGKILL and SIGTERM are intercepted for cleanup. -func (srv *Server) Daemon() error { if err := utils.CreatePidFile(srv.runtime.config.Pidfile); err != nil { log.Fatal(err) } - defer utils.RemovePidFile(srv.runtime.config.Pidfile) - c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM)) go func() { @@ -66,8 +56,17 @@ func (srv *Server) Daemon() error { srv.Close() os.Exit(0) }() + err = engine.Register("serveapi", func(job *engine.Job) string { + return srv.ListenAndServe(job.Args...).Error() + }) + if err != nil { + return err.Error() + } + return "0" +} - protoAddrs := srv.runtime.config.ProtoAddresses + +func (srv *Server) ListenAndServe(protoAddrs ...string) error { chErrors := make(chan error, len(protoAddrs)) for _, protoAddr := range protoAddrs { protoAddrParts := strings.SplitN(protoAddr, "://", 2)