mirror of
https://github.com/containers/podman.git
synced 2025-06-03 20:33:20 +08:00
Merge pull request #3031 from baude/remotewindows
enable podman-remote on windows
This commit is contained in:
1
pkg/adapter/runtime_remote_supported.go
Normal file
1
pkg/adapter/runtime_remote_supported.go
Normal file
@ -0,0 +1 @@
|
||||
package adapter
|
@ -2,16 +2,12 @@ package adapter
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
gosignal "os/signal"
|
||||
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/docker/docker/pkg/signal"
|
||||
"github.com/docker/docker/pkg/term"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"k8s.io/client-go/tools/remotecommand"
|
||||
)
|
||||
|
||||
@ -19,83 +15,6 @@ import (
|
||||
type RawTtyFormatter struct {
|
||||
}
|
||||
|
||||
// StartAttachCtr starts and (if required) attaches to a container
|
||||
func StartAttachCtr(ctx context.Context, ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string, sigProxy bool, startContainer bool, recursive bool) error {
|
||||
resize := make(chan remotecommand.TerminalSize)
|
||||
|
||||
haveTerminal := terminal.IsTerminal(int(os.Stdin.Fd()))
|
||||
|
||||
// Check if we are attached to a terminal. If we are, generate resize
|
||||
// events, and set the terminal to raw mode
|
||||
if haveTerminal && ctr.Spec().Process.Terminal {
|
||||
logrus.Debugf("Handling terminal attach")
|
||||
|
||||
subCtx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
|
||||
resizeTty(subCtx, resize)
|
||||
|
||||
oldTermState, err := term.SaveState(os.Stdin.Fd())
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "unable to save terminal state")
|
||||
}
|
||||
|
||||
logrus.SetFormatter(&RawTtyFormatter{})
|
||||
term.SetRawTerminal(os.Stdin.Fd())
|
||||
|
||||
defer restoreTerminal(oldTermState)
|
||||
}
|
||||
|
||||
streams := new(libpod.AttachStreams)
|
||||
streams.OutputStream = stdout
|
||||
streams.ErrorStream = stderr
|
||||
streams.InputStream = stdin
|
||||
streams.AttachOutput = true
|
||||
streams.AttachError = true
|
||||
streams.AttachInput = true
|
||||
|
||||
if stdout == nil {
|
||||
logrus.Debugf("Not attaching to stdout")
|
||||
streams.AttachOutput = false
|
||||
}
|
||||
if stderr == nil {
|
||||
logrus.Debugf("Not attaching to stderr")
|
||||
streams.AttachError = false
|
||||
}
|
||||
if stdin == nil {
|
||||
logrus.Debugf("Not attaching to stdin")
|
||||
streams.AttachInput = false
|
||||
}
|
||||
|
||||
if !startContainer {
|
||||
if sigProxy {
|
||||
ProxySignals(ctr)
|
||||
}
|
||||
|
||||
return ctr.Attach(streams, detachKeys, resize)
|
||||
}
|
||||
|
||||
attachChan, err := ctr.StartAndAttach(ctx, streams, detachKeys, resize, recursive)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if sigProxy {
|
||||
ProxySignals(ctr)
|
||||
}
|
||||
|
||||
if stdout == nil && stderr == nil {
|
||||
fmt.Printf("%s\n", ctr.ID())
|
||||
}
|
||||
|
||||
err = <-attachChan
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error attaching to container %s", ctr.ID())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getResize returns a TerminalSize command matching stdin's current
|
||||
// size on success, and nil on errors.
|
||||
func getResize() *remotecommand.TerminalSize {
|
||||
|
91
pkg/adapter/terminal_linux.go
Normal file
91
pkg/adapter/terminal_linux.go
Normal file
@ -0,0 +1,91 @@
|
||||
package adapter
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/containers/libpod/libpod"
|
||||
"github.com/docker/docker/pkg/term"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"k8s.io/client-go/tools/remotecommand"
|
||||
)
|
||||
|
||||
// StartAttachCtr starts and (if required) attaches to a container
|
||||
func StartAttachCtr(ctx context.Context, ctr *libpod.Container, stdout, stderr, stdin *os.File, detachKeys string, sigProxy bool, startContainer bool, recursive bool) error {
|
||||
resize := make(chan remotecommand.TerminalSize)
|
||||
|
||||
haveTerminal := terminal.IsTerminal(int(os.Stdin.Fd()))
|
||||
|
||||
// Check if we are attached to a terminal. If we are, generate resize
|
||||
// events, and set the terminal to raw mode
|
||||
if haveTerminal && ctr.Spec().Process.Terminal {
|
||||
logrus.Debugf("Handling terminal attach")
|
||||
|
||||
subCtx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
|
||||
resizeTty(subCtx, resize)
|
||||
|
||||
oldTermState, err := term.SaveState(os.Stdin.Fd())
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "unable to save terminal state")
|
||||
}
|
||||
|
||||
logrus.SetFormatter(&RawTtyFormatter{})
|
||||
term.SetRawTerminal(os.Stdin.Fd())
|
||||
|
||||
defer restoreTerminal(oldTermState)
|
||||
}
|
||||
|
||||
streams := new(libpod.AttachStreams)
|
||||
streams.OutputStream = stdout
|
||||
streams.ErrorStream = stderr
|
||||
streams.InputStream = stdin
|
||||
streams.AttachOutput = true
|
||||
streams.AttachError = true
|
||||
streams.AttachInput = true
|
||||
|
||||
if stdout == nil {
|
||||
logrus.Debugf("Not attaching to stdout")
|
||||
streams.AttachOutput = false
|
||||
}
|
||||
if stderr == nil {
|
||||
logrus.Debugf("Not attaching to stderr")
|
||||
streams.AttachError = false
|
||||
}
|
||||
if stdin == nil {
|
||||
logrus.Debugf("Not attaching to stdin")
|
||||
streams.AttachInput = false
|
||||
}
|
||||
|
||||
if !startContainer {
|
||||
if sigProxy {
|
||||
ProxySignals(ctr)
|
||||
}
|
||||
|
||||
return ctr.Attach(streams, detachKeys, resize)
|
||||
}
|
||||
|
||||
attachChan, err := ctr.StartAndAttach(ctx, streams, detachKeys, resize, recursive)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if sigProxy {
|
||||
ProxySignals(ctr)
|
||||
}
|
||||
|
||||
if stdout == nil && stderr == nil {
|
||||
fmt.Printf("%s\n", ctr.ID())
|
||||
}
|
||||
|
||||
err = <-attachChan
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "error attaching to container %s", ctr.ID())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user