123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package client
- import (
- "fmt"
- "os"
- gosignal "os/signal"
- "runtime"
- "time"
- "github.com/Sirupsen/logrus"
- "github.com/docker/docker/api/client/lib"
- "github.com/docker/docker/api/types"
- "github.com/docker/docker/pkg/signal"
- "github.com/docker/docker/pkg/term"
- "github.com/docker/docker/registry"
- )
- 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)
- }
- }
- func (cli *DockerCli) resizeTty(id string, isExec bool) {
- height, width := cli.getTtySize()
- if height == 0 && width == 0 {
- return
- }
- options := types.ResizeOptions{
- ID: id,
- Height: height,
- Width: width,
- }
- var err error
- if !isExec {
- err = cli.client.ContainerExecResize(options)
- } else {
- err = cli.client.ContainerResize(options)
- }
- if err != nil {
- logrus.Debugf("Error resize: %s", err)
- }
- }
- // getExitCode perform an inspect on the container. It returns
- // the running state and the exit code.
- func getExitCode(cli *DockerCli, containerID string) (bool, int, error) {
- c, err := cli.client.ContainerInspect(containerID)
- if err != nil {
- // If we can't connect, then the daemon probably died.
- if err != lib.ErrConnectionFailed {
- return false, -1, err
- }
- return false, -1, nil
- }
- return c.State.Running, c.State.ExitCode, nil
- }
- // getExecExitCode perform an inspect on the exec command. It returns
- // the running state and the exit code.
- func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
- resp, err := cli.client.ContainerExecInspect(execID)
- if err != nil {
- // If we can't connect, then the daemon probably died.
- if err != lib.ErrConnectionFailed {
- return false, -1, err
- }
- return false, -1, nil
- }
- return resp.Running, resp.ExitCode, nil
- }
- func (cli *DockerCli) monitorTtySize(id string, isExec bool) error {
- cli.resizeTty(id, isExec)
- if runtime.GOOS == "windows" {
- go func() {
- prevH, prevW := cli.getTtySize()
- for {
- time.Sleep(time.Millisecond * 250)
- h, w := cli.getTtySize()
- if prevW != w || prevH != h {
- cli.resizeTty(id, isExec)
- }
- prevH = h
- prevW = w
- }
- }()
- } else {
- sigchan := make(chan os.Signal, 1)
- gosignal.Notify(sigchan, signal.SIGWINCH)
- go func() {
- for range sigchan {
- cli.resizeTty(id, isExec)
- }
- }()
- }
- return nil
- }
- func (cli *DockerCli) getTtySize() (int, int) {
- if !cli.isTerminalOut {
- return 0, 0
- }
- ws, err := term.GetWinsize(cli.outFd)
- if err != nil {
- logrus.Debugf("Error getting size: %s", err)
- if ws == nil {
- return 0, 0
- }
- }
- return int(ws.Height), int(ws.Width)
- }
|