diff --git a/debian/control b/debian/control index 42659d1..57d916c 100644 --- a/debian/control +++ b/debian/control @@ -11,6 +11,7 @@ Architecture: amd64 Depends: lua-dbi-mysql, lua-dbi-common, lua-sec, + lua-redis, lua-rex-pcre, lua-bitop, ${misc:Depends}, ${shlibs:Depends} @@ -30,3 +31,5 @@ Description: ngcp modules for the prosody Jabber/XMPP server normalization using the NGCP rewrite rules * mod_sipwise_groups.lua: inserts PBX groups to the user contact list * mod_websocket.lua: XMPP over websocket, (c) 2012 Florian Zeitz + * mod_sipwise_admin_telnet: admin_telnet with inteface selection + * mod_sipwise_redis_sessions: keep server's session info on redis diff --git a/plugins/mod_sipwise_redis_sessions.lua b/plugins/mod_sipwise_redis_sessions.lua new file mode 100644 index 0000000..00fc467 --- /dev/null +++ b/plugins/mod_sipwise_redis_sessions.lua @@ -0,0 +1,59 @@ +-- Prosody IM +-- Copyright (C) 2014 Sipwise GmbH +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + +module:set_global(); + +local redis = require 'redis'; +local redis_config = { + port = 6739, host = "127.0.0.1", + server_id = "0", redis_db = "2" +}; +local redis_client; + +local function test_connection() + if not redis_client then return nil end; + local ok, err = pcall(redis_client.ping, redis_client); + if not ok then + redis_client = nil; + end +end + +local function client_connect() + redis_client = redis.connect(redis_config.host, redis_config.port); + module:log("debug", "connected to redis server %s:%d", + redis_config.host, redis_config.port); + if redis_config.redis_db then + redis_client:select(redis_config.redis_db); + end +end + +local function resource_bind(event) + local session = event.session; + module:log("debug", "resource-bind from %s", session.host); + module:log("debug", "save %s", session.full_jid); + if not test_connection() then client_connect() end + redis_client:set(session.full_jid, redis_config.server_id); +end + +local function resource_unbind(event) + local session, err = event.session, event.error; + module:log("debug", "resource-unbind from %s", session.host); + module:log("debug", "remove %s", session.full_jid); + if not test_connection() then client_connect() end + redis_client:del(session.full_jid); +end + +function module.load() + module:log("debug", "load"); + redis_config = module:get_option("redis_sessions_auth", redis_config); + redis_enable = client_connect(); +end + +function module.add_host(module) + module:hook("resource-bind", resource_bind, 200); + module:hook("resource-unbind", resource_unbind, 200); +end