# HG changeset patch # User Kim Alvefur # Date 1373585328 -7200 # Node ID 97e238ce37ce122a68a4df442baa9a03a5f9d98d # Parent d988f2db9773e9741d7a9f0f2a59708f5cbd185b mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace diff -r d988f2db9773 -r 97e238ce37ce mod_s2s_keepalive/mod_s2s_keepalive.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_s2s_keepalive/mod_s2s_keepalive.lua Fri Jul 12 01:28:48 2013 +0200 @@ -0,0 +1,42 @@ +local st = require "util.stanza"; + +local keepalive_servers = module:get_option_set("keepalive_servers"); +local keepalive_interval = module:get_option_number("keepalive_interval", 60); + +local host = module.host; + +local function send_pings() + for remote_domain, session in pairs(hosts[host].s2sout) do + if session.type == "s2sout" -- as opposed to _unauthed + and (not(keepalive_servers) or keepalive_servers:contains(remote_domain)) then + session.sends2s(st.iq({ to = remote_domain, type = "get", from = host, id = "keepalive" }) + :tag("ping", { xmlns = "urn:xmpp:ping" }) + ); + -- Note: We don't actually check if this comes back. + end + end + + for session in pairs(prosody.incoming_s2s) do + if session.type == "s2sin" -- as opposed to _unauthed + and (not(keepalive_servers) or keepalive_servers:contains(session.from_host)) then + session.conn:send " "; + -- If the connection is dead, this should make it time out. + end + end + return keepalive_interval; +end + +if module.add_timer then -- 0.9 + module:add_timer(keepalive_interval, send_pings); +else -- 0.8 + local timer = require "util.timer"; + local unloaded; + timer.add_task(keepalive_interval, function() + if not unloaded then + return send_pings() + end + end); + function module.unload() + unloaded = true + end +end