diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 553cb69ee1..25e07493f7 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -38,7 +38,7 @@ local log = require "resources.functions.log".ring_group require "resources.functions.explode"; require "resources.functions.base64"; require "resources.functions.file_exists"; - require "resources.functions.explode"; + require "resources.functions.channel_utils" --get the variables domain_name = session:getVariable("domain_name"); @@ -439,34 +439,10 @@ local log = require "resources.functions.log".ring_group extension_uuid = trim(api:executeString(cmd)); --send to user local dial_string_to_user = "[sip_invite_domain="..domain_name..","..group_confirm.."leg_timeout="..destination_timeout..","..delay_name.."="..destination_delay..",dialed_extension=" .. row.destination_number .. ",extension_uuid="..extension_uuid .. row.record_session .. "]user/" .. row.destination_number .. "@" .. domain_name; - if (ring_group_skip_active ~= nil) then - if (ring_group_skip_active == "true") then - cmd = "show channels like "..destination_number; - reply = trim(api:executeString(cmd)); - --freeswitch.consoleLog("notice", "[ring group] reply "..cmd.." " .. reply .. "\n"); - exploded_reply = {}; - exploded_reply = explode(",",reply); - - if (reply == "0 total.") then - dial_string = dial_string_to_user - else - idle_extension=true; - - if (exploded_reply ~= nil) then - for i,v in ipairs(exploded_reply) do - if(v==destination_number.."@"..domain_name) then - idle_extension=false; - end - end - end - - if(idle_extension) then - dial_string = dial_string_to_user; - end - end - else - --look inside the reply to check for the correct domain_name - dial_string = dial_string_to_user; + if (ring_group_skip_active == "true") then + local channels = channels_by_number(destination_number, domain_name) + if (not channels) or #channels == 0 then + dial_string = dial_string_to_user end else dial_string = dial_string_to_user; diff --git a/resources/install/scripts/resources/functions/channel_utils.lua b/resources/install/scripts/resources/functions/channel_utils.lua index a078939d2e..5cf33c5f8f 100644 --- a/resources/install/scripts/resources/functions/channel_utils.lua +++ b/resources/install/scripts/resources/functions/channel_utils.lua @@ -1,3 +1,7 @@ +require 'resources.config' +require 'resources.functions.trim' + +local Database = require 'resources.functions.database' local api = api or freeswitch.API() @@ -18,3 +22,38 @@ function channel_evalute(uuid, cmd) return result end + +local _switchname +local function switchname() + if _switchname then return _switchname end + + local result = api:executeString("switchname") + + if result:sub(1, 4) == '-ERR' then return nil, result end + if result == '_undef_' then return false end + + _switchname = result + return result +end + +function channels_by_number(number, domain) + local hostname = assert(switchname()) + local dbh = Database.new('switch') + + local full_number = number .. '@' .. (domain or '%') + + local sql = ([[select * from channels where hostname='%s' and ( + (context = '%s' and (cid_name = '%s' or cid_num = '%s')) + or name like '%s' or presence_id like '%s' or presence_data like '%s' + ) + order by created_epoch + ]]):format(hostname, + domain, number, number, + full_number, full_number, full_number + ) + + local rows = assert(dbh:fetch_all(sql)) + + dbh:release() + return rows +end