changeset 4577:253df0798996

mod_discodot: Print a graph of service discovery
author Kim Alvefur <zash@zash.se>
date Thu, 27 May 2021 17:23:43 +0200 (2021-05-27)
parents cade5dac1003
children d95fcde6e39d
files mod_discodot/README.markdown mod_discodot/mod_discodot.lua mod_discodot/mod_discodot.tl
diffstat 3 files changed, 116 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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`
--- /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
--- /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