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  }