aboutsummaryrefslogtreecommitdiffstats
path: root/prosody
diff options
context:
space:
mode:
Diffstat (limited to 'prosody')
-rwxr-xr-xprosody119
1 files changed, 72 insertions, 47 deletions
diff --git a/prosody b/prosody
index 446dbfb7..635ec5f3 100755
--- a/prosody
+++ b/prosody
@@ -2,7 +2,7 @@
-- 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.
--
@@ -11,17 +11,17 @@
-- Will be modified by configure script if run --
-CFG_SOURCEDIR=os.getenv("PROSODY_SRCDIR");
-CFG_CONFIGDIR=os.getenv("PROSODY_CFGDIR");
-CFG_PLUGINDIR=os.getenv("PROSODY_PLUGINDIR");
-CFG_DATADIR=os.getenv("PROSODY_DATADIR");
+CFG_SOURCEDIR=CFG_SOURCEDIR or os.getenv("PROSODY_SRCDIR");
+CFG_CONFIGDIR=CFG_CONFIGDIR or os.getenv("PROSODY_CFGDIR");
+CFG_PLUGINDIR=CFG_PLUGINDIR or os.getenv("PROSODY_PLUGINDIR");
+CFG_DATADIR=CFG_DATADIR or os.getenv("PROSODY_DATADIR");
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
local function is_relative(path)
local path_sep = package.config:sub(1,1);
- return ((path_sep == "/" and path:sub(1,1) ~= "/")
- or (path_sep == "\\" and (path:sub(1,1) ~= "/" and path:sub(2,3) ~= ":\\")))
+ return ((path_sep == "/" and path:sub(1,1) ~= "/")
+ or (path_sep == "\\" and (path:sub(1,1) ~= "/" and path:sub(2,3) ~= ":\\")))
end
-- Tell Lua where to find our libraries
@@ -43,6 +43,12 @@ if CFG_DATADIR then
end
end
+if #arg > 0 and arg[1] ~= "--config" then
+ print("Unknown command-line option: "..tostring(arg[1]));
+ print("Perhaps you meant to use prosodyctl instead?");
+ return 1;
+end
+
-- Global 'prosody' object
local prosody = { events = require "util.events".new(); };
_G.prosody = prosody;
@@ -54,13 +60,13 @@ local dependencies = require "util.dependencies";
config = require "core.configmanager"
-- -- -- --
--- Define the functions we call during startup, the
+-- Define the functions we call during startup, the
-- actual startup happens right at the end, where these
-- functions get called
function read_config()
local filenames = {};
-
+
local filename;
if arg[1] == "--config" and arg[2] then
table.insert(filenames, arg[2]);
@@ -89,7 +95,7 @@ function read_config()
print("\n");
print("**************************");
if level == "parser" then
- print("A problem occured while reading the config file "..(CFG_CONFIGDIR or ".").."/prosody.cfg.lua"..":");
+ print("A problem occured while reading the config file "..filename);
print("");
local err_line, err_message = tostring(err):match("%[string .-%]:(%d*): (.*)");
if err:match("chunk has too many syntax levels$") then
@@ -101,7 +107,7 @@ function read_config()
print("");
elseif level == "file" then
print("Prosody was unable to find the configuration file.");
- print("We looked for: "..(CFG_CONFIGDIR or ".").."/prosody.cfg.lua");
+ print("We looked for: "..filename);
print("A sample config file is included in the Prosody download called prosody.cfg.lua.dist");
print("Copy or rename it to prosody.cfg.lua and edit as necessary.");
end
@@ -119,10 +125,17 @@ function check_dependencies()
end
end
+-- luacheck: globals socket server
+
function load_libraries()
-- Load socket framework
+ -- luacheck: ignore 111/server 111/socket
+ socket = require "socket";
server = require "net.server"
-end
+end
+
+-- The global log() gets defined by loggingmanager
+-- luacheck: ignore 113/log
function init_logging()
-- Initialize logging
@@ -149,11 +162,15 @@ end
function sandbox_require()
-- Replace require() with one that doesn't pollute _G, required
-- for neat sandboxing of modules
+ -- luacheck: ignore 113/getfenv 111/require
local _realG = _G;
local _real_require = require;
- if not getfenv then
+ local getfenv = getfenv or function (f)
-- FIXME: This is a hack to replace getfenv() in Lua 5.2
- function getfenv(f) return debug.getupvalue(debug.getinfo(f or 1).func, 1); end
+ 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);
@@ -162,7 +179,7 @@ function sandbox_require()
if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
local old_newindex, old_index;
old_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env;
- old_index, _realG_mt.__index = _realG_mt.__index, function (_G, k)
+ old_index, _realG_mt.__index = _realG_mt.__index, function (_G, k) -- luacheck: ignore 212/_G
return rawget(curr_env, k);
end;
local ret = _real_require(...);
@@ -202,15 +219,16 @@ function set_function_metatable()
end
function init_global_state()
+ prosody.bare_sessions = {};
+ prosody.full_sessions = {};
+ prosody.hosts = {};
+
-- COMPAT: These globals are deprecated
- bare_sessions = {};
- full_sessions = {};
- hosts = {};
-
- prosody.bare_sessions = bare_sessions;
- prosody.full_sessions = full_sessions;
- prosody.hosts = hosts;
-
+ -- luacheck: ignore 111/bare_sessions 111/full_sessions 111/hosts
+ bare_sessions = prosody.bare_sessions;
+ full_sessions = prosody.full_sessions;
+ hosts = prosody.hosts;
+
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
@@ -218,7 +236,7 @@ function init_global_state()
-- 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 ".",
+ prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR or ".",
plugins = CFG_PLUGINDIR or "plugins", data = data_path };
prosody.arg = _G.arg;
@@ -229,12 +247,12 @@ function init_global_state()
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
-
+
if prosody.installed then
-- Change working directory to data path.
require "lfs".chdir(data_path);
@@ -262,18 +280,16 @@ function init_global_state()
end
-- Function to initiate prosody shutdown
- function prosody.shutdown(reason)
+ function prosody.shutdown(reason, code)
log("info", "Shutting down: %s", reason or "unknown reason");
prosody.shutdown_reason = reason;
- prosody.events.fire_event("server-stopping", {reason = reason});
+ prosody.shutdown_code = code;
+ prosody.events.fire_event("server-stopping", {
+ reason = reason;
+ code = code;
+ });
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()
@@ -295,6 +311,7 @@ function load_secondary_libraries()
require "util.import"
require "util.xmppstream"
require "core.stanza_router"
+ require "core.statsmanager"
require "core.hostmanager"
require "core.portmanager"
require "core.modulemanager"
@@ -306,19 +323,23 @@ function load_secondary_libraries()
return function() end
end});
- require "net.http"
-
+ local http = require "net.http"
+ local config_ssl = config.get("*", "ssl") or {}
+ local https_client = config.get("*", "client_https_ssl")
+ http.default.options.sslctx = require "core.certmanager".create_context("client_https port 0", "client",
+ { capath = config_ssl.capath, cafile = config_ssl.cafile, verify = "peer", }, https_client);
+
require "util.array"
require "util.datetime"
require "util.iterators"
require "util.timer"
require "util.helpers"
-
+
pcall(require, "util.signal") -- Not on Windows
-
- -- Commented to protect us from
+
+ -- Commented to protect us from
-- the second kind of people
- --[[
+ --[[
pcall(require, "remdebug.engine");
if remdebug then remdebug.engine.start() end
]]
@@ -336,19 +357,20 @@ function prepare_to_start()
-- Signal to modules that we are ready to start
prosody.events.fire_event("server-starting");
prosody.start_time = os.time();
-end
+end
function init_global_protection()
-- Catch global accesses
+ -- luacheck: ignore 212/t
local locked_globals_mt = {
__index = function (t, k) log("warn", "%s", debug.traceback("Attempt to read a non-existent global '"..tostring(k).."'", 2)); end;
__newindex = function (t, k, v) error("Attempt to set a global: "..tostring(k).." = "..tostring(v), 2); end;
};
-
+
function prosody.unlock_globals()
setmetatable(_G, nil);
end
-
+
function prosody.lock_globals()
setmetatable(_G, locked_globals_mt);
end
@@ -363,18 +385,20 @@ function loop()
if type(err) == "string" and err:match("interrupted!$") then
return "quitting";
end
-
+
log("error", "Top-level error, please report:\n%s", tostring(err));
local traceback = debug.traceback("", 2);
if traceback then
log("error", "%s", traceback);
end
-
+
prosody.events.fire_event("very-bad-error", {error = err, traceback = traceback});
end
-
+
+ local sleep = require"socket".sleep;
+
while select(2, xpcall(server.loop, catch_uncaught_error)) ~= "quitting" do
- socket.sleep(0.2);
+ sleep(0.2);
end
end
@@ -411,3 +435,4 @@ cleanup();
prosody.events.fire_event("server-stopped");
log("info", "Shutdown complete");
+os.exit(prosody.shutdown_code)