Browse Source

move arguments outside program

pull/31/head
aler9 5 years ago
parent
commit
03b5d393cd
  1. 142
      main.go
  2. 16
      server-client.go
  3. 4
      server-tcpl.go

142
main.go

@ -47,76 +47,57 @@ func (s streamProtocol) String() string {
return "tcp" return "tcp"
} }
type program struct { type args struct {
protocols map[streamProtocol]struct{} version bool
rtspPort int protocolsStr string
rtpPort int rtspPort int
rtcpPort int rtpPort int
publishUser string rtcpPort int
publishPass string publishUser string
preScript string publishPass string
postScript string preScript string
mutex sync.RWMutex postScript string
rtspl *serverTcpListener
rtpl *serverUdpListener
rtcpl *serverUdpListener
clients map[*serverClient]struct{}
publishers map[string]*serverClient
} }
func newProgram() (*program, error) { type program struct {
kingpin.CommandLine.Help = "rtsp-simple-server " + Version + "\n\n" + args args
"RTSP server." protocols map[streamProtocol]struct{}
mutex sync.RWMutex
argVersion := kingpin.Flag("version", "print rtsp-simple-server version").Bool() rtspl *serverTcpListener
argProtocolsStr := kingpin.Flag("protocols", "supported protocols").Default("udp,tcp").String() rtpl *serverUdpListener
argRtspPort := kingpin.Flag("rtsp-port", "port of the RTSP TCP listener").Default("8554").Int() rtcpl *serverUdpListener
argRtpPort := kingpin.Flag("rtp-port", "port of the RTP UDP listener").Default("8000").Int() clients map[*serverClient]struct{}
argRtcpPort := kingpin.Flag("rtcp-port", "port of the RTCP UDP listener").Default("8001").Int() publishers map[string]*serverClient
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 func newProgram(args args) (*program, error) {
protocolsStr := *argProtocolsStr if args.version == true {
rtspPort := *argRtspPort
rtpPort := *argRtpPort
rtcpPort := *argRtcpPort
publishUser := *argPublishUser
publishPass := *argPublishPass
preScript := *argPreScript
postScript := *argPostScript
if version == true {
fmt.Println("rtsp-simple-server " + Version) fmt.Println("rtsp-simple-server " + Version)
os.Exit(0) os.Exit(0)
} }
if rtspPort == 0 { if args.rtspPort == 0 {
return nil, fmt.Errorf("rtsp port not provided") return nil, fmt.Errorf("rtsp port not provided")
} }
if rtpPort == 0 { if args.rtpPort == 0 {
return nil, fmt.Errorf("rtp port not provided") return nil, fmt.Errorf("rtp port not provided")
} }
if rtcpPort == 0 { if args.rtcpPort == 0 {
return nil, fmt.Errorf("rtcp port not provided") 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") return nil, fmt.Errorf("rtp port must be even")
} }
if rtcpPort != (rtpPort + 1) { if args.rtcpPort != (args.rtpPort + 1) {
return nil, fmt.Errorf("rtcp port must be rtp port plus 1") return nil, fmt.Errorf("rtcp and rtp ports must be consecutive")
} }
protocols := make(map[streamProtocol]struct{}) protocols := make(map[streamProtocol]struct{})
for _, proto := range strings.Split(protocolsStr, ",") { for _, proto := range strings.Split(args.protocolsStr, ",") {
switch proto { switch proto {
case "udp": case "udp":
protocols[_STREAM_PROTOCOL_UDP] = struct{}{} protocols[_STREAM_PROTOCOL_UDP] = struct{}{}
@ -132,45 +113,39 @@ func newProgram() (*program, error) {
return nil, fmt.Errorf("no protocols provided") return nil, fmt.Errorf("no protocols provided")
} }
if publishUser != "" { if args.publishUser != "" {
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(publishUser) { if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(args.publishUser) {
return nil, fmt.Errorf("publish username must be alphanumeric") return nil, fmt.Errorf("publish username must be alphanumeric")
} }
} }
if publishPass != "" { if args.publishPass != "" {
if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(publishPass) { if !regexp.MustCompile("^[a-zA-Z0-9]+$").MatchString(args.publishPass) {
return nil, fmt.Errorf("publish password must be alphanumeric") 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") return nil, fmt.Errorf("publish username and password must be both filled")
} }
log.Printf("rtsp-simple-server %s", Version) log.Printf("rtsp-simple-server %s", Version)
p := &program{ p := &program{
protocols: protocols, args: args,
rtspPort: rtspPort, protocols: protocols,
rtpPort: rtpPort, clients: make(map[*serverClient]struct{}),
rtcpPort: rtcpPort, publishers: make(map[string]*serverClient),
publishUser: publishUser,
publishPass: publishPass,
preScript: preScript,
postScript: postScript,
clients: make(map[*serverClient]struct{}),
publishers: make(map[string]*serverClient),
} }
var err error 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 { if err != nil {
return nil, err 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 { if err != nil {
return nil, err return nil, err
} }
@ -180,16 +155,11 @@ func newProgram() (*program, error) {
return nil, err return nil, err
} }
return p, nil
}
func (p *program) run() {
go p.rtpl.run() go p.rtpl.run()
go p.rtcpl.run() go p.rtcpl.run()
go p.rtspl.run() go p.rtspl.run()
infty := make(chan struct{}) return p, nil
<-infty
} }
func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte) { 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() { 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 { if err != nil {
log.Fatal("ERR: ", err) log.Fatal("ERR: ", err)
} }
p.run() infty := make(chan struct{})
<-infty
} }

16
server-client.go

@ -177,8 +177,8 @@ func (c *serverClient) zone() string {
func (c *serverClient) run() { func (c *serverClient) run() {
defer func() { defer func() {
if c.p.postScript != "" { if c.p.args.postScript != "" {
postScript := exec.Command(c.p.postScript) postScript := exec.Command(c.p.args.postScript)
err := postScript.Run() err := postScript.Run()
if err != nil { if err != nil {
c.log("ERR: %s", err) c.log("ERR: %s", err)
@ -196,8 +196,8 @@ func (c *serverClient) run() {
c.log("connected") c.log("connected")
if c.p.preScript != "" { if c.p.args.preScript != "" {
preScript := exec.Command(c.p.preScript) preScript := exec.Command(c.p.args.preScript)
err := preScript.Run() err := preScript.Run()
if err != nil { if err != nil {
c.log("ERR: %s", err) c.log("ERR: %s", err)
@ -320,11 +320,11 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
return false return false
} }
if c.p.publishUser != "" { if c.p.args.publishUser != "" {
initialRequest := false initialRequest := false
if c.as == nil { if c.as == nil {
initialRequest = true 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) 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", "RTP/AVP/UDP",
"unicast", "unicast",
fmt.Sprintf("client_port=%d-%d", rtpPort, rtcpPort), 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"}, "Session": []string{"12345678"},
}, },
@ -623,7 +623,7 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
"RTP/AVP/UDP", "RTP/AVP/UDP",
"unicast", "unicast",
fmt.Sprintf("client_port=%d-%d", rtpPort, rtcpPort), 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"}, "Session": []string{"12345678"},
}, },

4
server-tcpl.go

@ -12,7 +12,7 @@ type serverTcpListener struct {
func newServerTcpListener(p *program) (*serverTcpListener, error) { func newServerTcpListener(p *program) (*serverTcpListener, error) {
netl, err := net.ListenTCP("tcp", &net.TCPAddr{ netl, err := net.ListenTCP("tcp", &net.TCPAddr{
Port: p.rtspPort, Port: p.args.rtspPort,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -23,7 +23,7 @@ func newServerTcpListener(p *program) (*serverTcpListener, error) {
netl: netl, netl: netl,
} }
s.log("opened on :%d", p.rtspPort) s.log("opened on :%d", p.args.rtspPort)
return s, nil return s, nil
} }

Loading…
Cancel
Save