initial commit
This commit is contained in:
73
tplCmd/funcs_templatecmd.go
Normal file
73
tplCmd/funcs_templatecmd.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package tplCmd
|
||||
|
||||
import (
|
||||
`bytes`
|
||||
`os`
|
||||
`os/exec`
|
||||
`text/template`
|
||||
)
|
||||
|
||||
// ToCmd returns an (os/)exec.Cmd from a TemplateCmd. t should be a tunnelbroker.FetchedTunnel, generally.
|
||||
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)
|
||||
|
||||
buf.Reset()
|
||||
if tpl, err = template.New("").Parse(c.Program); err != nil {
|
||||
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()
|
||||
if tpl, err = template.New("").Parse(arg); err != nil {
|
||||
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()
|
||||
if tpl, err = template.New("").Parse(env); err != nil {
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user