73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
package process
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"termtap.dev/internal/model"
|
|
)
|
|
|
|
func CommandString(c model.Command) string {
|
|
return fmt.Sprintf("%s %s", c.Name, strings.Join(c.Args, " "))
|
|
}
|
|
|
|
func NewProcess(cmd model.Command, addr string, ch chan<- model.Message) *exec.Cmd {
|
|
proc := exec.Command(cmd.Name, cmd.Args...)
|
|
|
|
injectEnv(proc, addr)
|
|
|
|
stdout, err := proc.StdoutPipe()
|
|
if err != nil {
|
|
ch <- model.Message{
|
|
Type: model.MessageTypeWarn,
|
|
Body: fmt.Sprintf("could not open stdout pipe: %q", err),
|
|
PID: proc.Process.Pid,
|
|
}
|
|
} else {
|
|
go readPipe(stdout, model.MessageTypeProcessStdout, ch)
|
|
}
|
|
|
|
stderr, err := proc.StderrPipe()
|
|
if err != nil {
|
|
ch <- model.Message{
|
|
Type: model.MessageTypeWarn,
|
|
Body: fmt.Sprintf("could not open stderr pipe: %q", err),
|
|
PID: proc.Process.Pid,
|
|
}
|
|
} else {
|
|
go readPipe(stderr, model.MessageTypeProcessStderr, ch)
|
|
}
|
|
|
|
return proc
|
|
}
|
|
|
|
func injectEnv(proc *exec.Cmd, addr string) {
|
|
proxyAddr := "http://" + addr
|
|
injected := []string{
|
|
"HTTP_PROXY=" + proxyAddr,
|
|
"http_proxy=" + proxyAddr,
|
|
"HTTPS_PROXY=" + proxyAddr, // TODO: HTTP NOT SUPPORTED
|
|
"https_proxy=" + proxyAddr,
|
|
// "ALL_PROXY=" + proxyAddr,
|
|
// "all_proxy=" + proxyAddr,
|
|
"NO_PROXY=",
|
|
"no_proxy=",
|
|
}
|
|
|
|
proc.Env = append(os.Environ(), injected...)
|
|
}
|
|
|
|
func readPipe(pipe io.Reader, t model.MessageType, ch chan<- model.Message) {
|
|
scanner := bufio.NewScanner(pipe)
|
|
for scanner.Scan() {
|
|
ch <- model.Message{
|
|
Type: t,
|
|
Body: scanner.Text(),
|
|
}
|
|
}
|
|
}
|