Change. Store data in cache based on UserID.
Change. Support register with AuthID==UserID==Extension for extension with number-alias. 1. We need only one record in memcache. When we get SIP request we can find record by userid. When we want check AuthID we do `user_data userid@domain attr id` which also search record by userid. 2. We do not need check AuthID if we get record from DB. There already has check. So we can reduce number of request to * if there no record in memcached - one memcache get (returns not found) - database auth - one memcache set * if record in memcache - one memcache get to retrieve XML - one memcache get to check Extension==AuthID
This commit is contained in:
+56
-31
@@ -68,6 +68,9 @@
|
|||||||
end
|
end
|
||||||
|
|
||||||
local from_user = params:getHeader("sip_from_user")
|
local from_user = params:getHeader("sip_from_user")
|
||||||
|
if from_user == '' then
|
||||||
|
from_user = user
|
||||||
|
end
|
||||||
|
|
||||||
-- verify from_user and number alias for this methods
|
-- verify from_user and number alias for this methods
|
||||||
local METHODS = {
|
local METHODS = {
|
||||||
@@ -80,30 +83,50 @@
|
|||||||
user = "";
|
user = "";
|
||||||
end
|
end
|
||||||
|
|
||||||
--get the cache
|
if (from_user == "") or (from_user == nil) then
|
||||||
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
|
from_user = user
|
||||||
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
|
end
|
||||||
|
|
||||||
--prevent processing for invalid user
|
--prevent processing for invalid user
|
||||||
if (user == "*97") then
|
if (user == "*97") or (user == "") then
|
||||||
source = "";
|
source = "";
|
||||||
continue = false;
|
continue = false;
|
||||||
end
|
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
|
--show the params in the console
|
||||||
--if (params:serialize() ~= nil) then
|
--if (params:serialize() ~= nil) then
|
||||||
-- freeswitch.consoleLog("notice", "[xml_handler-directory.lua] Params:\n" .. params:serialize() .. "\n");
|
-- freeswitch.consoleLog("notice", "[xml_handler-directory.lua] Params:\n" .. params:serialize() .. "\n");
|
||||||
@@ -118,8 +141,10 @@
|
|||||||
--freeswitch.consoleLog("notice", "[xml_handler-directory.lua] dialed_extension is " .. dialed_extension .. "\n");
|
--freeswitch.consoleLog("notice", "[xml_handler-directory.lua] dialed_extension is " .. dialed_extension .. "\n");
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local loaded_from_db = false
|
||||||
--build the XML string from the database
|
--build the XML string from the database
|
||||||
if (source == "database") or (load_balancing) then
|
if (source == "database") or (load_balancing) then
|
||||||
|
loaded_from_db = true
|
||||||
--database connection
|
--database connection
|
||||||
if (continue) then
|
if (continue) then
|
||||||
--connect to the database
|
--connect to the database
|
||||||
@@ -211,8 +236,10 @@
|
|||||||
if (debug["sql"]) then
|
if (debug["sql"]) then
|
||||||
freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n");
|
freeswitch.consoleLog("notice", "[xml_handler] SQL: " .. sql .. "\n");
|
||||||
end
|
end
|
||||||
|
continue = false
|
||||||
dbh:query(sql, function(row)
|
dbh:query(sql, function(row)
|
||||||
--general
|
--general
|
||||||
|
continue = true
|
||||||
domain_uuid = row.domain_uuid;
|
domain_uuid = row.domain_uuid;
|
||||||
extension_uuid = row.extension_uuid;
|
extension_uuid = row.extension_uuid;
|
||||||
extension = row.extension;
|
extension = row.extension;
|
||||||
@@ -266,7 +293,7 @@
|
|||||||
|
|
||||||
-- check matching UserID and AuthName
|
-- check matching UserID and AuthName
|
||||||
if sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then
|
if sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then
|
||||||
continue = (sip_from_user == user) and ((sip_from_number == user) or (sip_from_number == from_user))
|
continue = (sip_from_user == user) and ((sip_from_number == from_user) or (from_user == user))
|
||||||
if not continue then
|
if not continue then
|
||||||
XML_STRING = nil;
|
XML_STRING = nil;
|
||||||
return 1;
|
return 1;
|
||||||
@@ -279,8 +306,7 @@
|
|||||||
else
|
else
|
||||||
--set a default dial string
|
--set a default dial string
|
||||||
if (dial_string == null) then
|
if (dial_string == null) then
|
||||||
local username = (#number_alias > 0) and number_alias or extension
|
dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. sip_from_number .. "@" .. domain_name .. ")}";
|
||||||
dial_string = "{sip_invite_domain=" .. domain_name .. ",presence_id=" .. user .. "@" .. domain_name .. "}${sofia_contact(" .. username .. "@" .. domain_name .. ")}";
|
|
||||||
end
|
end
|
||||||
--set the an alternative dial string if the hostnames don't match
|
--set the an alternative dial string if the hostnames don't match
|
||||||
if (load_balancing) then
|
if (load_balancing) then
|
||||||
@@ -514,9 +540,11 @@
|
|||||||
dbh:release();
|
dbh:release();
|
||||||
|
|
||||||
--set the cache
|
--set the cache
|
||||||
if (user and domain_name) then
|
local key = "directory:" .. sip_from_number .. "@" .. domain_name
|
||||||
result = trim(api:execute("memcache", "set directory:" .. user .. "@" .. domain_name .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"]));
|
if debug['cache'] then
|
||||||
|
freeswitch.consoleLog("notice", "[xml_handler-directory][memcache] set key: " .. key .. "\n")
|
||||||
end
|
end
|
||||||
|
result = trim(api:execute("memcache", "set " .. key .. " '"..XML_STRING:gsub("'", "'").."' "..expire["directory"]));
|
||||||
|
|
||||||
--send the xml to the console
|
--send the xml to the console
|
||||||
if (debug["xml_string"]) then
|
if (debug["xml_string"]) then
|
||||||
@@ -532,17 +560,14 @@
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if XML_STRING and sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_) then
|
if XML_STRING and (not loaded_from_db)
|
||||||
--disable registration for number-alias
|
and sip_auth_method and (METHODS[sip_auth_method] or METHODS._ANY_)
|
||||||
if (api:execute("user_data", user .. "@" .. domain_name .." attr id") ~= user) then
|
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;
|
XML_STRING = nil;
|
||||||
end
|
end
|
||||||
--disable registration for foreign number_alias
|
|
||||||
if from_user ~= user then
|
|
||||||
if (api:execute("user_data", from_user .. "@" .. domain_name .." attr id") ~= user) then
|
|
||||||
XML_STRING = nil;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--get the XML string from the cache
|
--get the XML string from the cache
|
||||||
|
|||||||
Reference in New Issue
Block a user