Mercurial > prosody-modules
changeset 2352:3296a09b4e57
misc/systemd: Experimental files for enabling socket activation
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 08 Nov 2016 00:09:56 +0100 |
parents | f8ecb4b248b0 |
children | ea97a87c3828 |
files | misc/systemd/prosody-c2s.socket misc/systemd/prosody-s2s.socket misc/systemd/socket-activation.lua |
diffstat | 3 files changed, 60 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/systemd/prosody-c2s.socket Tue Nov 08 00:09:56 2016 +0100 @@ -0,0 +1,9 @@ +[Install] +WantedBy=sockets.target + +[Socket] +ListenStream=0.0.0.0:5222 +ListenStream=5222 +BindIPv6Only=ipv6-only +Accept=false +Service=prosody.service
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/systemd/prosody-s2s.socket Tue Nov 08 00:09:56 2016 +0100 @@ -0,0 +1,9 @@ +[Install] +WantedBy=sockets.target + +[Socket] +ListenStream=0.0.0.0:5269 +ListenStream=5269 +BindIPv6Only=ipv6-only +Accept=false +Service=prosody.service
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/systemd/socket-activation.lua Tue Nov 08 00:09:56 2016 +0100 @@ -0,0 +1,42 @@ +-- Monkeypatch to support socket activation +-- +-- Requires LuaSocket after "agnostic" changes merged +-- +-- To enable: +-- RunScript "socket-activation.lua" + +local socket = require"socket"; +local tcp_serv_mt = debug.getregistry()["tcp{server}"]; +local socket_bind = socket.bind; + +local SD_LISTEN_FDS_START = 3; + +local fds = tonumber(os.getenv"LISTEN_FDS") or 0; + +if fds < SD_LISTEN_FDS_START then return; end + +local servs = {}; + +for i = 1, fds do + local serv = socket.tcp(); + if serv:getfd() >= 0 then + return; -- This won't work, we will leak the old FD + end + debug.setmetatable(serv, tcp_serv_mt); + serv:setfd(SD_LISTEN_FDS_START + i - 1); + local ip, port = serv:getsockname(); + servs [ ip .. ":" .. port ] = serv; +end + +function socket.bind( ip, port, backlog ) + local sock = servs [ ip .. ":" .. port ]; + if sock then + servs [ ip .. ":" .. port ] = nil; + return sock; + end + if next(servs) == nil then + -- my work here is done + socket.bind = socket_bind; + end + return socket_bind( ip, port, backlog ); +end