diff --git a/README.md b/README.md index 6f92fe8..c48d26a 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ If you want to make changes to the `dind` image being used, make your changes to ### How can I connect to a published port from the outside world? -If you need to access your services from outside, use the following URL pattern `http://pwd-..labs.play-with-docker.com` (i.e: http://pwd10_2_135_3-80.host3.labs.play-with-docker.com/). +If you need to access your services from outside, use the following URL pattern `http://pwd-..labs.play-with-docker.com` (i.e: http://pwd10-2-135-3-80.host3.labs.play-with-docker.com/). ### Why is PWD running in ports 80 and 443?, Can I change that?. diff --git a/docker/docker.go b/docker/docker.go index 1cf0dfe..58494f2 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -340,18 +340,18 @@ func (d *docker) CreateContainer(opts CreateContainerOpts) (err error) { container, err := d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) if err != nil { - if client.IsErrNotFound(err) { - log.Printf("Unable to find image '%s' locally\n", opts.Image) - if err = d.pullImage(context.Background(), opts.Image); err != nil { - return - } - container, err = d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) - if err != nil { - return - } - } else { - return - } + //if client.IsErrImageNotFound(err) { + //log.Printf("Unable to find image '%s' locally\n", opts.Image) + //if err = d.pullImage(context.Background(), opts.Image); err != nil { + //return "", err + //} + //container, err = d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) + //if err != nil { + //return "", err + //} + //} else { + return err + //} } //connect remaining networks if there are any diff --git a/dockerfiles/dind/Dockerfile.dind b/dockerfiles/dind/Dockerfile.dind index 860e359..81060c8 100644 --- a/dockerfiles/dind/Dockerfile.dind +++ b/dockerfiles/dind/Dockerfile.dind @@ -32,7 +32,7 @@ RUN mkdir /etc/bash_completion.d \ RUN rm /sbin/modprobe && echo '#!/bin/true' >/sbin/modprobe && chmod +x /sbin/modprobe # Install a nice vimrc file and prompt (by soulshake) -COPY ["docker-prompt","/usr/local/bin/"] +COPY ["docker-prompt","sudo","/usr/local/bin/"] COPY [".vimrc",".profile", ".inputrc", ".gitconfig", "./root/"] COPY ["motd", "/etc/motd"] COPY ["daemon.json", "/etc/docker/"] diff --git a/handlers/bootstrap.go b/handlers/bootstrap.go index 2438e1d..52b854f 100644 --- a/handlers/bootstrap.go +++ b/handlers/bootstrap.go @@ -101,6 +101,7 @@ func Register(extend HandlerExtender) { IdleTimeout: 30 * time.Second, ReadHeaderTimeout: 5 * time.Second, } + if config.UseLetsEncrypt { certManager := autocert.Manager{ Prompt: autocert.AcceptTOS, @@ -127,7 +128,6 @@ func Register(extend HandlerExtender) { log.Println("Listening on port " + config.PortNumber) log.Fatal(httpServer.ListenAndServe()) } - } func RegisterEvents(s *socketio.Server) { diff --git a/handlers/ping.go b/handlers/ping.go index 66a41be..49cfdd1 100644 --- a/handlers/ping.go +++ b/handlers/ping.go @@ -1,6 +1,41 @@ package handlers -import "net/http" +import ( + "context" + "log" + "net/http" + "time" + + "github.com/docker/docker/client" + "github.com/play-with-docker/play-with-docker/config" + "github.com/shirou/gopsutil/load" +) func Ping(rw http.ResponseWriter, req *http.Request) { + // Get system load average of the last 5 minutes and compare it against a threashold. + + c, err := client.NewEnvClient() + + if err != nil { + rw.WriteHeader(http.StatusInternalServerError) + return + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + if _, err := c.Info(ctx); err != nil && err == context.DeadlineExceeded { + log.Printf("Docker info took to long to respond\n") + rw.WriteHeader(http.StatusGatewayTimeout) + } + + a, err := load.Avg() + if err != nil { + log.Println("Cannot get system load average!", err) + } else { + if a.Load5 > config.MaxLoadAvg { + log.Printf("System load average is too high [%f]\n", a.Load5) + rw.WriteHeader(http.StatusInsufficientStorage) + } + } } diff --git a/handlers/ws.go b/handlers/ws.go index b41b490..08e5c98 100644 --- a/handlers/ws.go +++ b/handlers/ws.go @@ -21,6 +21,7 @@ func WS(so socketio.Socket) { session := core.SessionGet(sessionId) if session == nil { log.Printf("Session with id [%s] does not exist!\n", sessionId) + so.Disconnect() return } diff --git a/www/assets/app.js b/www/assets/app.js index ad1f584..1004206 100644 --- a/www/assets/app.js +++ b/www/assets/app.js @@ -214,6 +214,7 @@ window.location.href = '/'; }); $scope.isAlive = false; + socket.close(); }); socket.on('instance new', function(name, ip, hostname, proxyHost) {