move arguments outside program
This commit is contained in:
parent
278b8fc43f
commit
03b5d393cd
112
main.go
112
main.go
|
@ -47,8 +47,9 @@ func (s streamProtocol) String() string {
|
|||
return "tcp"
|
||||
}
|
||||
|
||||
type program struct {
|
||||
protocols map[streamProtocol]struct{}
|
||||
type args struct {
|
||||
version bool
|
||||
protocolsStr string
|
||||
rtspPort int
|
||||
rtpPort int
|
||||
rtcpPort int
|
||||
|
@ -56,6 +57,11 @@ type program struct {
|
|||
publishPass string
|
||||
preScript string
|
||||
postScript string
|
||||
}
|
||||
|
||||
type program struct {
|
||||
args args
|
||||
protocols map[streamProtocol]struct{}
|
||||
mutex sync.RWMutex
|
||||
rtspl *serverTcpListener
|
||||
rtpl *serverUdpListener
|
||||
|
@ -64,59 +70,34 @@ type program struct {
|
|||
publishers map[string]*serverClient
|
||||
}
|
||||
|
||||
func newProgram() (*program, error) {
|
||||
kingpin.CommandLine.Help = "rtsp-simple-server " + Version + "\n\n" +
|
||||
"RTSP server."
|
||||
|
||||
argVersion := kingpin.Flag("version", "print rtsp-simple-server version").Bool()
|
||||
argProtocolsStr := kingpin.Flag("protocols", "supported protocols").Default("udp,tcp").String()
|
||||
argRtspPort := kingpin.Flag("rtsp-port", "port of the RTSP TCP listener").Default("8554").Int()
|
||||
argRtpPort := kingpin.Flag("rtp-port", "port of the RTP UDP listener").Default("8000").Int()
|
||||
argRtcpPort := kingpin.Flag("rtcp-port", "port of the RTCP UDP listener").Default("8001").Int()
|
||||
argPublishUser := kingpin.Flag("publish-user", "optional username required to publish").Default("").String()
|
||||
argPublishPass := kingpin.Flag("publish-pass", "optional password required to publish").Default("").String()
|
||||
argPreScript := kingpin.Flag("pre-script", "optional script to run on client connect").Default("").String()
|
||||
argPostScript := kingpin.Flag("post-script", "optional script to run on client disconnect").Default("").String()
|
||||
|
||||
kingpin.Parse()
|
||||
|
||||
version := *argVersion
|
||||
protocolsStr := *argProtocolsStr
|
||||
rtspPort := *argRtspPort
|
||||
rtpPort := *argRtpPort
|
||||
rtcpPort := *argRtcpPort
|
||||
publishUser := *argPublishUser
|
||||
publishPass := *argPublishPass
|
||||
preScript := *argPreScript
|
||||
postScript := *argPostScript
|
||||
|
||||
if version == true {
|
||||
func newProgram(args args) (*program, error) {
|
||||
if args.version == true {
|
||||
fmt.Println("rtsp-simple-server " + Version)
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
if rtspPort == 0 {
|
||||
if args.rtspPort == 0 {
|
||||
return nil, fmt.Errorf("rtsp port not provided")
|
||||
}
|
||||
|
||||
if rtpPort == 0 {
|
||||
if args.rtpPort == 0 {
|
||||
return nil, fmt.Errorf("rtp port not provided")
|
||||
}
|
||||
|
||||
if rtcpPort == 0 {
|
||||
if args.rtcpPort == 0 {
|
||||
return nil, fmt.Errorf("rtcp port not provided")
|
||||
}
|
||||
|
||||
if (rtpPort % 2) != 0 {
|
||||
if (args.rtpPort % 2) != 0 {
|
||||
return nil, fmt.Errorf("rtp port must be even")
|
||||
}
|
||||
|
||||
if rtcpPort != (rtpPort + 1) {
|
||||
return nil, fmt.Errorf("rtcp port must be rtp port plus 1")
|
||||
if args.rtcpPort != (args.rtpPort + 1) {
|
||||
return nil, fmt.Errorf("rtcp and rtp ports must be consecutive")
|
||||
}
|
||||
|
||||
protocols := make(map[streamProtocol]struct{})
|
||||
for _, proto := range strings.Split(protocolsStr, ",") {
|
||||
for _, proto := range strings.Split(args.protocolsStr, ",") {
|
||||
switch proto {
|
||||
case "udp":
|
||||
protocols[_STREAM_PROTOCOL_UDP] = struct{}{}
|
||||
|
@ -132,45 +113,39 @@ func newProgram() (*program, error) {
|
|||
return nil, fmt.Errorf("no protocols provided")
|
||||
}
|
||||
|
||||
if publishUser != "" {
|
||||
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(publishUser) {
|
||||
if args.publishUser != "" {
|
||||
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(args.publishUser) {
|
||||
return nil, fmt.Errorf("publish username must be alphanumeric")
|
||||
}
|
||||
}
|
||||
|
||||
if publishPass != "" {
|
||||
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(publishPass) {
|
||||
if args.publishPass != "" {
|
||||
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(args.publishPass) {
|
||||
return nil, fmt.Errorf("publish password must be alphanumeric")
|
||||
}
|
||||
}
|
||||
|
||||
if publishUser != "" && publishPass == "" || publishUser == "" && publishPass != "" {
|
||||
if args.publishUser != "" && args.publishPass == "" || args.publishUser == "" && args.publishPass != "" {
|
||||
return nil, fmt.Errorf("publish username and password must be both filled")
|
||||
}
|
||||
|
||||
log.Printf("rtsp-simple-server %s", Version)
|
||||
|
||||
p := &program{
|
||||
args: args,
|
||||
protocols: protocols,
|
||||
rtspPort: rtspPort,
|
||||
rtpPort: rtpPort,
|
||||
rtcpPort: rtcpPort,
|
||||
publishUser: publishUser,
|
||||
publishPass: publishPass,
|
||||
preScript: preScript,
|
||||
postScript: postScript,
|
||||
clients: make(map[*serverClient]struct{}),
|
||||
publishers: make(map[string]*serverClient),
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
p.rtpl, err = newServerUdpListener(p, rtpPort, _TRACK_FLOW_RTP)
|
||||
p.rtpl, err = newServerUdpListener(p, args.rtpPort, _TRACK_FLOW_RTP)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
p.rtcpl, err = newServerUdpListener(p, rtcpPort, _TRACK_FLOW_RTCP)
|
||||
p.rtcpl, err = newServerUdpListener(p, args.rtcpPort, _TRACK_FLOW_RTCP)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -180,16 +155,11 @@ func newProgram() (*program, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (p *program) run() {
|
||||
go p.rtpl.run()
|
||||
go p.rtcpl.run()
|
||||
go p.rtspl.run()
|
||||
|
||||
infty := make(chan struct{})
|
||||
<-infty
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte) {
|
||||
|
@ -227,10 +197,36 @@ func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte
|
|||
}
|
||||
|
||||
func main() {
|
||||
p, err := newProgram()
|
||||
kingpin.CommandLine.Help = "rtsp-simple-server " + Version + "\n\n" +
|
||||
"RTSP server."
|
||||
|
||||
argVersion := kingpin.Flag("version", "print rtsp-simple-server version").Bool()
|
||||
argProtocolsStr := kingpin.Flag("protocols", "supported protocols").Default("udp,tcp").String()
|
||||
argRtspPort := kingpin.Flag("rtsp-port", "port of the RTSP TCP listener").Default("8554").Int()
|
||||
argRtpPort := kingpin.Flag("rtp-port", "port of the RTP UDP listener").Default("8000").Int()
|
||||
argRtcpPort := kingpin.Flag("rtcp-port", "port of the RTCP UDP listener").Default("8001").Int()
|
||||
argPublishUser := kingpin.Flag("publish-user", "optional username required to publish").Default("").String()
|
||||
argPublishPass := kingpin.Flag("publish-pass", "optional password required to publish").Default("").String()
|
||||
argPreScript := kingpin.Flag("pre-script", "optional script to run on client connect").Default("").String()
|
||||
argPostScript := kingpin.Flag("post-script", "optional script to run on client disconnect").Default("").String()
|
||||
|
||||
kingpin.Parse()
|
||||
|
||||
_, err := newProgram(args{
|
||||
version: *argVersion,
|
||||
protocolsStr: *argProtocolsStr,
|
||||
rtspPort: *argRtspPort,
|
||||
rtpPort: *argRtpPort,
|
||||
rtcpPort: *argRtcpPort,
|
||||
publishUser: *argPublishUser,
|
||||
publishPass: *argPublishPass,
|
||||
preScript: *argPreScript,
|
||||
postScript: *argPostScript,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal("ERR: ", err)
|
||||
}
|
||||
|
||||
p.run()
|
||||
infty := make(chan struct{})
|
||||
<-infty
|
||||
}
|
||||
|
|
|
@ -177,8 +177,8 @@ func (c *serverClient) zone() string {
|
|||
|
||||
func (c *serverClient) run() {
|
||||
defer func() {
|
||||
if c.p.postScript != "" {
|
||||
postScript := exec.Command(c.p.postScript)
|
||||
if c.p.args.postScript != "" {
|
||||
postScript := exec.Command(c.p.args.postScript)
|
||||
err := postScript.Run()
|
||||
if err != nil {
|
||||
c.log("ERR: %s", err)
|
||||
|
@ -196,8 +196,8 @@ func (c *serverClient) run() {
|
|||
|
||||
c.log("connected")
|
||||
|
||||
if c.p.preScript != "" {
|
||||
preScript := exec.Command(c.p.preScript)
|
||||
if c.p.args.preScript != "" {
|
||||
preScript := exec.Command(c.p.args.preScript)
|
||||
err := preScript.Run()
|
||||
if err != nil {
|
||||
c.log("ERR: %s", err)
|
||||
|
@ -320,11 +320,11 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
if c.p.publishUser != "" {
|
||||
if c.p.args.publishUser != "" {
|
||||
initialRequest := false
|
||||
if c.as == nil {
|
||||
initialRequest = true
|
||||
c.as = gortsplib.NewAuthServer(c.p.publishUser, c.p.publishPass)
|
||||
c.as = gortsplib.NewAuthServer(c.p.args.publishUser, c.p.args.publishPass)
|
||||
}
|
||||
|
||||
err := c.as.ValidateHeader(req.Header["Authorization"], gortsplib.ANNOUNCE, req.Url)
|
||||
|
@ -482,7 +482,7 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
|
|||
"RTP/AVP/UDP",
|
||||
"unicast",
|
||||
fmt.Sprintf("client_port=%d-%d", rtpPort, rtcpPort),
|
||||
fmt.Sprintf("server_port=%d-%d", c.p.rtpPort, c.p.rtcpPort),
|
||||
fmt.Sprintf("server_port=%d-%d", c.p.args.rtpPort, c.p.args.rtcpPort),
|
||||
}, ";")},
|
||||
"Session": []string{"12345678"},
|
||||
},
|
||||
|
@ -623,7 +623,7 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
|
|||
"RTP/AVP/UDP",
|
||||
"unicast",
|
||||
fmt.Sprintf("client_port=%d-%d", rtpPort, rtcpPort),
|
||||
fmt.Sprintf("server_port=%d-%d", c.p.rtpPort, c.p.rtcpPort),
|
||||
fmt.Sprintf("server_port=%d-%d", c.p.args.rtpPort, c.p.args.rtcpPort),
|
||||
}, ";")},
|
||||
"Session": []string{"12345678"},
|
||||
},
|
||||
|
|
|
@ -12,7 +12,7 @@ type serverTcpListener struct {
|
|||
|
||||
func newServerTcpListener(p *program) (*serverTcpListener, error) {
|
||||
netl, err := net.ListenTCP("tcp", &net.TCPAddr{
|
||||
Port: p.rtspPort,
|
||||
Port: p.args.rtspPort,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -23,7 +23,7 @@ func newServerTcpListener(p *program) (*serverTcpListener, error) {
|
|||
netl: netl,
|
||||
}
|
||||
|
||||
s.log("opened on :%d", p.rtspPort)
|
||||
s.log("opened on :%d", p.args.rtspPort)
|
||||
return s, nil
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue