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. |