move hooks into dedicated package (#2746)

This commit is contained in:
Alessandro Ros 2023-11-26 22:06:07 +01:00 committed by GitHub
parent d640dcf14d
commit ce45498769
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 442 additions and 387 deletions

View file

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

View file

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

View file

@ -16,6 +16,7 @@ import (
"github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
"github.com/bluenviron/mediamtx/internal/record" "github.com/bluenviron/mediamtx/internal/record"
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
@ -303,7 +304,12 @@ func (pa *path) run() {
} }
} }
onUnInitHook := onInitHook(pa) onUnInitHook := hooks.OnInit(hooks.OnInitParams{
Logger: pa,
ExternalCmdPool: pa.externalCmdPool,
Conf: pa.conf,
ExternalCmdEnv: pa.externalCmdEnv(),
})
err := pa.runInner() err := pa.runInner()
@ -789,7 +795,13 @@ func (pa *path) onDemandStaticSourceStop(reason string) {
} }
func (pa *path) onDemandPublisherStart(query string) { func (pa *path) onDemandPublisherStart(query string) {
pa.onUnDemandHook = onDemandHook(pa, query) pa.onUnDemandHook = hooks.OnDemand(hooks.OnDemandParams{
Logger: pa,
ExternalCmdPool: pa.externalCmdPool,
Conf: pa.conf,
ExternalCmdEnv: pa.externalCmdEnv(),
Query: query,
})
pa.onDemandPublisherReadyTimer.Stop() pa.onDemandPublisherReadyTimer.Stop()
pa.onDemandPublisherReadyTimer = time.NewTimer(time.Duration(pa.conf.RunOnDemandStartTimeout)) pa.onDemandPublisherReadyTimer = time.NewTimer(time.Duration(pa.conf.RunOnDemandStartTimeout))
@ -834,7 +846,14 @@ func (pa *path) setReady(desc *description.Session, allocateEncoder bool) error
pa.readyTime = time.Now() pa.readyTime = time.Now()
pa.onNotReadyHook = onReadyHook(pa) pa.onNotReadyHook = hooks.OnReady(hooks.OnReadyParams{
Logger: pa,
ExternalCmdPool: pa.externalCmdPool,
Conf: pa.conf,
ExternalCmdEnv: pa.externalCmdEnv(),
Desc: pa.source.APISourceDescribe(),
Query: pa.publisherQuery,
})
pa.parent.pathReady(pa) pa.parent.pathReady(pa)

View file

@ -21,6 +21,7 @@ import (
"github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
"github.com/bluenviron/mediamtx/internal/protocols/rtmp" "github.com/bluenviron/mediamtx/internal/protocols/rtmp"
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
@ -57,12 +58,14 @@ type rtmpConnParent interface {
} }
type rtmpConn struct { type rtmpConn struct {
*conn
isTLS bool isTLS bool
rtspAddress string
readTimeout conf.StringDuration readTimeout conf.StringDuration
writeTimeout conf.StringDuration writeTimeout conf.StringDuration
writeQueueSize int writeQueueSize int
runOnConnect string
runOnConnectRestart bool
runOnDisconnect string
wg *sync.WaitGroup wg *sync.WaitGroup
nconn net.Conn nconn net.Conn
externalCmdPool *externalcmd.Pool externalCmdPool *externalcmd.Pool
@ -99,9 +102,13 @@ func newRTMPConn(
c := &rtmpConn{ c := &rtmpConn{
isTLS: isTLS, isTLS: isTLS,
rtspAddress: rtspAddress,
readTimeout: readTimeout, readTimeout: readTimeout,
writeTimeout: writeTimeout, writeTimeout: writeTimeout,
writeQueueSize: writeQueueSize, writeQueueSize: writeQueueSize,
runOnConnect: runOnConnect,
runOnConnectRestart: runOnConnectRestart,
runOnDisconnect: runOnDisconnect,
wg: wg, wg: wg,
nconn: nconn, nconn: nconn,
externalCmdPool: externalCmdPool, externalCmdPool: externalCmdPool,
@ -113,15 +120,6 @@ func newRTMPConn(
created: time.Now(), created: time.Now(),
} }
c.conn = newConn(
rtspAddress,
runOnConnect,
runOnConnectRestart,
runOnDisconnect,
externalCmdPool,
c,
)
c.Log(logger.Info, "opened") c.Log(logger.Info, "opened")
c.wg.Add(1) c.wg.Add(1)
@ -149,9 +147,16 @@ func (c *rtmpConn) ip() net.IP {
func (c *rtmpConn) run() { //nolint:dupl func (c *rtmpConn) run() { //nolint:dupl
defer c.wg.Done() defer c.wg.Done()
desc := c.apiReaderDescribe() onDisconnectHook := hooks.OnConnect(hooks.OnConnectParams{
c.conn.open(desc) Logger: c,
defer c.conn.close() ExternalCmdPool: c.externalCmdPool,
RunOnConnect: c.runOnConnect,
RunOnConnectRestart: c.runOnConnectRestart,
RunOnDisconnect: c.runOnDisconnect,
RTSPAddress: c.rtspAddress,
Desc: c.apiReaderDescribe(),
})
defer onDisconnectHook()
err := c.runInner() err := c.runInner()
@ -254,15 +259,14 @@ func (c *rtmpConn) runRead(conn *rtmp.Conn, u *url.URL) error {
c.Log(logger.Info, "is reading from path '%s', %s", c.Log(logger.Info, "is reading from path '%s', %s",
res.path.name, readerMediaInfo(writer, res.stream)) res.path.name, readerMediaInfo(writer, res.stream))
pathConf := res.path.safeConf() onUnreadHook := hooks.OnRead(hooks.OnReadParams{
Logger: c,
onUnreadHook := onReadHook( ExternalCmdPool: c.externalCmdPool,
c.externalCmdPool, Conf: res.path.safeConf(),
pathConf, ExternalCmdEnv: res.path.externalCmdEnv(),
res.path, Reader: c.APISourceDescribe(),
c.apiReaderDescribe(), Query: rawQuery,
rawQuery, })
c)
defer onUnreadHook() defer onUnreadHook()
var err error var err error

View file

@ -14,6 +14,7 @@ import (
"github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
) )
@ -28,8 +29,6 @@ type rtspConnParent interface {
} }
type rtspConn struct { type rtspConn struct {
*conn
isTLS bool isTLS bool
rtspAddress string rtspAddress string
authMethods []headers.AuthMethod authMethods []headers.AuthMethod
@ -40,6 +39,7 @@ type rtspConn struct {
uuid uuid.UUID uuid uuid.UUID
created time.Time created time.Time
onDisconnectHook func()
authNonce string authNonce string
authFailures int authFailures int
} }
@ -69,18 +69,9 @@ func newRTSPConn(
created: time.Now(), created: time.Now(),
} }
c.conn = newConn(
rtspAddress,
runOnConnect,
runOnConnectRestart,
runOnDisconnect,
externalCmdPool,
c,
)
c.Log(logger.Info, "opened") c.Log(logger.Info, "opened")
c.conn.open(defs.APIPathSourceOrReader{ desc := defs.APIPathSourceOrReader{
Type: func() string { Type: func() string {
if isTLS { if isTLS {
return "rtspsConn" return "rtspsConn"
@ -88,6 +79,16 @@ func newRTSPConn(
return "rtspConn" return "rtspConn"
}(), }(),
ID: c.uuid.String(), ID: c.uuid.String(),
}
c.onDisconnectHook = hooks.OnConnect(hooks.OnConnectParams{
Logger: c,
ExternalCmdPool: externalCmdPool,
RunOnConnect: runOnConnect,
RunOnConnectRestart: runOnConnectRestart,
RunOnDisconnect: runOnDisconnect,
RTSPAddress: rtspAddress,
Desc: desc,
}) })
return c return c
@ -114,7 +115,7 @@ func (c *rtspConn) ip() net.IP {
func (c *rtspConn) onClose(err error) { func (c *rtspConn) onClose(err error) {
c.Log(logger.Info, "closed: %v", err) c.Log(logger.Info, "closed: %v", err)
c.conn.close() c.onDisconnectHook()
} }
// onRequest is called by rtspServer. // onRequest is called by rtspServer.

View file

@ -16,6 +16,7 @@ import (
"github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
) )
@ -289,16 +290,14 @@ func (s *rtspSession) onPlay(_ *gortsplib.ServerHandlerOnPlayCtx) (*base.Respons
s.session.SetuppedTransport(), s.session.SetuppedTransport(),
mediaInfo(s.session.SetuppedMedias())) mediaInfo(s.session.SetuppedMedias()))
pathConf := s.path.safeConf() s.onUnreadHook = hooks.OnRead(hooks.OnReadParams{
Logger: s,
s.onUnreadHook = onReadHook( ExternalCmdPool: s.externalCmdPool,
s.externalCmdPool, Conf: s.path.safeConf(),
pathConf, ExternalCmdEnv: s.path.externalCmdEnv(),
s.path, Reader: s.apiReaderDescribe(),
s.apiReaderDescribe(), Query: s.session.SetuppedQuery(),
s.session.SetuppedQuery(), })
s,
)
s.mutex.Lock() s.mutex.Lock()
s.state = gortsplib.ServerSessionStatePlay s.state = gortsplib.ServerSessionStatePlay

View file

@ -19,6 +19,7 @@ import (
"github.com/bluenviron/mediamtx/internal/conf" "github.com/bluenviron/mediamtx/internal/conf"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
"github.com/bluenviron/mediamtx/internal/protocols/mpegts" "github.com/bluenviron/mediamtx/internal/protocols/mpegts"
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
@ -59,14 +60,15 @@ type srtConnParent interface {
} }
type srtConn struct { type srtConn struct {
*conn
rtspAddress string rtspAddress string
readTimeout conf.StringDuration readTimeout conf.StringDuration
writeTimeout conf.StringDuration writeTimeout conf.StringDuration
writeQueueSize int writeQueueSize int
udpMaxPayloadSize int udpMaxPayloadSize int
connReq srt.ConnRequest connReq srt.ConnRequest
runOnConnect string
runOnConnectRestart bool
runOnDisconnect string
wg *sync.WaitGroup wg *sync.WaitGroup
externalCmdPool *externalcmd.Pool externalCmdPool *externalcmd.Pool
pathManager srtConnPathManager pathManager srtConnPathManager
@ -110,6 +112,9 @@ func newSRTConn(
writeQueueSize: writeQueueSize, writeQueueSize: writeQueueSize,
udpMaxPayloadSize: udpMaxPayloadSize, udpMaxPayloadSize: udpMaxPayloadSize,
connReq: connReq, connReq: connReq,
runOnConnect: runOnConnect,
runOnConnectRestart: runOnConnectRestart,
runOnDisconnect: runOnDisconnect,
wg: wg, wg: wg,
externalCmdPool: externalCmdPool, externalCmdPool: externalCmdPool,
pathManager: pathManager, pathManager: pathManager,
@ -122,15 +127,6 @@ func newSRTConn(
chSetConn: make(chan srt.Conn), chSetConn: make(chan srt.Conn),
} }
c.conn = newConn(
rtspAddress,
runOnConnect,
runOnConnectRestart,
runOnDisconnect,
externalCmdPool,
c,
)
c.Log(logger.Info, "opened") c.Log(logger.Info, "opened")
c.wg.Add(1) c.wg.Add(1)
@ -154,9 +150,16 @@ func (c *srtConn) ip() net.IP {
func (c *srtConn) run() { //nolint:dupl func (c *srtConn) run() { //nolint:dupl
defer c.wg.Done() defer c.wg.Done()
desc := c.apiReaderDescribe() onDisconnectHook := hooks.OnConnect(hooks.OnConnectParams{
c.conn.open(desc) Logger: c,
defer c.conn.close() ExternalCmdPool: c.externalCmdPool,
RunOnConnect: c.runOnConnect,
RunOnConnectRestart: c.runOnConnectRestart,
RunOnDisconnect: c.runOnDisconnect,
RTSPAddress: c.rtspAddress,
Desc: c.apiReaderDescribe(),
})
defer onDisconnectHook()
err := c.runInner() err := c.runInner()
@ -373,16 +376,14 @@ func (c *srtConn) runRead(req srtNewConnReq, pathName string, user string, pass
c.Log(logger.Info, "is reading from path '%s', %s", c.Log(logger.Info, "is reading from path '%s', %s",
res.path.name, readerMediaInfo(writer, res.stream)) res.path.name, readerMediaInfo(writer, res.stream))
pathConf := res.path.safeConf() onUnreadHook := hooks.OnRead(hooks.OnReadParams{
Logger: c,
onUnreadHook := onReadHook( ExternalCmdPool: c.externalCmdPool,
c.externalCmdPool, Conf: res.path.safeConf(),
pathConf, ExternalCmdEnv: res.path.externalCmdEnv(),
res.path, Reader: c.apiReaderDescribe(),
c.apiReaderDescribe(), Query: query,
query, })
c,
)
defer onUnreadHook() defer onUnreadHook()
// disable read deadline // disable read deadline

View file

@ -24,6 +24,7 @@ import (
"github.com/bluenviron/mediamtx/internal/asyncwriter" "github.com/bluenviron/mediamtx/internal/asyncwriter"
"github.com/bluenviron/mediamtx/internal/defs" "github.com/bluenviron/mediamtx/internal/defs"
"github.com/bluenviron/mediamtx/internal/externalcmd" "github.com/bluenviron/mediamtx/internal/externalcmd"
"github.com/bluenviron/mediamtx/internal/hooks"
"github.com/bluenviron/mediamtx/internal/logger" "github.com/bluenviron/mediamtx/internal/logger"
"github.com/bluenviron/mediamtx/internal/protocols/webrtc" "github.com/bluenviron/mediamtx/internal/protocols/webrtc"
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
@ -610,16 +611,14 @@ func (s *webRTCSession) runRead() (int, error) {
s.Log(logger.Info, "is reading from path '%s', %s", s.Log(logger.Info, "is reading from path '%s', %s",
res.path.name, readerMediaInfo(writer, res.stream)) res.path.name, readerMediaInfo(writer, res.stream))
pathConf := res.path.safeConf() onUnreadHook := hooks.OnRead(hooks.OnReadParams{
Logger: s,
onUnreadHook := onReadHook( ExternalCmdPool: s.externalCmdPool,
s.externalCmdPool, Conf: res.path.safeConf(),
pathConf, ExternalCmdEnv: res.path.externalCmdEnv(),
res.path, Reader: s.apiReaderDescribe(),
s.apiReaderDescribe(), Query: s.req.query,
s.req.query, })
s,
)
defer onUnreadHook() defer onUnreadHook()
writer.Start() writer.Start()

2
internal/hooks/hooks.go Normal file
View file

@ -0,0 +1,2 @@
// Package hooks contains hook implementations.
package hooks

View file

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

View file

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

39
internal/hooks/on_init.go Normal file
View file

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

61
internal/hooks/on_read.go Normal file
View file

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

View file

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