util.startup: Check root after detecting platform and reading config (thanks SigmaTel71)
Ensures that startup.detect_platform() runs so know whether to use the
POSIX method of checking the current user or something else. Also after
reading the config so we know whether the root override setting is set.
#!/usr/bin/env lua
-- cfgdump.lua prosody.cfg.lua [[host] option]
if not pcall(require, "prosody.loader") then
pcall(require, "loader");
end
local s_format, print = string.format, print;
local printf = function(fmt, ...) return print(s_format(fmt, ...)); end
local it = require "prosody.util.iterators";
local function sort_anything(a, b)
local typeof_a, typeof_b = type(a), type(b);
if typeof_a ~= typeof_b then return typeof_a < typeof_b end
return a < b -- should work for everything in a config file
end
local serialization = require "prosody.util.serialization";
local serialize = serialization.new and serialization.new({
unquoted = true, table_iterator = function(t) return it.sorted_pairs(t, sort_anything); end,
}) or serialization.serialize;
local configmanager = require"prosody.core.configmanager";
local startup = require "prosody.util.startup";
startup.set_function_metatable();
local config_filename, onlyhost, onlyoption = ...;
local ok, _, err = configmanager.load(config_filename or "./prosody.cfg.lua", "lua");
assert(ok, err);
if onlyhost then
if not onlyoption then
onlyhost, onlyoption = "*", onlyhost;
end
if onlyhost ~= "*" then
local component_module = configmanager.get(onlyhost, "component_module");
if component_module == "component" then
printf("Component %q", onlyhost);
elseif component_module then
printf("Component %q %q", onlyhost, component_module);
else
printf("VirtualHost %q", onlyhost);
end
end
printf("%s = %s", onlyoption or "?", serialize(configmanager.get(onlyhost, onlyoption)));
return;
end
local config = configmanager.getconfig();
for host, hostcfg in it.sorted_pairs(config) do
local fixed = {};
for option, value in it.sorted_pairs(hostcfg) do
fixed[option] = value;
if option:match("ports?$") or option:match("interfaces?$") then
if option:match("s$") then
if type(value) ~= "table" then
fixed[option] = { value };
end
else
if type(value) == "table" and #value > 1 then
fixed[option] = nil;
fixed[option.."s"] = value;
end
end
end
end
config[host] = fixed;
end
local globals = config["*"]; config["*"] = nil;
local function printsection(section)
local out, n = {}, 1;
for k,v in it.sorted_pairs(section) do
out[n], n = s_format("%s = %s", k, serialize(v)), n + 1;
end
table.sort(out);
print(table.concat(out, "\n"));
end
print("-------------- Prosody Exported Configuration File -------------");
print();
print("------------------------ Global section ------------------------");
print();
printsection(globals);
print();
local has_components = nil;
print("------------------------ Virtual hosts -------------------------");
for host, hostcfg in it.sorted_pairs(config) do
setmetatable(hostcfg, nil);
hostcfg.defined = nil;
if hostcfg.component_module == nil then
print();
printf("VirtualHost %q", host);
printsection(hostcfg);
else
has_components = true
end
end
print();
if has_components then
print("------------------------- Components ---------------------------");
for host, hostcfg in it.sorted_pairs(config) do
local component_module = hostcfg.component_module;
hostcfg.component_module = nil;
if component_module then
print();
if component_module == "component" then
printf("Component %q", host);
else
printf("Component %q %q", host, component_module);
hostcfg.component_module = nil;
hostcfg.load_global_modules = nil;
end
printsection(hostcfg);
end
end
end
print()
print("------------------------- End of File --------------------------");