-- Check dependencies
local dependencies = require "util.dependencies";
-if not dependencies.check_dependencies() then
- os.exit(1);
-end
-- Load the config-parsing module
config = require "core.configmanager"
if CFG_CONFIGDIR then
table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
end
+ elseif os.getenv("PROSODY_CONFIG") then -- Passed by prosodyctl
+ table.insert(filenames, os.getenv("PROSODY_CONFIG"));
else
for _, format in ipairs(config.parsers()) do
table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg."..format);
break;
end
end
+ prosody.config_file = filename
local ok, level, err = config.load(filename);
if not ok then
print("\n");
end
end
+function check_dependencies()
+ if not dependencies.check_dependencies() then
+ os.exit(1);
+ end
+end
+
function load_libraries()
-- Load socket framework
server = require "net.server"
end
function sanity_check()
- for host, host_config in pairs(configmanager.getconfig()) do
+ for host, host_config in pairs(config.getconfig()) do
if host ~= "*"
- and host_config.core.enabled ~= false
- and not host_config.core.component_module then
+ and host_config.enabled ~= false
+ and not host_config.component_module then
return;
end
end
-- for neat sandboxing of modules
local _realG = _G;
local _real_require = require;
+ local getfenv = getfenv or function (f)
+ -- FIXME: This is a hack to replace getfenv() in Lua 5.2
+ local name, env = debug.getupvalue(debug.getinfo(f or 1).func, 1);
+ if name == "_ENV" then
+ return env;
+ end
+ end
function require(...)
local curr_env = getfenv(2);
- local curr_env_mt = getmetatable(getfenv(2));
+ local curr_env_mt = getmetatable(curr_env);
local _realG_mt = getmetatable(_realG);
if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
local old_newindex, old_index;
end
function init_global_state()
+ -- COMPAT: These globals are deprecated
bare_sessions = {};
full_sessions = {};
hosts = {};
prosody.full_sessions = full_sessions;
prosody.hosts = hosts;
- local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
- local custom_plugin_paths = config.get("*", "core", "plugin_paths");
+ local data_path = config.get("*", "data_path") or CFG_DATADIR or "data";
+ local custom_plugin_paths = config.get("*", "plugin_paths");
if custom_plugin_paths then
local path_sep = package.config:sub(3,3);
-- path1;path2;path3;defaultpath...
prosody.installed = true;
end
+ if prosody.installed then
+ -- Change working directory to data path.
+ require "lfs".chdir(data_path);
+ end
+
-- Function to reload the config file
function prosody.reload_config()
log("info", "Reloading configuration file");
prosody.events.fire_event("reloading-config");
- local ok, level, err = config.load((rawget(_G, "CFG_CONFIGDIR") or ".").."/prosody.cfg.lua");
+ local ok, level, err = config.load(prosody.config_file);
if not ok then
if level == "parser" then
log("error", "There was an error parsing the configuration file: %s", tostring(err));
prosody.events.fire_event("server-stopping", {reason = reason});
server.setquitting(true);
end
-
- -- Load SSL settings from config, and create a ctx table
- local certmanager = require "core.certmanager";
- local global_ssl_ctx = certmanager.create_context("*", "server");
- prosody.global_ssl_ctx = global_ssl_ctx;
-
end
function read_version()
--- Load and initialise core modules
require "util.import"
require "util.xmppstream"
- require "core.rostermanager"
+ require "core.stanza_router"
+ require "core.statsmanager"
require "core.hostmanager"
require "core.portmanager"
require "core.modulemanager"
require "core.usermanager"
+ require "core.rostermanager"
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[ \t]*([^\n]*)"));
return function() end
function cleanup()
log("info", "Shutdown status: Cleaning up");
prosody.events.fire_event("server-cleanup");
-
- -- Ok, we're quitting I know, but we
- -- need to do some tidying before we go :)
- server.setquitting(false);
-
- log("info", "Shutdown status: Closing all active sessions");
- for hostname, host in pairs(hosts) do
- log("debug", "Shutdown status: Closing client connections for %s", hostname)
- if host.sessions then
- local reason = { condition = "system-shutdown", text = "Server is shutting down" };
- if prosody.shutdown_reason then
- reason.text = reason.text..": "..prosody.shutdown_reason;
- end
- for username, user in pairs(host.sessions) do
- for resource, session in pairs(user.sessions) do
- log("debug", "Closing connection for %s@%s/%s", username, hostname, resource);
- session:close(reason);
- end
- end
- end
-
- log("debug", "Shutdown status: Closing outgoing s2s connections from %s", hostname);
- if host.s2sout then
- for remotehost, session in pairs(host.s2sout) do
- if session.close then
- session:close("system-shutdown");
- else
- log("warn", "Unable to close outgoing s2s session to %s, no session:close()?!", remotehost);
- end
- end
- end
- end
-
- log("info", "Shutdown status: Closing all server connections");
- server.closeall();
-
- server.setquitting(true);
end
-- Are you ready? :)
sanity_check();
sandbox_require();
set_function_metatable();
+check_dependencies();
load_libraries();
init_global_state();
read_version();