diff --git a/Dockerfile.dind b/Dockerfile.dind index d768cb4..2b7378f 100644 --- a/Dockerfile.dind +++ b/Dockerfile.dind @@ -41,7 +41,11 @@ ENV DOCKER_STORAGE_DRIVER=$docker_storage_driver # Move to our home WORKDIR /root -RUN mkdir -p /var/run/pwd/certs && mkdir -p /var/run/pwd/uploads +# Setup certs and ssh keys +RUN mkdir -p /var/run/pwd/certs && mkdir -p /var/run/pwd/uploads \ + && ssh-keygen -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key >/dev/null \ + && mkdir ~/.ssh && ssh-keygen -N "" -t rsa -f ~/.ssh/id_rsa \ + && cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys # Remove IPv6 alias for localhost and start docker in the background ... CMD cat /etc/hosts >/etc/hosts.bak && \ @@ -53,7 +57,7 @@ CMD cat /etc/hosts >/etc/hosts.bak && \ sed -i "s/\DOCKER_TLSCERT/$DOCKER_TLSCERT/" /etc/docker/daemon.json && \ sed -i "s/\DOCKER_TLSKEY/$DOCKER_TLSKEY/" /etc/docker/daemon.json && \ umount /var/lib/docker && mount -t securityfs none /sys/kernel/security && \ - echo "root:root" | chpasswd &> /dev/null && ssh-keygen -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key >/dev/null && \ + echo "root:root" | chpasswd &> /dev/null && \ /usr/sbin/sshd -o PermitRootLogin=yes -o PrintMotd=no 2>/dev/null && \ dockerd &>/docker.log & \ while true ; do script -q -c "/bin/bash -l" /dev/null ; done diff --git a/handlers/file_upload.go b/handlers/file_upload.go index 4241b62..f261d9e 100644 --- a/handlers/file_upload.go +++ b/handlers/file_upload.go @@ -1,6 +1,7 @@ package handlers import ( + "io" "log" "net/http" @@ -28,18 +29,34 @@ func FileUpload(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusOK) return } else { - // This is for multipart upload - log.Println("Not implemented yet") - - /* - err := req.ParseMultipartForm(32 << 20) + red, err := req.MultipartReader() + if err != nil { + log.Println(err) + rw.WriteHeader(http.StatusBadRequest) + return + } + for { + p, err := red.NextPart() + if err == io.EOF { + break + } if err != nil { log.Println(err) - rw.WriteHeader(http.StatusBadRequest) + continue + } + + if p.FileName() == "" { + continue + } + err = core.InstanceUploadFromReader(i, p.FileName(), p) + if err != nil { + log.Println(err) + rw.WriteHeader(http.StatusInternalServerError) return } - */ - rw.WriteHeader(http.StatusInternalServerError) + log.Printf("Uploaded [%s] to [%s]\n", p.FileName(), i.Name) + } + rw.WriteHeader(http.StatusOK) return } diff --git a/pwd/instance.go b/pwd/instance.go index d9751a1..5af7544 100644 --- a/pwd/instance.go +++ b/pwd/instance.go @@ -82,6 +82,18 @@ func (p *pwd) InstanceUploadFromUrl(instance *types.Instance, url string) error return nil } +func (p *pwd) InstanceUploadFromReader(instance *types.Instance, fileName string, reader io.Reader) error { + defer observeAction("InstanceUploadFromReader", time.Now()) + + copyErr := p.docker.CopyToContainer(instance.Name, "/var/run/pwd/uploads", fileName, reader) + + if copyErr != nil { + return fmt.Errorf("Error while uploading file [%s]. Error: %s\n", fileName, copyErr) + } + + return nil +} + func (p *pwd) InstanceGet(session *types.Session, name string) *types.Instance { defer observeAction("InstanceGet", time.Now()) return session.Instances[name] diff --git a/pwd/pwd.go b/pwd/pwd.go index 1abba0c..1dcc8fa 100644 --- a/pwd/pwd.go +++ b/pwd/pwd.go @@ -1,6 +1,7 @@ package pwd import ( + "io" "time" "github.com/play-with-docker/play-with-docker/docker" @@ -60,6 +61,7 @@ type PWDApi interface { InstanceResizeTerminal(instance *types.Instance, cols, rows uint) error InstanceAttachTerminal(instance *types.Instance) error InstanceUploadFromUrl(instance *types.Instance, url string) error + InstanceUploadFromReader(instance *types.Instance, filename string, reader io.Reader) error InstanceGet(session *types.Session, name string) *types.Instance InstanceFindByIP(ip string) *types.Instance InstanceFindByAlias(sessionPrefix, alias string) *types.Instance