Software /
code /
prosody
File
tools/cfgdump.lua @ 13238:26327eac56dc
util.datamanager: Always reset index after list shift
Shifting the index does not work reliably yet, better to rebuild it from
scratch. Since there is minimal parsing involved in that, it should be
more efficient anyway.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 22 Jul 2023 14:02:01 +0200 |
parent | 13142:879a6a33c21b |
line wrap: on
line source
#!/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 --------------------------");