14 changed files with 442 additions and 387 deletions
@ -1,44 +0,0 @@ |
|||||||
package core |
|
||||||
|
|
||||||
import ( |
|
||||||
"github.com/bluenviron/mediamtx/internal/defs" |
|
||||||
"github.com/bluenviron/mediamtx/internal/externalcmd" |
|
||||||
"github.com/bluenviron/mediamtx/internal/logger" |
|
||||||
) |
|
||||||
|
|
||||||
type conn struct { |
|
||||||
rtspAddress string |
|
||||||
runOnConnect string |
|
||||||
runOnConnectRestart bool |
|
||||||
runOnDisconnect string |
|
||||||
externalCmdPool *externalcmd.Pool |
|
||||||
logger logger.Writer |
|
||||||
|
|
||||||
onDisconnectHook func() |
|
||||||
} |
|
||||||
|
|
||||||
func newConn( |
|
||||||
rtspAddress string, |
|
||||||
runOnConnect string, |
|
||||||
runOnConnectRestart bool, |
|
||||||
runOnDisconnect string, |
|
||||||
externalCmdPool *externalcmd.Pool, |
|
||||||
logger logger.Writer, |
|
||||||
) *conn { |
|
||||||
return &conn{ |
|
||||||
rtspAddress: rtspAddress, |
|
||||||
runOnConnect: runOnConnect, |
|
||||||
runOnConnectRestart: runOnConnectRestart, |
|
||||||
runOnDisconnect: runOnDisconnect, |
|
||||||
externalCmdPool: externalCmdPool, |
|
||||||
logger: logger, |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func (c *conn) open(desc defs.APIPathSourceOrReader) { |
|
||||||
c.onDisconnectHook = onConnectHook(c, desc) |
|
||||||
} |
|
||||||
|
|
||||||
func (c *conn) close() { |
|
||||||
c.onDisconnectHook() |
|
||||||
} |
|
@ -1,208 +0,0 @@ |
|||||||
package core |
|
||||||
|
|
||||||
import ( |
|
||||||
"net" |
|
||||||
|
|
||||||
"github.com/bluenviron/mediamtx/internal/conf" |
|
||||||
"github.com/bluenviron/mediamtx/internal/defs" |
|
||||||
"github.com/bluenviron/mediamtx/internal/externalcmd" |
|
||||||
"github.com/bluenviron/mediamtx/internal/logger" |
|
||||||
) |
|
||||||
|
|
||||||
func onInitHook(path *path) func() { |
|
||||||
var onInitCmd *externalcmd.Cmd |
|
||||||
|
|
||||||
if path.conf.RunOnInit != "" { |
|
||||||
path.Log(logger.Info, "runOnInit command started") |
|
||||||
onInitCmd = externalcmd.NewCmd( |
|
||||||
path.externalCmdPool, |
|
||||||
path.conf.RunOnInit, |
|
||||||
path.conf.RunOnInitRestart, |
|
||||||
path.externalCmdEnv(), |
|
||||||
func(err error) { |
|
||||||
path.Log(logger.Info, "runOnInit command exited: %v", err) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
return func() { |
|
||||||
if onInitCmd != nil { |
|
||||||
onInitCmd.Close() |
|
||||||
path.Log(logger.Info, "runOnInit command stopped") |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func onConnectHook(c *conn, desc defs.APIPathSourceOrReader) func() { |
|
||||||
var env externalcmd.Environment |
|
||||||
var onConnectCmd *externalcmd.Cmd |
|
||||||
|
|
||||||
if c.runOnConnect != "" || c.runOnDisconnect != "" { |
|
||||||
_, port, _ := net.SplitHostPort(c.rtspAddress) |
|
||||||
env = externalcmd.Environment{ |
|
||||||
"RTSP_PORT": port, |
|
||||||
"MTX_CONN_TYPE": desc.Type, |
|
||||||
"MTX_CONN_ID": desc.ID, |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if c.runOnConnect != "" { |
|
||||||
c.logger.Log(logger.Info, "runOnConnect command started") |
|
||||||
|
|
||||||
onConnectCmd = externalcmd.NewCmd( |
|
||||||
c.externalCmdPool, |
|
||||||
c.runOnConnect, |
|
||||||
c.runOnConnectRestart, |
|
||||||
env, |
|
||||||
func(err error) { |
|
||||||
c.logger.Log(logger.Info, "runOnConnect command exited: %v", err) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
return func() { |
|
||||||
if onConnectCmd != nil { |
|
||||||
onConnectCmd.Close() |
|
||||||
c.logger.Log(logger.Info, "runOnConnect command stopped") |
|
||||||
} |
|
||||||
|
|
||||||
if c.runOnDisconnect != "" { |
|
||||||
c.logger.Log(logger.Info, "runOnDisconnect command launched") |
|
||||||
externalcmd.NewCmd( |
|
||||||
c.externalCmdPool, |
|
||||||
c.runOnDisconnect, |
|
||||||
false, |
|
||||||
env, |
|
||||||
nil) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func onDemandHook(path *path, query string) func(string) { |
|
||||||
var env externalcmd.Environment |
|
||||||
var onDemandCmd *externalcmd.Cmd |
|
||||||
|
|
||||||
if path.conf.RunOnDemand != "" || path.conf.RunOnUnDemand != "" { |
|
||||||
env = path.externalCmdEnv() |
|
||||||
env["MTX_QUERY"] = query |
|
||||||
} |
|
||||||
|
|
||||||
if path.conf.RunOnDemand != "" { |
|
||||||
path.Log(logger.Info, "runOnDemand command started") |
|
||||||
|
|
||||||
onDemandCmd = externalcmd.NewCmd( |
|
||||||
path.externalCmdPool, |
|
||||||
path.conf.RunOnDemand, |
|
||||||
path.conf.RunOnDemandRestart, |
|
||||||
env, |
|
||||||
func(err error) { |
|
||||||
path.Log(logger.Info, "runOnDemand command exited: %v", err) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
return func(reason string) { |
|
||||||
if onDemandCmd != nil { |
|
||||||
onDemandCmd.Close() |
|
||||||
path.Log(logger.Info, "runOnDemand command stopped: %v", reason) |
|
||||||
} |
|
||||||
|
|
||||||
if path.conf.RunOnUnDemand != "" { |
|
||||||
path.Log(logger.Info, "runOnUnDemand command launched") |
|
||||||
externalcmd.NewCmd( |
|
||||||
path.externalCmdPool, |
|
||||||
path.conf.RunOnUnDemand, |
|
||||||
false, |
|
||||||
env, |
|
||||||
nil) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func onReadyHook(path *path) func() { |
|
||||||
var env externalcmd.Environment |
|
||||||
var onReadyCmd *externalcmd.Cmd |
|
||||||
|
|
||||||
if path.conf.RunOnReady != "" || path.conf.RunOnNotReady != "" { |
|
||||||
env = path.externalCmdEnv() |
|
||||||
desc := path.source.APISourceDescribe() |
|
||||||
env["MTX_QUERY"] = path.publisherQuery |
|
||||||
env["MTX_SOURCE_TYPE"] = desc.Type |
|
||||||
env["MTX_SOURCE_ID"] = desc.ID |
|
||||||
} |
|
||||||
|
|
||||||
if path.conf.RunOnReady != "" { |
|
||||||
path.Log(logger.Info, "runOnReady command started") |
|
||||||
onReadyCmd = externalcmd.NewCmd( |
|
||||||
path.externalCmdPool, |
|
||||||
path.conf.RunOnReady, |
|
||||||
path.conf.RunOnReadyRestart, |
|
||||||
env, |
|
||||||
func(err error) { |
|
||||||
path.Log(logger.Info, "runOnReady command exited: %v", err) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
return func() { |
|
||||||
if onReadyCmd != nil { |
|
||||||
onReadyCmd.Close() |
|
||||||
path.Log(logger.Info, "runOnReady command stopped") |
|
||||||
} |
|
||||||
|
|
||||||
if path.conf.RunOnNotReady != "" { |
|
||||||
path.Log(logger.Info, "runOnNotReady command launched") |
|
||||||
externalcmd.NewCmd( |
|
||||||
path.externalCmdPool, |
|
||||||
path.conf.RunOnNotReady, |
|
||||||
false, |
|
||||||
env, |
|
||||||
nil) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
func onReadHook( |
|
||||||
externalCmdPool *externalcmd.Pool, |
|
||||||
pathConf *conf.Path, |
|
||||||
path *path, |
|
||||||
reader defs.APIPathSourceOrReader, |
|
||||||
query string, |
|
||||||
l logger.Writer, |
|
||||||
) func() { |
|
||||||
var env externalcmd.Environment |
|
||||||
var onReadCmd *externalcmd.Cmd |
|
||||||
|
|
||||||
if pathConf.RunOnRead != "" || pathConf.RunOnUnread != "" { |
|
||||||
env = path.externalCmdEnv() |
|
||||||
desc := reader |
|
||||||
env["MTX_QUERY"] = query |
|
||||||
env["MTX_READER_TYPE"] = desc.Type |
|
||||||
env["MTX_READER_ID"] = desc.ID |
|
||||||
} |
|
||||||
|
|
||||||
if pathConf.RunOnRead != "" { |
|
||||||
l.Log(logger.Info, "runOnRead command started") |
|
||||||
onReadCmd = externalcmd.NewCmd( |
|
||||||
externalCmdPool, |
|
||||||
pathConf.RunOnRead, |
|
||||||
pathConf.RunOnReadRestart, |
|
||||||
env, |
|
||||||
func(err error) { |
|
||||||
l.Log(logger.Info, "runOnRead command exited: %v", err) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
return func() { |
|
||||||
if onReadCmd != nil { |
|
||||||
onReadCmd.Close() |
|
||||||
l.Log(logger.Info, "runOnRead command stopped") |
|
||||||
} |
|
||||||
|
|
||||||
if pathConf.RunOnUnread != "" { |
|
||||||
l.Log(logger.Info, "runOnUnread command launched") |
|
||||||
externalcmd.NewCmd( |
|
||||||
externalCmdPool, |
|
||||||
pathConf.RunOnUnread, |
|
||||||
false, |
|
||||||
env, |
|
||||||
nil) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,2 @@ |
|||||||
|
// Package hooks contains hook implementations.
|
||||||
|
package hooks |
@ -0,0 +1,65 @@ |
|||||||
|
package hooks |
||||||
|
|
||||||
|
import ( |
||||||
|
"net" |
||||||
|
|
||||||
|
"github.com/bluenviron/mediamtx/internal/defs" |
||||||
|
"github.com/bluenviron/mediamtx/internal/externalcmd" |
||||||
|
"github.com/bluenviron/mediamtx/internal/logger" |
||||||
|
) |
||||||
|
|
||||||
|
// OnConnectParams are the parameters of OnConnect.
|
||||||
|
type OnConnectParams struct { |
||||||
|
Logger logger.Writer |
||||||
|
ExternalCmdPool *externalcmd.Pool |
||||||
|
RunOnConnect string |
||||||
|
RunOnConnectRestart bool |
||||||
|
RunOnDisconnect string |
||||||
|
RTSPAddress string |
||||||
|
Desc defs.APIPathSourceOrReader |
||||||
|
} |
||||||
|
|
||||||
|
// OnConnect is the OnConnect hook.
|
||||||
|
func OnConnect(params OnConnectParams) func() { |
||||||
|
var env externalcmd.Environment |
||||||
|
var onConnectCmd *externalcmd.Cmd |
||||||
|
|
||||||
|
if params.RunOnConnect != "" || params.RunOnDisconnect != "" { |
||||||
|
_, port, _ := net.SplitHostPort(params.RTSPAddress) |
||||||
|
env = externalcmd.Environment{ |
||||||
|
"RTSP_PORT": port, |
||||||
|
"MTX_CONN_TYPE": params.Desc.Type, |
||||||
|
"MTX_CONN_ID": params.Desc.ID, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if params.RunOnConnect != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnConnect command started") |
||||||
|
|
||||||
|
onConnectCmd = externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.RunOnConnect, |
||||||
|
params.RunOnConnectRestart, |
||||||
|
env, |
||||||
|
func(err error) { |
||||||
|
params.Logger.Log(logger.Info, "runOnConnect command exited: %v", err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return func() { |
||||||
|
if onConnectCmd != nil { |
||||||
|
onConnectCmd.Close() |
||||||
|
params.Logger.Log(logger.Info, "runOnConnect command stopped") |
||||||
|
} |
||||||
|
|
||||||
|
if params.RunOnDisconnect != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnDisconnect command launched") |
||||||
|
externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.RunOnDisconnect, |
||||||
|
false, |
||||||
|
env, |
||||||
|
nil) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
package hooks |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/bluenviron/mediamtx/internal/conf" |
||||||
|
"github.com/bluenviron/mediamtx/internal/externalcmd" |
||||||
|
"github.com/bluenviron/mediamtx/internal/logger" |
||||||
|
) |
||||||
|
|
||||||
|
// OnDemandParams are the parameters of OnDemand.
|
||||||
|
type OnDemandParams struct { |
||||||
|
Logger logger.Writer |
||||||
|
ExternalCmdPool *externalcmd.Pool |
||||||
|
Conf *conf.Path |
||||||
|
ExternalCmdEnv externalcmd.Environment |
||||||
|
Query string |
||||||
|
} |
||||||
|
|
||||||
|
// OnDemand is the OnDemand hook.
|
||||||
|
func OnDemand(params OnDemandParams) func(string) { |
||||||
|
var env externalcmd.Environment |
||||||
|
var onDemandCmd *externalcmd.Cmd |
||||||
|
|
||||||
|
if params.Conf.RunOnDemand != "" || params.Conf.RunOnUnDemand != "" { |
||||||
|
env = params.ExternalCmdEnv |
||||||
|
env["MTX_QUERY"] = params.Query |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnDemand != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnDemand command started") |
||||||
|
|
||||||
|
onDemandCmd = externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnDemand, |
||||||
|
params.Conf.RunOnDemandRestart, |
||||||
|
env, |
||||||
|
func(err error) { |
||||||
|
params.Logger.Log(logger.Info, "runOnDemand command exited: %v", err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return func(reason string) { |
||||||
|
if onDemandCmd != nil { |
||||||
|
onDemandCmd.Close() |
||||||
|
params.Logger.Log(logger.Info, "runOnDemand command stopped: %v", reason) |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnUnDemand != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnUnDemand command launched") |
||||||
|
externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnUnDemand, |
||||||
|
false, |
||||||
|
env, |
||||||
|
nil) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package hooks |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/bluenviron/mediamtx/internal/conf" |
||||||
|
"github.com/bluenviron/mediamtx/internal/externalcmd" |
||||||
|
"github.com/bluenviron/mediamtx/internal/logger" |
||||||
|
) |
||||||
|
|
||||||
|
// OnInitParams are the parameters of OnInit.
|
||||||
|
type OnInitParams struct { |
||||||
|
Logger logger.Writer |
||||||
|
ExternalCmdPool *externalcmd.Pool |
||||||
|
Conf *conf.Path |
||||||
|
ExternalCmdEnv externalcmd.Environment |
||||||
|
} |
||||||
|
|
||||||
|
// OnInit is the OnInit hook.
|
||||||
|
func OnInit(params OnInitParams) func() { |
||||||
|
var onInitCmd *externalcmd.Cmd |
||||||
|
|
||||||
|
if params.Conf.RunOnInit != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnInit command started") |
||||||
|
onInitCmd = externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnInit, |
||||||
|
params.Conf.RunOnInitRestart, |
||||||
|
params.ExternalCmdEnv, |
||||||
|
func(err error) { |
||||||
|
params.Logger.Log(logger.Info, "runOnInit command exited: %v", err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return func() { |
||||||
|
if onInitCmd != nil { |
||||||
|
onInitCmd.Close() |
||||||
|
params.Logger.Log(logger.Info, "runOnInit command stopped") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,61 @@ |
|||||||
|
package hooks |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/bluenviron/mediamtx/internal/conf" |
||||||
|
"github.com/bluenviron/mediamtx/internal/defs" |
||||||
|
"github.com/bluenviron/mediamtx/internal/externalcmd" |
||||||
|
"github.com/bluenviron/mediamtx/internal/logger" |
||||||
|
) |
||||||
|
|
||||||
|
// OnReadParams are the parameters of OnRead.
|
||||||
|
type OnReadParams struct { |
||||||
|
Logger logger.Writer |
||||||
|
ExternalCmdPool *externalcmd.Pool |
||||||
|
Conf *conf.Path |
||||||
|
ExternalCmdEnv externalcmd.Environment |
||||||
|
Reader defs.APIPathSourceOrReader |
||||||
|
Query string |
||||||
|
} |
||||||
|
|
||||||
|
// OnRead is the OnRead hook.
|
||||||
|
func OnRead(params OnReadParams) func() { |
||||||
|
var env externalcmd.Environment |
||||||
|
var onReadCmd *externalcmd.Cmd |
||||||
|
|
||||||
|
if params.Conf.RunOnRead != "" || params.Conf.RunOnUnread != "" { |
||||||
|
env = params.ExternalCmdEnv |
||||||
|
desc := params.Reader |
||||||
|
env["MTX_QUERY"] = params.Query |
||||||
|
env["MTX_READER_TYPE"] = desc.Type |
||||||
|
env["MTX_READER_ID"] = desc.ID |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnRead != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnRead command started") |
||||||
|
onReadCmd = externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnRead, |
||||||
|
params.Conf.RunOnReadRestart, |
||||||
|
env, |
||||||
|
func(err error) { |
||||||
|
params.Logger.Log(logger.Info, "runOnRead command exited: %v", err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return func() { |
||||||
|
if onReadCmd != nil { |
||||||
|
onReadCmd.Close() |
||||||
|
params.Logger.Log(logger.Info, "runOnRead command stopped") |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnUnread != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnUnread command launched") |
||||||
|
externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnUnread, |
||||||
|
false, |
||||||
|
env, |
||||||
|
nil) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
package hooks |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/bluenviron/mediamtx/internal/conf" |
||||||
|
"github.com/bluenviron/mediamtx/internal/defs" |
||||||
|
"github.com/bluenviron/mediamtx/internal/externalcmd" |
||||||
|
"github.com/bluenviron/mediamtx/internal/logger" |
||||||
|
) |
||||||
|
|
||||||
|
// OnReadyParams are the parameters of OnReady.
|
||||||
|
type OnReadyParams struct { |
||||||
|
Logger logger.Writer |
||||||
|
ExternalCmdPool *externalcmd.Pool |
||||||
|
Conf *conf.Path |
||||||
|
ExternalCmdEnv externalcmd.Environment |
||||||
|
Desc defs.APIPathSourceOrReader |
||||||
|
Query string |
||||||
|
} |
||||||
|
|
||||||
|
// OnReady is the OnReady hook.
|
||||||
|
func OnReady(params OnReadyParams) func() { |
||||||
|
var env externalcmd.Environment |
||||||
|
var onReadyCmd *externalcmd.Cmd |
||||||
|
|
||||||
|
if params.Conf.RunOnReady != "" || params.Conf.RunOnNotReady != "" { |
||||||
|
env = params.ExternalCmdEnv |
||||||
|
env["MTX_QUERY"] = params.Query |
||||||
|
env["MTX_SOURCE_TYPE"] = params.Desc.Type |
||||||
|
env["MTX_SOURCE_ID"] = params.Desc.ID |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnReady != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnReady command started") |
||||||
|
onReadyCmd = externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnReady, |
||||||
|
params.Conf.RunOnReadyRestart, |
||||||
|
env, |
||||||
|
func(err error) { |
||||||
|
params.Logger.Log(logger.Info, "runOnReady command exited: %v", err) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return func() { |
||||||
|
if onReadyCmd != nil { |
||||||
|
onReadyCmd.Close() |
||||||
|
params.Logger.Log(logger.Info, "runOnReady command stopped") |
||||||
|
} |
||||||
|
|
||||||
|
if params.Conf.RunOnNotReady != "" { |
||||||
|
params.Logger.Log(logger.Info, "runOnNotReady command launched") |
||||||
|
externalcmd.NewCmd( |
||||||
|
params.ExternalCmdPool, |
||||||
|
params.Conf.RunOnNotReady, |
||||||
|
false, |
||||||
|
env, |
||||||
|
nil) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue