Fix. Properly handle error from memcached when load configs. (#2641)

On my system mod_memcached returns `-ERR SOME ERRORS WERE REPORTED` when
memcached service not available. And sofia.conf.lua does not handle this case
and interpret this response as valid one.
Using `cache` class allows handle such errors. Also this class handle all
escaping operation which makes code more clear.
This commit is contained in:
Alexey Melnichuk
2017-06-08 18:38:28 +03:00
committed by FusionPBX
parent 49ab82e657
commit 76ab1cca6a
4 changed files with 79 additions and 47 deletions

View File

@@ -33,14 +33,21 @@
]]
--get the cache
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
XML_STRING = trim(api:execute("memcache", "get configuration:acl.conf"));
else
XML_STRING = "-ERR NOT FOUND";
end
local cache = require "resources.functions.cache"
local acl_cache_key = "configuration:acl.conf"
XML_STRING, err = cache.get(acl_cache_key)
--set the cache
if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then
if not XML_STRING then
--log cache error
if (debug["cache"]) then
freeswitch.consoleLog("warning", "[xml_handler] " .. acl_cache_key .. " can not be get from memcache: " .. tostring(err) .. "\n");
end
--log cache error
if (debug["cache"]) then
freeswitch.consoleLog("warning", "[xml_handler] configuration:acl.conf can not be get from memcache: " .. tostring(err) .. "\n");
end
--set a default value
if (expire["acl"] == nil) then
@@ -115,7 +122,14 @@
dbh:release();
--set the cache
result = trim(api:execute("memcache", "set configuration:acl.conf '"..XML_STRING:gsub("'", "'").."' "..expire["acl"]));
local ok, err = cache.set(acl_cache_key, XML_STRING, expire["acl"]);
if debug["cache"] then
if ok then
freeswitch.consoleLog("notice", "[xml_handler] " .. acl_cache_key .. " stored in memcache\n");
else
freeswitch.consoleLog("warning", "[xml_handler] " .. acl_cache_key .. " can not be stored in memcache: " .. tostring(err) .. "\n");
end
end
--send the xml to the console
if (debug["xml_string"]) then
@@ -126,14 +140,11 @@
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:acl.conf source: database\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. acl_cache_key .. " source: database\n");
end
else
--replace the &#39 back to a single quote
XML_STRING = XML_STRING:gsub("'", "'");
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:acl.conf source: memcache\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. acl_cache_key .. " source: memcache\n");
end
end --if XML_STRING

View File

@@ -28,15 +28,17 @@
require "resources.functions.format_ringback"
--get the cache
local cache = require "resources.functions.cache"
hostname = trim(api:execute("switchname", ""));
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
XML_STRING = trim(api:execute("memcache", "get configuration:callcenter.conf:" .. hostname));
else
XML_STRING = "-ERR NOT FOUND";
end
local cc_cache_key = "configuration:callcenter.conf:" .. hostname
XML_STRING, err = cache.get(cc_cache_key)
--set the cache
if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then
if not XML_STRING then
--log cache error
if (debug["cache"]) then
freeswitch.consoleLog("warning", "[xml_handler] " .. cc_cache_key .. " can not be get from memcache: " .. tostring(err) .. "\n");
end
--connect to the database
local Database = require "resources.functions.database";
@@ -282,7 +284,14 @@
--freeswitch.consoleLog("notice", "[xml_handler]"..api:execute("eval ${dsn}"));
--set the cache
result = trim(api:execute("memcache", "set configuration:callcenter.conf:" .. hostname .." '"..XML_STRING:gsub("'", "'").."' ".."expire['callcenter.conf']"));
local ok, err = cache.set(cc_cache_key, XML_STRING, expire["callcenter"]);
if debug["cache"] then
if ok then
freeswitch.consoleLog("notice", "[xml_handler] " .. cc_cache_key .. " stored in memcache\n");
else
freeswitch.consoleLog("warning", "[xml_handler] " .. cc_cache_key .. " can not be stored in memcache: " .. tostring(err) .. "\n");
end
end
--send the xml to the console
if (debug["xml_string"]) then
@@ -293,13 +302,11 @@
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:callcenter.conf:" .. hostname .." source: database\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. cc_cache_key .. " source: database\n");
end
else
--replace the &#39 back to a single quote
XML_STRING = XML_STRING:gsub("'", "'");
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:callcenter.conf source: memcache\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. cc_cache_key .. " source: memcache\n");
end
end --if XML_STRING

View File

@@ -30,14 +30,17 @@
local log = require "resources.functions.log".ivr_menu
--get the cache
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
XML_STRING = trim(api:execute("memcache", "get configuration:ivr.conf:" .. ivr_menu_uuid));
else
XML_STRING = "-ERR NOT FOUND";
end
local cache = require "resources.functions.cache"
local ivr_menu_cache_key = "configuration:ivr.conf:" .. ivr_menu_uuid
XML_STRING, err = cache.get(ivr_menu_cache_key)
--set the cache
if (XML_STRING == "-ERR NOT FOUND" or XML_STRING == "-ERR CONNECTION FAILURE") then
if not XML_STRING then
--log cache error
if (debug["cache"]) then
freeswitch.consoleLog("warning", "[xml_handler] " .. ivr_menu_cache_key .. " can not be get from memcache: " .. tostring(err) .. "\n");
end
--required includes
local Database = require "resources.functions.database"
local Settings = require "resources.functions.lazy_settings"
@@ -268,7 +271,14 @@
--freeswitch.consoleLog("notice", "[xml_handler]"..api:execute("eval ${dsn}"));
--set the cache
result = trim(api:execute("memcache", "set configuration:ivr.conf:".. ivr_menu_uuid .." '"..XML_STRING:gsub("'", "'").."' "..expire['ivr']));
local ok, err = cache.set(ivr_menu_uuid, XML_STRING, expire["ivr"]);
if debug["cache"] then
if ok then
freeswitch.consoleLog("notice", "[xml_handler] " .. ivr_menu_uuid .. " stored in memcache\n");
else
freeswitch.consoleLog("warning", "[xml_handler] " .. ivr_menu_uuid .. " can not be stored in memcache: " .. tostring(err) .. "\n");
end
end
--send the xml to the console
if (debug["xml_string"]) then
@@ -279,14 +289,12 @@
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:ivr.conf:" .. ivr_menu_uuid .." source: database\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. ivr_menu_cache_key .. " source: database\n");
end
else
--replace the &#39 back to a single quote
XML_STRING = XML_STRING:gsub("'", "'");
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:ivr.conf" .. ivr_menu_uuid .." source: memcache\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. ivr_menu_cache_key .. " source: memcache\n");
end
end --if XML_STRING

View File

@@ -25,15 +25,17 @@
-- POSSIBILITY OF SUCH DAMAGE.
--get the cache
hostname = trim(api:execute("switchname", ""));
if (trim(api:execute("module_exists", "mod_memcache")) == "true") then
XML_STRING = trim(api:execute("memcache", "get configuration:sofia.conf:" .. hostname));
else
XML_STRING = "-ERR NOT FOUND";
end
local cache = require "resources.functions.cache"
local hostname = trim(api:execute("switchname", ""))
local sofia_cache_key = "configuration:sofia.conf:" .. hostname
XML_STRING, err = cache.get(sofia_cache_key)
--set the cache
if (XML_STRING == "-ERR NOT FOUND") or (XML_STRING == "-ERR CONNECTION FAILURE") then
if not XML_STRING then
--log cache error
if (debug["cache"]) then
freeswitch.consoleLog("warning", "[xml_handler] " .. sofia_cache_key .. " can not be get from memcache: " .. tostring(err) .. "\n");
end
--set a default value
if (expire["sofia"] == nil) then
@@ -296,7 +298,14 @@
dbh:release();
--set the cache
result = trim(api:execute("memcache", "set configuration:sofia.conf:" .. hostname .." '"..XML_STRING:gsub("'", "'").."' "..expire["sofia"]));
local ok, err = cache.set(sofia_cache_key, XML_STRING, expire["sofia"])
if debug["cache"] then
if ok then
freeswitch.consoleLog("notice", "[xml_handler] " .. sofia_cache_key .. " stored in memcache\n");
else
freeswitch.consoleLog("warning", "[xml_handler] " .. sofia_cache_key .. " can not be stored in memcache: " .. tostring(err) .. "\n");
end
end
--send the xml to the console
if (debug["xml_string"]) then
@@ -307,14 +316,11 @@
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:sofia.conf:" .. hostname .." source: database\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. sofia_cache_key .. " source: database\n");
end
else
--replace the &#39 back to a single quote
XML_STRING = XML_STRING:gsub("'", "'");
--send to the console
if (debug["cache"]) then
freeswitch.consoleLog("notice", "[xml_handler] configuration:sofia.conf source: memcache\n");
freeswitch.consoleLog("notice", "[xml_handler] " .. sofia_cache_key .. " source: memcache\n");
end
end --if XML_STRING