# HG changeset patch # User Matthew Wild # Date 1227406366 0 # Node ID 6d87944df37c0bbd44a656cb4daf5dceedfeeebd # Parent a6a4ea3633b0dae34a0849129934c96229348430 New configmanager. Old-style config files still work, but will print a warning diff -r a6a4ea3633b0 -r 6d87944df37c core/configmanager.lua --- a/core/configmanager.lua Sun Nov 23 02:11:58 2008 +0000 +++ b/core/configmanager.lua Sun Nov 23 02:12:46 2008 +0000 @@ -1,5 +1,7 @@ local _G = _G; +local setmetatable, loadfile, pcall, rawget, rawset, io = + setmetatable, loadfile, pcall, rawget, rawset, io; module "configmanager" local parsers = {}; @@ -21,6 +23,10 @@ end }; end +function getconfig() + return config; +end + function get(host, section, key) local sec = config[host][section]; if sec then @@ -45,15 +51,20 @@ end function load(filename, format) + format = format or filename:match("%w+$"); if parsers[format] and parsers[format].load then local f = io.open(filename); if f then - local ok, err = parsers[format](f:read("*a")); + local ok, err = parsers[format].load(f:read("*a")); f:close(); return ok, err; end end - return false, "no parser"; + if not format then + return nil, "no parser specified"; + else + return false, "no parser"; + end end function save(filename, format) @@ -65,21 +76,28 @@ end end +-- Built-in Lua parser do + local loadstring, pcall, setmetatable = _G.loadstring, _G.pcall, _G.setmetatable; + local setfenv, rawget, tostring = _G.setfenv, _G.rawget, _G.tostring; parsers.lua = {}; function parsers.lua.load(data) - local env = setmetatable({}, { __index = function (t, k) - if k:match("^mod_") then - return function (settings_table) + local env; + env = setmetatable({ Host = true; host = true; }, { __index = function (t, k) + return rawget(_G, k) or + function (settings_table) config[__currenthost or "*"][k] = settings_table; end; - end - return rawget(_G, k); + end, + __newindex = function (t, k, v) + set(env.__currenthost or "*", "core", k, v); end}); function env.Host(name) - env.__currenthost = name; + rawset(env, "__currenthost", name); + set(name or "*", "core", "defined", true); end + env.host = env.Host; local chunk, err = loadstring(data); @@ -95,8 +113,6 @@ return nil, err; end - - return true; end diff -r a6a4ea3633b0 -r 6d87944df37c main.lua --- a/main.lua Sun Nov 23 02:11:58 2008 +0000 +++ b/main.lua Sun Nov 23 02:12:46 2008 +0000 @@ -4,22 +4,42 @@ require "lxp" require "socket" require "ssl" +local config = require "core.configmanager" -function log(type, area, message) - print(type, area, message); +log = require "util.logger".init("general"); + +do + -- TODO: Check for other formats when we add support for them + -- Use lfs? Make a new conf/ dir? + local ok, err = config.load("lxmppd.cfg.lua"); + if not ok then + log("error", "Couldn't load config file: %s", err); + log("info", "Falling back to old config file format...") + ok, err = pcall(dofile, "lxmppd.cfg"); + if not ok then + log("error", "Old config format loading failed too: %s", err); + else + for _, host in ipairs(_G.config.hosts) do + config.set(host, "core", "defined", true); + end + + config.set("*", "core", "modules_enabled", _G.config.modules); + config.set("*", "core", "ssl", _G.config.ssl_ctx); + end + end end -dofile "lxmppd.cfg" - -- Maps connections to sessions -- sessions = {}; hosts = {}; -if config.hosts and #config.hosts > 0 then - for _, host in pairs(config.hosts) do +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 = {} }; end -else error("No hosts defined in the configuration file"); end +end -- Load and initialise core modules -- @@ -42,11 +62,12 @@ ------------------------------------------------------------------------ -- Initialise modules -if config.modules and #config.modules > 0 then - for _, module in pairs(config.modules) do +local modules_enabled = config.get("*", "core", "modules_enabled"); +if modules_enabled then + for _, module in pairs(modules_enabled) do modulemanager.load(module); end -else error("No modules enabled in the configuration file"); end +end -- 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 }) --]][][[]][]; @@ -54,9 +75,16 @@ 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; + +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"; }; + setmetatable(global_ssl_ctx, { __index = default_ssl_ctx }); +end + -- start listening on sockets -start("xmppclient", { ssl = config.ssl_ctx }) -start("xmppserver", { ssl = config.ssl_ctx }) +start("xmppclient", { ssl = global_ssl_ctx }) +start("xmppserver", { ssl = global_ssl_ctx }) modulemanager.fire_event("server-started");