From 03b5d393cd73a7c88f8bc7a24c2ab0ef3a360792 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 10 May 2020 15:33:42 +0200 Subject: [PATCH] move arguments outside program --- main.go | 142 +++++++++++++++++++++++------------------------ server-client.go | 16 +++--- server-tcpl.go | 4 +- 3 files changed, 79 insertions(+), 83 deletions(-) diff --git a/main.go b/main.go index 6012f1b9..47103468 100644 --- a/main.go +++ b/main.go @@ -47,76 +47,57 @@ func (s streamProtocol) String() string { return "tcp" } -type program struct { - protocols map[streamProtocol]struct{} - rtspPort int - rtpPort int - rtcpPort int - publishUser string - publishPass string - preScript string - postScript string - mutex sync.RWMutex - rtspl *serverTcpListener - rtpl *serverUdpListener - rtcpl *serverUdpListener - clients map[*serverClient]struct{} - publishers map[string]*serverClient +type args struct { + version bool + protocolsStr string + rtspPort int + rtpPort int + rtcpPort int + publishUser string + publishPass string + preScript string + postScript string } -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() +type program struct { + args args + protocols map[streamProtocol]struct{} + mutex sync.RWMutex + rtspl *serverTcpListener + rtpl *serverUdpListener + rtcpl *serverUdpListener + clients map[*serverClient]struct{} + publishers map[string]*serverClient +} - 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{ - 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), + args: args, + protocols: protocols, + 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 } diff --git a/server-client.go b/server-client.go index 57ae172e..cbd1addd 100644 --- a/server-client.go +++ b/server-client.go @@ -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"}, }, diff --git a/server-tcpl.go b/server-tcpl.go index 8588e577..bede6ded 100644 --- a/server-tcpl.go +++ b/server-tcpl.go @@ -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 }