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"