GoBroke/tplCmd/funcs_templatecmd.go

86 lines
1.5 KiB
Go
Raw Normal View History

2024-12-17 17:39:10 -05:00
package tplCmd
import (
`bytes`
`os`
`os/exec`
`text/template`
)
2025-02-04 12:14:08 -05:00
/*
ToCmd returns an (os/)exec.Cmd from a TemplateCmd.
t should be a runner.TunnelResult.
*/
2024-12-17 17:39:10 -05:00
func (c *TemplateCmd) ToCmd(t any) (cmd *exec.Cmd, err error) {
var progName string
var envs []string
var tpl *template.Template
var args []string
var buf *bytes.Buffer = new(bytes.Buffer)
2025-02-04 12:14:08 -05:00
if !c.IsTemplate {
cmd, err = c.Cmd.ToCmd()
return
}
2024-12-17 17:39:10 -05:00
buf.Reset()
2025-02-04 12:14:08 -05:00
tpl = GetTpl()
if _, err = tpl.Parse(c.Program); err != nil {
2024-12-17 17:39:10 -05:00
return
}
if err = tpl.Execute(buf, t); err != nil {
return
}
progName = buf.String()
if c.Args != nil && len(c.Args) > 0 {
args = make([]string, len(c.Args))
for idx, arg := range c.Args {
buf.Reset()
2025-02-04 12:14:08 -05:00
tpl = GetTpl()
if _, err = tpl.Parse(arg); err != nil {
2024-12-17 17:39:10 -05:00
return
}
if err = tpl.Execute(buf, t); err != nil {
return
}
args[idx] = buf.String()
}
}
if c.EnvVars != nil && len(c.EnvVars) > 0 {
envs = make([]string, len(c.EnvVars))
for idx, env := range c.EnvVars {
buf.Reset()
2025-02-04 12:14:08 -05:00
tpl = GetTpl()
if _, err = tpl.Parse(env); err != nil {
2024-12-17 17:39:10 -05:00
return
}
if err = tpl.Execute(buf, t); err != nil {
return
}
envs[idx] = buf.String()
}
}
if !c.IsolateEnv {
if envs != nil && len(envs) > 0 {
envs = append(os.Environ(), envs...)
} else {
envs = os.Environ()
}
}
if args != nil && len(args) > 0 {
cmd = exec.Command(progName, args...)
} else {
cmd = exec.Command(progName)
}
cmd.Env = envs
return
}