2026-04-13 20:28:10 -07:00

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(),
}
}
}