X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;ds=sidebyside;f=prosody;h=98d15da2a6c3783c5b6f3b31dd26e38eb7101308;hb=cc99208ab793ff03e4a0d030cfcb355756260fcb;hp=10aea492d891123ae0c5321ba7111569d2bf9ffb;hpb=33c9234d80050ab89343ae1e327bf2bc55004cd7;p=prosody.git diff --git a/prosody b/prosody index 10aea492..98d15da2 100755 --- a/prosody +++ b/prosody @@ -1,32 +1,42 @@ #!/usr/bin/env lua +-- Prosody IM v0.2 +-- Copyright (C) 2008 Matthew Wild +-- Copyright (C) 2008 Waqas Hussain +-- +-- This program is free software; you can redistribute it and/or +-- modify it under the terms of the GNU General Public License +-- as published by the Free Software Foundation; either version 2 +-- of the License, or (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +-- -- Config here -- CFG_SOURCEDIR=nil; -CFG_CONFIGDIR=nil; +CFG_CONFIGDIR=os.getenv("PROSODY_CFGDIR"); CFG_PLUGINDIR=nil; +CFG_DATADIR=os.getenv("PROSODY_DATADIR"); -- -- -- -- -- -- if CFG_SOURCEDIR then - if os.getenv("HOME") then - CFG_SOURCEDIR = CFG_SOURCEDIR:gsub("^~", os.getenv("HOME")); - end package.path = CFG_SOURCEDIR.."/?.lua;"..package.path package.cpath = CFG_SOURCEDIR.."/?.so;"..package.cpath end -if CFG_CONFIGDIR then - if os.getenv("HOME") then - CFG_CONFIGDIR = CFG_CONFIGDIR:gsub("^~", os.getenv("HOME")); - end -end - -if CFG_PLUGINDIR then +if CFG_DATADIR then if os.getenv("HOME") then - CFG_PLUGINDIR = CFG_PLUGINDIR:gsub("^~", os.getenv("HOME")); + CFG_DATADIR = CFG_DATADIR:gsub("^~", os.getenv("HOME")); end -end +end -- Required to be able to find packages installed with luarocks pcall(require, "luarocks.require") @@ -35,6 +45,9 @@ pcall(require, "luarocks.require") config = require "core.configmanager" log = require "util.logger".init("general"); +-- Disable log output, needs to read from config +-- require "util.logger".setwriter(function () end); + do -- TODO: Check for other formats when we add support for them -- Use lfs? Make a new conf/ dir? @@ -56,31 +69,6 @@ do end end -local data_path = config.get("*", "core", "data_path") or "data"; -local path_separator = "/"; if os.getenv("WINDIR") then path_separator = "\\" end -local _mkdir = {} -function mkdir(path) - path = path:gsub("/", path_separator); - --print("mkdir",path); - local x = io.popen("mkdir "..path.." 2>&1"):read("*a"); -end -function encode(s) return s and (s:gsub("%W", function (c) return string.format("%%%x", c:byte()); end)); end -function mkdirs(host) - if not _mkdir[host] then - local host_dir = string.format("%s/%s", data_path, encode(host)); - mkdir(host_dir); - mkdir(host_dir.."/accounts"); - mkdir(host_dir.."/vcard"); - mkdir(host_dir.."/roster"); - mkdir(host_dir.."/private"); - mkdir(host_dir.."/offline"); - _mkdir[host] = true; - end -end -mkdir(data_path); - -require "util.datamanager".set_data_path(data_path); - local server = require "net.server" require "util.dependencies" @@ -89,21 +77,14 @@ require "util.dependencies" sessions = {}; hosts = {}; -local defined_hosts = config.getconfig(); - -for host, host_config in pairs(defined_hosts) do - if host ~= "*" and (host_config.core.enabled == nil or host_config.core.enabled) then - hosts[host] = {type = "local", connected = true, sessions = {}, host = host, s2sout = {} }; - mkdirs(data_path.."/"..host); - end -end - -- Load and initialise core modules -- require "util.import" require "core.xmlhandlers" require "core.rostermanager" require "core.offlinemessage" +require "core.eventmanager" +require "core.hostmanager" require "core.modulemanager" require "core.usermanager" require "core.sessionmanager" @@ -114,32 +95,51 @@ pcall(require, "remdebug.engine"); if remdebug then remdebug.engine.start() end ]] -local start = require "net.connlisteners".start; +local cl = require "net.connlisteners"; + require "util.stanza" require "util.jid" ------------------------------------------------------------------------ --- Initialise modules -for host in pairs(hosts) do - if host ~= "*" then - local modules_enabled = config.get(host, "core", "modules_enabled"); - if modules_enabled then - for _, module in pairs(modules_enabled) do - modulemanager.load(host, module); - end - end +------------- Begin code without a home --------------------- + +local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data"; +require "util.datamanager".set_data_path(data_path); + + +local path_separator = "/"; if os.getenv("WINDIR") then path_separator = "\\" end +local _mkdir = {} +function mkdir(path) + path = path:gsub("/", path_separator); + local x = io.popen("mkdir \""..path.."\" 2>&1"):read("*a"); +end +function encode(s) return s and (s:gsub("%W", function (c) return string.format("%%%02x", c:byte()); end)); end +function mkdirs(host) + if not _mkdir[host] then + local host_dir = string.format("%s/%s", data_path, encode(host)); + mkdir(host_dir); + mkdir(host_dir.."/accounts"); + mkdir(host_dir.."/vcard"); + mkdir(host_dir.."/roster"); + mkdir(host_dir.."/private"); + mkdir(host_dir.."/offline"); + _mkdir[host] = true; end end +mkdir(data_path); --- setup error handling -setmetatable(_G, { __index = function (t, k) print("WARNING: ATTEMPT TO READ A NIL GLOBAL!!!", k); error("Attempt to read a non-existent global. Naughty boy.", 2); end, __newindex = function (t, k, v) print("ATTEMPT TO SET A GLOBAL!!!!", tostring(k).." = "..tostring(v)); error("Attempt to set a global. Naughty boy.", 2); end }) --]][][[]][]; +eventmanager.add_event_hook("host-activated", mkdirs); + +----------- End of out-of-place code -------------- -local protected_handler = function (conn, data, err) local success, ret = pcall(handler, conn, data, err); if not success then print("ERROR on "..tostring(conn)..": "..ret); conn:close(); end end; -local protected_disconnect = function (conn, err) local success, ret = pcall(disconnect, conn, err); if not success then print("ERROR on "..tostring(conn).." disconnect: "..ret); conn:close(); end end; +eventmanager.fire_event("server-starting"); +-- setup error handling +setmetatable(_G, { __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 }); + local global_ssl_ctx = config.get("*", "core", "ssl"); if global_ssl_ctx then local default_ssl_ctx = { mode = "server", protocol = "sslv23", capath = "/etc/ssl/certs", verify = "none"; }; @@ -147,13 +147,34 @@ if global_ssl_ctx then end -- start listening on sockets -start("xmppclient", { ssl = global_ssl_ctx }) -start("xmppserver", { ssl = global_ssl_ctx }) +local function do_ports(option, listener, default, key) + local ports = config.get("*", "core", option) or default; + --if type(ports) == "number" then ports = {ports} end; + if type(ports) ~= "table" then + log("error", "core."..option.." is not a table"); + else + for _, port in ipairs(ports) do + if type(port) ~= "number" then + log("error", "Non-numeric "..option..": "..tostring(port)); + else + cl.start(listener, { ssl = global_ssl_ctx, [key] = port }); + end + end + end +end + +do_ports("c2s_ports", "xmppclient", {5222}, "port"); +do_ports("s2s_ports", "xmppserver", {5269}, "port"); +do_ports("legacy_ssl_ports", "xmppclient", {}, "legacy_ssl_port"); if config.get("*", "core", "console_enabled") then - start("console") + if cl.get("console") then + cl.start("console") + else + log("error", "Console is enabled, but the console module appears not to be loaded"); + end end -modulemanager.fire_event("server-started"); +eventmanager.fire_event("server-started"); server.loop();