-- Will be modified by configure script if run --
-CFG_SOURCEDIR=nil;
+CFG_SOURCEDIR=os.getenv("PROSODY_SRCDIR");
CFG_CONFIGDIR=os.getenv("PROSODY_CFGDIR");
-CFG_PLUGINDIR=nil;
+CFG_PLUGINDIR=os.getenv("PROSODY_PLUGINDIR");
CFG_DATADIR=os.getenv("PROSODY_DATADIR");
-- -- -- -- -- -- -- ---- -- -- -- -- -- -- -- --
end
end
-read_config();
-
function load_libraries()
--- Initialize logging
require "core.loggingmanager"
--- Load socket framework
server = require "net.server"
end
-load_libraries();
function init_global_state()
bare_sessions = {};
prosody.arg = _G.arg;
prosody.events = require "util.events".new();
-end
-init_global_state();
+
+ prosody.platform = "unknown";
+ if os.getenv("WINDIR") then
+ prosody.platform = "windows";
+ elseif package.config:sub(1,1) == "/" then
+ prosody.platform = "posix";
+ end
+
+ prosody.installed = nil;
+ if CFG_SOURCEDIR and (prosody.platform == "windows" or CFG_SOURCEDIR:match("^/")) then
+ prosody.installed = true;
+ 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");
+ if not ok then
+ if level == "parser" then
+ log("error", "There was an error parsing the configuration file: %s", tostring(err));
+ elseif level == "file" then
+ log("error", "Couldn't read the config file when trying to reload: %s", tostring(err));
+ end
+ end
+ return ok, (err and tostring(level)..": "..tostring(err)) or nil;
+ end
+ -- Function to reopen logfiles
+ function prosody.reopen_logfiles()
+ log("info", "Re-opening log files");
+ eventmanager.fire_event("reopen-log-files"); -- Handled by appropriate log sinks
+ prosody.events.fire_event("reopen-log-files");
+ end
+
+ -- Function to initiate prosody shutdown
+ function prosody.shutdown(reason)
+ log("info", "Shutting down: %s", reason or "unknown reason");
+ prosody.shutdown_reason = reason;
+ prosody.events.fire_event("server-stopping", {reason = reason});
+ server.setquitting(true);
+ end
+end
function read_version()
-- Try to determine version
prosody.version = "unknown";
end
end
-read_version();
-log("info", "Hello and welcome to Prosody version %s", prosody.version);
function load_secondary_libraries()
--- Load and initialise core modules
require "util.array"
require "util.iterators"
require "util.timer"
-
+ require "util.helpers"
+
-- Commented to protect us from
-- the second kind of people
--[[
require "util.stanza"
require "util.jid"
end
-load_secondary_libraries();
-
function init_data_store()
local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
return username, host, datastore, data;
end);
end
-init_data_store();
--- 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");
- if not ok then
- if level == "parser" then
- log("error", "There was an error parsing the configuration file: %s", tostring(err));
- elseif level == "file" then
- log("error", "Couldn't read the config file when trying to reload: %s", tostring(err));
- end
- end
-end
-
--- Function to reopen logfiles
-function prosody.reopen_logfiles()
- log("info", "Re-opening log files");
- eventmanager.fire_event("reopen-log-files"); -- Handled by appropriate log sinks
- prosody.events.fire_event("reopen-log-files");
-end
-
--- Function to initiate prosody shutdown
-function prosody.shutdown(reason)
- log("info", "Shutting down: %s", reason or "unknown reason");
- prosody.events.fire_event("server-stopping", {reason = reason});
- server.setquitting(true);
-end
-
-function prosody.prepare_to_start()
+function prepare_to_start()
-- Signal to modules that we are ready to start
eventmanager.fire_event("server-starting");
prosody.events.fire_event("server-starting");
local cl = require "net.connlisteners";
-- start listening on sockets
function net_activate_ports(option, listener, default, conntype)
+ if not cl.get(listener) then return; end
local ports = config.get("*", "core", option.."_ports") or default;
if type(ports) == "number" then ports = {ports} end;
end
net_activate_ports("c2s", "xmppclient", {5222}, (global_ssl_ctx and "tls") or "tcp");
- net_activate_ports("s2s", "xmppserver", {5269}, "tcp");
+ net_activate_ports("s2s", "xmppserver", {5269}, (global_ssl_ctx and "tls") or "tcp");
net_activate_ports("component", "xmppcomponent", {}, "tcp");
net_activate_ports("legacy_ssl", "xmppclient", {}, "ssl");
-
- if cl.get("console") then
- cl.start("console", { interface = config.get("*", "core", "console_interface") or "127.0.0.1" })
- end
+ net_activate_ports("console", "console", {5582}, "tcp");
prosody.start_time = os.time();
end
-prosody.prepare_to_start();
-function prosody.init_global_protection()
+function init_global_protection()
-- Catch global accesses --
local locked_globals_mt = { __index = function (t, k) error("Attempt to read a non-existent global '"..k.."'", 2); end, __newindex = function (t, k, v) error("Attempt to set a global: "..tostring(k).." = "..tostring(v), 2); end }
-- And lock now...
prosody.lock_globals();
end
-prosody.init_global_protection();
-
-eventmanager.fire_event("server-started");
-prosody.events.fire_event("server-started");
-
-function prosody.loop()
+function loop()
-- Error handler for errors that make it this far
local function catch_uncaught_error(err)
if err:match("%d*: interrupted!$") then
socket.sleep(0.2);
end
end
-prosody.loop();
-function prosody.cleanup()
+function cleanup()
log("info", "Shutdown status: Cleaning up");
prosody.events.fire_event("server-cleanup");
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("system-shutdown");
+ session:close(reason);
end
end
end
server.setquitting(true);
end
-prosody.cleanup();
+read_config();
+load_libraries();
+init_global_state();
+read_version();
+log("info", "Hello and welcome to Prosody version %s", prosody.version);
+load_secondary_libraries();
+init_data_store();
+prepare_to_start();
+init_global_protection();
+
+eventmanager.fire_event("server-started");
+prosody.events.fire_event("server-started");
+
+loop();
+
+log("info", "Shutting down...");
+cleanup();
eventmanager.fire_event("server-stopped");
prosody.events.fire_event("server-stopped");
-log("info", "Shutdown status: Complete!");
+log("info", "Shutdown complete");
+