mirror of
https://github.com/containers/podman.git
synced 2025-05-21 09:05:56 +08:00

build a podman-remote binary for windows that allows users to use the remote client on windows and interact with podman on linux system. Signed-off-by: baude <bbaude@redhat.com>
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package adapter
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
gosignal "os/signal"
|
|
|
|
"github.com/docker/docker/pkg/signal"
|
|
"github.com/docker/docker/pkg/term"
|
|
"github.com/sirupsen/logrus"
|
|
"k8s.io/client-go/tools/remotecommand"
|
|
)
|
|
|
|
// RawTtyFormatter ...
|
|
type RawTtyFormatter struct {
|
|
}
|
|
|
|
// getResize returns a TerminalSize command matching stdin's current
|
|
// size on success, and nil on errors.
|
|
func getResize() *remotecommand.TerminalSize {
|
|
winsize, err := term.GetWinsize(os.Stdin.Fd())
|
|
if err != nil {
|
|
logrus.Warnf("Could not get terminal size %v", err)
|
|
return nil
|
|
}
|
|
return &remotecommand.TerminalSize{
|
|
Width: winsize.Width,
|
|
Height: winsize.Height,
|
|
}
|
|
}
|
|
|
|
// Helper for prepareAttach - set up a goroutine to generate terminal resize events
|
|
func resizeTty(ctx context.Context, resize chan remotecommand.TerminalSize) {
|
|
sigchan := make(chan os.Signal, 1)
|
|
gosignal.Notify(sigchan, signal.SIGWINCH)
|
|
go func() {
|
|
defer close(resize)
|
|
// Update the terminal size immediately without waiting
|
|
// for a SIGWINCH to get the correct initial size.
|
|
resizeEvent := getResize()
|
|
for {
|
|
if resizeEvent == nil {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case <-sigchan:
|
|
resizeEvent = getResize()
|
|
}
|
|
} else {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case <-sigchan:
|
|
resizeEvent = getResize()
|
|
case resize <- *resizeEvent:
|
|
resizeEvent = nil
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func restoreTerminal(state *term.State) error {
|
|
logrus.SetFormatter(&logrus.TextFormatter{})
|
|
return term.RestoreTerminal(os.Stdin.Fd(), state)
|
|
}
|
|
|
|
// Format ...
|
|
func (f *RawTtyFormatter) Format(entry *logrus.Entry) ([]byte, error) {
|
|
textFormatter := logrus.TextFormatter{}
|
|
bytes, err := textFormatter.Format(entry)
|
|
|
|
if err == nil {
|
|
bytes = append(bytes, '\r')
|
|
}
|
|
|
|
return bytes, err
|
|
}
|