aboutsummaryrefslogtreecommitdiffstats
path: root/tools/cfgdump.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cfgdump.lua')
-rwxr-xr-xtools/cfgdump.lua128
1 files changed, 128 insertions, 0 deletions
diff --git a/tools/cfgdump.lua b/tools/cfgdump.lua
new file mode 100755
index 00000000..8c331a58
--- /dev/null
+++ b/tools/cfgdump.lua
@@ -0,0 +1,128 @@
+#!/usr/bin/env lua
+
+-- cfgdump.lua prosody.cfg.lua [[host] option]
+
+local s_format, print = string.format, print;
+local printf = function(fmt, ...) return print(s_format(fmt, ...)); end
+local it = require "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 "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"core.configmanager";
+local startup = require "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 --------------------------");
+