Diff

mod_pinger/mod_pinger.lua @ 2034:256a5e3591db

mod_pinger: Added from /files/
author Matthew Wild <mwild1@gmail.com>
date Tue, 26 Jan 2016 19:15:00 +0000
child 2671:80b6c63cb559
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_pinger/mod_pinger.lua	Tue Jan 26 19:15:00 2016 +0000
@@ -0,0 +1,50 @@
+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;
+               if session.smacks and not session.awaiting_ack then
+                       session.send(st.stanza("r", { xmlns = "urn:xmpp:sm:2" })) -- TODO: hardcoded sm:2
+               else
+                       session.send(st.iq({ type = "get", from = module.host, id = "idle-check" })
+                               :tag("ping", { xmlns = "urn:xmpp:ping" }));
+               end
+		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);