(jobId string, cmdDef CmdDef)
| 42 | } |
| 43 | |
| 44 | func MakeJobCmd(jobId string, cmdDef CmdDef) (*JobCmd, error) { |
| 45 | jm := &JobCmd{ |
| 46 | jobId: jobId, |
| 47 | } |
| 48 | if cmdDef.TermSize.Rows == 0 || cmdDef.TermSize.Cols == 0 { |
| 49 | cmdDef.TermSize.Rows = 25 |
| 50 | cmdDef.TermSize.Cols = 80 |
| 51 | } |
| 52 | if cmdDef.TermSize.Rows <= 0 || cmdDef.TermSize.Cols <= 0 { |
| 53 | return nil, fmt.Errorf("invalid term size: %v", cmdDef.TermSize) |
| 54 | } |
| 55 | ecmd := exec.Command(cmdDef.Cmd, cmdDef.Args...) |
| 56 | if len(cmdDef.Env) > 0 { |
| 57 | ecmd.Env = make([]string, 0, len(cmdDef.Env)) |
| 58 | for key, val := range cmdDef.Env { |
| 59 | ecmd.Env = append(ecmd.Env, fmt.Sprintf("%s=%s", key, val)) |
| 60 | } |
| 61 | } |
| 62 | cmdPty, err := pty.StartWithSize(ecmd, &pty.Winsize{Rows: uint16(cmdDef.TermSize.Rows), Cols: uint16(cmdDef.TermSize.Cols)}) |
| 63 | if err != nil { |
| 64 | return nil, fmt.Errorf("failed to start command: %w", err) |
| 65 | } |
| 66 | unixutil.SetCloseOnExec(int(cmdPty.Fd())) |
| 67 | jm.cmd = ecmd |
| 68 | jm.cmdPty = cmdPty |
| 69 | jm.ptsName = jm.cmdPty.Name() |
| 70 | jm.termSize = cmdDef.TermSize |
| 71 | go jm.waitForProcess() |
| 72 | return jm, nil |
| 73 | } |
| 74 | |
| 75 | func (jm *JobCmd) waitForProcess() { |
| 76 | if jm.cmd == nil || jm.cmd.Process == nil { |
no test coverage detected