From c0ccfeebe78dc1d0136f86e5f0e9562c4804cfa9 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 21 Nov 2010 20:59:01 +0000
Subject: Start implementing Freeswitch in ROBUST
---
.../FreeswitchService/FreeswitchService.cs | 12 ++++++--
.../FreeswitchService/FreeswitchServiceBase.cs | 36 +++++++++++++++++++++-
2 files changed, 45 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Services/FreeswitchService')
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index 0a38300..109ef9b 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -33,19 +33,27 @@ using OpenSim.Framework;
using OpenSim.Data;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
+using System.Collections;
namespace OpenSim.Services.FreeswitchService
{
public class FreeswitchService : FreeswitchServiceBase, IFreeswitchService
{
- //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public FreeswitchService(IConfigSource config) : base(config)
{
// Perform initilialization here
}
+ public Hashtable HandleDirectoryRequest(Hashtable requestBody)
+ {
+ return new Hashtable();
+ }
- // Implement IFreeswitchService here
+ public Hashtable HandleDialplanRequest(Hashtable requestBody)
+ {
+ return new Hashtable();
+ }
}
}
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs b/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
index 83fecef..ebbb1b0 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchServiceBase.cs
@@ -31,11 +31,28 @@ using Nini.Config;
using OpenSim.Framework;
using OpenSim.Services.Interfaces;
using OpenSim.Services.Base;
+using log4net;
namespace OpenSim.Services.FreeswitchService
{
public class FreeswitchServiceBase : ServiceBase
{
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ protected string m_freeSwitchRealm;
+ protected string m_freeSwitchSIPProxy;
+ protected bool m_freeSwitchAttemptUseSTUN = false;
+ protected string m_freeSwitchEchoServer;
+ protected int m_freeSwitchEchoPort = 50505;
+ protected string m_freeSwitchDefaultWellKnownIP;
+ protected int m_freeSwitchDefaultTimeout = 5000;
+ protected string m_freeSwitchContext = "default";
+ protected string m_freeSwitchServerUser = "freeswitch";
+ protected string m_freeSwitchServerPass = "password";
+ protected readonly string m_freeSwitchAPIPrefix = "/fsapi";
+
+ protected bool m_Enabled = false;
+
public FreeswitchServiceBase(IConfigSource config) : base(config)
{
//
@@ -44,7 +61,24 @@ namespace OpenSim.Services.FreeswitchService
IConfig freeswitchConfig = config.Configs["FreeswitchService"];
if (freeswitchConfig != null)
{
- // Read config here !!
+ m_freeSwitchDefaultWellKnownIP = freeswitchConfig.GetString("ServerAddress", String.Empty);
+ if (m_freeSwitchDefaultWellKnownIP == String.Empty)
+ {
+ m_log.Error("[FREESWITCH]: No FreeswitchServerAddress given, can't continue");
+ return;
+ }
+
+ m_freeSwitchRealm = freeswitchConfig.GetString("Realm", m_freeSwitchDefaultWellKnownIP);
+ m_freeSwitchSIPProxy = freeswitchConfig.GetString("SIPProxy", m_freeSwitchDefaultWellKnownIP + ":5060");
+ m_freeSwitchEchoServer = freeswitchConfig.GetString("EchoServer", m_freeSwitchDefaultWellKnownIP);
+ m_freeSwitchEchoPort = freeswitchConfig.GetInt("EchoPort", m_freeSwitchEchoPort);
+ m_freeSwitchAttemptUseSTUN = freeswitchConfig.GetBoolean("AttemptSTUN", false); // This may not work
+ m_freeSwitchDefaultTimeout = freeswitchConfig.GetInt("DefaultTimeout", m_freeSwitchDefaultTimeout);
+ m_freeSwitchContext = freeswitchConfig.GetString("Context", m_freeSwitchContext);
+ m_freeSwitchServerUser = freeswitchConfig.GetString("UserName", m_freeSwitchServerUser);
+ m_freeSwitchServerPass = freeswitchConfig.GetString("Password", m_freeSwitchServerPass);
+
+ m_Enabled = true;
}
}
}
--
cgit v1.1
From ed5f91c638d39938bfca04319434e007fcad90b2 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 21 Nov 2010 21:18:03 +0000
Subject: Move Dialplan and Directory from the region module to the ROBUST
server
---
.../FreeswitchService/FreeswitchService.cs | 337 ++++++++++++++++++++-
1 file changed, 333 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Services/FreeswitchService')
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index 109ef9b..b62a65a 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Text;
using System.Reflection;
using Nini.Config;
using log4net;
@@ -46,14 +47,342 @@ namespace OpenSim.Services.FreeswitchService
// Perform initilialization here
}
- public Hashtable HandleDirectoryRequest(Hashtable requestBody)
+ public Hashtable HandleDialplanRequest(Hashtable request)
{
- return new Hashtable();
+ m_log.DebugFormat("[FreeSwitchVoice] HandleDialplanRequest called with {0}",request.ToString());
+
+ Hashtable response = new Hashtable();
+
+ foreach (DictionaryEntry item in request)
+ {
+ m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}",item.Key, item.Value);
+ }
+
+ string requestcontext = (string) request["Hunt-Context"];
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+
+ if (m_freeSwitchContext != String.Empty && m_freeSwitchContext != requestcontext)
+ {
+ m_log.Debug("[FreeSwitchDirectory] returning empty as it's for another context");
+ response["str_response_string"] = "";
+ }
+ else
+ {
+ response["str_response_string"] = String.Format(@"
+
+
+ " +
+
+/*
+
+
+
+
+
+ */
+
+ @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ", m_freeSwitchContext, m_freeSwitchRealm);
+ }
+
+ return response;
}
- public Hashtable HandleDialplanRequest(Hashtable requestBody)
+ public Hashtable HandleDirectoryRequest(Hashtable request)
+ {
+ Hashtable response = new Hashtable();
+ string domain = (string) request["domain"];
+ if (domain != m_freeSwitchRealm) {
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = "";
+ } else {
+ m_log.DebugFormat("[FreeSwitchDirectory] HandleDirectoryRequest called with {0}",request.ToString());
+
+ // information in the request we might be interested in
+
+ // Request 1 sip_auth for users account
+
+ //Event-Calling-Function=sofia_reg_parse_auth
+ //Event-Calling-Line-Number=1494
+ //action=sip_auth
+ //sip_user_agent=Vivox-SDK-2.1.3010.6151-Mac%20(Feb-11-2009/16%3A42%3A41)
+ //sip_auth_username=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_auth_realm=9.20.151.43
+ //sip_contact_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_contact_host=192.168.0.3 // this shouldnt really be a local IP, investigate STUN servers
+ //sip_to_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //sip_to_host=9.20.151.43
+ //sip_auth_method=REGISTER
+ //user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //domain=9.20.151.43
+ //ip=9.167.220.137 // this is the correct IP rather than sip_contact_host above when through a vpn or NAT setup
+
+ foreach (DictionaryEntry item in request)
+ {
+ m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}", item.Key, item.Value);
+ }
+
+ string eventCallingFunction = (string) request["Event-Calling-Function"];
+ if (eventCallingFunction == null)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
+
+ if (eventCallingFunction.Length == 0)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
+
+ if (eventCallingFunction == "sofia_reg_parse_auth")
+ {
+ string sipAuthMethod = (string)request["sip_auth_method"];
+
+ if (sipAuthMethod == "REGISTER")
+ {
+ response = HandleRegister(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (sipAuthMethod == "INVITE")
+ {
+ response = HandleInvite(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod);
+ response["int_response_code"] = 404;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ else if (eventCallingFunction == "switch_xml_locate_user")
+ {
+ response = HandleLocateUser(m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "user_data_function") // gets called when an avatar to avatar call is made
+ {
+ response = HandleLocateUser(m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "user_outgoing_channel")
+ {
+ response = HandleRegister(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "config_sofia") // happens once on freeswitch startup
+ {
+ response = HandleConfigSofia(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "switch_load_network_lists")
+ {
+ //response = HandleLoadNetworkLists(request);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ return response;
+ }
+
+ private Hashtable HandleRegister(string Context, string Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleRegister called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string password = "1234";
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user, password, Context);
+
+ return response;
+ }
+
+ private Hashtable HandleInvite(string Context, string Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleInvite called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string password = "1234";
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+ string sipRequestUser = (string) request["sip_request_user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user, password,sipRequestUser, Context);
+
+ return response;
+ }
+
+ private Hashtable HandleLocateUser(String Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleLocateUser called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ ""+
+ "\r\n"+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user);
+
+ return response;
+ }
+
+ private Hashtable HandleConfigSofia(string Context, string Realm, Hashtable request)
{
- return new Hashtable();
+ m_log.Info("[FreeSwitchDirectory] HandleConfigSofia called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string domain = (string) request["domain"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ ""+
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain, Context);
+
+ return response;
}
}
}
--
cgit v1.1
From 2b0ef9ad1d46d89e01bc9149c8689aaa0b412587 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 21 Nov 2010 22:17:25 +0000
Subject: Implement a method to allow regions to query the gridwide Freeswitch
configuration from ROBUST
---
.../Services/FreeswitchService/FreeswitchService.cs | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
(limited to 'OpenSim/Services/FreeswitchService')
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index b62a65a..21518f3 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -34,6 +34,7 @@ using OpenSim.Framework;
using OpenSim.Data;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
+using OpenMetaverse.StructuredData;
using System.Collections;
namespace OpenSim.Services.FreeswitchService
@@ -384,5 +385,24 @@ namespace OpenSim.Services.FreeswitchService
return response;
}
+
+ public string GetJsonConfig()
+ {
+ OSDMap map = new OSDMap(11);
+
+ map.Add("Realm", m_freeSwitchRealm);
+ map.Add("SIPProxy", m_freeSwitchSIPProxy);
+ map.Add("AttemptUseSTUN", m_freeSwitchAttemptUseSTUN);
+ map.Add("EchoServer", m_freeSwitchEchoServer);
+ map.Add("EchoPort", m_freeSwitchEchoPort);
+ map.Add("DefaultWellKnownIP", m_freeSwitchDefaultWellKnownIP);
+ map.Add("DefaultTimeout", m_freeSwitchDefaultTimeout);
+ map.Add("Context", m_freeSwitchContext);
+ map.Add("ServerUser", m_freeSwitchServerUser);
+ map.Add("ServerPass", m_freeSwitchServerPass);
+ map.Add("APIPrefix", m_freeSwitchAPIPrefix);
+
+ return OSDParser.SerializeJsonString(map);
+ }
}
}
--
cgit v1.1
From a7174cecdd1724e8c8fa2f24355cb4ef380d5bf7 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 21 Nov 2010 22:45:04 +0000
Subject: Remove username and password from the publicly accessible FS config
---
OpenSim/Services/FreeswitchService/FreeswitchService.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
(limited to 'OpenSim/Services/FreeswitchService')
diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index 21518f3..fe6f5cd 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -388,7 +388,7 @@ namespace OpenSim.Services.FreeswitchService
public string GetJsonConfig()
{
- OSDMap map = new OSDMap(11);
+ OSDMap map = new OSDMap(9);
map.Add("Realm", m_freeSwitchRealm);
map.Add("SIPProxy", m_freeSwitchSIPProxy);
@@ -398,8 +398,6 @@ namespace OpenSim.Services.FreeswitchService
map.Add("DefaultWellKnownIP", m_freeSwitchDefaultWellKnownIP);
map.Add("DefaultTimeout", m_freeSwitchDefaultTimeout);
map.Add("Context", m_freeSwitchContext);
- map.Add("ServerUser", m_freeSwitchServerUser);
- map.Add("ServerPass", m_freeSwitchServerPass);
map.Add("APIPrefix", m_freeSwitchAPIPrefix);
return OSDParser.SerializeJsonString(map);
--
cgit v1.1