mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
135 lines
3.8 KiB
Lua
135 lines
3.8 KiB
Lua
-- Prosody IM
|
|
-- Copyright (C) 2008-2010 Matthew Wild
|
|
-- Copyright (C) 2008-2010 Waqas Hussain
|
|
--
|
|
-- This project is MIT/X11 licensed. Please see the
|
|
-- COPYING file in the source package for more information.
|
|
--
|
|
|
|
local function log(level, format, ...)
|
|
print("net.server", level, format:format(...));
|
|
end
|
|
|
|
local default_backend = "select";
|
|
local server_type = default_backend;
|
|
|
|
if (prosody and prosody.config_loaded) then
|
|
default_backend = "epoll";
|
|
log = require"prosody.util.logger".init("net.server");
|
|
server_type = require"prosody.core.configmanager".get("*", "network_backend") or default_backend;
|
|
|
|
if require"prosody.core.configmanager".get("*", "use_libevent") then
|
|
server_type = "event";
|
|
end
|
|
elseif pcall(require, "prosody.util.poll") then
|
|
server_type = "epoll";
|
|
end
|
|
|
|
if server_type == "event" then
|
|
if not pcall(require, "luaevent.core") then
|
|
log("error", "libevent not found, falling back to %s", default_backend);
|
|
server_type = default_backend;
|
|
end
|
|
end
|
|
|
|
local server;
|
|
local set_config;
|
|
if server_type == "event" then
|
|
server = require "prosody.net.server_event";
|
|
|
|
local defaults = {};
|
|
for k,v in pairs(server.cfg) do
|
|
defaults[k] = v;
|
|
end
|
|
function set_config(settings)
|
|
local event_settings = {
|
|
ACCEPT_DELAY = settings.accept_retry_interval;
|
|
ACCEPT_QUEUE = settings.tcp_backlog;
|
|
CLEAR_DELAY = settings.event_clear_interval;
|
|
CONNECT_TIMEOUT = settings.connect_timeout;
|
|
DEBUG = settings.debug;
|
|
HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
|
|
MAX_CONNECTIONS = settings.max_connections;
|
|
MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
|
|
MAX_READ_LENGTH = settings.max_receive_buffer_size;
|
|
MAX_SEND_LENGTH = settings.max_send_buffer_size;
|
|
READ_TIMEOUT = settings.read_timeout;
|
|
WRITE_TIMEOUT = settings.send_timeout;
|
|
};
|
|
|
|
for k,default in pairs(defaults) do
|
|
server.cfg[k] = event_settings[k] or default;
|
|
end
|
|
end
|
|
elseif server_type == "select" then
|
|
-- TODO Remove completely.
|
|
log("warn", "select is deprecated, the new default is epoll. For more info see https://prosody.im/doc/network_backend");
|
|
server = require "prosody.net.server_select";
|
|
|
|
local defaults = {};
|
|
for k,v in pairs(server.getsettings()) do
|
|
defaults[k] = v;
|
|
end
|
|
function set_config(settings)
|
|
local select_settings = {};
|
|
for k,default in pairs(defaults) do
|
|
select_settings[k] = settings[k] or default;
|
|
end
|
|
server.changesettings(select_settings);
|
|
end
|
|
else
|
|
server = require("prosody.net.server_"..server_type);
|
|
set_config = server.set_config;
|
|
if not server.get_backend then
|
|
function server.get_backend()
|
|
return server_type;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- If server.hook_signal exists, replace signal.signal()
|
|
local has_signal, signal = pcall(require, "prosody.util.signal");
|
|
if has_signal then
|
|
if server.hook_signal then
|
|
function signal.signal(signal_id, handler)
|
|
if type(signal_id) == "string" then
|
|
signal_id = signal[signal_id:upper()];
|
|
end
|
|
if type(signal_id) ~= "number" then
|
|
return false, "invalid-signal";
|
|
end
|
|
return server.hook_signal(signal_id, handler);
|
|
end
|
|
else
|
|
server.hook_signal = signal.signal;
|
|
end
|
|
else
|
|
if not server.hook_signal then
|
|
server.hook_signal = function()
|
|
return false, "signal hooking not supported"
|
|
end
|
|
end
|
|
end
|
|
|
|
if prosody and set_config then
|
|
local config_get = require "prosody.core.configmanager".get;
|
|
local function load_config()
|
|
local settings = config_get("*", "network_settings") or {};
|
|
return set_config(settings);
|
|
end
|
|
load_config();
|
|
prosody.events.add_handler("config-reloaded", load_config);
|
|
end
|
|
|
|
if prosody and server.tls_builder then
|
|
local tls_builder = server.tls_builder;
|
|
-- resolving the basedir here avoids util.sslconfig depending on
|
|
-- prosody.paths.config
|
|
function server.tls_builder()
|
|
return tls_builder(prosody.paths.config or "")
|
|
end
|
|
end
|
|
|
|
-- require "prosody.net.server" shall now forever return this,
|
|
-- ie. server_select or server_event as chosen above.
|
|
return server;
|