|
|
|
|
@ -12,7 +12,8 @@ local array = require "util.array";
|
|
|
|
|
local redis = require 'redis';
|
|
|
|
|
local redis_config = {
|
|
|
|
|
port = 6739, host = "127.0.0.1",
|
|
|
|
|
server_id = "0", redis_db = "2"
|
|
|
|
|
server_id = "0", redis_db = "2",
|
|
|
|
|
clean_local_sessions = true,
|
|
|
|
|
};
|
|
|
|
|
local redis_client;
|
|
|
|
|
|
|
|
|
|
@ -48,17 +49,23 @@ local function resource_bind(event)
|
|
|
|
|
redis_client:sadd(bare_jid, redis_config.server_id..":"..resource);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function resource_unbind(event)
|
|
|
|
|
local session, _ = event.session, event.error;
|
|
|
|
|
local node, domain, resource = jid.split(session.full_jid);
|
|
|
|
|
local full_jid, bare_jid = session.full_jid, node.."@"..domain;
|
|
|
|
|
local function remove_resource(full_jid)
|
|
|
|
|
local node, domain, resource = jid.split(full_jid);
|
|
|
|
|
local bare_jid = node.."@"..domain;
|
|
|
|
|
|
|
|
|
|
module:log("debug", "resource-unbind from %s", session.host);
|
|
|
|
|
module:log("debug", "remove [%s]=%s", full_jid, redis_config.server_id);
|
|
|
|
|
if not test_connection() then client_connect() end
|
|
|
|
|
redis_client:del(full_jid);
|
|
|
|
|
module:log("debug", "remove [%s]=>%s:%s", bare_jid, redis_config.server_id, resource);
|
|
|
|
|
module:log("debug", "remove [%s]=%s", full_jid, redis_config.server_id);
|
|
|
|
|
redis_client:srem(bare_jid, redis_config.server_id..":"..resource);
|
|
|
|
|
module:log("debug", "remove [%s]=>%s:%s", bare_jid,
|
|
|
|
|
redis_config.server_id, resource);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function resource_unbind(event)
|
|
|
|
|
local session, _ = event.session, event.error;
|
|
|
|
|
|
|
|
|
|
module:log("debug", "resource-unbind from %s", session.host);
|
|
|
|
|
remove_resource(session.full_jid);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function split_key(key)
|
|
|
|
|
@ -66,6 +73,23 @@ local function split_key(key)
|
|
|
|
|
return t[1], t[2];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function clean_local_sessions(host)
|
|
|
|
|
if not test_connection() then client_connect() end
|
|
|
|
|
local l = redis_client:keys('*@'..host);
|
|
|
|
|
for _, bare_jid in ipairs(l) do
|
|
|
|
|
local resources = redis_client:smembers(bare_jid);
|
|
|
|
|
module:log("debug", "clean previous sessions for %s on %s",
|
|
|
|
|
bare_jid, redis_config.server_id);
|
|
|
|
|
for _, resource in ipairs(resources) do
|
|
|
|
|
local server, old_resource = split_key(resource);
|
|
|
|
|
if server == redis_config.server_id then
|
|
|
|
|
module:log("debug", "remove old resource %s", old_resource);
|
|
|
|
|
remove_resource(bare_jid..'/'..old_resource);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function redis_sessions.get_hosts(j)
|
|
|
|
|
local node, domain = jid.split(j);
|
|
|
|
|
local bare_jid = node.."@"..domain;
|
|
|
|
|
@ -105,7 +129,12 @@ function module.load()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function module.add_host(module)
|
|
|
|
|
module:hook("resource-bind", resource_bind, 200);
|
|
|
|
|
module:hook("resource-unbind", resource_unbind, 200);
|
|
|
|
|
module:log("debug", "hooked at %s", module:get_host());
|
|
|
|
|
local host = module:get_host();
|
|
|
|
|
|
|
|
|
|
if module:get_host_type() ~= "component" then
|
|
|
|
|
module:hook("resource-bind", resource_bind, 200);
|
|
|
|
|
module:hook("resource-unbind", resource_unbind, 200);
|
|
|
|
|
clean_local_sessions(host);
|
|
|
|
|
module:log("debug", "hooked at %s", host);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|