diff options
-rw-r--r-- | app/controllers/gateways_controller.rb | 2 | ||||
-rw-r--r-- | app/models/gateway.rb | 2 | ||||
-rw-r--r-- | app/models/gateway_setting.rb | 10 | ||||
-rw-r--r-- | app/views/gateway_settings/_form_core.html.haml | 2 | ||||
-rw-r--r-- | app/views/gateways/_form_core.html.haml | 2 | ||||
-rw-r--r-- | db/migrate/20130127073800_add_dingaling_parameter.rb | 10 | ||||
-rw-r--r-- | misc/freeswitch/conf/freeswitch.xml | 1 | ||||
-rw-r--r-- | misc/freeswitch/scripts/common/gateway.lua | 85 | ||||
-rw-r--r-- | misc/freeswitch/scripts/configuration.lua | 69 | ||||
-rw-r--r-- | misc/freeswitch/scripts/dialplan/dialplan.lua | 2 |
10 files changed, 149 insertions, 36 deletions
diff --git a/app/controllers/gateways_controller.rb b/app/controllers/gateways_controller.rb index 5741195..d3362e0 100644 --- a/app/controllers/gateways_controller.rb +++ b/app/controllers/gateways_controller.rb @@ -13,6 +13,7 @@ class GatewaysController < ApplicationController def new @gateway = Gateway.new + @technologies = Gateway::TECHNOLOGIES spread_breadcrumbs end @@ -28,6 +29,7 @@ class GatewaysController < ApplicationController def edit @gateway = Gateway.find(params[:id]) + @technologies = Gateway::TECHNOLOGIES spread_breadcrumbs end diff --git a/app/models/gateway.rb b/app/models/gateway.rb index 3e791a6..a8df41f 100644 --- a/app/models/gateway.rb +++ b/app/models/gateway.rb @@ -1,5 +1,5 @@ class Gateway < ActiveRecord::Base - TECHNOLOGIES = ['sip'] + TECHNOLOGIES = ['sip', 'xmpp'] attr_accessible :name, :technology, :inbound, :outbound, :description diff --git a/app/models/gateway_setting.rb b/app/models/gateway_setting.rb index c01f0a8..e3eaadb 100644 --- a/app/models/gateway_setting.rb +++ b/app/models/gateway_setting.rb @@ -11,6 +11,16 @@ class GatewaySetting < ActiveRecord::Base 'auth_pattern' => 'String', 'number_source' => 'String', }, + 'xmpp' => { + 'server' => 'String', + 'login' => 'String', + 'password' => 'String', + 'inbound_number' => 'String', + 'auth_source' => 'String', + 'auth_pattern' => 'String', + 'number_source' => 'String', + 'destination_domain' => 'String', + }, } attr_accessible :gateway_id, :name, :value, :class_type, :description diff --git a/app/views/gateway_settings/_form_core.html.haml b/app/views/gateway_settings/_form_core.html.haml index 3e7dc49..229009b 100644 --- a/app/views/gateway_settings/_form_core.html.haml +++ b/app/views/gateway_settings/_form_core.html.haml @@ -1,4 +1,4 @@ .inputs - = f.input :name, :collection => GatewaySetting::GATEWAY_SETTINGS['sip'].keys, :label => t('gateway_settings.form.name.label'), :hint => conditional_hint('gateway_settings.form.name.hint'), :autofocus => true, :include_blank => false + = f.input :name, :collection => GatewaySetting::GATEWAY_SETTINGS[@gateway.technology].keys, :label => t('gateway_settings.form.name.label'), :hint => conditional_hint('gateway_settings.form.name.hint'), :autofocus => true, :include_blank => false = f.input :value, :label => t('gateway_settings.form.value.label'), :hint => conditional_hint('gateway_settings.form.value.hint') = f.input :description, :label => t('gateway_settings.form.description.label'), :hint => conditional_hint('gateway_settings.form.description.hint') diff --git a/app/views/gateways/_form_core.html.haml b/app/views/gateways/_form_core.html.haml index 13ed8b1..604c223 100644 --- a/app/views/gateways/_form_core.html.haml +++ b/app/views/gateways/_form_core.html.haml @@ -1,6 +1,6 @@ .inputs = f.input :name, :label => t('gateways.form.name.label'), :hint => conditional_hint('gateways.form.name.hint'), :autofocus => true - = f.input :technology, :label => t('gateways.form.technology.label'), :hint => conditional_hint('gateways.form.technology.hint') + = f.input :technology, :collection => @technologies, :label => t('gateways.form.technology.label'), :hint => conditional_hint('gateways.form.technology.hint'), :include_blank => false = f.input :inbound, :label => t('gateways.form.inbound.label'), :hint => conditional_hint('gateways.form.inbound.hint') = f.input :outbound, :label => t('gateways.form.outbound.label'), :hint => conditional_hint('gateways.form.outbound.hint') = f.input :description, :label => t('gateways.form.description.label'), :hint => conditional_hint('gateways.form.description.hint') diff --git a/db/migrate/20130127073800_add_dingaling_parameter.rb b/db/migrate/20130127073800_add_dingaling_parameter.rb new file mode 100644 index 0000000..ff5bd7c --- /dev/null +++ b/db/migrate/20130127073800_add_dingaling_parameter.rb @@ -0,0 +1,10 @@ +class AddDingalingParameter < ActiveRecord::Migration + def up + GsParameter.create(:entity => 'dingaling', :section => 'parameters', :name => 'debug', :value => '0', :class_type => 'Integer', :description => 'Debug level.') + GsParameter.create(:entity => 'dingaling', :section => 'parameters', :name => 'codec-prefs', :value => 'PCMA,PCMU', :class_type => 'String', :description => 'Codec preferences.') + end + + def down + GsParameter.where(:entity => 'dingaling', :section => 'parameters').destroy_all + end +end diff --git a/misc/freeswitch/conf/freeswitch.xml b/misc/freeswitch/conf/freeswitch.xml index 33a743e..fd6ab67 100644 --- a/misc/freeswitch/conf/freeswitch.xml +++ b/misc/freeswitch/conf/freeswitch.xml @@ -634,6 +634,7 @@ <load module="mod_say_en"/> <load module="mod_spandsp"/> <load module="mod_snmp"/> + <load module="mod_dingaling"/> </modules> </configuration> <configuration name="lua.conf" description="LUA Configuration"> diff --git a/misc/freeswitch/scripts/common/gateway.lua b/misc/freeswitch/scripts/common/gateway.lua index 1b3b832..c1b50a7 100644 --- a/misc/freeswitch/scripts/common/gateway.lua +++ b/misc/freeswitch/scripts/common/gateway.lua @@ -84,20 +84,30 @@ end function Gateway.call_url(self, destination_number) if self.technology == 'sip' then return 'sofia/gateway/' .. self.GATEWAY_PREFIX .. self.id .. '/' .. tostring(destination_number); + elseif self.technology == 'xmpp' then + local destination_str = tostring(destination_number); + if self.settings.destination_domain then + destination_str = destination_str .. '@' .. self.settings.destination_domain; + end + return 'dingaling/' .. self.GATEWAY_PREFIX .. self.id .. '/' .. destination_str; end return ''; end -function Gateway.authenticate(self, technology, caller) +function Gateway.authenticate(self, caller, technology) local sql_query = 'SELECT `c`.`name`, `c`.`id`, `a`.`value` `auth_source`, `b`.`value` `auth_pattern` \ FROM `gateway_settings` `a` \ INNER JOIN `gateway_settings` `b` \ ON (`a`.`gateway_id` = `b`.`gateway_id` AND `a`.`name` = "auth_source" AND `b`.`name` = "auth_pattern" ) \ LEFT JOIN `gateways` `c` \ ON (`a`.`gateway_id` = `c`.`id`) \ - WHERE `c`.`inbound` IS TRUE AND `c`.`technology` = "' .. tostring(technology) .. '"'; + WHERE `c`.`inbound` IS TRUE'; + + if technology then + sql_query = sql_query .. ' AND `c`.`technology` = "' .. tostring(technology) .. '"'; + end local gateway = false; @@ -142,39 +152,58 @@ function Gateway.config_table_get(self, config_table, gateway_id) end -function Gateway.parameters_build(self, gateway_id) +function Gateway.parameters_build(self, gateway_id, technology) local settings = self:config_table_get('gateway_settings', gateway_id); - local parameters = { - realm = settings.domain, - extension = 'auto_to_user', - }; require 'common.str' + local parameters = {}; + + if technology == 'sip' then + parameters.realm = settings.domain; + parameters.extension = 'auto_to_user'; + + if common.str.blank(settings.username) then + parameters.username = 'gateway' .. gateway_id; + parameters.register = false; + else + parameters.username = settings.username; + parameters.register = true; + end - if common.str.blank(settings.username) then - parameters.username = 'gateway' .. gateway_id; - parameters.register = false; - else - parameters.username = settings.username; - parameters.register = true; - end - - if not common.str.blank(settings.register) then - parameters.register = common.str.to_b(settings.register); - end + if not common.str.blank(settings.register) then + parameters.register = common.str.to_b(settings.register); + end - if common.str.blank(settings.password) then - parameters.password = 'gateway' .. gateway_id; - else - parameters.password = settings.password; - end + if common.str.blank(settings.password) then + parameters.password = 'gateway' .. gateway_id; + else + parameters.password = settings.password; + end - parameters['extension-in-contact'] = true; + parameters['extension-in-contact'] = true; - if common.str.blank(settings.contact) then - parameters['extension'] = 'gateway' .. gateway_id; - else - parameters['extension'] = settings.contact; + if common.str.blank(settings.contact) then + parameters['extension'] = 'gateway' .. gateway_id; + else + parameters['extension'] = settings.contact; + end + elseif technology == 'xmpp' then + parameters.message = 'Gemeinschaft 5 by AMOOMA'; + parameters.dialplan = 'XML'; + parameters.context = 'default'; + parameters['rtp-ip'] = 'auto'; + parameters['auto-login'] = 'true'; + parameters.sasl = 'plain'; + parameters.tls = 'true'; + parameters['use-rtp-timer'] = 'true'; + parameters.vad = 'both'; + parameters.use_jingle = 'true'; + parameters['candidate-acl'] = 'wan.auto'; + parameters.name = self.GATEWAY_PREFIX .. gateway_id; + parameters.server = settings.server; + parameters.login = settings.login; + parameters.password = settings.password; + parameters.exten = settings.inbound_number or parameters.name; end for key, value in pairs(self:config_table_get('gateway_parameters', gateway_id)) do diff --git a/misc/freeswitch/scripts/configuration.lua b/misc/freeswitch/scripts/configuration.lua index 9e62bb6..062cf5d 100644 --- a/misc/freeswitch/scripts/configuration.lua +++ b/misc/freeswitch/scripts/configuration.lua @@ -29,7 +29,7 @@ function nodes(database, local_node_id) end -function gateways(database, profile_name) +function sofia_gateways(database, profile_name) require 'configuration.simple_xml' local xml = configuration.simple_xml.SimpleXml:new(); @@ -44,8 +44,8 @@ function gateways(database, profile_name) local gateway = gateways[index]; local gateway_profile = gateway_class:profile_get(gateway.id); if tostring(gateway_profile) == profile_name or (profile_name == 'gemeinschaft' and common.str.blank(gateway_profile)) then - log:debug('GATEWAY - name: ', gateway.name); - local parameters = gateway_class:parameters_build(gateway.id); + log:debug('SIP_GATEWAY - name: ', gateway.name); + local parameters = gateway_class:parameters_build(gateway.id, 'sip'); gateways_xml = gateways_xml .. xml:element{ 'gateway', @@ -86,7 +86,7 @@ function profile(database, sofia_ini, profile_name, index, domains, node_id) log:debug('SOFIA_PROFILE ', index,' - name: ', profile_name, ' - no domains'); end - local gateways_xml = gateways(database, profile_name); + local gateways_xml = sofia_gateways(database, profile_name); if index == 1 then gateways_xml = gateways_xml .. nodes(database, node_id); @@ -296,6 +296,65 @@ function conf_post_switch(database) end +function dingaling_profiles(database) + local TECHNOLOGY = 'xmpp'; + require 'common.str' + require 'configuration.simple_xml' + local xml = configuration.simple_xml.SimpleXml:new(); + + require 'common.gateway' + local gateway_class = common.gateway.Gateway:new{ log = log, database = database}; + local gateways = gateway_class:list(TECHNOLOGY); + + local gateways_xml = ''; + for index=1, #gateways do + local gateway = gateways[index]; + local gateway_profile = gateway_class:profile_get(gateway.id); + log:debug('XMPP_GATEWAY - name: ', gateway.name); + local parameters = gateway_class:parameters_build(gateway.id, TECHNOLOGY); + + gateways_xml = gateways_xml .. xml:element{ + 'profile', + ['type'] = 'client', + xml:from_hash('param', parameters, 'name', 'value'), + }; + end + + return gateways_xml; +end + + +function conf_dingaling(database) + require 'configuration.simple_xml' + local xml = configuration.simple_xml.SimpleXml:new(); + + require 'common.configuration_table'; + local parameters = common.configuration_table.get(database, 'dingaling', 'parameters') or {}; + + local profiles_xml = dingaling_profiles(database) or ''; + + XML_STRING = xml:element{ + 'document', + ['type'] = 'freeswitch/xml', + xml:element{ + 'section', + name = 'configuration', + description = 'Gemeinschaft 5 FreeSWITCH configuration', + xml:element{ + 'configuration', + name = 'dingaling.conf', + description = 'Jingle endpoint configuration', + xml:element{ + 'settings', + xml:from_hash('param', parameters, 'name', 'value'), + }, + profiles_xml, + }, + }, + }; +end + + function directory_sip_account(database) require 'configuration.simple_xml' local xml = configuration.simple_xml.SimpleXml:new(); @@ -480,6 +539,8 @@ if XML_REQUEST.section == 'configuration' and XML_REQUEST.tag_name == 'configura if XML_REQUEST.key_value == 'sofia.conf' then conf_sofia(database); + elseif XML_REQUEST.key_value == "dingaling.conf" then + conf_dingaling(database); elseif XML_REQUEST.key_value == "conference.conf" then conf_conference(database); elseif XML_REQUEST.key_value == "voicemail.conf" then diff --git a/misc/freeswitch/scripts/dialplan/dialplan.lua b/misc/freeswitch/scripts/dialplan/dialplan.lua index 49d698b..ff4adc6 100644 --- a/misc/freeswitch/scripts/dialplan/dialplan.lua +++ b/misc/freeswitch/scripts/dialplan/dialplan.lua @@ -135,7 +135,7 @@ end function Dialplan.auth_gateway(self) require 'common.gateway' local gateway_class = common.gateway.Gateway:new{ log = self.log, database = self.database}; - local gateway = gateway_class:authenticate('sip', self.caller); + local gateway = gateway_class:authenticate(self.caller); if gateway then log:info('AUTH_GATEWAY - ', gateway.auth_source, ' ~ ', gateway.auth_pattern, ', gateway=', gateway.id, ', name: ', gateway.name, ', ip: ', self.caller.sip_contact_host); |