mod_posix: Move everything to util.startup
This allows greater control over the order of events.
Notably, the internal ordering between daemonization, initialization of
libunbound and setup of signal handling is sensitive.
libunbound starts a separate thread for processing DNS requests.
If this thread is started before signal handling has been set up, it
will not inherit the signal handlers and instead behave as it would have
before signal handlers were set up, i.e. cause the whole process to
immediately exit.
libunbound is usually initialized on the first DNS request, usually
triggered by an outgoing s2s connection attempt.
If daemonization happens before signals have been set up, signals may
not be processed at all.
#!/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 --------------------------");