diff --git a/client.go b/client.go index 81251833..d0f79bb3 100644 --- a/client.go +++ b/client.go @@ -7,7 +7,6 @@ import ( "net" "os" "os/exec" - "runtime" "strconv" "strings" "sync/atomic" @@ -230,16 +229,8 @@ var errRunRecord = errors.New("record") func (c *client) run() { var onConnectCmd *exec.Cmd if c.p.conf.RunOnConnect != "" { - var substitutedCommand = strings.ReplaceAll(c.p.conf.RunOnConnect, "$RTSP_SERVER_PATH", c.path.name) - if runtime.GOOS == "windows" { - var command = strings.Fields(substitutedCommand) - onConnectCmd = exec.Command(command[0], command[1:]...) - } else { - onConnectCmd = exec.Command("/bin/sh", "-c", substitutedCommand) - } - onConnectCmd.Stdout = os.Stdout - onConnectCmd.Stderr = os.Stderr - err := onConnectCmd.Start() + var err error + onConnectCmd, err = startExternalCommand(c.p.conf.RunOnConnect, c.path.name) if err != nil { c.log("ERR: %s", err) } @@ -933,16 +924,8 @@ func (c *client) runPlay() bool { var onReadCmd *exec.Cmd if c.path.confp.RunOnRead != "" { - var substitutedCommand = strings.ReplaceAll(c.path.confp.RunOnRead, "$RTSP_SERVER_PATH", c.path.name) - if runtime.GOOS == "windows" { - var command = strings.Fields(substitutedCommand) - onReadCmd = exec.Command(command[0], command[1:]...) - } else { - onReadCmd = exec.Command("/bin/sh", "-c", substitutedCommand) - } - onReadCmd.Stdout = os.Stdout - onReadCmd.Stderr = os.Stderr - err := onReadCmd.Start() + var err error + onReadCmd, err = startExternalCommand(c.path.confp.RunOnRead, c.path.name) if err != nil { c.log("ERR: %s", err) } @@ -1084,16 +1067,8 @@ func (c *client) runRecord() bool { var onPublishCmd *exec.Cmd if c.path.confp.RunOnPublish != "" { - var substitutedCommand = strings.ReplaceAll(c.path.confp.RunOnPublish, "$RTSP_SERVER_PATH", c.path.name) - if runtime.GOOS == "windows" { - var command = strings.Fields(substitutedCommand) - onPublishCmd = exec.Command(command[0], command[1:]...) - } else { - onPublishCmd = exec.Command("/bin/sh", "-c", substitutedCommand) - } - onPublishCmd.Stdout = os.Stdout - onPublishCmd.Stderr = os.Stderr - err := onPublishCmd.Start() + var err error + onPublishCmd, err = startExternalCommand(c.path.confp.RunOnPublish, c.path.name) if err != nil { c.log("ERR: %s", err) } diff --git a/path.go b/path.go index c5e08be6..a334ab3e 100644 --- a/path.go +++ b/path.go @@ -4,8 +4,6 @@ import ( "fmt" "os" "os/exec" - "runtime" - "strings" "time" ) @@ -64,16 +62,9 @@ func (pa *path) onInit() { if pa.confp.RunOnInit != "" { pa.log("starting on init command") - var substitutedCommand = strings.ReplaceAll(pa.confp.RunOnInit, "$RTSP_SERVER_PATH", pa.name) - if runtime.GOOS == "windows" { - var command = strings.Fields(substitutedCommand) - pa.onInitCmd = exec.Command(command[0], command[1:]...) - } else { - pa.onInitCmd = exec.Command("/bin/sh", "-c", substitutedCommand) - } - pa.onInitCmd.Stdout = os.Stdout - pa.onInitCmd.Stderr = os.Stderr - err := pa.onInitCmd.Start() + + var err error + pa.onInitCmd, err = startExternalCommand(pa.confp.RunOnInit, pa.name) if err != nil { pa.log("ERR: %s", err) } @@ -235,18 +226,10 @@ func (pa *path) onDescribe(client *client) { if pa.confp.RunOnDemand != "" { if pa.onDemandCmd == nil { // start if needed pa.log("starting on demand command") - pa.lastDescribeActivation = time.Now() - var substitutedCommand = strings.ReplaceAll(pa.confp.RunOnDemand, "$RTSP_SERVER_PATH", pa.name) - if runtime.GOOS == "windows" { - var command = strings.Fields(substitutedCommand) - pa.onDemandCmd = exec.Command(command[0], command[1:]...) - } else { - pa.onDemandCmd = exec.Command("/bin/sh", "-c", substitutedCommand) - } - pa.onDemandCmd.Stdout = os.Stdout - pa.onDemandCmd.Stderr = os.Stderr - err := pa.onDemandCmd.Start() + + var err error + pa.onDemandCmd, err = startExternalCommand(pa.confp.RunOnDemand, "") if err != nil { pa.log("ERR: %s", err) } diff --git a/utils.go b/utils.go index c988d441..1397b2c2 100644 --- a/utils.go +++ b/utils.go @@ -3,7 +3,10 @@ package main import ( "fmt" "net" + "os" + "os/exec" "regexp" + "runtime" "strings" ) @@ -126,3 +129,33 @@ func checkPathName(name string) error { return nil } + +func startExternalCommand(cmdstr string, pathName string) (*exec.Cmd, error) { + var cmd *exec.Cmd + if runtime.GOOS == "windows" { + // in Windows the shell is not used and command is started directly + // variables are replaced manually in order to allow + // compatibility with linux commands + cmdstr = strings.ReplaceAll(cmdstr, "$RTSP_SERVER_PATH", pathName) + args := strings.Fields(cmdstr) + cmd = exec.Command(args[0], args[1:]...) + + } else { + cmd = exec.Command("/bin/sh", "-c", cmdstr) + } + + // variables are available through environment variables + cmd.Env = append(os.Environ(), + "RTSP_SERVER_PATH="+pathName, + ) + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + err := cmd.Start() + if err != nil { + return nil, err + } + + return cmd, nil +}