2014-03-28 23:21:55 +00:00
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
gosignal "os/signal"
|
2015-03-26 22:52:16 +00:00
|
|
|
"runtime"
|
|
|
|
"time"
|
2014-03-28 23:21:55 +00:00
|
|
|
|
2015-03-26 22:22:04 +00:00
|
|
|
"github.com/Sirupsen/logrus"
|
2015-12-04 19:49:22 +00:00
|
|
|
"github.com/docker/docker/api/client/lib"
|
2015-12-06 23:41:57 +00:00
|
|
|
"github.com/docker/docker/api/types"
|
2014-11-13 18:40:22 +00:00
|
|
|
"github.com/docker/docker/pkg/signal"
|
2014-07-24 22:19:50 +00:00
|
|
|
"github.com/docker/docker/pkg/term"
|
|
|
|
"github.com/docker/docker/registry"
|
2014-03-28 23:21:55 +00:00
|
|
|
)
|
|
|
|
|
2015-12-06 20:17:34 +00:00
|
|
|
func (cli *DockerCli) encodeRegistryAuth(index *registry.IndexInfo) (string, error) {
|
|
|
|
authConfig := registry.ResolveAuthConfig(cli.configFile, index)
|
|
|
|
return authConfig.EncodeToBase64()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cli *DockerCli) registryAuthenticationPrivilegedFunc(index *registry.IndexInfo, cmdName string) lib.RequestPrivilegeFunc {
|
|
|
|
return func() (string, error) {
|
|
|
|
fmt.Fprintf(cli.out, "\nPlease login prior to %s:\n", cmdName)
|
|
|
|
if err := cli.CmdLogin(index.GetAuthConfigKey()); err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return cli.encodeRegistryAuth(index)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-16 06:43:43 +00:00
|
|
|
func (cli *DockerCli) resizeTty(id string, isExec bool) {
|
2014-03-28 23:21:55 +00:00
|
|
|
height, width := cli.getTtySize()
|
|
|
|
if height == 0 && width == 0 {
|
|
|
|
return
|
|
|
|
}
|
2014-09-16 06:43:43 +00:00
|
|
|
|
2015-12-06 23:41:57 +00:00
|
|
|
options := types.ResizeOptions{
|
|
|
|
ID: id,
|
|
|
|
Height: height,
|
|
|
|
Width: width,
|
|
|
|
}
|
|
|
|
|
|
|
|
var err error
|
2014-09-16 06:43:43 +00:00
|
|
|
if !isExec {
|
2015-12-06 23:41:57 +00:00
|
|
|
err = cli.client.ContainerExecResize(options)
|
2014-09-16 06:43:43 +00:00
|
|
|
} else {
|
2015-12-06 23:41:57 +00:00
|
|
|
err = cli.client.ContainerResize(options)
|
2014-09-16 06:43:43 +00:00
|
|
|
}
|
|
|
|
|
2015-12-06 23:41:57 +00:00
|
|
|
if err != nil {
|
2015-03-26 22:22:04 +00:00
|
|
|
logrus.Debugf("Error resize: %s", err)
|
2014-03-28 23:21:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// getExitCode perform an inspect on the container. It returns
|
|
|
|
// the running state and the exit code.
|
2015-03-26 02:31:29 +00:00
|
|
|
func getExitCode(cli *DockerCli, containerID string) (bool, int, error) {
|
2015-12-04 19:49:22 +00:00
|
|
|
c, err := cli.client.ContainerInspect(containerID)
|
2014-03-28 23:21:55 +00:00
|
|
|
if err != nil {
|
|
|
|
// If we can't connect, then the daemon probably died.
|
2015-12-04 19:49:22 +00:00
|
|
|
if err != lib.ErrConnectionFailed {
|
2014-03-28 23:21:55 +00:00
|
|
|
return false, -1, err
|
|
|
|
}
|
|
|
|
return false, -1, nil
|
|
|
|
}
|
2014-06-04 22:11:11 +00:00
|
|
|
|
2015-04-13 14:17:14 +00:00
|
|
|
return c.State.Running, c.State.ExitCode, nil
|
2014-03-28 23:21:55 +00:00
|
|
|
}
|
|
|
|
|
2014-11-17 23:50:09 +00:00
|
|
|
// getExecExitCode perform an inspect on the exec command. It returns
|
|
|
|
// the running state and the exit code.
|
2015-03-26 02:31:29 +00:00
|
|
|
func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
|
2015-12-06 05:33:38 +00:00
|
|
|
resp, err := cli.client.ContainerExecInspect(execID)
|
2014-11-17 23:50:09 +00:00
|
|
|
if err != nil {
|
|
|
|
// If we can't connect, then the daemon probably died.
|
2015-12-06 05:33:38 +00:00
|
|
|
if err != lib.ErrConnectionFailed {
|
2014-11-17 23:50:09 +00:00
|
|
|
return false, -1, err
|
|
|
|
}
|
|
|
|
return false, -1, nil
|
|
|
|
}
|
|
|
|
|
2015-12-06 05:33:38 +00:00
|
|
|
return resp.Running, resp.ExitCode, nil
|
2014-11-17 23:50:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-16 06:43:43 +00:00
|
|
|
func (cli *DockerCli) monitorTtySize(id string, isExec bool) error {
|
|
|
|
cli.resizeTty(id, isExec)
|
2014-03-28 23:21:55 +00:00
|
|
|
|
2015-03-26 22:52:16 +00:00
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
go func() {
|
2015-04-06 21:31:42 +00:00
|
|
|
prevH, prevW := cli.getTtySize()
|
2015-03-26 22:52:16 +00:00
|
|
|
for {
|
|
|
|
time.Sleep(time.Millisecond * 250)
|
2015-04-06 21:31:42 +00:00
|
|
|
h, w := cli.getTtySize()
|
2015-03-26 22:52:16 +00:00
|
|
|
|
|
|
|
if prevW != w || prevH != h {
|
|
|
|
cli.resizeTty(id, isExec)
|
|
|
|
}
|
|
|
|
prevH = h
|
2015-04-06 21:31:42 +00:00
|
|
|
prevW = w
|
2015-03-26 22:52:16 +00:00
|
|
|
}
|
|
|
|
}()
|
|
|
|
} else {
|
|
|
|
sigchan := make(chan os.Signal, 1)
|
|
|
|
gosignal.Notify(sigchan, signal.SIGWINCH)
|
|
|
|
go func() {
|
2015-04-01 22:39:37 +00:00
|
|
|
for range sigchan {
|
2015-03-26 22:52:16 +00:00
|
|
|
cli.resizeTty(id, isExec)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|
2014-03-28 23:21:55 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cli *DockerCli) getTtySize() (int, int) {
|
2014-09-10 13:35:48 +00:00
|
|
|
if !cli.isTerminalOut {
|
2014-03-28 23:21:55 +00:00
|
|
|
return 0, 0
|
|
|
|
}
|
2014-09-10 13:35:48 +00:00
|
|
|
ws, err := term.GetWinsize(cli.outFd)
|
2014-03-28 23:21:55 +00:00
|
|
|
if err != nil {
|
2015-03-26 22:22:04 +00:00
|
|
|
logrus.Debugf("Error getting size: %s", err)
|
2014-03-28 23:21:55 +00:00
|
|
|
if ws == nil {
|
|
|
|
return 0, 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return int(ws.Height), int(ws.Width)
|
|
|
|
}
|