Changeset

12217:39043233de04

util.prosodyctl.check: Add HTTP related DNS checks Since XEP-0363 is essentially mandatory now this will hopefully help diagnose some common issues.
author Kim Alvefur <zash@zash.se>
date Thu, 27 Jan 2022 12:36:50 +0100
parents 12216:0f5d04c3092f
children 12218:0795e1ccf3d8
files util/prosodyctl/check.lua
diffstat 1 files changed, 41 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/util/prosodyctl/check.lua	Wed Jan 26 13:24:23 2022 +0100
+++ b/util/prosodyctl/check.lua	Thu Jan 27 12:36:50 2022 +0100
@@ -592,17 +592,18 @@
 				target_hosts:remove("localhost");
 			end
 
+			local function check_address(target)
+				local A, AAAA = dns.lookup(idna.to_ascii(target), "A"), dns.lookup(idna.to_ascii(target), "AAAA");
+				local prob = {};
+				if use_ipv4 and not A then table.insert(prob, "A"); end
+				if use_ipv6 and not AAAA then table.insert(prob, "AAAA"); end
+				return prob;
+			end
+
 			if modules:contains("proxy65") then
 				local proxy65_target = configmanager.get(host, "proxy65_address") or host;
 				if type(proxy65_target) == "string" then
-					local A, AAAA = dns.lookup(idna.to_ascii(proxy65_target), "A"), dns.lookup(idna.to_ascii(proxy65_target), "AAAA");
-					local prob = {};
-					if use_ipv4 and not A then
-						table.insert(prob, "A");
-					end
-					if use_ipv6 and not AAAA then
-						table.insert(prob, "AAAA");
-					end
+					local prob = check_address(proxy65_target);
 					if #prob > 0 then
 						print("    File transfer proxy "..proxy65_target.." has no "..table.concat(prob, "/")
 						.." record. Create one or set 'proxy65_address' to the correct host/IP.");
@@ -612,6 +613,38 @@
 				end
 			end
 
+			local known_http_modules = set.new { "bosh"; "http_files"; "http_file_share"; "http_openmetrics"; "websocket" };
+			local function contains_match(hayset, needle)
+				for member in hayset do if member:find(needle) then return true end end
+			end
+
+			if modules:contains("http") or not set.intersection(modules, known_http_modules):empty()
+				or contains_match(modules, "^http_") or contains_match(modules, "_web$") then
+
+				local http_host = configmanager.get(host, "http_host") or host;
+				local http_internal_host = http_host;
+				local http_url = configmanager.get(host, "http_external_url");
+				if http_url then
+					local url_parse = require "socket.url";
+					local external_url_parts = url_parse(http_url);
+					if external_url_parts then
+						http_host = external_url_parts.host;
+					else
+						print("    The 'http_external_url' setting is not a valid URL");
+					end
+				end
+
+				local prob = check_address(http_host);
+				if #prob > 1 then
+					print("    HTTP service " .. http_host .. " has no " .. table.concat(prob, "/") .. " record. Create one or change "
+									.. (http_url and "'http_external_url'" or "'http_host'").." to the correct host.");
+				end
+
+				if http_host ~= http_internal_host then
+					print("    Ensure the reverse proxy sets the HTTP Host header to '" .. http_internal_host .. "'");
+				end
+			end
+
 			if not use_ipv4 and not use_ipv6 then
 				print("    Both IPv6 and IPv4 are disabled, Prosody will not listen on any ports");
 				print("    nor be able to connect to any remote servers.");