From 30b6c8990c33a37647c482d351712d9fb9e65ff1 Mon Sep 17 00:00:00 2001 From: markjcrane Date: Fri, 4 Sep 2015 02:38:17 -0600 Subject: [PATCH] Restore directory.lua - this fixes load balancing as taught in the FusionPBX Advanced Class. --- .../resources/scripts/directory/directory.lua | 117 +++++------------- 1 file changed, 29 insertions(+), 88 deletions(-) diff --git a/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua b/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua index e8f81e07d6..3b33446381 100644 --- a/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua +++ b/resources/install/scripts/app/xml_handler/resources/scripts/directory/directory.lua @@ -13,7 +13,7 @@ -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the distribution. -- --- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, @@ -26,7 +26,7 @@ -- -- Contributor(s): -- Mark J Crane --- Luis Daniel Lucio Quiroz +-- Luis Daniel Lucio Quiroz --set the default continue = true; @@ -62,32 +62,26 @@ --all other directory actions: sip_auth, user_call --except for the action: group_call - -- Make sance only for extensions with number_alias - -- true - you should register with AuthID=Extension and UserID=Number Alias - -- false - you should register with AuthID=UserID=Extension - -- also in this case you need 2 records in memcache for one extension - local DIAL_STRING_BASED_ON_USERID = false - - local sip_auth_method = params:getHeader("sip_auth_method") - if sip_auth_method then - sip_auth_method = sip_auth_method:upper(); - end - - local from_user = params:getHeader("sip_from_user") - - -- verify from_user and number alias for this methods - local METHODS = { - -- _ANY_ = true, - REGISTER = true, - -- INVITE = true, - } - if (user == nil) then user = ""; end - if (from_user == "") or (from_user == nil) then - from_user = user + --get the cache + if (trim(api:execute("module_exists", "mod_memcache")) == "true") then + if (domain_name) then + XML_STRING = trim(api:execute("memcache", "get directory:" .. user .. "@" .. domain_name)); + end + if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then + source = "database"; + continue = true; + else + source = "cache"; + continue = true; + end + else + XML_STRING = ""; + source = "database"; + continue = true; end --prevent processing for invalid user @@ -96,40 +90,6 @@ continue = false; end - -- cleanup - XML_STRING = nil; - - --get the cache - if (continue) then - if (trim(api:execute("module_exists", "mod_memcache")) == "true") then - if (domain_name) then - local key = "directory:" .. (from_user or user) .. "@" .. domain_name - XML_STRING = trim(api:execute("memcache", "get " .. key)); - - if debug['cache'] then - if XML_STRING:sub(1, 4) == '-ERR' then - freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] get key: " .. key .. " fail: " .. XML_STRING .. "\n") - else - freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] get key: " .. key .. " pass!" .. "\n") - end - end - else - XML_STRING = "-ERR NOT FOUND" - end - if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then - source = "database"; - continue = true; - else - source = "cache"; - continue = true; - end - else - XML_STRING = ""; - source = "database"; - continue = true; - end - end - --show the params in the console --if (params:serialize() ~= nil) then -- freeswitch.consoleLog("notice", "[xml_handler-directory.lua] Params:\n" .. params:serialize() .. "\n"); @@ -144,10 +104,8 @@ --freeswitch.consoleLog("notice", "[xml_handler-directory.lua] dialed_extension is " .. dialed_extension .. "\n"); end - local loaded_from_db = false --build the XML string from the database if (source == "database") or (load_balancing) then - loaded_from_db = true --database connection if (continue) then --connect to the database @@ -239,10 +197,8 @@ if (debug["sql"]) then freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n"); end - continue = false dbh:query(sql, function(row) --general - continue = true domain_uuid = row.domain_uuid; extension_uuid = row.extension_uuid; extension = row.extension; @@ -260,7 +216,6 @@ auth_acl = row.auth_acl; --variables sip_from_user = row.extension; - sip_from_number = (#number_alias > 0) and number_alias or row.extension; call_group = row.call_group; call_screen_enabled = row.call_screen_enabled; user_record = row.user_record; @@ -294,22 +249,13 @@ forward_no_answer_destination = row.forward_no_answer_destination; do_not_disturb = row.do_not_disturb; - -- check matching UserID and AuthName - if sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then - continue = (sip_from_user == user) and ((sip_from_number == from_user) or (from_user == user)) - if not continue then - XML_STRING = nil; - return 1; - end - end - --set the dial_string if (string.len(row.dial_string) > 0) then dial_string = row.dial_string; else --set a default dial string if (dial_string == null) then - dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. (DIAL_STRING_BASED_ON_USERID and sip_from_number or sip_from_user) .. "@" .. domain_name .. ")}"; + dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. extension .. "@" .. domain_name .. ")}"; end --set the an alternative dial string if the hostnames don't match if (load_balancing) then @@ -336,8 +282,8 @@ --get the voicemail from the database if (continue) then vm_enabled = "true"; - if number_alias and #number_alias > 0 then - sql = "SELECT * FROM v_voicemails WHERE domain_uuid = '" .. domain_uuid .. "' and voicemail_id = '" .. number_alias .. "' "; + if tonumber(user) == nil then + sql = "SELECT * FROM v_voicemails WHERE domain_uuid = '" .. domain_uuid .. "' and voicemail_id = '" .. number_alias .. "' "; else sql = "SELECT * FROM v_voicemails WHERE domain_uuid = '" .. domain_uuid .. "' and voicemail_id = '" .. user .. "' "; end @@ -426,7 +372,7 @@ table.insert(xml, [[ ]]); table.insert(xml, [[ ]]); table.insert(xml, [[ ]]); - table.insert(xml, [[ ]]); + table.insert(xml, [[ ]]); if (string.len(call_group) > 0) then table.insert(xml, [[ ]]); end @@ -543,11 +489,9 @@ dbh:release(); --set the cache - local key = "directory:" .. (DIAL_STRING_BASED_ON_USERID and sip_from_number or sip_from_user) .. "@" .. domain_name - if debug['cache'] then - freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] set key: " .. key .. "\n") + if (user and domain_name) then + result = trim(api:execute("memcache", "set directory:" .. user .. "@" .. domain_name .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"])); end - result = trim(api:execute("memcache", "set " .. key .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"])); --send the xml to the console if (debug["xml_string"]) then @@ -563,14 +507,11 @@ end end - if XML_STRING and (not loaded_from_db) - and sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) - then - local user_id = api:execute("user_data", from_user .. "@" .. domain_name .." attr id") - --disable registration for number-alias and foreign number_alias - if user_id ~= user then - XML_STRING = nil; - end + --disable registration for number-alias + if (params:getHeader("sip_auth_method") == "REGISTER") then + if (api:execute("user_data", user .. "@" .. domain_name .." attr id") ~= user) then + XML_STRING = nil; + end end --get the XML string from the cache