X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;ds=sidebyside;f=prosody;h=df7ce9fb9154da83622aaee785d8889a068ccc4c;hb=f0f1a8a8826b9bf8e77f32d155ef14c5f158d69e;hp=9ed1269c246cda843a4d016fbc24022b6d11a8cf;hpb=4eac757d0be13462861af1ab60ac7eb138efeee6;p=prosody.git diff --git a/prosody b/prosody index 9ed1269c..df7ce9fb 100755 --- a/prosody +++ b/prosody @@ -32,29 +32,6 @@ if CFG_DATADIR then end end --- Required to be able to find packages installed with luarocks -pcall(require, "luarocks.require"); - --- Replace require() with one that doesn't pollute _G, required --- for neat sandboxing of modules -do - local _realG = _G; - local _real_require = require; - function require(...) - local curr_env = getfenv(2); - local curr_env_mt = getmetatable(getfenv(2)); - 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_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env; - local ret = _real_require(...); - _realG_mt.__newindex = old_newindex; - return ret; - end - return _real_require(...); - end -end - -- Load the config-parsing module config = require "core.configmanager" @@ -64,8 +41,6 @@ config = require "core.configmanager" -- functions get called function read_config() - -- TODO: Check for other formats when we add support for them - -- Use lfs? Make a new conf/ dir? local filenames = {}; local filename; @@ -75,7 +50,9 @@ function read_config() table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]); end else - table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg.lua"); + for _, format in ipairs(config.parsers()) do + table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg."..format); + end end for _,_filename in ipairs(filenames) do filename = _filename; @@ -110,16 +87,42 @@ function read_config() end function load_libraries() - -- Initialize logging - require "core.loggingmanager" - - -- Check runtime dependencies - require "util.dependencies" - -- Load socket framework server = require "net.server" end +function init_logging() + -- Initialize logging + require "core.loggingmanager" +end + +function check_dependencies() + -- Check runtime dependencies + if not require "util.dependencies".check_dependencies() then + os.exit(1); + end +end + +function sandbox_require() + -- Replace require() with one that doesn't pollute _G, required + -- for neat sandboxing of modules + local _realG = _G; + local _real_require = require; + function require(...) + local curr_env = getfenv(2); + local curr_env_mt = getmetatable(getfenv(2)); + 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_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env; + local ret = _real_require(...); + _realG_mt.__newindex = old_newindex; + return ret; + end + return _real_require(...); + end +end + function init_global_state() bare_sessions = {}; full_sessions = {}; @@ -193,25 +196,50 @@ function init_global_state() local cl = require "net.connlisteners"; function prosody.net_activate_ports(option, listener, default, conntype) conntype = conntype or (global_ssl_ctx and "tls") or "tcp"; + local ports_option = option and option.."_ports" or "ports"; if not cl.get(listener) then return; end - local ports = config.get("*", "core", option.."_ports") or default; + local ports = config.get("*", "core", ports_option) or default; if type(ports) == "number" then ports = {ports} end; if type(ports) ~= "table" then - log("error", "core."..option.." is not a table"); + log("error", "core."..ports_option.." is not a table"); else for _, port in ipairs(ports) do + port = tonumber(port); if type(port) ~= "number" then - log("error", "Non-numeric "..option.."_ports: "..tostring(port)); + log("error", "Non-numeric "..ports_option..": "..tostring(port)); else - cl.start(listener, { - ssl = conntype ~= "tcp" and global_ssl_ctx, + local ok, err = cl.start(listener, { + ssl = conntype == "ssl" and global_ssl_ctx, port = port, - interface = config.get("*", "core", option.."_interface") - or cl.get(listener).default_interface + interface = (option and config.get("*", "core", option.."_interface")) + or cl.get(listener).default_interface or config.get("*", "core", "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 + friendly_message = "there is no 'ssl' config under Host \"*\" which is " + .."require for legacy SSL ports"; + end + log("error", "Failed to open server port %d, %s", port, friendly_message); + end end end end @@ -285,10 +313,17 @@ function prepare_to_start() prosody.events.fire_event("server-starting"); -- start listening on sockets - prosody.net_activate_ports("c2s", "xmppclient", {5222}); - prosody.net_activate_ports("s2s", "xmppserver", {5269}); - prosody.net_activate_ports("component", "xmppcomponent", {}, "tcp"); - prosody.net_activate_ports("legacy_ssl", "xmppclient", {}, "ssl"); + if config.get("*", "core", "ports") then + prosody.net_activate_ports(nil, "multiplex", {5222, 5269}); + if config.get("*", "core", "ssl_ports") then + prosody.net_activate_ports("ssl", "multiplex", {5223}, "ssl"); + end + else + prosody.net_activate_ports("c2s", "xmppclient", {5222}); + prosody.net_activate_ports("s2s", "xmppserver", {5269}); + prosody.net_activate_ports("component", "xmppcomponent", {5347}, "tcp"); + prosody.net_activate_ports("legacy_ssl", "xmppclient", {}, "ssl"); + end prosody.start_time = os.time(); end @@ -296,7 +331,7 @@ end function init_global_protection() -- Catch global accesses local locked_globals_mt = { - __index = function (t, k) log("warn", "%s", debug.traceback("Attempt to read a non-existent global '"..k.."'", 2)); end; + __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; }; @@ -376,7 +411,12 @@ function cleanup() end -- Are you ready? :) +-- These actions are in a strict order, as many depend on +-- previous steps to have already been performed read_config(); +init_logging(); +check_dependencies(); +sandbox_require(); load_libraries(); init_global_state(); read_version();