# HG changeset patch # User Kim Alvefur # Date 1622129023 -7200 # Node ID 253df0798996e936d463fcdcd11e49dab3bf9a4b # Parent cade5dac10034c7da0842428338a24e23e0b609f mod_discodot: Print a graph of service discovery diff -r cade5dac1003 -r 253df0798996 mod_discodot/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_discodot/README.markdown Thu May 27 17:23:43 2021 +0200 @@ -0,0 +1,32 @@ +# Flowcharts! + +Put this module somewhere Prosody will find it and then run +`prosodyctl mod_discodot | dot -Tsvg -o disco-graph.svg` to receive a +graph like this[^1]: + + +------------------------+ +------------------------------------------+ + | proxy.external.example | <-- | VirtualHost "example.com" | -+ + +------------------------+ +------------------------------------------+ | + | | + | | + v | + +------------------------------------------+ | + | Component "conference.example.com" "muc" | <+ + +------------------------------------------+ + +Example config for the above: + +``` {.lua} +VirtualHost "xmpp.example.com" +disco_items = { + { "conference.example.com"; }; + { "proxy.external.example"; }; +} + +Component "conference.example.com" "muc" +``` + +Note the `disco_items` entry causing duplication since subdomains are +implicitly added. + +[^1]: this was actuall made with `graph-easy` diff -r cade5dac1003 -r 253df0798996 mod_discodot/mod_discodot.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_discodot/mod_discodot.lua Thu May 27 17:23:43 2021 +0200 @@ -0,0 +1,42 @@ +local cm = require("core.configmanager"); + +local function format_host(host, conf) + if host == "*" then + return "Global" + end + local component_module = conf["component_module"]; + if type(component_module) == "string" then + if component_module == "component" then + return string.format("Component %q", host) + else + return string.format("Component %q %q", host, component_module) + end + else + return string.format("VirtualHost %q", host) + end +end + +function module.command(arg) + + local config = cm.getconfig(); + + print("digraph \"prosody\" {") + for host, conf in pairs(config) do + print(string.format("%q [label=%q]", host, format_host(host, conf))); + local parent = host:match("%.(.*)"); + if parent and rawget(config, parent) then + print(string.format("%q -> %q", parent, host)); + end + local disco_items = conf["disco_items"] + if type(disco_items) == "table" then + for _, pair in ipairs(disco_items) do + print(string.format("%q -> %q", host, pair[1])); + end + end + + end + + print("}") + + return 0 +end diff -r cade5dac1003 -r 253df0798996 mod_discodot/mod_discodot.tl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_discodot/mod_discodot.tl Thu May 27 17:23:43 2021 +0200 @@ -0,0 +1,42 @@ +local cm = require"core.configmanager"; + +local function format_host(host:string, conf:{string:any}) : string + if host == "*" then + return "Global"; + end + local component_module = conf["component_module"]; + if component_module is string then + if component_module == "component" then + return string.format("Component %q", host); + else + return string.format("Component %q %q", host, component_module); + end + else + return string.format("VirtualHost %q", host); + end +end + +function module.command(arg : { string }) : integer + + local config : { string : { string : any } } = cm.getconfig(); + + print"digraph \"prosody\" {" + for host, conf in pairs(config) do + print(string.format("%q [label=%q]", host, format_host(host, conf))); + local parent = host:match("%.(.*)"); + if parent and rawget(config, parent) then + print(string.format("%q -> %q", parent, host)); + end + local disco_items = conf["disco_items"] + if disco_items is { { string, string } } then + for _, pair in ipairs(disco_items) do + print(string.format("%q -> %q", host, pair[1])); + end + end + + end + + print"}" + + return 0 +end