Files
Supervisor/internal/session/process.go

54 lines
977 B
Go

package session
import (
"os"
"os/exec"
"syscall"
"github.com/creack/pty"
)
type DefaultPTYFactory struct{}
type shellProcess struct {
cmd *exec.Cmd
pty *os.File
}
func (f DefaultPTYFactory) Start(command string) (PTYProcess, error) {
cmd := exec.Command("bash", "-lc", command)
cmd.Env = os.Environ()
ptmx, err := pty.Start(cmd)
if err != nil {
return nil, err
}
return &shellProcess{cmd: cmd, pty: ptmx}, nil
}
func (p *shellProcess) Read(b []byte) (int, error) {
return p.pty.Read(b)
}
func (p *shellProcess) Write(b []byte) (int, error) {
return p.pty.Write(b)
}
func (p *shellProcess) Close() error {
return p.pty.Close()
}
func (p *shellProcess) Wait() error {
return p.cmd.Wait()
}
func (p *shellProcess) Resize(cols, rows uint16) error {
return pty.Setsize(p.pty, &pty.Winsize{Cols: cols, Rows: rows})
}
func (p *shellProcess) SignalStop() error {
if p.cmd.Process == nil {
return nil
}
return p.cmd.Process.Signal(syscall.SIGTERM)
}