diff --git a/agents/janusagent.go b/agents/janusagent.go index c7bc46a26..7fd32dd35 100644 --- a/agents/janusagent.go +++ b/agents/janusagent.go @@ -19,38 +19,41 @@ along with this program. If not, see package agents import ( - "context" "encoding/json" "fmt" "io" "net/http" - "regexp" "strconv" "strings" "time" - bicontext "github.com/cgrates/birpc/context" + "github.com/cgrates/birpc" + "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/sessions" "github.com/cgrates/cgrates/utils" janus "github.com/cgrates/janusgo" -) - -var ( - janSessionPath = regexp.MustCompile(`^\/janus/\d+?$`) - janPluginHandlePath = regexp.MustCompile(`^\/janus/.*/.*`) + "nhooyr.io/websocket" ) // NewJanusAgent will construct a JanusAgent func NewJanusAgent(cgrCfg *config.CGRConfig, connMgr *engine.ConnManager, - filterS *engine.FilterS) *JanusAgent { - return &JanusAgent{ + filterS *engine.FilterS) (*JanusAgent, error) { + jsa := &JanusAgent{ cgrCfg: cgrCfg, connMgr: connMgr, filterS: filterS, } + srv, err := birpc.NewServiceWithMethodsRename(jsa, utils.AgentV1, true, func(oldFn string) (newFn string) { + return strings.TrimPrefix(oldFn, "V1") + }) + if err != nil { + return nil, err + } + jsa.ctx = context.WithClient(context.TODO(), srv) + return jsa, nil } // JanusAgent is a gateway between HTTP and Janus Server over Websocket @@ -59,12 +62,23 @@ type JanusAgent struct { connMgr *engine.ConnManager filterS *engine.FilterS jnsConn *janus.Gateway + adminWs *websocket.Conn + ctx *context.Context } // Connect will create the connection to the Janus Server func (ja *JanusAgent) Connect() (err error) { ja.jnsConn, err = janus.Connect( fmt.Sprintf("ws://%s", ja.cgrCfg.JanusAgentCfg().JanusConns[0].Address)) + + if err != nil { + return + } + + ja.adminWs, _, err = websocket.Dial(context.Background(), fmt.Sprintf("ws://%s", ja.cgrCfg.JanusAgentCfg().JanusConns[0].AdminAddress), &websocket.DialOptions{ + Subprotocols: []string{utils.JanusAdminSubProto}, + }) + return } @@ -90,6 +104,7 @@ func (ja *JanusAgent) CreateSession(w http.ResponseWriter, req *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() @@ -115,7 +130,7 @@ func (ja *JanusAgent) authSession(origIP string) (err error) { }, }} rply := new(sessions.V1AuthorizeReply) - err = ja.connMgr.Call(bicontext.Background(), ja.cgrCfg.JanusAgentCfg().SessionSConns, + err = ja.connMgr.Call(ja.ctx, ja.cgrCfg.JanusAgentCfg().SessionSConns, utils.SessionSv1AuthorizeEvent, authArgs, rply) return @@ -140,7 +155,7 @@ func (ja *JanusAgent) acntStartSession(s *janus.Session) (err error) { ForceDuration: true, } rply := new(sessions.V1InitSessionReply) - err = ja.connMgr.Call(bicontext.Background(), ja.cgrCfg.JanusAgentCfg().SessionSConns, + err = ja.connMgr.Call(ja.ctx, ja.cgrCfg.JanusAgentCfg().SessionSConns, utils.SessionSv1InitiateSession, initArgs, rply) return @@ -165,7 +180,7 @@ func (ja *JanusAgent) acntStopSession(s *janus.Session) (err error) { ForceDuration: true, } var rply string - err = ja.connMgr.Call(bicontext.Background(), ja.cgrCfg.JanusAgentCfg().SessionSConns, + err = ja.connMgr.Call(ja.ctx, ja.cgrCfg.JanusAgentCfg().SessionSConns, utils.SessionSv1TerminateSession, terminateArgs, &rply) return @@ -186,7 +201,7 @@ func (ja *JanusAgent) cdrSession(s *janus.Session) (err error) { }, } var rply string - err = ja.connMgr.Call(bicontext.Background(), ja.cgrCfg.JanusAgentCfg().SessionSConns, + err = ja.connMgr.Call(ja.ctx, ja.cgrCfg.JanusAgentCfg().SessionSConns, utils.SessionSv1ProcessCDR, cgrEv, &rply) return @@ -404,3 +419,57 @@ func (ja *JanusAgent) HandlePlugin(w http.ResponseWriter, r *http.Request) { } json.NewEncoder(w).Encode(resp) } + +func (ja *JanusAgent) V1GetActiveSessionIDs(ctx *context.Context, ignParam string, + sessionIDs *[]*sessions.SessionID) error { + var sIDs []*sessions.SessionID + msg := struct { + janus.BaseMsg + AdminSecret string `json:"admin_secret"` + }{ + BaseMsg: janus.BaseMsg{ + Type: "list_sessions", + ID: utils.GenUUID(), + }, + AdminSecret: ja.cgrCfg.JanusAgentCfg().JanusConns[0].AdminPassword, + } + byteMsg, err := json.Marshal(msg) + if err != nil { + return err + } + if err = ja.adminWs.Write(context.Background(), websocket.MessageText, byteMsg); err != nil { + return err + } + _, rpl, err := ja.adminWs.Read(context.Background()) + if err != nil { + return err + } + var sucessMsg struct { + janus.SuccessMsg + Sessions []uint64 `json:"sessions"` + } + + if err = json.Unmarshal(rpl, &sucessMsg); err != nil { + return err + } + for _, sId := range sucessMsg.Sessions { + sess, has := ja.jnsConn.Sessions[sId] + if !has { + continue + } + sIDs = append(sIDs, &sessions.SessionID{ + OriginHost: sess.Data[utils.OriginHost].(string), + OriginID: sess.Data[utils.OriginID].(string), + }) + } + if len(sIDs) == 0 { + return utils.ErrNoActiveSession + } + *sessionIDs = sIDs + return nil +} + +func (ja *JanusAgent) V1DisconnectSession(ctx *context.Context, cgrEv utils.CGREvent, reply *string) (err error) { + *reply = utils.OK + return nil +} diff --git a/agents/janusagent_it_test.go b/agents/janusagent_it_test.go index f1c5313b3..c9094c103 100644 --- a/agents/janusagent_it_test.go +++ b/agents/janusagent_it_test.go @@ -32,6 +32,8 @@ import ( "testing" "time" + "github.com/cgrates/birpc" + "github.com/cgrates/birpc/context" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" @@ -39,11 +41,20 @@ import ( ) var ( - janCfgPath string - janCfgDIR string - janCfg *config.CGRConfig - janhttpC *http.Client // so we can cache the connection - + janCfgPath string + janCfgDIR string + janCfg *config.CGRConfig + janRPC *birpc.Client + sTestsJanus = []func(t *testing.T){ + testJanitInitCfg, + testJanitResetDB, + testJanCmd, + testJanitStartEngine, + testJanitApierRpcConn, + testJanitTPFromFolder, + testJanitAgent, + testJanitStopEngine, + } ) func TestJanusit(t *testing.T) { @@ -55,34 +66,65 @@ func TestJanusit(t *testing.T) { default: t.Fatal("Unknown Database type") } - file, err := exec.LookPath("/opt/janus/bin/janus") - if err != nil || file == "" { - t.SkipNow() + for _, stests := range sTestsJanus { + t.Run(janCfgDIR, stests) } +} + +func testJanitInitCfg(t *testing.T) { + var err error janCfgPath = path.Join(*utils.DataDir, "conf", "samples", janCfgDIR) janCfg, err = config.NewCGRConfigFromPath(janCfgPath) if err != nil { - t.Fatal("could not start init ", err.Error()) - } - cmd := exec.Command(file) - - if err := cmd.Start(); err != nil { t.Fatal(err) } - defer cmd.Wait() - - janhttpC = http.DefaultClient +} +func testJanitResetDB(t *testing.T) { if err := engine.InitDataDb(janCfg); err != nil { t.Fatal(err) } if err := engine.InitStorDb(janCfg); err != nil { t.Fatal(err) } +} +func testJanitStartEngine(t *testing.T) { if _, err := engine.StopStartEngine(janCfgPath, *utils.WaitRater); err != nil { t.Fatal(err) } +} + +func testJanitApierRpcConn(t *testing.T) { + var err error + janRPC, err = newRPCClient(janCfg.ListenCfg()) // We connect over JSON so we can also troubleshoot if needed + if err != nil { + t.Fatal(err) + } +} + +func testJanCmd(t *testing.T) { + janBin, err := exec.LookPath("/opt/janus/bin/janus") + if err != nil || janBin == "" { + t.SkipNow() + } + cmd := exec.Command(janBin) + if err := cmd.Start(); err != nil { + t.Fatal(err) + } +} + +func testJanitTPFromFolder(t *testing.T) { + attrs := &utils.AttrLoadTpFromFolder{FolderPath: path.Join(*utils.DataDir, "tariffplans", "tutorial")} + var loadInst utils.LoadInstance + if err := janRPC.Call(context.Background(), utils.APIerSv2LoadTariffPlanFromFolder, attrs, &loadInst); err != nil { + t.Error(err) + } + time.Sleep(100 * time.Millisecond) +} + +func testJanitAgent(t *testing.T) { + var sessionMsg janus.SuccessMsg id := utils.GenUUID() @@ -91,30 +133,18 @@ func TestJanusit(t *testing.T) { Type: "create", ID: id, } - data, err := json.Marshal(&msg) + + sessionurl := fmt.Sprintf("http://%s%s", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL) + body, err := sendReq(true, sessionurl, msg) if err != nil { t.Error(err) } - url := fmt.Sprintf("http://%s%s", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL) - req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data)) - if err != nil { - t.Error(err) - } - res, err := janhttpC.Do(req) - if err != nil { - t.Error(err) - } - defer res.Body.Close() exp := janus.SuccessMsg{ Type: "success", ID: id, } - body, err := io.ReadAll(res.Body) - if err != nil { - t.Error(err) - } if err := json.Unmarshal(body, &sessionMsg); err != nil { t.Error(err) } @@ -132,54 +162,37 @@ func TestJanusit(t *testing.T) { ID: id, } - url = fmt.Sprintf("http://%s%s/%d", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL, sessionMsg.Data.ID) - data, err = json.Marshal(&msg) + url := fmt.Sprintf("http://%s%s/%d", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL, sessionMsg.Data.ID) + body, err = sendReq(true, url, msg) if err != nil { t.Error(err) } - req, err = http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data)) - if err != nil { - t.Error(err) - } - res, err = janhttpC.Do(req) - if err != nil { - t.Error(err) - } - defer res.Body.Close() exp = janus.SuccessMsg{ Type: "success", ID: id, } - body, err = io.ReadAll(res.Body) - if err != nil { - t.Error(err) - } - if err := json.Unmarshal(body, &pluginMsg); err != nil { t.Error(err) } if exp.ID != id || exp.Type != "success" { t.Error(err) } - url = fmt.Sprintf("http://%s%s/%d?rid=1714324194137&maxev=10", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL, sessionMsg.Data.ID) - req, err = http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatal(err) - } - pullResp := make(chan *http.Response) + + pullResp := make(chan []byte) done := make(chan struct{}) go func() { - ticker := time.NewTicker(100 * time.Millisecond) + url := fmt.Sprintf("http://localhost%s%s/%d?rid=1714324194137&maxev=10", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL, sessionMsg.Data.ID) + ticker := time.NewTicker(50 * time.Millisecond) for { select { case <-ticker.C: - rsp, err := janhttpC.Do(req) + body, err := sendReq(false, url, nil) if err != nil { - t.Error(err) + continue } - pullResp <- rsp + pullResp <- body case <-done: return } @@ -198,21 +211,11 @@ func TestJanusit(t *testing.T) { "video": true, }, } - data, err = json.Marshal(&messagePlugin) - if err != nil { - t.Error(err) - } - url = fmt.Sprintf("http://%s%s/%d/%d", janCfg.ListenCfg().HTTPListen, janCfg.JanusAgentCfg().URL, sessionMsg.Data.ID, pluginMsg.Data.ID) - req2, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data)) + body, err = sendReq(true, url, messagePlugin) if err != nil { t.Error(err) } - res, err = janhttpC.Do(req2) - if err != nil { - t.Error(err) - } - defer res.Body.Close() expAck := janus.AckMsg{ Type: "ack", @@ -220,10 +223,6 @@ func TestJanusit(t *testing.T) { Hint: "I'm taking my time!", } - body, err = io.ReadAll(res.Body) - if err != nil { - t.Error(err) - } var ackMsg janus.AckMsg if err := json.Unmarshal(body, &ackMsg); err != nil { t.Error(err) @@ -235,15 +234,10 @@ func TestJanusit(t *testing.T) { var eventMsg []janus.EventMsg eventmsg := <-pullResp - body, err = io.ReadAll(eventmsg.Body) - if err != nil { + if err = json.Unmarshal(eventmsg, &eventMsg); err != nil { t.Error(err) } - if err = json.Unmarshal(body, &eventMsg); err != nil { - t.Error(err) - } - eventmsg.Body.Close() expEvent := []janus.EventMsg{ { ID: id, @@ -263,89 +257,47 @@ func TestJanusit(t *testing.T) { if !reflect.DeepEqual(eventMsg, expEvent) { t.Errorf("expected <%+v>,got <%+v instead", expEvent, eventMsg) } + close(done) +} - id = utils.GenUUID() - jsepMessage := janus.HandlerMessageJsep{ - HandlerMessage: janus.HandlerMessage{ - BaseMsg: janus.BaseMsg{ - Type: "message", - ID: id, - }, - Body: map[string]any{ - "audio": true, - "video": true, - }, - }, - Jsep: map[string]any{ - "type": "offer", - "sdp": "v=0\r\no=- 6988110098816037393 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS b98fa06f-90d2-4b82-8b51-ade1eefb38fa\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:uB6B\r\na=ice-pwd:YmBQuaIhSa85WKcu70uyDuME\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C5:94:C2:D3:FF:DF:BA:B2:67:A3:E9:B6:3A:BE:67:98:EE:61:28:00:00:E3:73:2F:A7:4C:8F:F0:99:5E:D3:77\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendrecv\r\na=msid:b98fa06f-90d2-4b82-8b51-ade1eefb38fa f420b74c-3101-4882-805f-da7276f7bcf7\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:58232649 cname:RdHAkKyMp2NLvuvZ\r\na=ssrc:58232649 msid:b98fa06f-90d2-4b82-8b51-ade1eefb38fa f420b74c-3101-4882-805f-da7276f7bcf7\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 102 103 104 105 106 107 108 109 127 125 39 40 45 46 98 99 100 101 112 113 114\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:uB6B\r\na=ice-pwd:YmBQuaIhSa85WKcu70uyDuME\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C5:94:C2:D3:FF:DF:BA:B2:67:A3:E9:B6:3A:BE:67:98:EE:61:28:00:00:E3:73:2F:A7:4C:8F:F0:99:5E:D3:77\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendrecv\r\na=msid:b98fa06f-90d2-4b82-8b51-ade1eefb38fa 253b02b7-e51b-4f44-a4f4-195cef6a16bb\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:103 rtx/90000\r\na=fmtp:103 apt=102\r\na=rtpmap:104 H264/90000\r\na=rtcp-fb:104 goog-remb\r\na=rtcp-fb:104 transport-cc\r\na=rtcp-fb:104 ccm fir\r\na=rtcp-fb:104 nack\r\na=rtcp-fb:104 nack pli\r\na=fmtp:104 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:105 rtx/90000\r\na=fmtp:105 apt=104\r\na=rtpmap:106 H264/90000\r\na=rtcp-fb:106 goog-remb\r\na=rtcp-fb:106 transport-cc\r\na=rtcp-fb:106 ccm fir\r\na=rtcp-fb:106 nack\r\na=rtcp-fb:106 nack pli\r\na=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=106\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:125 rtx/90000\r\na=fmtp:125 apt=127\r\na=rtpmap:39 H264/90000\r\na=rtcp-fb:39 goog-remb\r\na=rtcp-fb:39 transport-cc\r\na=rtcp-fb:39 ccm fir\r\na=rtcp-fb:39 nack\r\na=rtcp-fb:39 nack pli\r\na=fmtp:39 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f\r\na=rtpmap:40 rtx/90000\r\na=fmtp:40 apt=39\r\na=rtpmap:45 AV1/90000\r\na=rtcp-fb:45 goog-remb\r\na=rtcp-fb:45 transport-cc\r\na=rtcp-fb:45 ccm fir\r\na=rtcp-fb:45 nack\r\na=rtcp-fb:45 nack pli\r\na=rtpmap:46 rtx/90000\r\na=fmtp:46 apt=45\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:112 red/90000\r\na=rtpmap:113 rtx/90000\r\na=fmtp:113 apt=112\r\na=rtpmap:114 ulpfec/90000\r\na=ssrc-group:FID 3369134375 2588693051\r\na=ssrc:3369134375 cname:RdHAkKyMp2NLvuvZ\r\na=ssrc:3369134375 msid:b98fa06f-90d2-4b82-8b51-ade1eefb38fa 253b02b7-e51b-4f44-a4f4-195cef6a16bb\r\na=ssrc:2588693051 cname:RdHAkKyMp2NLvuvZ\r\na=ssrc:2588693051 msid:b98fa06f-90d2-4b82-8b51-ade1eefb38fa 253b02b7-e51b-4f44-a4f4-195cef6a16bb\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:uB6B\r\na=ice-pwd:YmBQuaIhSa85WKcu70uyDuME\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C5:94:C2:D3:FF:DF:BA:B2:67:A3:E9:B6:3A:BE:67:98:EE:61:28:00:00:E3:73:2F:A7:4C:8F:F0:99:5E:D3:77\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n", - }, +func sendReq(isPost bool, url string, msg any) (body []byte, err error) { + var ( + req *http.Request + data []byte + ) + if isPost { + data, err = json.Marshal(msg) + if err != nil { + return + } + req, err = http.NewRequest(http.MethodPost, url, bytes.NewReader(data)) + + } else { + req, err = http.NewRequest(http.MethodGet, url, nil) } - data, err = json.Marshal(jsepMessage) if err != nil { - t.Error(err) + return } - req2, err = http.NewRequest(http.MethodPost, url, bytes.NewReader(data)) + + res, err := http.DefaultClient.Do(req) if err != nil { - t.Error(err) - } - res, err = janhttpC.Do(req2) - if err != nil { - t.Error(err) + return } + + defer res.Body.Close() body, err = io.ReadAll(res.Body) if err != nil { - t.Error(err) - } - res.Body.Close() - if err := json.Unmarshal(body, &ackMsg); err != nil { - t.Error(err) + return } - expAck.ID = id - - if !reflect.DeepEqual(ackMsg, expAck) { - t.Errorf("Expected <%s> ,got <%s> instead", utils.ToJSON(expAck), utils.ToJSON(ackMsg)) - } - - jsepEventRsp := <-pullResp - defer jsepEventRsp.Body.Close() - var jsepMsg []janus.EventMsg - data, err = io.ReadAll(jsepEventRsp.Body) - if err != nil { - t.Error(err) - } - if err := json.Unmarshal(data, &jsepMsg); err != nil { - t.Error(err) - } - - expJsepEvnt := []janus.EventMsg{ - { - Type: "event", - ID: id, - Session: sessionMsg.Data.ID, - Handle: pluginMsg.Data.ID, - Plugindata: janus.PluginData{ - Plugin: "janus.plugin.echotest", - Data: map[string]interface{}{ - "echotest": "event", - "result": "ok", - }, - }, - Jsep: map[string]interface{}{ - "sdp": jsepMessage.Jsep["sdp"], - "type": "answer", - }, - }, - } - - if !reflect.DeepEqual(jsepMsg[0].Plugindata, expJsepEvnt[0].Plugindata) || jsepMsg[0].Handle != expJsepEvnt[0].Handle || jsepMsg[0].Jsep["type"] != expJsepEvnt[0].Jsep["type"] { - t.Errorf("Expected <%s> ,\n got <%s> instead\n", utils.ToJSON(expJsepEvnt), utils.ToJSON(jsepMsg)) - } - - close(done) + return +} +func testJanitStopEngine(t *testing.T) { if err := engine.KillEngine(*utils.WaitRater); err != nil { t.Error(err) } + if err := exec.Command("pkill", "janus").Run(); err != nil { + t.Error(err) + } } diff --git a/config/config_defaults.go b/config/config_defaults.go index a16ab0ac6..e0e2b7c58 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -1182,14 +1182,16 @@ const CGRATES_CFG_JSON = ` "janus_agent": { - "enabled": false, // enables the Janus agent: + "enabled": false, // enables the Janus agent: "url": "/janus", "sessions_conns": ["*internal"], - "janus_conns":[ // instantiate connections to multiple Asterisk servers - {"address": "127.0.0.1:8088", "type": "*ws"} - ], - "request_processors": [ // request processors to be applied to Janus messages - ], + "janus_conns": [{ // instantiate connections to multiple Janus Servers + "address": "127.0.0.1:8088", // janus API address + "type": "*ws", // type of the transport to interact via janus API + "admin_address": "localhost:7188", // janus admin address used to retrive more information for sessions and handles + "admin_password": "", // secret to pass restriction to communicate to the endpoint + }], + "request_processors": [], // request processors to be applied to Janus messages }, diff --git a/config/janusagntcfg.go b/config/janusagntcfg.go index a1ca00a5c..8e65a98f9 100644 --- a/config/janusagntcfg.go +++ b/config/janusagntcfg.go @@ -25,36 +25,46 @@ import ( // JanusConn represents one connection to Janus server type JanusConn struct { - Address string // Address to reach Janus - Type string // Connection type + Address string // Address to reach Janus + Type string // Connection type + AdminAddress string + AdminPassword string } func (jc *JanusConn) loadFromJSONCfg(jsnCfg *JanusConnJsonCfg) (err error) { if jsnCfg == nil { return } - if jsnCfg.Address != nil { jc.Address = *jsnCfg.Address } - if jsnCfg.Type != nil { jc.Type = *jsnCfg.Type } + if jsnCfg.AdminAddress != nil { + jc.AdminAddress = *jsnCfg.AdminAddress + } + if jsnCfg.AdminPassword != nil { + jc.AdminPassword = *jsnCfg.AdminPassword + } return } func (jc *JanusConn) AsMapInterface() map[string]any { return map[string]any{ - utils.AddressCfg: jc.Address, - utils.TypeCfg: jc.Type, + utils.AddressCfg: jc.Address, + utils.TypeCfg: jc.Type, + utils.AdminAddressCfg: jc.AdminAddress, + utils.AdminPasswordCfg: jc.AdminPassword, } } func (jc *JanusConn) Clone() *JanusConn { return &JanusConn{ - Address: jc.Address, - Type: jc.Type, + Address: jc.Address, + Type: jc.Type, + AdminAddress: jc.AdminAddress, + AdminPassword: jc.AdminPassword, } } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 45348f2c5..ff0fb065b 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -885,8 +885,10 @@ type JanusAgentJsonCfg struct { } type JanusConnJsonCfg struct { - Address *string `json:"address"` - Type *string `json:"type"` + Address *string `json:"address"` + Type *string `json:"type"` + AdminAddress *string `json:"admin_address"` + AdminPassword *string `json:"admin_password"` } type ConfigSCfgJson struct { diff --git a/data/conf/samples/janus_agent/cgrates.json b/data/conf/samples/janus_agent/cgrates.json index 43ea7a50b..184982a58 100644 --- a/data/conf/samples/janus_agent/cgrates.json +++ b/data/conf/samples/janus_agent/cgrates.json @@ -53,6 +53,7 @@ "cdrs_conns": ["*localhost"], "rals_conns": ["*localhost"], "chargers_conns": ["*internal"], + "channel_sync_interval": "15s" }, @@ -60,14 +61,17 @@ "enabled": true, "scheduler_conns": ["*internal"], }, -"janus_agent":{ -"enabled":true, -"url":"/janus", -"janus_conns":[ - { -"address":"localhost:8188" - } -] + + +"janus_agent": { + "enabled": true, + "url": "/janus", + "sessions_conns": ["*bijson_localhost"], + "janus_conns": [{ + "address": "localhost:8188", + "admin_address": "localhost:7188", + "admin_password": "janusoverlord" + }] } } diff --git a/go.mod b/go.mod index 833be7f88..816565fad 100644 --- a/go.mod +++ b/go.mod @@ -47,13 +47,14 @@ require ( github.com/segmentio/kafka-go v0.4.44 github.com/ugorji/go/codec v1.2.12 go.mongodb.org/mongo-driver v1.12.1 - golang.org/x/crypto v0.19.0 - golang.org/x/net v0.21.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.22.0 golang.org/x/oauth2 v0.19.0 google.golang.org/api v0.169.0 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.5.4 gorm.io/gorm v1.25.5 + nhooyr.io/websocket v1.8.11 ) require ( @@ -108,7 +109,10 @@ require ( github.com/mschoch/smat v0.2.0 // indirect github.com/nats-io/nkeys v0.4.5 // indirect github.com/nats-io/nuid v1.0.1 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.17.0 // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect + github.com/stretchr/testify v1.9.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -121,12 +125,11 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78 // indirect google.golang.org/grpc v1.62.1 // indirect google.golang.org/protobuf v1.33.0 // indirect - nhooyr.io/websocket v1.8.11 // indirect ) diff --git a/go.sum b/go.sum index 7ec724ec4..2f7bc832a 100644 --- a/go.sum +++ b/go.sum @@ -110,6 +110,7 @@ github.com/fiorix/go-diameter/v4 v4.0.4/go.mod h1:Qx/+pf+c9sBUHWq1d7EH3bkdwN8U0m github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -120,6 +121,7 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -135,8 +137,10 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -165,7 +169,6 @@ github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUh github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 h1:f0n1xnMSmBLzVfsMMvriDyA75NB/oBgILX2GcHXIQzY= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ishidawataru/sctp v0.0.0-20190922091402-408ec287e38c h1:PwVcPU2rqkJIG0Lz/UGbGcbfi/HhEbOIId+w4xkbGHQ= github.com/ishidawataru/sctp v0.0.0-20190922091402-408ec287e38c/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= @@ -210,13 +213,22 @@ github.com/nats-io/nkeys v0.4.5 h1:Zdz2BUlFm4fJlierwvGK+yl20IAKUm7eV6AAZXEhkPk= github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nyaruka/phonenumbers v1.1.8 h1:mjFu85FeoH2Wy18aOMUvxqi1GgAqiQSJsa/cCC5yu2s= github.com/nyaruka/phonenumbers v1.1.8/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI= github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= @@ -233,12 +245,13 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -249,6 +262,7 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -267,16 +281,18 @@ go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= @@ -289,22 +305,26 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= @@ -314,8 +334,13 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -324,8 +349,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -347,14 +372,16 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -390,13 +417,16 @@ google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGm google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/services/janusagent.go b/services/janusagent.go index 6db5cf862..dd669707e 100644 --- a/services/janusagent.go +++ b/services/janusagent.go @@ -68,7 +68,10 @@ func (ja *JanusAgent) Start() (err error) { ja.Unlock() return utils.ErrServiceAlreadyRunning } - ja.jA = agents.NewJanusAgent(ja.cfg, ja.connMgr, filterS) + ja.jA, err = agents.NewJanusAgent(ja.cfg, ja.connMgr, filterS) + if err != nil { + return + } if err = ja.jA.Connect(); err != nil { return } diff --git a/utils/consts.go b/utils/consts.go index e23db91f9..17313729e 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -698,8 +698,9 @@ const ( IdxCombination = "][" // *vars consts in agents - MetaAppID = "*appid" - MetaSessionID = "*sessionID" // used to retrieve RADIUS Access-Reqest packets of active sessions + MetaAppID = "*appid" + MetaSessionID = "*sessionID" // used to retrieve RADIUS Access-Reqest packets of active sessions + JanusAdminSubProto = "janus-admin-protocol" RemoteHost = "RemoteHost" Local = "local" @@ -2229,6 +2230,8 @@ const ( Password = "password" AliasCfg = "alias" AccountSConnsCfg = "accounts_conns" + AdminAddressCfg = "admin_address" + AdminPasswordCfg = "admin_password" // KamAgentCfg EvapiConnsCfg = "evapi_conns"