changeset 1089:4057f176be7b

mod_s2soutinjection: Initial commit, variant of mod_srvinjection using 0.9+ APIs
author Kim Alvefur <zash@zash.se>
date Fri, 28 Jun 2013 03:20:57 +0200
parents 6f8e7f65f704
children 1aa48916eb8b
files mod_s2soutinjection/mod_s2soutinjection.lua
diffstat 1 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_s2soutinjection/mod_s2soutinjection.lua	Fri Jun 28 03:20:57 2013 +0200
@@ -0,0 +1,48 @@
+local st = require"util.stanza";
+local new_ip = require"util.ip".new_ip;
+local new_outgoing = require"core.s2smanager".new_outgoing;
+local bounce_sendq = module:depends"s2s".route_to_new_session.bounce_sendq;
+local s2sout = module:depends"s2s".route_to_new_session.s2sout;
+
+local injected = module:get_option("s2s_connect_overrides");
+
+local function isip(addr)
+	return not not (addr and addr:match("^%d+%.%d+%.%d+%.%d+$") or addr:match("^[%x:]*:[%x:]-:[%x:]*$"));
+end
+
+module:hook("route/remote", function(event)
+	local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza;
+	local inject = injected and injected[to_host];
+	if not inject then return end
+	log("debug", "opening a new outgoing connection for this stanza");
+	local host_session = new_outgoing(from_host, to_host);
+
+	-- Store in buffer
+	host_session.bounce_sendq = bounce_sendq;
+	host_session.sendq = { {tostring(stanza), stanza.attr.type ~= "error" and stanza.attr.type ~= "result" and st.reply(stanza)} };
+	log("debug", "stanza [%s] queued until connection complete", tostring(stanza.name));
+
+	local ip_hosts, srv_hosts = {}, {};
+	host_session.srv_hosts = srv_hosts;
+	host_session.srv_choice = 0;
+
+	if type(inject) == "string" then inject = { inject } end
+
+	for _, item in ipairs(inject) do
+		local host, port = item[1] or item, tonumber(item[2]) or 5269;
+		if isip(host) then
+			ip_hosts[#ip_hosts+1] = { ip = new_ip(host), port = port }
+		else
+			srv_hosts[#srv_hosts+1] = { target = host, port = port }
+		end
+	end
+	if #ip_hosts > 0 then
+		host_session.ip_hosts = ip_hosts;
+		host_session.ip_choice = 0; -- Incremented by try_next_ip
+		s2sout.try_next_ip(host_session);
+		return true;
+	end
+
+	return s2sout.try_connect(host_session, host_session.srv_hosts[1].target, host_session.srv_hosts[1].port);
+end, -2);
+