|
From: <abe...@us...> - 2013-01-19 19:09:39
|
Revision: 5911
http://astlinux.svn.sourceforge.net/astlinux/?rev=5911&view=rev
Author: abelbeck
Date: 2013-01-19 19:09:32 +0000 (Sat, 19 Jan 2013)
Log Message:
-----------
prosody, add XMPP_C2S_IDLE_TIMEOUT rc.conf variable
Modified Paths:
--------------
branches/1.0/package/prosody/prosody.init
branches/1.0/package/prosody/prosody.mk
branches/1.0/project/astlinux/target_skeleton/stat/etc/rc.conf
Added Paths:
-----------
branches/1.0/package/prosody/modules/mod_pinger.lua
branches/1.0/package/prosody/util/
branches/1.0/package/prosody/util/watchdog.lua
Added: branches/1.0/package/prosody/modules/mod_pinger.lua
===================================================================
--- branches/1.0/package/prosody/modules/mod_pinger.lua (rev 0)
+++ branches/1.0/package/prosody/modules/mod_pinger.lua 2013-01-19 19:09:32 UTC (rev 5911)
@@ -0,0 +1,46 @@
+local new_watchdog = require "util.watchdog".new;
+local filters = require "util.filters";
+local st = require "util.stanza";
+
+local idle_timeout = module:get_option_number("c2s_idle_timeout", 300);
+local ping_timeout = module:get_option_number("c2s_ping_timeout", 30);
+
+function update_watchdog(data, session)
+ session.idle_watchdog:reset();
+ session.idle_pinged = nil;
+ return data;
+end
+
+function check_session(watchdog)
+ local session = watchdog.session;
+ if not session.idle_pinged then
+ session.idle_pinged = true;
+ session.send(st.iq({ type = "get", from = module.host, id = "idle-check" })
+ :tag("ping", { xmlns = "urn:xmpp:ping" }));
+ return ping_timeout; -- Call us again after ping_timeout
+ else
+ module:log("info", "Client %q silent for too long, closing...", session.full_jid);
+ session:close("connection-timeout");
+ end
+end
+
+
+function watch_session(session)
+ if not session.idle_watchdog
+ and not session.requests then -- Don't watch BOSH connections (BOSH already has timeouts)
+ session.idle_watchdog = new_watchdog(idle_timeout, check_session);
+ session.idle_watchdog.session = session;
+ filters.add_filter(session, "bytes/in", update_watchdog);
+ end
+end
+
+function unwatch_session(session)
+ if session.idle_watchdog then
+ session.idle_watchdog:cancel();
+ session.idle_watchdog = nil;
+ filters.remove_filter(session, "bytes/in", update_watchdog);
+ end
+end
+
+module:hook("resource-bind", function (event) watch_session(event.session); end);
+module:hook("resource-unbind", function (event) unwatch_session(event.session); end);
Modified: branches/1.0/package/prosody/prosody.init
===================================================================
--- branches/1.0/package/prosody/prosody.init 2013-01-18 15:37:38 UTC (rev 5910)
+++ branches/1.0/package/prosody/prosody.init 2013-01-19 19:09:32 UTC (rev 5911)
@@ -26,7 +26,7 @@
gen_xmpp_config()
{
local m MODS ADD_MODS="" modules="" admins="" hostname cert key no_s2s log syslog error c2s_port s2s_port
- local LOG_OK SYSLOG_OK ERROR_LOG IFS
+ local LOG_OK SYSLOG_OK ERROR_LOG IFS c2s_idle_timeout
cert="${XMPP_CERT:-/etc/prosody/certs/server.crt}"
key="${XMPP_KEY:-/etc/prosody/certs/server.key}"
@@ -45,6 +45,13 @@
no_s2s="true"
fi
+ if [ -n "$XMPP_C2S_IDLE_TIMEOUT" ]; then
+ MODS="$MODS pinger"
+ c2s_idle_timeout="$XMPP_C2S_IDLE_TIMEOUT"
+ else
+ c2s_idle_timeout=""
+ fi
+
unset IFS
for m in $XMPP_ENABLE_MODULES; do
if ! mod_in_list "$m" "$MODS"; then
@@ -102,8 +109,10 @@
disallow_s2s = $no_s2s
-c2s_require_encryption = true
+c2s_require_encryption = true${c2s_idle_timeout:+
+c2s_idle_timeout = $c2s_idle_timeout}
+
c2s_ports = { $c2s_port }
s2s_ports = { $s2s_port }
Modified: branches/1.0/package/prosody/prosody.mk
===================================================================
--- branches/1.0/package/prosody/prosody.mk 2013-01-18 15:37:38 UTC (rev 5910)
+++ branches/1.0/package/prosody/prosody.mk 2013-01-19 19:09:32 UTC (rev 5911)
@@ -30,6 +30,8 @@
cp $(TARGET_DIR)/etc/prosody/prosody.cfg.lua $(TARGET_DIR)/stat/etc/prosody/prosody.cfg.lua
rm -rf $(TARGET_DIR)/etc/prosody
$(INSTALL) -m 0644 -D package/prosody/modules/mod_listusers.lua $(TARGET_DIR)/usr/lib/prosody/modules/
+ $(INSTALL) -m 0644 -D package/prosody/modules/mod_pinger.lua $(TARGET_DIR)/usr/lib/prosody/modules/
+ $(INSTALL) -m 0644 -D package/prosody/util/watchdog.lua $(TARGET_DIR)/usr/lib/prosody/util/
$(INSTALL) -m 0755 -D package/prosody/prosody.init $(TARGET_DIR)/etc/init.d/prosody
ln -s /tmp/etc/prosody $(TARGET_DIR)/etc/prosody
ln -sf ../../init.d/prosody $(TARGET_DIR)/etc/runlevels/default/S58prosody
Added: branches/1.0/package/prosody/util/watchdog.lua
===================================================================
--- branches/1.0/package/prosody/util/watchdog.lua (rev 0)
+++ branches/1.0/package/prosody/util/watchdog.lua 2013-01-19 19:09:32 UTC (rev 5911)
@@ -0,0 +1,34 @@
+local timer = require "util.timer";
+local setmetatable = setmetatable;
+local os_time = os.time;
+
+module "watchdog"
+
+local watchdog_methods = {};
+local watchdog_mt = { __index = watchdog_methods };
+
+function new(timeout, callback)
+ local watchdog = setmetatable({ timeout = timeout, last_reset = os_time(), callback = callback }, watchdog_mt);
+ timer.add_task(timeout+1, function (current_time)
+ local last_reset = watchdog.last_reset;
+ if not last_reset then
+ return;
+ end
+ local time_left = (last_reset + timeout) - current_time;
+ if time_left < 0 then
+ return watchdog:callback();
+ end
+ return time_left + 1;
+ end);
+ return watchdog;
+end
+
+function watchdog_methods:reset()
+ self.last_reset = os_time();
+end
+
+function watchdog_methods:cancel()
+ self.last_reset = nil;
+end
+
+return _M;
Modified: branches/1.0/project/astlinux/target_skeleton/stat/etc/rc.conf
===================================================================
--- branches/1.0/project/astlinux/target_skeleton/stat/etc/rc.conf 2013-01-18 15:37:38 UTC (rev 5910)
+++ branches/1.0/project/astlinux/target_skeleton/stat/etc/rc.conf 2013-01-19 19:09:32 UTC (rev 5911)
@@ -449,6 +449,7 @@
#XMPP_ENABLE_MODULES="" # Space separated list of modules to enable, not enabled by default.
#XMPP_DISABLE_MODULES="" # Space separated list of default modules not to enable.
#XMPP_CONFERENCE="" # Enable a multi-user chat room server, ie. conference.host.example.com
+#XMPP_C2S_IDLE_TIMEOUT="300" # Send server-to-client ping every "nnn" seconds and timeout if no reply, disabled if ""
#XMPP_C2S_PORT="5222" # TCP Port for client-to-server connections, defaults to 5222
#XMPP_S2S_PORT="5269" # TCP Port for server-to-server connections, defaults to 5269
#XMPP_LOG="none" # Enable /var/log/prosody/prosody.log: "none", "warn", "info", "debug"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|