summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc/freeswitch/scripts/common/routing_tables.lua66
-rw-r--r--misc/freeswitch/scripts/dialplan/dialplan.lua8
-rw-r--r--misc/freeswitch/scripts/dialplan/hunt_group.lua39
-rw-r--r--misc/freeswitch/scripts/dialplan/route.lua265
-rw-r--r--misc/freeswitch/scripts/dialplan/router.lua4
-rw-r--r--misc/freeswitch/scripts/send_fax.lua2
6 files changed, 35 insertions, 349 deletions
diff --git a/misc/freeswitch/scripts/common/routing_tables.lua b/misc/freeswitch/scripts/common/routing_tables.lua
deleted file mode 100644
index f28b5c5..0000000
--- a/misc/freeswitch/scripts/common/routing_tables.lua
+++ /dev/null
@@ -1,66 +0,0 @@
--- Gemeinschaft 5 module: routing table functions
--- (c) AMOOMA GmbH 2012-2013
---
-
-module(...,package.seeall)
-
-function expand_variables(line, variables_list)
- variables_list = variables_list or {};
-
- return (line:gsub('{([%a%d_]+)}', function(captured)
- return variables_list[captured] or '';
- end))
-end
-
-
-function match_route(entry, search_str, variables_list)
- if not entry or not search_str then
- return { error = 'No input values' };
- end
-
- local result = nil;
- local success = nil;
- success, result = pcall(string.find, search_str, entry[1]);
-
- if not success then
- return { error = result, line = line }
- elseif result then
- local route = {
- pattern = entry[1],
- value = search_str:gsub(entry[1], expand_variables(entry[#entry], variables_list)),
- }
-
- for index = 2, #entry-1 do
- local attribute = entry[index]:match('^(.-)%s*=');
- if attribute then
- route[attribute] = entry[index]:match('=%s*(.-)$');
- end
- end
-
- return route;
- end
-
- return {};
-end
-
-
-function match_caller_id(entry, search_str, variables_list)
- if not entry or not search_str then
- return { error = 'No input values' };
- end
- local result = nil;
- local success = nil;
- success, result = pcall(string.find, search_str, entry[1]);
- if not success then
- return { error = result, line = line }
- elseif result then
- return {
- value = search_str:gsub(entry[1], expand_variables(entry[4], variables_list)),
- class = entry[2],
- endpoint = entry[3],
- pattern = entry[1],
- }
- end
-
- return {};
-end
diff --git a/misc/freeswitch/scripts/dialplan/dialplan.lua b/misc/freeswitch/scripts/dialplan/dialplan.lua
index 3fcb2bd..cc222fc 100644
--- a/misc/freeswitch/scripts/dialplan/dialplan.lua
+++ b/misc/freeswitch/scripts/dialplan/dialplan.lua
@@ -625,7 +625,7 @@ function Dialplan.callthrough(self, destination)
end
require 'dialplan.router'
- local route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('prerouting', destination_number, true);
+ local route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('prerouting', true);
if route and route.destination_number then
destination_number = route.destination_number;
@@ -774,7 +774,7 @@ function Dialplan.switch(self, destination)
destination.callee_id_name = nil;
require 'dialplan.router'
- local routes = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('outbound', destination.number);
+ local routes = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('outbound');
if not routes or #routes == 0 then
self.log:notice('SWITCH - no route - number: ', destination.number);
@@ -879,7 +879,7 @@ function Dialplan.run(self, destination)
self.caller.destination_number = self.caller:to_s(self.caller.gateway.settings.number_source);
end
- route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('inbound', self.caller.destination_number, true);
+ route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('inbound', true);
if route then
local ignore_keys = {
id = true,
@@ -899,7 +899,7 @@ function Dialplan.run(self, destination)
self.log:notice('INBOUND - no route');
end
else
- route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('prerouting', self.caller.destination_number, true);
+ route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = self.caller, variables = self.caller }:route_run('prerouting', true);
if route then
local ignore_keys = {
id = true,
diff --git a/misc/freeswitch/scripts/dialplan/hunt_group.lua b/misc/freeswitch/scripts/dialplan/hunt_group.lua
index 44c2bb8..07f403e 100644
--- a/misc/freeswitch/scripts/dialplan/hunt_group.lua
+++ b/misc/freeswitch/scripts/dialplan/hunt_group.lua
@@ -98,21 +98,35 @@ function HuntGroup.run(self, dialplan_object, caller, destination)
self.log:info('HUNTGROUP ', self.record.id, ' - name: ', self.record.name, ', strategy: ', self.record.strategy,', members: ', #hunt_group_members);
+ local save_destination = caller.destination;
+
local destinations = {}
for index, hunt_group_member in ipairs(hunt_group_members) do
local destination = dialplan_object:destination_new{ number = hunt_group_member.number };
if destination.type == 'unknown' then
- require 'dialplan.route'
- local routes = dialplan.route.Route:new{ log = self.log, database = self.database, routing_table = dialplan_object.routes }:outbound(caller, destination.number);
- if routes and #routes > 0 then
- destination.callee_id_number = destination.number;
- destination.callee_id_name = nil;
- local route = routes[1];
- destination.gateway = route.endpoint;
- destination.type = route.class;
- destination.number = route.value;
- destination.caller_id_number = route.caller_id_number;
- destination.caller_id_name = route.caller_id_name;
+ self.log:notice('HG_DESTINATION - number: ', destination.number, ', hunt_group_member.number: ', hunt_group_member.number);
+
+
+ caller.destination_number = destination.number;
+
+ require 'dialplan.router'
+ local route = dialplan.router.Router:new{ log = self.log, database = self.database, caller = caller, variables = caller }:route_run('outbound', true);
+
+ if route then
+ destination = dialplan_object:destination_new{ ['type'] = route.type, id = route.id, number = route.destination_number }
+
+ local ignore_keys = {
+ id = true,
+ ['type'] = true,
+ channel_variables = true,
+ };
+
+ for key, value in pairs(route) do
+ if not ignore_keys[key] then
+ destination[key] = value;
+ end
+ end
+
table.insert(destinations, destination);
end
else
@@ -120,6 +134,9 @@ function HuntGroup.run(self, dialplan_object, caller, destination)
end
end
+ caller.destination = save_destination;
+ caller.destination_number = save_destination.number;
+
local forwarding_destination = nil;
if caller.forwarding_service == 'assistant' and caller.auth_account then
forwarding_destination = dialplan_object:destination_new{ type = caller.auth_account.class, id = caller.auth_account.id, number = forwarding_number }
diff --git a/misc/freeswitch/scripts/dialplan/route.lua b/misc/freeswitch/scripts/dialplan/route.lua
deleted file mode 100644
index a12b5f9..0000000
--- a/misc/freeswitch/scripts/dialplan/route.lua
+++ /dev/null
@@ -1,265 +0,0 @@
--- Gemeinschaft 5 module: routing class
--- (c) AMOOMA GmbH 2012-2013
---
-
-module(...,package.seeall)
-
-Route = {}
-
--- create route object
-function Route.new(self, arg)
- arg = arg or {}
- object = arg.object or {}
- setmetatable(object, self);
- self.__index = self;
- self.log = arg.log;
- self.database = arg.database;
- self.routing_table = arg.routing_table;
- self.expandable = arg.expandable or {};
- return object;
-end
-
--- find matching routes
-function Route.prerouting(self, caller, number)
- require 'common.routing_tables'
-
- for index, routing_entry in pairs(self.routing_table.prerouting) do
- local route = common.routing_tables.match_route(routing_entry, number);
- if route.error then
- self.log:error('PREROUTE - error: ', route.error);
- elseif route.value then
- self.log:info('ROUTE_PREROUTING - called number: ', number, ', value: ', route.value, ', pattern: ', route.pattern);
- return route;
- end
- end
-end
-
--- find matching routes
-function Route.outbound(self, caller, number)
- local routes = {};
- require 'common.routing_tables'
- require 'common.str'
-
- local ignore_arguments = {
- class=true,
- endpoint=true,
- pattern=true,
- value=true,
- group=true,
- phrase=true,
- }
-
- local clip_no_screening = common.str.try(caller, 'account.record.clip_no_screening');
- local caller_id_numbers = {}
- if not common.str.blank(clip_no_screening) then
- for index, number in ipairs(common.str.strip_to_a(clip_no_screening, ',')) do
- table.insert(caller_id_numbers, number);
- end
- end
- for index, number in ipairs(caller.caller_phone_numbers) do
- table.insert(caller_id_numbers, number);
- end
- self.log:info('CALLER_ID_NUMBER - caller_id_numbers: ', table.concat(caller_id_numbers, ','));
-
- for index, routing_entry in pairs(self.routing_table.outbound) do
- local route = common.routing_tables.match_route(routing_entry, number);
- if route.error then
- self.log:error('ROUTE_OUTBOUND - error: ', route.error);
- elseif route.value then
- local valid_route = true;
-
- for argument, value in pairs(route) do
- if not ignore_arguments[argument] then
- local table_value = common.str.downcase(tostring(common.str.try(caller, argument)));
- value = common.str.downcase(tostring(value));
- if table_value:match(value) then
- self.log:info('ROUTE_OUTBOUND_POSITIVE - ', argument, '=', value, ' ~ ', table_value, ', pattern: ', route.pattern);
- else
- self.log:info('ROUTE_OUTBOUND_NEGATIVE - ', argument, '=', value, ' !~ ', table_value, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
- end
-
- if route.group then
- if common.str.try(caller.auth_account, 'owner.groups.' .. tostring(route.group)) then
- self.log:info('ROUTE_OUTBOUND_POSITIVE - group=', route.group, ', pattern: ', route.pattern);
- else
- self.log:info('ROUTE_OUTBOUND_NEGATIVE - group=', route.group, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
-
- if route.cidn then
- if caller.caller_id_number:match(route.cidn) then
- self.log:info('ROUTE_OUTBOUND_POSITIVE - cidn=', route.cidn, ' ~ ', caller.caller_id_number,', pattern: ', route.pattern);
- else
- self.log:info('ROUTE_OUTBOUND_NEGATIVE - cidn=', route.cidn, ' !~ ', caller.caller_id_number, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
-
- if valid_route then
- if route.class ~= 'hangup' then
- route.caller_id_number = self:outbound_cid_number(caller, caller_id_numbers, route.endpoint, route.class);
- self.expandable.caller_id_number = route.caller_id_number;
- route.caller_id_name = self:outbound_cid_name(caller, route.endpoint, route.class);
- end
- table.insert(routes, route);
- self.log:info('ROUTE_OUTBOUND ', #routes,' - ', route.class, '=', route.endpoint, ', value: ', route.value, ', caller_id_number: ', route.caller_id_number, ', caller_id_name: ', route.caller_id_name);
- end
- end
- end
-
- return routes;
-end
-
-
-function Route.inbound(self, caller, number)
- require 'common.routing_tables'
-
- local ignore_arguments = {
- class=true,
- endpoint=true,
- pattern=true,
- value=true,
- group=true,
- phrase=true,
- }
-
- for index, routing_entry in pairs(self.routing_table.inbound) do
- local route = common.routing_tables.match_route(routing_entry, number);
- if route.error then
- self.log:error('ROUTE_INBOUND - error: ', route.error);
- elseif route.value then
- local valid_route = true;
-
- for argument, value in pairs(route) do
- if not ignore_arguments[argument] then
- local table_value = common.str.downcase(tostring(common.str.try(caller, argument)));
- value = common.str.downcase(tostring(value));
- if table_value:match(value) then
- self.log:info('ROUTE_INBOUND_POSITIVE - ', argument, '=', value, ' ~ ', table_value, ', pattern: ', route.pattern);
- else
- self.log:info('ROUTE_INBOUND_NEGATIVE - ', argument, '=', value, ' !~ ', table_value, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
- end
-
- if route.class and route.endpoint then
- if route.class == 'gateway' and caller.gateway_name:match(route.endpoint) then
- self.log:info('ROUTE_INBOUND_POSITIVE - ', route.class, '=', route.endpoint, ' ~ ', caller.gateway_name, ', pattern: ', route.pattern);
- else
- self.log:info('ROUTE_INBOUND_NEGATIVE - ', route.class, '=', route.endpoint, ' !~ ', caller.gateway_name, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
-
- if valid_route then
- self.log:info('ROUTE_INBOUND - called number: ', number, ', value: ', route.value, ', pattern: ', route.pattern);
- return route;
- end
- end
- end
-end
-
--- find caller id
-function Route.caller_id(self, caller, cid_entry, search_str, endpoint, class)
- local ignore_arguments = {
- class=true,
- endpoint=true,
- pattern=true,
- value=true,
- group=true,
- phrase=true,
- }
-
- local route = common.routing_tables.match_route(cid_entry, search_str, self.expandable);
- if route.error then
- self.log:error('CALLER_ID - error: ', route.error);
- elseif route.value then
- local valid_route = true;
-
- for argument, value in pairs(route) do
- if not ignore_arguments[argument] then
- local table_value = common.str.downcase(tostring(common.str.try(caller, argument)));
- value = common.str.downcase(tostring(value));
- if table_value:match(value) then
- self.log:debug('CALLER_ID_POSITIVE - ', argument, '=', value, ' ~ ', table_value, ', pattern: ', route.pattern);
- else
- self.log:debug('CALLER_ID_NEGATIVE - ', argument, '=', value, ' !~ ', table_value, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
- end
-
- if route.group then
- if common.str.try(caller.auth_account, 'owner.groups.' .. tostring(route.group)) then
- self.log:debug('CALLER_ID_POSITIVE - group=', route.group, ', pattern: ', route.pattern);
- else
- self.log:debug('CALLER_ID_NEGATIVE - group=', route.group, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
-
- endpoint = tostring(endpoint);
- if route.class and route.endpoint then
- if route.class == 'gateway' and endpoint:match(route.endpoint) then
- self.log:debug('CALLER_ID_POSITIVE - ', route.class, '=', route.endpoint, ' ~ ', endpoint, ', pattern: ', route.pattern);
- else
- self.log:debug('CALLER_ID_NEGATIVE - ', route.class, '=', route.endpoint, ' !~ ', endpoint, ', pattern: ', route.pattern);
- valid_route = false;
- end
- end
-
- if valid_route then
- self.log:debug('CALLER_ID ', route.class, '=', route.endpoint, ', value: ', route.value);
- return route.value;
- end
- end
-
- return nil;
-end
-
--- find matching caller id number
-function Route.outbound_cid_number(self, caller, caller_id_numbers, endpoint, class)
- for route_index, cid_entry in pairs(self.routing_table.outbound_cid_number) do
- for index, number in ipairs(caller_id_numbers) do
- local route = self:caller_id(caller, cid_entry, number, endpoint, class);
- if route then
- return route;
- end
- end
- end
-end
-
--- find matching caller id name
-function Route.outbound_cid_name(self, caller, endpoint, class)
- for route_index, cid_entry in pairs(self.routing_table.outbound_cid_name) do
- local route = self:caller_id(caller, cid_entry, caller.caller_id_name, endpoint, class);
- if route then
- return route;
- end
- end
-end
-
--- find matching caller id number
-function Route.inbound_cid_number(self, caller, endpoint, class)
- for route_index, cid_entry in pairs(self.routing_table.inbound_cid_number) do
- local route = self:caller_id(caller, cid_entry, caller.caller_id_number, endpoint, class);
- if route then
- return route;
- end
- end
-end
-
--- find matching caller id name
-function Route.inbound_cid_name(self, caller, endpoint, class)
- for route_index, cid_entry in pairs(self.routing_table.inbound_cid_name) do
- local route = self:caller_id(caller, cid_entry, caller.caller_id_name, endpoint, class);
- if route then
- return route;
- end
- end
-end
diff --git a/misc/freeswitch/scripts/dialplan/router.lua b/misc/freeswitch/scripts/dialplan/router.lua
index 5f427ac..7e64d7b 100644
--- a/misc/freeswitch/scripts/dialplan/router.lua
+++ b/misc/freeswitch/scripts/dialplan/router.lua
@@ -162,13 +162,13 @@ function Router.route_match(self, route)
end
-function Router.route_run(self, table_name, phone_number, find_first)
+function Router.route_run(self, table_name, find_first)
local routing_table = self:read_table(table_name);
local routes = {};
if type(routing_table) == 'table' then
for index=1, #routing_table do
- local route = self:route_match(routing_table[index], phone_number);
+ local route = self:route_match(routing_table[index]);
if route then
table.insert(routes, route);
self.log:info('ROUTE ', #routes,' - ', table_name,'=', routing_table[index].id, '/', routing_table[index].name, ', destination: ', route.type, '=', route.id, ', destination_number: ', route.destination_number);
diff --git a/misc/freeswitch/scripts/send_fax.lua b/misc/freeswitch/scripts/send_fax.lua
index 35460a3..11cd1d7 100644
--- a/misc/freeswitch/scripts/send_fax.lua
+++ b/misc/freeswitch/scripts/send_fax.lua
@@ -94,7 +94,7 @@ else
local result = dialplan:retrieve_caller_data();
local dialplan_router = require('dialplan.router');
- local routes = dialplan_router.Router:new{ log = log, database = database, caller = caller, variables = caller }:route_run('outbound', destination_number);
+ local routes = dialplan_router.Router:new{ log = log, database = database, caller = caller, variables = caller }:route_run('outbound');
if not routes or #routes == 0 then
log:notice('SWITCH - no route - number: ', destination_number);