1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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 --------------------------");
|