66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
// +build !windows
|
|
|
|
package tasks
|
|
|
|
import (
|
|
gocontext "context"
|
|
"os"
|
|
"os/signal"
|
|
|
|
"github.com/containerd/console"
|
|
"github.com/containerd/containerd"
|
|
"github.com/containerd/containerd/cio"
|
|
"github.com/containerd/containerd/log"
|
|
"github.com/pkg/errors"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// HandleConsoleResize resizes the console
|
|
func HandleConsoleResize(ctx gocontext.Context, task resizer, con console.Console) error {
|
|
// do an initial resize of the console
|
|
size, err := con.Size()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := task.Resize(ctx, uint32(size.Width), uint32(size.Height)); err != nil {
|
|
log.G(ctx).WithError(err).Error("resize pty")
|
|
}
|
|
s := make(chan os.Signal, 16)
|
|
signal.Notify(s, unix.SIGWINCH)
|
|
go func() {
|
|
for range s {
|
|
size, err := con.Size()
|
|
if err != nil {
|
|
log.G(ctx).WithError(err).Error("get pty size")
|
|
continue
|
|
}
|
|
if err := task.Resize(ctx, uint32(size.Width), uint32(size.Height)); err != nil {
|
|
log.G(ctx).WithError(err).Error("resize pty")
|
|
}
|
|
}
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
// NewTask creates a new task
|
|
func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, tty, nullIO bool) (containerd.Task, error) {
|
|
if checkpoint == "" {
|
|
ioCreator := cio.Stdio
|
|
if tty {
|
|
ioCreator = cio.StdioTerminal
|
|
}
|
|
if nullIO {
|
|
if tty {
|
|
return nil, errors.New("tty and null-io cannot be used together")
|
|
}
|
|
ioCreator = cio.NullIO
|
|
}
|
|
return container.NewTask(ctx, ioCreator)
|
|
}
|
|
im, err := client.GetImage(ctx, checkpoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return container.NewTask(ctx, cio.Stdio, containerd.WithTaskCheckpoint(im))
|
|
}
|