dependencies.log_warnings();
end
+function sanity_check()
+ for host, host_config in pairs(configmanager.getconfig()) do
+ if host ~= "*"
+ and host_config.core.enabled ~= false
+ and not host_config.core.component_module then
+ return;
+ end
+ end
+ log("error", "No enabled VirtualHost entries found in the config file.");
+ log("error", "At least one active host is required for Prosody to function. Exiting...");
+ os.exit(1);
+end
+
function sandbox_require()
-- Replace require() with one that doesn't pollute _G, required
-- for neat sandboxing of modules
prosody.hosts = hosts;
local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
- CFG_PLUGINDIR = config.get("*", "core", "plugin_path") or CFG_PLUGINDIR or "plugins"
- prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR,
- plugins = CFG_PLUGINDIR, data = data_path };
+ local custom_plugin_paths = config.get("*", "core", "plugin_paths");
+ if custom_plugin_paths then
+ local path_sep = package.config:sub(3,3);
+ -- path1;path2;path3;defaultpath...
+ CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins");
+ end
+ prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR or ".",
+ plugins = CFG_PLUGINDIR or "plugins", data = data_path };
prosody.arg = _G.arg;
if type(port) ~= "number" then
log("error", "Non-numeric "..ports_option..": "..tostring(port));
else
- local ok, err = cl.start(listener, {
+ local ok, errors = cl.start(listener, {
ssl = conntype == "ssl" and global_ssl_ctx,
port = port,
interface = (option and config.get("*", "core", option.."_interface"))
type = conntype
});
if not ok then
- local friendly_message = err;
- if err:match(" in use") then
- if port == 5222 or port == 5223 or port == 5269 then
- friendly_message = "check that Prosody or another XMPP server is "
- .."not already running and using this port";
- elseif port == 80 or port == 81 then
- friendly_message = "check that a HTTP server is not already using "
- .."this port";
- elseif port == 5280 then
- friendly_message = "check that Prosody or a BOSH connection manager "
- .."is not already running";
- else
- friendly_message = "this port is in use by another application";
- end
- elseif err:match("permission") then
- friendly_message = "Prosody does not have sufficient privileges to use this port";
- elseif err == "no ssl context" then
- if not config.get("*", "core", "ssl") then
- friendly_message = "there is no 'ssl' config under Host \"*\" which is "
- .."require for legacy SSL ports";
- else
- friendly_message = "initializing SSL support failed, see previous log entries";
+ for addr, err in pairs(errors) do
+ local friendly_message = err;
+ if err:match(" in use") then
+ if port == 5222 or port == 5223 or port == 5269 then
+ friendly_message = "check that Prosody or another XMPP server is "
+ .."not already running and using this port";
+ elseif port == 80 or port == 81 then
+ friendly_message = "check that a HTTP server is not already using "
+ .."this port";
+ elseif port == 5280 then
+ friendly_message = "check that Prosody or a BOSH connection manager "
+ .."is not already running";
+ else
+ friendly_message = "this port is in use by another application";
+ end
+ elseif err:match("permission") then
+ friendly_message = "Prosody does not have sufficient privileges to use this port";
+ elseif err == "no ssl context" then
+ if not config.get("*", "core", "ssl") then
+ friendly_message = "there is no 'ssl' config under Host \"*\" which is "
+ .."require for legacy SSL ports";
+ else
+ friendly_message = "initializing SSL support failed, see previous log entries";
+ end
end
+ log("error", "Failed to open server port %d on %s, %s", port, addr, friendly_message);
end
- log("error", "Failed to open server port %d, %s", port, friendly_message);
end
end
end
require "core.sessionmanager"
require "core.stanza_router"
package.loaded['core.componentmanager'] = setmetatable({},{__index=function()
- log("warn", "componentmanager is deprecated: %s", debug.traceback():match("\n[^\n]*\n[\s\t]*([^\n]*)"));
+ log("warn", "componentmanager is deprecated: %s", debug.traceback():match("\n[^\n]*\n[ \t]*([^\n]*)"));
return function() end
end});
]]
require "net.connlisteners";
+ require "net.httpserver";
require "util.stanza"
require "util.jid"
-- previous steps to have already been performed
read_config();
init_logging();
+sanity_check();
sandbox_require();
set_function_metatable();
load_libraries();