github.com/fanux/shipyard@v0.0.0-20161009071005-6515ce223235/controller/api/exec.go (about) 1 package api 2 3 import ( 4 "strconv" 5 "strings" 6 7 log "github.com/Sirupsen/logrus" 8 "github.com/samalba/dockerclient" 9 "golang.org/x/net/websocket" 10 ) 11 12 func (a *Api) execContainer(ws *websocket.Conn) { 13 qry := ws.Request().URL.Query() 14 containerId := qry.Get("id") 15 command := qry.Get("cmd") 16 ttyWidth := qry.Get("w") 17 ttyHeight := qry.Get("h") 18 token := qry.Get("token") 19 cmd := strings.Split(command, ",") 20 21 if !a.manager.ValidateConsoleSessionToken(containerId, token) { 22 ws.Write([]byte("unauthorized")) 23 ws.Close() 24 return 25 } 26 27 log.Debugf("starting exec session: container=%s cmd=%s", containerId, command) 28 clientUrl := a.manager.DockerClient().URL 29 30 execConfig := &dockerclient.ExecConfig{ 31 AttachStdin: true, 32 AttachStdout: true, 33 AttachStderr: true, 34 Tty: true, 35 Cmd: cmd, 36 Container: containerId, 37 Detach: true, 38 } 39 40 execId, err := a.manager.DockerClient().ExecCreate(execConfig) 41 if err != nil { 42 log.Errorf("error calling exec: %s", err) 43 return 44 } 45 46 if err := a.hijack(clientUrl.Host, "POST", "/exec/"+execId+"/start", true, ws, ws, ws, nil, nil); err != nil { 47 log.Errorf("error during hijack: %s", err) 48 return 49 } 50 51 // resize 52 w, err := strconv.Atoi(ttyWidth) 53 if err != nil { 54 log.Error(err) 55 return 56 } 57 58 h, err := strconv.Atoi(ttyHeight) 59 if err != nil { 60 log.Error(err) 61 return 62 } 63 64 if err := a.manager.DockerClient().ExecResize(execId, w, h); err != nil { 65 log.Errorf("error resizing exec tty: %s", err) 66 return 67 } 68 69 }