restore environment variables for external commands

This commit is contained in:
aler9 2020-09-09 19:32:51 +02:00
parent fd1beadf9d
commit d69d433927
3 changed files with 45 additions and 54 deletions

View File

@ -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)
}

29
path.go
View File

@ -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)
}

View File

@ -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
}