|
@@ -1,12 +1,10 @@
|
|
|
package worker
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
"os"
|
|
|
- "os/exec"
|
|
|
- "strings"
|
|
|
|
|
|
"github.com/anmitsu/go-shlex"
|
|
|
- "github.com/codeskyblue/go-sh"
|
|
|
)
|
|
|
|
|
|
type cmdConfig struct {
|
|
@@ -21,8 +19,7 @@ type cmdProvider struct {
|
|
|
baseProvider
|
|
|
cmdConfig
|
|
|
command []string
|
|
|
- cmd *exec.Cmd
|
|
|
- session *sh.Session
|
|
|
+ cmd *cmdJob
|
|
|
}
|
|
|
|
|
|
func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
|
|
@@ -49,39 +46,10 @@ func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
|
|
|
return provider, nil
|
|
|
}
|
|
|
|
|
|
-// Copied from go-sh
|
|
|
-func newEnviron(env map[string]string, inherit bool) []string { //map[string]string {
|
|
|
- environ := make([]string, 0, len(env))
|
|
|
- if inherit {
|
|
|
- for _, line := range os.Environ() {
|
|
|
- // if os environment and env collapses,
|
|
|
- // omit the os one
|
|
|
- k := strings.Split(line, "=")[0]
|
|
|
- if _, ok := env[k]; ok {
|
|
|
- continue
|
|
|
- }
|
|
|
- environ = append(environ, line)
|
|
|
- }
|
|
|
- }
|
|
|
- for k, v := range env {
|
|
|
- environ = append(environ, k+"="+v)
|
|
|
- }
|
|
|
- return environ
|
|
|
+func (p *cmdProvider) InitRunner() {
|
|
|
}
|
|
|
|
|
|
-// TODO: implement this
|
|
|
func (p *cmdProvider) Run() error {
|
|
|
- if len(p.command) == 1 {
|
|
|
- p.cmd = exec.Command(p.command[0])
|
|
|
- } else if len(p.command) > 1 {
|
|
|
- c := p.command[0]
|
|
|
- args := p.command[1:]
|
|
|
- p.cmd = exec.Command(c, args...)
|
|
|
- } else if len(p.command) == 0 {
|
|
|
- panic("Command length should be at least 1!")
|
|
|
- }
|
|
|
- p.cmd.Dir = p.WorkingDir()
|
|
|
-
|
|
|
env := map[string]string{
|
|
|
"TUNASYNC_MIRROR_NAME": p.Name(),
|
|
|
"TUNASYNC_WORKING_DIR": p.WorkingDir(),
|
|
@@ -91,14 +59,14 @@ func (p *cmdProvider) Run() error {
|
|
|
for k, v := range p.env {
|
|
|
env[k] = v
|
|
|
}
|
|
|
- p.cmd.Env = newEnviron(env, true)
|
|
|
+ p.cmd = newCmdJob(p.command, p.WorkingDir(), env)
|
|
|
|
|
|
logFile, err := os.OpenFile(p.LogFile(), os.O_WRONLY|os.O_CREATE, 0644)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- p.cmd.Stdout = logFile
|
|
|
- p.cmd.Stderr = logFile
|
|
|
+ // defer logFile.Close()
|
|
|
+ p.cmd.SetLogFile(logFile)
|
|
|
|
|
|
return p.cmd.Start()
|
|
|
}
|
|
@@ -107,9 +75,12 @@ func (p *cmdProvider) Wait() error {
|
|
|
return p.cmd.Wait()
|
|
|
}
|
|
|
|
|
|
-// TODO: implement this
|
|
|
-func (p *cmdProvider) Terminate() {
|
|
|
-
|
|
|
+func (p *cmdProvider) Terminate() error {
|
|
|
+ if p.cmd == nil {
|
|
|
+ return errors.New("provider command job not initialized")
|
|
|
+ }
|
|
|
+ err := p.cmd.Terminate()
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
// TODO: implement this
|