aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2015-05-19 09:31:12 +0100
committerMatthew Wild <mwild1@gmail.com>2015-05-19 09:31:12 +0100
commitebe83d27d3179fa5d3c1452a8633a49d85a94f60 (patch)
tree6225faf7bc524edf57e2118bc8633e07d2b28333 /core
parent879862c536a5fba488307eb9e8a2f4f6523dbf09 (diff)
parent79534953279caa15362184c30db97c354e2d7364 (diff)
downloadprosody-ebe83d27d3179fa5d3c1452a8633a49d85a94f60.tar.gz
prosody-ebe83d27d3179fa5d3c1452a8633a49d85a94f60.zip
Merge 0.10->trunk
Diffstat (limited to 'core')
-rw-r--r--core/configmanager.lua84
-rw-r--r--core/hostmanager.lua15
-rw-r--r--core/loggingmanager.lua16
3 files changed, 64 insertions, 51 deletions
diff --git a/core/configmanager.lua b/core/configmanager.lua
index 48f039ea..5ee131ad 100644
--- a/core/configmanager.lua
+++ b/core/configmanager.lua
@@ -28,7 +28,7 @@ _M.resolve_relative_path = resolve_relative_path; -- COMPAT
local parsers = {};
-local config_mt = { __index = function (t, k) return rawget(t, "*"); end};
+local config_mt = { __index = function (t, _) return rawget(t, "*"); end};
local config = setmetatable({ ["*"] = { } }, config_mt);
-- When host not found, use global
@@ -54,11 +54,11 @@ function _M.rawget(host, key, _oldkey)
end
end
-local function set(config, host, key, value)
+local function set(config_table, host, key, value)
if host and key then
- local hostconfig = rawget(config, host);
+ local hostconfig = rawget(config_table, host);
if not hostconfig then
- hostconfig = rawset(config, host, setmetatable({}, host_mt))[host];
+ hostconfig = rawset(config_table, host, setmetatable({}, host_mt))[host];
end
hostconfig[key] = value;
return true;
@@ -73,20 +73,20 @@ function _M.set(host, key, value, _oldvalue)
return set(config, host, key, value);
end
-function load(filename, format)
- format = format or filename:match("%w+$");
+function load(filename, config_format)
+ config_format = config_format or filename:match("%w+$");
- if parsers[format] and parsers[format].load then
+ if parsers[config_format] and parsers[config_format].load then
local f, err = io.open(filename);
if f then
local new_config = setmetatable({ ["*"] = { } }, config_mt);
- local ok, err = parsers[format].load(f:read("*a"), filename, new_config);
+ local ok, err = parsers[config_format].load(f:read("*a"), filename, new_config);
f:close();
if ok then
config = new_config;
fire_event("config-reloaded", {
filename = filename,
- format = format,
+ format = config_format,
config = config
});
end
@@ -95,65 +95,61 @@ function load(filename, format)
return f, "file", err;
end
- if not format then
+ if not config_format then
return nil, "file", "no parser specified";
else
- return nil, "file", "no parser for "..(format);
+ return nil, "file", "no parser for "..(config_format);
end
end
-function save(filename, format)
-end
-
-function addparser(format, parser)
- if format and parser then
- parsers[format] = parser;
+function addparser(config_format, parser)
+ if config_format and parser then
+ parsers[config_format] = parser;
end
end
-- _M needed to avoid name clash with local 'parsers'
function _M.parsers()
local p = {};
- for format in pairs(parsers) do
- table.insert(p, format);
+ for config_format in pairs(parsers) do
+ table.insert(p, config_format);
end
return p;
end
-- Built-in Lua parser
do
- local pcall, setmetatable = _G.pcall, _G.setmetatable;
- local rawget = _G.rawget;
+ local pcall = _G.pcall;
parsers.lua = {};
- function parsers.lua.load(data, config_file, config)
+ function parsers.lua.load(data, config_file, config_table)
local env;
-- The ' = true' are needed so as not to set off __newindex when we assign the functions below
env = setmetatable({
Host = true, host = true, VirtualHost = true,
Component = true, component = true,
Include = true, include = true, RunScript = true }, {
- __index = function (t, k)
+ __index = function (_, k)
return rawget(_G, k);
end,
- __newindex = function (t, k, v)
- set(config, env.__currenthost or "*", k, v);
+ __newindex = function (_, k, v)
+ set(config_table, env.__currenthost or "*", k, v);
end
});
rawset(env, "__currenthost", "*") -- Default is global
function env.VirtualHost(name)
name = nameprep(name);
- if rawget(config, name) and rawget(config[name], "component_module") then
+ if rawget(config_table, name) and rawget(config_table[name], "component_module") then
error(format("Host %q clashes with previously defined %s Component %q, for services use a sub-domain like conference.%s",
- name, config[name].component_module:gsub("^%a+$", { component = "external", muc = "MUC"}), name, name), 0);
+ name, config_table[name].component_module:gsub("^%a+$", { component = "external", muc = "MUC"}), name, name), 0);
end
rawset(env, "__currenthost", name);
-- Needs at least one setting to logically exist :)
- set(config, name or "*", "defined", true);
+ set(config_table, name or "*", "defined", true);
return function (config_options)
rawset(env, "__currenthost", "*"); -- Return to global scope
for option_name, option_value in pairs(config_options) do
- set(config, name or "*", option_name, option_value);
+ set(config_table, name or "*", option_name, option_value);
end
end;
end
@@ -161,24 +157,24 @@ do
function env.Component(name)
name = nameprep(name);
- if rawget(config, name) and rawget(config[name], "defined") and not rawget(config[name], "component_module") then
+ if rawget(config_table, name) and rawget(config_table[name], "defined") and not rawget(config_table[name], "component_module") then
error(format("Component %q clashes with previously defined Host %q, for services use a sub-domain like conference.%s",
name, name, name), 0);
end
- set(config, name, "component_module", "component");
+ set(config_table, name, "component_module", "component");
-- Don't load the global modules by default
- set(config, name, "load_global_modules", false);
+ set(config_table, name, "load_global_modules", false);
rawset(env, "__currenthost", name);
local function handle_config_options(config_options)
rawset(env, "__currenthost", "*"); -- Return to global scope
for option_name, option_value in pairs(config_options) do
- set(config, name or "*", option_name, option_value);
+ set(config_table, name or "*", option_name, option_value);
end
end
return function (module)
if type(module) == "string" then
- set(config, name, "component_module", module);
+ set(config_table, name, "component_module", module);
return handle_config_options;
end
return handle_config_options(module);
@@ -187,6 +183,7 @@ do
env.component = env.Component;
function env.Include(file)
+ -- Check whether this is a wildcard Include
if file:match("[*?]") then
local lfs = deps.softreq "lfs";
if not lfs then
@@ -206,16 +203,17 @@ do
env.Include(path..path_sep..f);
end
end
- else
- local file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file);
- local f, err = io.open(file);
- if f then
- local ret, err = parsers.lua.load(f:read("*a"), file, config);
- if not ret then error(err:gsub("%[string.-%]", file), 0); end
- end
- if not f then error("Error loading included "..file..": "..err, 0); end
- return f, err;
+ return;
+ end
+ -- Not a wildcard, so resolve (potentially) relative path and run through config parser
+ file = resolve_relative_path(config_file:gsub("[^"..path_sep.."]+$", ""), file);
+ local f, err = io.open(file);
+ if f then
+ local ret, err = parsers.lua.load(f:read("*a"), file, config_table);
+ if not ret then error(err:gsub("%[string.-%]", file), 0); end
end
+ if not f then error("Error loading included "..file..": "..err, 0); end
+ return f, err;
end
env.include = env.Include;
diff --git a/core/hostmanager.lua b/core/hostmanager.lua
index b13b1944..3d581418 100644
--- a/core/hostmanager.lua
+++ b/core/hostmanager.lua
@@ -26,9 +26,23 @@ local core_route_stanza = _G.prosody.core_route_stanza;
local pairs, select, rawget = pairs, select, rawget;
local tostring, type = tostring, type;
+local setmetatable = setmetatable;
module "hostmanager"
+local host_mt = { }
+function host_mt:__tostring()
+ if self.type == "component" then
+ local typ = configmanager.get(self.host, "component_module");
+ if typ == "component" then
+ return ("Component %q"):format(self.host);
+ end
+ return ("Component %q %q"):format(self.host, typ);
+ elseif self.type == "local" then
+ return ("VirtualHost %q"):format(self.host);
+ end
+end
+
local hosts_loaded_once;
local function load_enabled_hosts(config)
@@ -69,6 +83,7 @@ function activate(host, host_config)
send = host_send;
modules = {};
};
+ setmetatable(host_session, host_mt);
if not host_config.component_module then -- host
host_session.type = "local";
host_session.sessions = {};
diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua
index f348dbdf..57ed8687 100644
--- a/core/loggingmanager.lua
+++ b/core/loggingmanager.lua
@@ -177,8 +177,8 @@ end
-- Column width for "source" (used by stdout and console)
local sourcewidth = 20;
-function log_sink_types.stdout(config)
- local timestamps = config.timestamps;
+function log_sink_types.stdout(sink_config)
+ local timestamps = sink_config.timestamps;
if timestamps == true then
timestamps = default_timestamp; -- Default format
@@ -207,13 +207,13 @@ do
logstyles["warn"] = getstyle("bold", "yellow");
logstyles["error"] = getstyle("bold", "red");
end
- function log_sink_types.console(config)
+ function log_sink_types.console(sink_config)
-- Really if we don't want pretty colours then just use plain stdout
if not do_pretty_printing then
- return log_sink_types.stdout(config);
+ return log_sink_types.stdout(sink_config);
end
- local timestamps = config.timestamps;
+ local timestamps = sink_config.timestamps;
if timestamps == true then
timestamps = default_timestamp; -- Default format
@@ -240,15 +240,15 @@ do
end
local empty_function = function () end;
-function log_sink_types.file(config)
- local log = config.filename;
+function log_sink_types.file(sink_config)
+ local log = sink_config.filename;
local logfile = io_open(log, "a+");
if not logfile then
return empty_function;
end
local write, flush = logfile.write, logfile.flush;
- local timestamps = config.timestamps;
+ local timestamps = sink_config.timestamps;
if timestamps == nil or timestamps == true then
timestamps = default_timestamp; -- Default format