net.server_epoll: Add support for systemd socket activation
Allows creating listening sockets and accepting client connections
before Prosody starts.
This is unlike normal Prosody dynamic resource management, where ports
may added and removed at any time, and the ports defined by the config.
Weird things happen if these are closed (e.g. due to reload) so here we
prevent closing and ensure sockets are reused when opened again.
local initialize_filters = require "prosody.util.filters".initialize;
local time = require "prosody.util.time";
local logger = require "prosody.util.logger";
local function new_session(typ)
local session = {
type = typ .. "_unauthed";
base_type = typ;
since = time.now();
};
return session;
end
local function set_id(session)
local id = session.base_type .. tostring(session):match("%x+$"):lower();
session.id = id;
return session;
end
local function set_logger(session)
local log = logger.init(session.id);
session.log = log;
return session;
end
local function set_conn(session, conn)
session.conn = conn;
session.ip = conn:ip();
return session;
end
local function set_send(session)
local conn = session.conn;
if not conn then
function session.send(data)
session.log("debug", "Discarding data sent to unconnected session: %s", data);
return false;
end
return session;
end
local filter = initialize_filters(session);
local w = conn.write;
session.send = function (t)
if t.name then
t = filter("stanzas/out", t);
end
if t then
t = filter("bytes/out", tostring(t));
if t then
local ret, err = w(conn, t);
if not ret then
session.log("debug", "Error writing to connection: %s", err);
return false, err;
end
end
end
return true;
end
return session;
end
local function set_role(session, role)
session.role = role;
end
return {
new = new_session;
set_id = set_id;
set_logger = set_logger;
set_conn = set_conn;
set_send = set_send;
set_role = set_role;
}