annotate util/prosodyctl/check.lua @ 14216:2ec517d8d43e

net.unbound: Enable DNSSEC by default with option for turning off You know what they say about opt-in security. Enabling DNSSEC in libunbound without a way to turn it off would likely be a problem for those whose DNS resolvers do not support, or outright block DNSSEC. The merge algorithm already in place here doesn't have a way to unset something, so instead a simpler boolean setting is introduced, similar to some existing ones like use_ipv6/4 and use_dane.
author Kim Alvefur <zash@zash.se>
date Sun, 07 Jun 2026 20:32:55 +0200
parents 70b08435e47b
children 565debd9c37a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
1 local configmanager = require "prosody.core.configmanager";
13218
e576c6a0d1f8 Merge 0.12->trunk
Kim Alvefur <zash@zash.se>
parents: 13122 13217
diff changeset
2 local moduleapi = require "prosody.core.moduleapi";
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
3 local show_usage = require "prosody.util.prosodyctl".show_usage;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
4 local show_warning = require "prosody.util.prosodyctl".show_warning;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
5 local is_prosody_running = require "prosody.util.prosodyctl".isrunning;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
6 local parse_args = require "prosody.util.argparse".parse;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
7 local dependencies = require "prosody.util.dependencies";
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local socket = require "socket";
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
9 local socket_url = require "socket.url";
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
10 local jid_split = require "prosody.util.jid".prepped_split;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
11 local modulemanager = require "prosody.core.modulemanager";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
12 local async = require "prosody.util.async";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
13 local httputil = require "prosody.util.http";
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
14 local human_units = require "prosody.util.human.units";
14050
64cd905cb1de util.prosodyctl.check: Do not suggest renaming domain to public suffix
Kim Alvefur <zash@zash.se>
parents: 14048
diff changeset
15 local have_psl, publicsuffix = pcall(require, "psl");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
17 local function api(host)
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
18 return setmetatable({ name = "prosodyctl.check"; host = host; log = prosody.log }, { __index = moduleapi })
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
19 end
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
20
11826
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
21 local function check_ojn(check_type, target_host)
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
22 local http = require "prosody.net.http"; -- .new({});
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
23 local json = require "prosody.util.json";
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
24
11826
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
25 local response, err = async.wait_for(http.request(
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
26 ("https://observe.jabber.network/api/v1/check/%s"):format(httputil.urlencode(check_type)),
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
27 {
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
28 method="POST",
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
29 headers={["Accept"] = "application/json"; ["Content-Type"] = "application/json"},
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
30 body=json.encode({target=target_host}),
11826
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
31 }));
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
32
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
33 if not response then
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
34 return false, err;
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
35 end
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
36
11826
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
37 if response.code ~= 200 then
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
38 return false, ("API replied with non-200 code: %d"):format(response.code);
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
39 end
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
40
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
41 local decoded_body, err = json.decode(response.body);
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
42 if decoded_body == nil then
e1c4cc5d0ef8 prosodyctl: Use HTTP client in promise mode for connectivity check
Kim Alvefur <zash@zash.se>
parents: 11807
diff changeset
43 return false, ("Failed to parse API JSON: %s"):format(err)
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
44 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
45
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
46 local success = decoded_body["success"];
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
47 return success == true, nil;
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
48 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
49
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
50 local function check_probe(base_url, probe_module, target)
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
51 local http = require "prosody.net.http"; -- .new({});
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
52 local params = httputil.formencode({ module = probe_module; target = target })
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
53 local response, err = async.wait_for(http.request(base_url .. "?" .. params));
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
54
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
55 if not response then return false, err; end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
56
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
57 if response.code ~= 200 then return false, ("API replied with non-200 code: %d"):format(response.code); end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
58
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
59 for line in response.body:gmatch("[^\r\n]+") do
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
60 local probe_success = line:match("^probe_success%s+(%d+)");
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
61
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
62 if probe_success == "1" then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
63 return true;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
64 elseif probe_success == "0" then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
65 return false;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
66 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
67 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
68 return false, "Probe endpoint did not return a success status";
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
69 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
70
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
71 local function check_turn_service(turn_service, ping_service)
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
72 local ip = require "prosody.util.ip";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
73 local stun = require "prosody.net.stun";
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
74
13580
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
75 local result = { warnings = {} };
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
76
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
77 -- Create UDP socket for communication with the server
14079
0ea2848d7771 prosodyctl: Only import "socket" in the root of the module
Link Mauve <linkmauve@linkmauve.fr>
parents: 14050
diff changeset
78 local sock = assert(socket.udp());
13580
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
79 do
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
80 local ok, err = sock:setsockname("*", 0);
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
81 if not ok then
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
82 result.error = "Unable to perform TURN test: setsockname: "..tostring(err);
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
83 return result;
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
84 end
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
85 ok, err = sock:setpeername(turn_service.host, turn_service.port);
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
86 if not ok then
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
87 result.error = "Unable to perform TURN test: setpeername: "..tostring(err);
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
88 return result;
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
89 end
836efad8483c util.prosodyctl.check: Improve error handling of UDP socket setup (for #1803)
Matthew Wild <mwild1@gmail.com>
parents: 13465
diff changeset
90 end
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
91 sock:settimeout(10);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
92
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
93 -- Helper function to receive a packet
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
94 local function receive_packet()
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
95 local raw_packet, err = sock:receive();
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
96 if not raw_packet then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
97 return nil, err;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
98 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
99 return stun.new_packet():deserialize(raw_packet);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
100 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
101
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
102 -- Send a "binding" query, i.e. a request for our external IP/port
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
103 local bind_query = stun.new_packet("binding", "request");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
104 bind_query:add_attribute("software", "prosodyctl check turn");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
105 sock:send(bind_query:serialize());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
106
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
107 local bind_result, err = receive_packet();
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
108 if not bind_result then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
109 result.error = "No STUN response: "..err;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
110 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
111 elseif bind_result:is_err_resp() then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
112 result.error = ("STUN server returned error: %d (%s)"):format(bind_result:get_error());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
113 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
114 elseif not bind_result:is_success_resp() then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
115 result.error = ("Unexpected STUN response: %d (%s)"):format(bind_result:get_type());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
116 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
117 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
118
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
119 result.external_ip = bind_result:get_xor_mapped_address();
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
120 if not result.external_ip then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
121 result.error = "STUN server did not return an address";
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
122 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
123 end
12384
53b4549c2209 prosodyctl: check turn: Add check for private IP returned from STUN.
Matthew Wild <mwild1@gmail.com>
parents: 12383
diff changeset
124 if ip.new_ip(result.external_ip.address).private then
53b4549c2209 prosodyctl: check turn: Add check for private IP returned from STUN.
Matthew Wild <mwild1@gmail.com>
parents: 12383
diff changeset
125 table.insert(result.warnings, "STUN returned a private IP! Is the TURN server behind a NAT and misconfigured?");
53b4549c2209 prosodyctl: check turn: Add check for private IP returned from STUN.
Matthew Wild <mwild1@gmail.com>
parents: 12383
diff changeset
126 end
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
127
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
128 -- Send a TURN "allocate" request. Expected to fail due to auth, but
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
129 -- necessary to obtain a valid realm/nonce from the server.
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
130 local pre_request = stun.new_packet("allocate", "request");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
131 sock:send(pre_request:serialize());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
132
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
133 local pre_result, err = receive_packet();
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
134 if not pre_result then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
135 result.error = "No initial TURN response: "..err;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
136 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
137 elseif pre_result:is_success_resp() then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
138 result.error = "TURN server does not have authentication enabled";
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
139 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
140 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
141
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
142 local realm = pre_result:get_attribute("realm");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
143 local nonce = pre_result:get_attribute("nonce");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
144
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
145 if not realm then
12383
a9b6ed86b573 prosodyctl: check turn: improve warning text to suggest issues
Matthew Wild <mwild1@gmail.com>
parents: 12382
diff changeset
146 table.insert(result.warnings, "TURN server did not return an authentication realm. Is authentication enabled?");
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
147 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
148 if not nonce then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
149 table.insert(result.warnings, "TURN server did not return a nonce");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
150 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
151
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
152 -- Use the configured secret to obtain temporary user/pass credentials
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
153 local turn_user, turn_pass = stun.get_user_pass_from_secret(turn_service.secret);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
154
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
155 -- Send a TURN allocate request, will fail if auth is wrong
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
156 local alloc_request = stun.new_packet("allocate", "request");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
157 alloc_request:add_requested_transport("udp");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
158 alloc_request:add_attribute("username", turn_user);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
159 if realm then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
160 alloc_request:add_attribute("realm", realm);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
161 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
162 if nonce then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
163 alloc_request:add_attribute("nonce", nonce);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
164 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
165 local key = stun.get_long_term_auth_key(realm or turn_service.host, turn_user, turn_pass);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
166 alloc_request:add_message_integrity(key);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
167 sock:send(alloc_request:serialize());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
168
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
169 -- Check the response
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
170 local alloc_response, err = receive_packet();
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
171 if not alloc_response then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
172 result.error = "TURN server did not response to allocation request: "..err;
12466
9ee41552bca0 util.prosodyctl: check turn: ensure a result is always returned from a check (thanks eTaurus)
Matthew Wild <mwild1@gmail.com>
parents: 12441
diff changeset
173 return result;
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
174 elseif alloc_response:is_err_resp() then
12741
7b3deafb9162 prosodyctl: check turn: More clearly indicate the error is from TURN server
Matthew Wild <mwild1@gmail.com>
parents: 12520
diff changeset
175 result.error = ("TURN server failed to create allocation: %d (%s)"):format(alloc_response:get_error());
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
176 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
177 elseif not alloc_response:is_success_resp() then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
178 result.error = ("Unexpected TURN response: %d (%s)"):format(alloc_response:get_type());
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
179 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
180 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
181
12375
ea5e46601cfb prosodyctl: check turn: show relayed address(es) in verbose mode
Matthew Wild <mwild1@gmail.com>
parents: 12373
diff changeset
182 result.relayed_addresses = alloc_response:get_xor_relayed_addresses();
ea5e46601cfb prosodyctl: check turn: show relayed address(es) in verbose mode
Matthew Wild <mwild1@gmail.com>
parents: 12373
diff changeset
183
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
184 if not ping_service then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
185 -- Success! We won't be running the relay test.
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
186 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
187 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
188
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
189 -- Run the relay test - i.e. send a binding request to ping_service
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
190 -- and receive a response.
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
191
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
192 -- Resolve the IP of the ping service
12373
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
193 local ping_host, ping_port = ping_service:match("^([^:]+):(%d+)$");
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
194 if ping_host then
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
195 ping_port = tonumber(ping_port);
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
196 else
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
197 -- Only a hostname specified, use default STUN port
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
198 ping_host, ping_port = ping_service, 3478;
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
199 end
12416
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
200
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
201 if ping_host == turn_service.host then
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
202 result.error = ("Unable to perform ping test: please supply an external STUN server address. See https://prosody.im/doc/turn#prosodyctl-check");
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
203 return result;
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
204 end
19fd28239e73 prosodyctl: check turn: Fail with error if our own address is supplied for the ping test
Matthew Wild <mwild1@gmail.com>
parents: 12414
diff changeset
205
12373
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
206 local ping_service_ip, err = socket.dns.toip(ping_host);
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
207 if not ping_service_ip then
12379
6ac3c580c00d prosodyctl: check turn: Clearer error when unable to resolve external service host
Matthew Wild <mwild1@gmail.com>
parents: 12377
diff changeset
208 result.error = "Unable to resolve ping service hostname: "..err;
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
209 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
210 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
211
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
212 -- Ask the TURN server to allow packets from the ping service IP
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
213 local perm_request = stun.new_packet("create-permission");
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
214 perm_request:add_xor_peer_address(ping_service_ip);
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
215 perm_request:add_attribute("username", turn_user);
12382
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
216 if realm then
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
217 perm_request:add_attribute("realm", realm);
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
218 end
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
219 if nonce then
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
220 perm_request:add_attribute("nonce", nonce);
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
221 end
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
222 perm_request:add_message_integrity(key);
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
223 sock:send(perm_request:serialize());
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
224
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
225 local perm_response, err = receive_packet();
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
226 if not perm_response then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
227 result.error = "No response from TURN server when requesting peer permission: "..err;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
228 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
229 elseif perm_response:is_err_resp() then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
230 result.error = ("TURN permission request failed: %d (%s)"):format(perm_response:get_error());
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
231 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
232 elseif not perm_response:is_success_resp() then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
233 result.error = ("Unexpected TURN response: %d (%s)"):format(perm_response:get_type());
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
234 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
235 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
236
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
237 -- Ask the TURN server to relay a STUN binding request to the ping server
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
238 local ping_data = stun.new_packet("binding"):serialize();
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
239
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
240 local ping_request = stun.new_packet("send", "indication");
12373
5417ec7e2ee8 prosodyctl: check turn: Allow specifying port for the ping service
Matthew Wild <mwild1@gmail.com>
parents: 12372
diff changeset
241 ping_request:add_xor_peer_address(ping_service_ip, ping_port);
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
242 ping_request:add_attribute("data", ping_data);
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
243 ping_request:add_attribute("username", turn_user);
12382
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
244 if realm then
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
245 ping_request:add_attribute("realm", realm);
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
246 end
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
247 if nonce then
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
248 ping_request:add_attribute("nonce", nonce);
574cf096a426 prosodyctl: check turn: fix traceback when server does not provide realm/nonce
Matthew Wild <mwild1@gmail.com>
parents: 12381
diff changeset
249 end
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
250 ping_request:add_message_integrity(key);
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
251 sock:send(ping_request:serialize());
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
252
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
253 local ping_response, err = receive_packet();
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
254 if not ping_response then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
255 result.error = "No response from ping server ("..ping_service_ip.."): "..err;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
256 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
257 elseif not ping_response:is_indication() or select(2, ping_response:get_method()) ~= "data" then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
258 result.error = ("Unexpected TURN response: %s %s"):format(select(2, ping_response:get_method()), select(2, ping_response:get_type()));
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
259 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
260 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
261
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
262 local pong_data = ping_response:get_attribute("data");
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
263 if not pong_data then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
264 result.error = "No data relayed from remote server";
12466
9ee41552bca0 util.prosodyctl: check turn: ensure a result is always returned from a check (thanks eTaurus)
Matthew Wild <mwild1@gmail.com>
parents: 12441
diff changeset
265 return result;
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
266 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
267 local pong = stun.new_packet():deserialize(pong_data);
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
268
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
269 result.external_ip_pong = pong:get_xor_mapped_address();
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
270 if not result.external_ip_pong then
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
271 result.error = "Ping server did not return an address";
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
272 return result;
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
273 end
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
274
12390
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
275 local relay_address_found, relay_port_matches;
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
276 for _, relayed_address in ipairs(result.relayed_addresses) do
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
277 if relayed_address.address == result.external_ip_pong.address then
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
278 relay_address_found = true;
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
279 relay_port_matches = result.external_ip_pong.port == relayed_address.port;
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
280 end
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
281 end
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
282 if not relay_address_found then
12383
a9b6ed86b573 prosodyctl: check turn: improve warning text to suggest issues
Matthew Wild <mwild1@gmail.com>
parents: 12382
diff changeset
283 table.insert(result.warnings, "TURN external IP vs relay address mismatch! Is the TURN server behind a NAT and misconfigured?");
12390
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
284 elseif not relay_port_matches then
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
285 table.insert(result.warnings, "External port does not match reported relay port! This is probably caused by a NAT in front of the TURN server.");
12383
a9b6ed86b573 prosodyctl: check turn: improve warning text to suggest issues
Matthew Wild <mwild1@gmail.com>
parents: 12382
diff changeset
286 end
a9b6ed86b573 prosodyctl: check turn: improve warning text to suggest issues
Matthew Wild <mwild1@gmail.com>
parents: 12382
diff changeset
287
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
288 --
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
289
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
290 return result;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
291 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
292
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
293 local function skip_bare_jid_hosts(host)
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
294 if jid_split(host) then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
295 -- See issue #779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
296 return false;
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
297 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
298 return true;
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
299 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
300
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
301 local check_opts = {
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
302 short_params = {
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
303 h = "help", v = "verbose";
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
304 };
12376
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
305 value_params = {
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
306 ping = true;
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
307 };
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
308 };
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
309
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 local function check(arg)
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
311 if arg[1] == "help" or arg[1] == "--help" then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 show_usage([[check]], [[Perform basic checks on your Prosody installation]]);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 return 1;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 local what = table.remove(arg, 1);
12376
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
316 local opts, opts_err, opts_info = parse_args(arg, check_opts);
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
317 if opts_err == "missing-value" then
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
318 print("Error: Expected a value after '"..opts_info.."'");
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
319 return 1;
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
320 elseif opts_err == "param-not-found" then
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
321 print("Error: Unknown parameter: "..opts_info);
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
322 return 1;
10353ad0ca7a prosodyctl: check: Slightly improved argument handling
Matthew Wild <mwild1@gmail.com>
parents: 12375
diff changeset
323 end
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
324 local array = require "prosody.util.array";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
325 local set = require "prosody.util.set";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
326 local it = require "prosody.util.iterators";
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 local ok = true;
13326
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
328 local function contains_match(hayset, needle) for member in hayset do if member:find(needle) then return true end end end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 local function disabled_hosts(host, conf) return host ~= "*" and conf.enabled ~= false; end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
330 local function is_user_host(host, conf) return host ~= "*" and conf.component_module == nil; end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
331 local function is_component_host(host, conf) return host ~= "*" and conf.component_module ~= nil; end
13706
a988867a5567 util.prosodyctl.check: Sort hosts in iterator for more stable output
Matthew Wild <mwild1@gmail.com>
parents: 13705
diff changeset
332 local function enabled_hosts() return it.filter(disabled_hosts, it.sorted_pairs(configmanager.getconfig())); end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
333 local function enabled_user_hosts() return it.filter(is_user_host, it.sorted_pairs(configmanager.getconfig())); end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
334 local function enabled_components() return it.filter(is_component_host, it.sorted_pairs(configmanager.getconfig())); end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
335
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
336 local checks = {};
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
337 function checks.disabled()
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 local disabled_hosts_set = set.new();
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
339 for host in it.filter("*", pairs(configmanager.getconfig())) do
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
340 if api(host):get_option_boolean("enabled") == false then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 disabled_hosts_set:add(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 if not disabled_hosts_set:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 local msg = "Checks will be skipped for these disabled hosts: %s";
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 if what then msg = "These hosts are disabled: %s"; end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347 show_warning(msg, tostring(disabled_hosts_set));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 if what then return 0; end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 print""
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 end
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
352 function checks.config()
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 print("Checking config...");
12441
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
354
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
355 if what == "config" then
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
356 local files = configmanager.files();
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
357 print(" The following configuration files have been loaded:");
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
358 print(" - "..table.concat(files, "\n - "));
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
359 end
dc6263625069 prosodyctl: check config: Report paths of loaded configuration files (fixed #1729)
Matthew Wild <mwild1@gmail.com>
parents: 12416
diff changeset
360
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
361 local obsolete = set.new({ --> remove
12118
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
362 "archive_cleanup_interval",
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
363 "dns_timeout",
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
364 "muc_log_cleanup_interval",
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
365 "s2s_dns_resolvers",
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
366 "setgid",
30d55809d9a6 util.prosodyctl.check: Add some more obsolete settings
Kim Alvefur <zash@zash.se>
parents: 12099
diff changeset
367 "setuid",
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 });
12159
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
369 local function instead_use(kind, name, value)
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
370 if kind == "option" then
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
371 if value then
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
372 return string.format("instead, use '%s = %q'", name, value);
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
373 else
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
374 return string.format("instead, use '%s'", name);
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
375 end
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
376 elseif kind == "module" then
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
377 return string.format("instead, add %q to '%s'", name, value or "modules_enabled");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
378 elseif kind == "community" then
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
379 return string.format("instead, add %q from %s", name, value or "prosody-modules");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
380 end
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
381 return kind
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
382 end
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
383 local deprecated_replacements = {
12159
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
384 anonymous_login = instead_use("option", "authentication", "anonymous");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
385 daemonize = "instead, use the --daemonize/-D or --foreground/-F command line flags";
13254
a2ba3f06dcf4 util.prosodyctl.check: Correct modern replacement for 'disallow_s2s'
Kim Alvefur <zash@zash.se>
parents: 13219
diff changeset
386 disallow_s2s = instead_use("module", "s2s", "modules_disabled");
12159
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
387 no_daemonize = "instead, use the --daemonize/-D or --foreground/-F command line flags";
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
388 require_encryption = "instead, use 'c2s_require_encryption' and 's2s_require_encryption'";
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
389 vcard_compatibility = instead_use("community", "mod_compat_vcard");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
390 use_libevent = instead_use("option", "network_backend", "event");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
391 whitelist_registration_only = instead_use("option", "allowlist_registration_only");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
392 registration_whitelist = instead_use("option", "registration_allowlist");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
393 registration_blacklist = instead_use("option", "registration_blocklist");
aa299551f8c6 util.prosodyctl.check: Parameterize replacement instructions
Kim Alvefur <zash@zash.se>
parents: 12158
diff changeset
394 blacklist_on_registration_throttle_overload = instead_use("blocklist_on_registration_throttle_overload");
12898
4255db0f8e58 util.prosodyctl.check: Suggest 'http_cors_override' instead of older CORS settings
Kim Alvefur <zash@zash.se>
parents: 12842
diff changeset
395 cross_domain_bosh = "instead, use 'http_cors_override', see https://prosody.im/doc/http#cross-domain-cors-support";
4255db0f8e58 util.prosodyctl.check: Suggest 'http_cors_override' instead of older CORS settings
Kim Alvefur <zash@zash.se>
parents: 12842
diff changeset
396 cross_domain_websocket = "instead, use 'http_cors_override', see https://prosody.im/doc/http#cross-domain-cors-support";
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
397 };
11800
60018637f5d4 util.prosodyctl.check: Nudge towards plural port options
Kim Alvefur <zash@zash.se>
parents: 11799
diff changeset
398 -- FIXME all the singular _port and _interface options are supposed to be deprecated too
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
399 local deprecated_ports = { bosh = "http", legacy_ssl = "c2s_direct_tls" };
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
400 local port_suffixes = set.new({ "port", "ports", "interface", "interfaces", "ssl" });
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
401 for port, replacement in pairs(deprecated_ports) do
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
402 for suffix in port_suffixes do
11800
60018637f5d4 util.prosodyctl.check: Nudge towards plural port options
Kim Alvefur <zash@zash.se>
parents: 11799
diff changeset
403 local rsuffix = (suffix == "port" or suffix == "interface") and suffix.."s" or suffix;
12158
7ff3699c1653 util.prosodyctl.check: Move word to ease future translations
Kim Alvefur <zash@zash.se>
parents: 12157
diff changeset
404 deprecated_replacements[port.."_"..suffix] = "instead, use '"..replacement.."_"..rsuffix.."'"
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
405 end
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
406 end
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
407 local deprecated = set.new(array.collect(it.keys(deprecated_replacements)));
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 local known_global_options = set.new({
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
409 "access_control_allow_credentials",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
410 "access_control_allow_headers",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
411 "access_control_allow_methods",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
412 "access_control_max_age",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
413 "admin_socket",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
414 "body_size_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
415 "bosh_max_inactivity",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
416 "bosh_max_polling",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
417 "bosh_max_wait",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
418 "buffer_size_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
419 "c2s_close_timeout",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
420 "c2s_stanza_size_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
421 "c2s_tcp_keepalives",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
422 "c2s_timeout",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
423 "component_stanza_size_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
424 "component_tcp_keepalives",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
425 "consider_bosh_secure",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
426 "consider_websocket_secure",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
427 "console_banner",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
428 "console_prettyprint_settings",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
429 "daemonize",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
430 "gc",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
431 "http_default_host",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
432 "http_errors_always_show",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
433 "http_errors_default_message",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
434 "http_errors_detailed",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
435 "http_errors_messages",
11833
bd86ab8122d9 util.prosodyctl.check: Add two known globals from mod_http
Kim Alvefur <zash@zash.se>
parents: 11827
diff changeset
436 "http_max_buffer_size",
bd86ab8122d9 util.prosodyctl.check: Add two known globals from mod_http
Kim Alvefur <zash@zash.se>
parents: 11827
diff changeset
437 "http_max_content_size",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
438 "installer_plugin_path",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
439 "limits",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
440 "limits_resolution",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
441 "log",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
442 "multiplex_buffer_size",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
443 "network_backend",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
444 "network_default_read_size",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
445 "network_settings",
11940
2d82e4245aa3 util.prosodyctl.check: Add mod_http_openmetrics settings to known globals
Kim Alvefur <zash@zash.se>
parents: 11925
diff changeset
446 "openmetrics_allow_cidr",
2d82e4245aa3 util.prosodyctl.check: Add mod_http_openmetrics settings to known globals
Kim Alvefur <zash@zash.se>
parents: 11925
diff changeset
447 "openmetrics_allow_ips",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
448 "pidfile",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
449 "plugin_paths",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
450 "plugin_server",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
451 "prosodyctl_timeout",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
452 "prosody_group",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
453 "prosody_user",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
454 "run_as_root",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
455 "s2s_close_timeout",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
456 "s2s_insecure_domains",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
457 "s2s_require_encryption",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
458 "s2s_secure_auth",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
459 "s2s_secure_domains",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
460 "s2s_stanza_size_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
461 "s2s_tcp_keepalives",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
462 "s2s_timeout",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
463 "statistics",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
464 "statistics_config",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
465 "statistics_interval",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
466 "tcp_keepalives",
12099
b344edad61d3 core.certmanager: Rename preset option to 'tls_preset'
Kim Alvefur <zash@zash.se>
parents: 11957
diff changeset
467 "tls_profile",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
468 "trusted_proxies",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
469 "umask",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
470 "use_dane",
14216
2ec517d8d43e net.unbound: Enable DNSSEC by default with option for turning off
Kim Alvefur <zash@zash.se>
parents: 14097
diff changeset
471 "use_dnssec",
11634
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
472 "use_ipv4",
a6c87b4c0cdf util.prosodyctl.check: Format, sort option listings into canonical form
Kim Alvefur <zash@zash.se>
parents: 11617
diff changeset
473 "use_ipv6",
11635
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
474 "websocket_frame_buffer_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
475 "websocket_frame_fragment_limit",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
476 "websocket_get_response_body",
1b17b967838e util.prosodyctl.check: Collect options from all global plugins
Kim Alvefur <zash@zash.se>
parents: 11634
diff changeset
477 "websocket_get_response_text",
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
478 });
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
479 local config = configmanager.getconfig();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
480 -- Check that we have any global options (caused by putting a host at the top)
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
481 if it.count(it.filter("log", pairs(config["*"]))) == 0 then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
482 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
483 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
484 print(" No global options defined. Perhaps you have put a host definition at the top")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
485 print(" of the config file? They should be at the bottom, see https://prosody.im/doc/configure#overview");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
486 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
487 if it.count(enabled_hosts()) == 0 then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
488 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
489 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
490 if it.count(it.filter("*", pairs(config))) == 0 then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
491 print(" No hosts are defined, please add at least one VirtualHost section")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
492 elseif config["*"]["enabled"] == false then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
493 print(" No hosts are enabled. Remove enabled = false from the global section or put enabled = true under at least one VirtualHost section")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
494 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
495 print(" All hosts are disabled. Remove enabled = false from at least one VirtualHost section")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
496 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
497 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
498 if not config["*"].modules_enabled then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
499 print(" No global modules_enabled is set?");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
500 local suggested_global_modules;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
501 for host, options in enabled_hosts() do --luacheck: ignore 213/host
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
502 if not options.component_module and options.modules_enabled then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 suggested_global_modules = set.intersection(suggested_global_modules or set.new(options.modules_enabled), set.new(options.modules_enabled));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 if suggested_global_modules and not suggested_global_modules:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 print(" Consider moving these modules into modules_enabled in the global section:")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 print(" "..tostring(suggested_global_modules / function (x) return ("%q"):format(x) end));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
510 print();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
512
13217
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
513 local function validate_module_list(host, name, modules)
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
514 if modules == nil then
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
515 return -- okay except for global section, checked separately
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
516 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
517 local t = type(modules)
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
518 if t ~= "table" then
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
519 print(" The " .. name .. " in the " .. host .. " section should not be a " .. t .. " but a list of strings, e.g.");
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
520 print(" " .. name .. " = { \"name_of_module\", \"another_plugin\", }")
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
521 print()
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
522 ok = false
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
523 return
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
524 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
525 for k, v in pairs(modules) do
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
526 if type(k) ~= "number" or type(v) ~= "string" then
13316
a27a329e93ca util.prosodyctl.check: Try to clarify check for misplaced k=v in modules_enabled (thanks aab and Menel)
Kim Alvefur <zash@zash.se>
parents: 13302
diff changeset
527 print(" The " .. name .. " in the " .. host .. " section should be a list of strings, e.g.");
13217
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
528 print(" " .. name .. " = { \"name_of_module\", \"another_plugin\", }")
13316
a27a329e93ca util.prosodyctl.check: Try to clarify check for misplaced k=v in modules_enabled (thanks aab and Menel)
Kim Alvefur <zash@zash.se>
parents: 13302
diff changeset
529 print(" It should not contain key = value pairs, try putting them outside the {} brackets.");
13217
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
530 ok = false
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
531 break
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
532 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
533 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
534 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
535
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
536 for host, options in enabled_hosts() do
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
537 validate_module_list(host, "modules_enabled", options.modules_enabled);
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
538 validate_module_list(host, "modules_disabled", options.modules_disabled);
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
539 end
b264ea91e930 util.prosodyctl.check: Validate format of module list options
Kim Alvefur <zash@zash.se>
parents: 13216
diff changeset
540
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
541 do -- Check for modules enabled both normally and as components
14043
d8a30fdfbddd util.prosodyctl.check: Fix #1978
Kim Alvefur <zash@zash.se>
parents: 14042
diff changeset
542 for host in enabled_hosts() do
d8a30fdfbddd util.prosodyctl.check: Fix #1978
Kim Alvefur <zash@zash.se>
parents: 14042
diff changeset
543 local modules, component_module = modulemanager.get_modules_for_host(host);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
544 if component_module and modules:contains(component_module) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
545 print((" mod_%s is enabled both in modules_enabled and as Component %q %q"):format(component_module, host, component_module));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
546 print(" This means the service is enabled on all VirtualHosts as well as the Component.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
547 print(" Are you sure this what you want? It may cause unexpected behaviour.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
548 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
549 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
550 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
551
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
552 -- Check for global options under hosts
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
553 local global_options = set.new(it.to_array(it.keys(config["*"])));
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
554 local obsolete_global_options = set.intersection(global_options, obsolete);
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
555 if not obsolete_global_options:empty() then
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
556 print("");
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
557 print(" You have some obsolete options you can remove from the global section:");
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
558 print(" "..tostring(obsolete_global_options))
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
559 ok = false;
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
560 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
561 local deprecated_global_options = set.intersection(global_options, deprecated);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
562 if not deprecated_global_options:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
563 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
564 print(" You have some deprecated options in the global section:");
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
565 for option in deprecated_global_options do
12158
7ff3699c1653 util.prosodyctl.check: Move word to ease future translations
Kim Alvefur <zash@zash.se>
parents: 12157
diff changeset
566 print((" '%s' -- %s"):format(option, deprecated_replacements[option]));
11798
ba88060fa145 util.prosodyctl.check: Suggest replacements for deprecated options #1684
Kim Alvefur <zash@zash.se>
parents: 11783
diff changeset
567 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
568 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
569 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
570 for host, options in it.filter(function (h) return h ~= "*" end, pairs(configmanager.getconfig())) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
571 local host_options = set.new(it.to_array(it.keys(options)));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
572 local misplaced_options = set.intersection(host_options, known_global_options);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
573 for name in pairs(options) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
574 if name:match("^interfaces?")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
575 or name:match("_ports?$") or name:match("_interfaces?$")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
576 or (name:match("_ssl$") and not name:match("^[cs]2s_ssl$")) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
577 misplaced_options:add(name);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
578 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
579 end
11799
8c9ec2db1d95 util.prosodyctl.check: Fix to not treat some options as misplaced
Kim Alvefur <zash@zash.se>
parents: 11798
diff changeset
580 -- FIXME These _could_ be misplaced, but we would have to check where the corresponding module is loaded to be sure
8c9ec2db1d95 util.prosodyctl.check: Fix to not treat some options as misplaced
Kim Alvefur <zash@zash.se>
parents: 11798
diff changeset
581 misplaced_options:exclude(set.new({ "external_service_port", "turn_external_port" }));
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
582 if not misplaced_options:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
583 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
584 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
585 local n = it.count(misplaced_options);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
586 print(" You have "..n.." option"..(n>1 and "s " or " ").."set under "..host.." that should be");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
587 print(" in the global section of the config file, above any VirtualHost or Component definitions,")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
588 print(" see https://prosody.im/doc/configure#overview for more information.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
589 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
590 print(" You need to move the following option"..(n>1 and "s" or "")..": "..table.concat(it.to_array(misplaced_options), ", "));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
591 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
592 end
14050
64cd905cb1de util.prosodyctl.check: Do not suggest renaming domain to public suffix
Kim Alvefur <zash@zash.se>
parents: 14048
diff changeset
593 local psl = have_psl and publicsuffix.latest(api("*"):get_option_string("public_suffix_file", nil));
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
594 for host, options in enabled_hosts() do
14045
76dba6ddf502 util.prosodyctl.check: Don't suggest renaming VirtualHost to bare TLD
Kim Alvefur <zash@zash.se>
parents: 13870
diff changeset
595 -- This is meant to prod people away from xmpp.example.com towards example.com,
76dba6ddf502 util.prosodyctl.check: Don't suggest renaming VirtualHost to bare TLD
Kim Alvefur <zash@zash.se>
parents: 13870
diff changeset
596 -- but will not do the right thing with second level hierarchies like .co.uk
14050
64cd905cb1de util.prosodyctl.check: Do not suggest renaming domain to public suffix
Kim Alvefur <zash@zash.se>
parents: 14048
diff changeset
597 -- unless lua-psl is installed
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
598 local host_options = set.new(it.to_array(it.keys(options)));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
599 local subdomain = host:match("^[^.]+");
14045
76dba6ddf502 util.prosodyctl.check: Don't suggest renaming VirtualHost to bare TLD
Kim Alvefur <zash@zash.se>
parents: 13870
diff changeset
600 local suggestion = host:gsub("^[^.]+%.", "");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
601 if not(host_options:contains("component_module")) and (subdomain == "jabber" or subdomain == "xmpp"
14050
64cd905cb1de util.prosodyctl.check: Do not suggest renaming domain to public suffix
Kim Alvefur <zash@zash.se>
parents: 14048
diff changeset
602 or subdomain == "chat" or subdomain == "im") and (suggestion:match("%.") or psl and not psl:is_public_suffix(suggestion)) then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
603 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
604 print(" Suggestion: If "..host.. " is a new host with no real users yet, consider renaming it now to");
14045
76dba6ddf502 util.prosodyctl.check: Don't suggest renaming VirtualHost to bare TLD
Kim Alvefur <zash@zash.se>
parents: 13870
diff changeset
605 print(" "..suggestion..". You can use SRV records to redirect XMPP clients and servers to "..host..".");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
606 print(" For more information see: https://prosody.im/doc/dns");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
607 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
608 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
609 local all_modules = set.new(config["*"].modules_enabled);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
610 local all_options = set.new(it.to_array(it.keys(config["*"])));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
611 for host in enabled_hosts() do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
612 all_options:include(set.new(it.to_array(it.keys(config[host]))));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
613 all_modules:include(set.new(config[host].modules_enabled));
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
614 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
615 for mod in all_modules do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
616 if mod:match("^mod_") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
617 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
618 print(" Modules in modules_enabled should not have the 'mod_' prefix included.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
619 print(" Change '"..mod.."' to '"..mod:match("^mod_(.*)").."'.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
620 elseif mod:match("^auth_") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
621 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
622 print(" Authentication modules should not be added to modules_enabled,");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
623 print(" but be specified in the 'authentication' option.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
624 print(" Remove '"..mod.."' from modules_enabled and instead add");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625 print(" authentication = '"..mod:match("^auth_(.*)").."'");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626 print(" For more information see https://prosody.im/doc/authentication");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
627 elseif mod:match("^storage_") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 print(" storage modules should not be added to modules_enabled,");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 print(" but be specified in the 'storage' option.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631 print(" Remove '"..mod.."' from modules_enabled and instead add");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
632 print(" storage = '"..mod:match("^storage_(.*)").."'");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
633 print(" For more information see https://prosody.im/doc/storage");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636 if all_modules:contains("vcard") and all_modules:contains("vcard_legacy") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
638 print(" Both mod_vcard_legacy and mod_vcard are enabled but they conflict");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639 print(" with each other. Remove one.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
640 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
641 if all_modules:contains("pep") and all_modules:contains("pep_simple") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
642 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 print(" Both mod_pep_simple and mod_pep are enabled but they conflict");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644 print(" with each other. Remove one.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
645 end
13690
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
646 if all_modules:contains("posix") then
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
647 print("");
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
648 print(" mod_posix is loaded in your configuration file, but it has");
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
649 print(" been deprecated. You can safely remove it.");
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
650 end
13841
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
651 if all_modules:contains("admin_telnet") then
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
652 print("");
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
653 print(" mod_admin_telnet is being replaced by mod_admin_shell (prosodyctl shell).");
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
654 print(" To update and ensure all commands are available, simply change \"admin_telnet\" to \"admin_shell\"");
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
655 print(" in your modules_enabled list.");
d01cfbb7fc4f prosodyctl check config: add recommendation to switch from admin_telnet to shell
Matthew Wild <mwild1@gmail.com>
parents: 13830
diff changeset
656 end
13690
d112eac6a3dc prosodyctl: check: Warn about deprecated mod_posix
Matthew Wild <mwild1@gmail.com>
parents: 13581
diff changeset
657
13830
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
658 local load_failures = {};
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
659 for mod_name in all_modules do
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
660 local mod, err = modulemanager.loader:load_resource(mod_name, nil);
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
661 if not mod then
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
662 load_failures[mod_name] = err;
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
663 end
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
664 end
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
665
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
666 if next(load_failures) ~= nil then
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
667 print("");
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
668 print(" The following modules failed to load:");
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
669 print("");
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
670 for mod_name, err in it.sorted_pairs(load_failures) do
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
671 print((" mod_%s: %s"):format(mod_name, err));
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
672 end
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
673 print("")
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
674 print(" Check for typos and remove any obsolete/incompatible modules from your config.");
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
675 end
145b71d1283c prosodyctl check config: List modules which Prosody cannot successfully load
Matthew Wild <mwild1@gmail.com>
parents: 13811
diff changeset
676
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677 for host, host_config in pairs(config) do --luacheck: ignore 213/host
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
678 if type(rawget(host_config, "storage")) == "string" and rawget(host_config, "default_storage") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
679 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680 print(" The 'default_storage' option is not needed if 'storage' is set to a string.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
681 break;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
682 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
683 end
13778
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
684
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
685 for host, host_config in pairs(config) do --luacheck: ignore 213/host
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
686 if type(rawget(host_config, "storage")) == "string" and rawget(host_config, "default_storage") then
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
687 print("");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
688 print(" The 'default_storage' option is not needed if 'storage' is set to a string.");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
689 break;
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
690 end
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
691 end
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
692
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 local require_encryption = set.intersection(all_options, set.new({
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 "require_encryption", "c2s_require_encryption", "s2s_require_encryption"
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 })):empty();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
696 local ssl = dependencies.softreq"ssl";
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
697 if not ssl then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
698 if not require_encryption then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
699 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
700 print(" You require encryption but LuaSec is not available.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
701 print(" Connections will fail.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
702 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
703 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 elseif not ssl.loadcertificate then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705 if all_options:contains("s2s_secure_auth") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
707 print(" You have set s2s_secure_auth but your version of LuaSec does ");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 print(" not support certificate validation, so all s2s connections will");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 print(" fail.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
711 elseif all_options:contains("s2s_secure_domains") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 local secure_domains = set.new();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 for host in enabled_hosts() do
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
714 if api(host):get_option_boolean("s2s_secure_auth") then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715 secure_domains:add("*");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
716 else
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
717 secure_domains:include(api(host):get_option_set("s2s_secure_domains", {}));
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
719 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
720 if not secure_domains:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
721 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
722 print(" You have set s2s_secure_domains but your version of LuaSec does ");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
723 print(" not support certificate validation, so s2s connections to/from ");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
724 print(" these domains will fail.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
725 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
726 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
727 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
728 elseif require_encryption and not all_modules:contains("tls") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
729 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
730 print(" You require encryption but mod_tls is not enabled.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
731 print(" Connections will fail.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
732 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
733 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
734
12317
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
735 do
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
736 local registration_enabled_hosts = {};
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
737 for host in enabled_hosts() do
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
738 local host_modules, component = modulemanager.get_modules_for_host(host);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
739 local hostapi = api(host);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
740 local allow_registration = hostapi:get_option_boolean("allow_registration", false);
12317
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
741 local mod_register = host_modules:contains("register");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
742 local mod_register_ibr = host_modules:contains("register_ibr");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
743 local mod_invites_register = host_modules:contains("invites_register");
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
744 local registration_invite_only = hostapi:get_option_boolean("registration_invite_only", true);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
745 local is_vhost = not component;
12317
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
746 if is_vhost and (mod_register_ibr or (mod_register and allow_registration))
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
747 and not (mod_invites_register and registration_invite_only) then
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
748 table.insert(registration_enabled_hosts, host);
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
749 end
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
750 end
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
751 if #registration_enabled_hosts > 0 then
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
752 table.sort(registration_enabled_hosts);
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
753 print("");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
754 print(" Public registration is enabled on:");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
755 print(" "..table.concat(registration_enabled_hosts, ", "));
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
756 print("");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
757 print(" If this is intentional, review our guidelines on running a public server");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
758 print(" at https://prosody.im/doc/public_servers - otherwise, consider switching to");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
759 print(" invite-based registration, which is more secure.");
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
760 end
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
761 end
b4f2027ef917 util.prosodyctl: Warn about enabled public registration in 'check config'
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
762
12318
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
763 do
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
764 local orphan_components = {};
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
765 local referenced_components = set.new();
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
766 local enabled_hosts_set = set.new();
13778
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
767 local invalid_disco_items = {};
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
768 for host in it.filter("*", pairs(configmanager.getconfig())) do
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
769 local hostapi = api(host);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
770 if hostapi:get_option_boolean("enabled", true) then
12318
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
771 enabled_hosts_set:add(host);
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
772 for _, disco_item in ipairs(hostapi:get_option_array("disco_items", {})) do
13778
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
773 if type(disco_item[1]) == "string" then
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
774 referenced_components:add(disco_item[1]);
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
775 else
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
776 invalid_disco_items[host] = true;
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
777 end
12318
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
778 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
779 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
780 end
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
781 for host in it.filter(skip_bare_jid_hosts, enabled_hosts()) do
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
782 local is_component = not not select(2, modulemanager.get_modules_for_host(host));
12318
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
783 if is_component then
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
784 local parent_domain = host:match("^[^.]+%.(.+)$");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
785 local is_orphan = not (enabled_hosts_set:contains(parent_domain) or referenced_components:contains(host));
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
786 if is_orphan then
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
787 table.insert(orphan_components, host);
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
788 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
789 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
790 end
13778
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
791
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
792 if next(invalid_disco_items) ~= nil then
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
793 print("");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
794 print(" Some hosts in your configuration file have an invalid 'disco_items' option.");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
795 print(" This may cause further errors, such as unreferenced components.");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
796 print("");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
797 for host in it.sorted_pairs(invalid_disco_items) do
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
798 print(" - "..host);
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
799 end
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
800 print("");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
801 end
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
802
12318
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
803 if #orphan_components > 0 then
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
804 table.sort(orphan_components);
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
805 print("");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
806 print(" Your configuration contains the following unreferenced components:\n");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
807 print(" "..table.concat(orphan_components, "\n "));
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
808 print("");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
809 print(" Clients may not be able to discover these services because they are not linked to");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
810 print(" any VirtualHost. They are automatically linked if they are direct subdomains of a");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
811 print(" VirtualHost. Alternatively, you can explicitly link them using the disco_items option.");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
812 print(" For more information see https://prosody.im/doc/modules/mod_disco#items");
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
813 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
814 end
239ce74aa6a4 util.prosodyctl: check: warn about unreferenced components, suggest disco_items
Matthew Wild <mwild1@gmail.com>
parents: 12317
diff changeset
815
13465
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
816 -- Check hostname validity
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
817 do
13466
5d9ec2e55d74 Merge 0.12->trunk
Matthew Wild <mwild1@gmail.com>
parents: 13327 13465
diff changeset
818 local idna = require "prosody.util.encodings".idna;
13465
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
819 local invalid_hosts = {};
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
820 local alabel_hosts = {};
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
821 for host in it.filter("*", pairs(configmanager.getconfig())) do
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
822 local _, h, _ = jid_split(host);
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
823 if not h or not idna.to_ascii(h) then
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
824 table.insert(invalid_hosts, host);
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
825 else
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
826 for label in h:gmatch("[^%.]+") do
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
827 if label:match("^xn%-%-") then
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
828 table.insert(alabel_hosts, host);
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
829 break;
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
830 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
831 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
832 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
833 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
834
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
835 if #invalid_hosts > 0 then
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
836 table.sort(invalid_hosts);
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
837 print("");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
838 print(" Your configuration contains invalid host names:");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
839 print(" "..table.concat(invalid_hosts, "\n "));
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
840 print("");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
841 print(" Clients may not be able to log in to these hosts, or you may not be able to");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
842 print(" communicate with remote servers.");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
843 print(" Use a valid domain name to correct this issue.");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
844 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
845
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
846 if #alabel_hosts > 0 then
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
847 table.sort(alabel_hosts);
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
848 print("");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
849 print(" Your configuration contains incorrectly-encoded hostnames:");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
850 for _, ahost in ipairs(alabel_hosts) do
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
851 print((" '%s' (should be '%s')"):format(ahost, idna.to_unicode(ahost)));
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
852 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
853 print("");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
854 print(" Clients may not be able to log in to these hosts, or you may not be able to");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
855 print(" communicate with remote servers.");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
856 print(" To correct this issue, use the Unicode version of the domain in Prosody's config file.");
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
857 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
858
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
859 if #invalid_hosts > 0 or #alabel_hosts > 0 then
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
860 print("");
13705
5f1eb8b14923 prosodyctl: check: Fix indentation in warning message
Matthew Wild <mwild1@gmail.com>
parents: 13690
diff changeset
861 print(" WARNING: Changing the name of a VirtualHost in Prosody's config file");
5f1eb8b14923 prosodyctl: check: Fix indentation in warning message
Matthew Wild <mwild1@gmail.com>
parents: 13690
diff changeset
862 print(" WILL NOT migrate any existing data (user accounts, etc.) to the new name.");
13465
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
863 ok = false;
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
864 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
865 end
54a936345aaa prosodyctl check: Warn about invalid domain names in the config file
Matthew Wild <mwild1@gmail.com>
parents: 13254
diff changeset
866
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
867 -- Check features
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
868 do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
869 local missing_features = {};
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
870 for host in enabled_user_hosts() do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
871 local all_features = checks.features(host, true);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
872 if not all_features then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
873 table.insert(missing_features, host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
874 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
875 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
876 if #missing_features > 0 then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
877 print("");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
878 print(" Some of your hosts may be missing features due to a lack of configuration.");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
879 print(" For more details, use the 'prosodyctl check features' command.");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
880 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
881 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
882
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
883 print("Done.\n");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
884 end
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
885 function checks.dns()
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
886 local dns = require "prosody.net.dns";
10971
3cdb4a7cb406 util.prosodyctl.check: Use net.unbound for DNS if available
Kim Alvefur <zash@zash.se>
parents: 10932
diff changeset
887 pcall(function ()
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
888 local unbound = require"prosody.net.unbound";
11645
3be346c5b940 util.prosodyctl.check: Reload unbound to ensure hosts.txt is ignored
Kim Alvefur <zash@zash.se>
parents: 11635
diff changeset
889 dns = unbound.dns;
10971
3cdb4a7cb406 util.prosodyctl.check: Use net.unbound for DNS if available
Kim Alvefur <zash@zash.se>
parents: 10932
diff changeset
890 end)
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
891 local idna = require "prosody.util.encodings".idna;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
892 local ip = require "prosody.util.ip";
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
893 local global = api("*");
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
894 local c2s_ports = global:get_option_set("c2s_ports", {5222});
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
895 local s2s_ports = global:get_option_set("s2s_ports", {5269});
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
896 local c2s_tls_ports = global:get_option_set("c2s_direct_tls_ports", {});
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
897 local s2s_tls_ports = global:get_option_set("s2s_direct_tls_ports", {});
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
899 local global_enabled = set.new();
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
900 for host in enabled_hosts() do
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
901 global_enabled:include(modulemanager.get_modules_for_host(host));
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
902 end
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
903 if global_enabled:contains("net_multiplex") then
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
904 local multiplex_ports = global:get_option_set("ports", {});
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
905 local multiplex_tls_ports = global:get_option_set("ssl_ports", {});
12230
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
906 if not multiplex_ports:empty() then
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
907 c2s_ports = c2s_ports + multiplex_ports;
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
908 s2s_ports = s2s_ports + multiplex_ports;
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
909 end
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
910 if not multiplex_tls_ports:empty() then
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
911 c2s_tls_ports = c2s_tls_ports + multiplex_tls_ports;
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
912 s2s_tls_ports = s2s_tls_ports + multiplex_tls_ports;
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
913 end
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
914 end
f590058d8d99 util.prosodyctl.check: Include multiplexed ports in DNS checks #1704
Kim Alvefur <zash@zash.se>
parents: 12218
diff changeset
915
11776
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
916 local c2s_srv_required, s2s_srv_required, c2s_tls_srv_required, s2s_tls_srv_required;
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
917 if not c2s_ports:contains(5222) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 c2s_srv_required = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
919 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
920 if not s2s_ports:contains(5269) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
921 s2s_srv_required = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
922 end
11615
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
923 if not c2s_tls_ports:empty() then
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
924 c2s_tls_srv_required = true;
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
925 end
11776
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
926 if not s2s_tls_ports:empty() then
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
927 s2s_tls_srv_required = true;
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
928 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
929
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
930 local problem_hosts = set.new();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
931
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
932 local external_addresses, internal_addresses = set.new(), set.new();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
933
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
934 local fqdn = socket.dns.tohostname(socket.dns.gethostname());
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
935 if fqdn then
13121
332e95f75dbb util.prosodyctl.check: Fix error where hostname can't be turned into A label
Kim Alvefur <zash@zash.se>
parents: 12898
diff changeset
936 local fqdn_a = idna.to_ascii(fqdn);
332e95f75dbb util.prosodyctl.check: Fix error where hostname can't be turned into A label
Kim Alvefur <zash@zash.se>
parents: 12898
diff changeset
937 if fqdn_a then
332e95f75dbb util.prosodyctl.check: Fix error where hostname can't be turned into A label
Kim Alvefur <zash@zash.se>
parents: 12898
diff changeset
938 local res = dns.lookup(fqdn_a, "A");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
939 if res then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
940 for _, record in ipairs(res) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 external_addresses:add(record.a);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
942 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 end
13121
332e95f75dbb util.prosodyctl.check: Fix error where hostname can't be turned into A label
Kim Alvefur <zash@zash.se>
parents: 12898
diff changeset
945 if fqdn_a then
332e95f75dbb util.prosodyctl.check: Fix error where hostname can't be turned into A label
Kim Alvefur <zash@zash.se>
parents: 12898
diff changeset
946 local res = dns.lookup(fqdn_a, "AAAA");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
947 if res then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
948 for _, record in ipairs(res) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
949 external_addresses:add(record.aaaa);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
950 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
951 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
952 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
953 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
954
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
955 local local_addresses = require"prosody.util.net".local_addresses() or {};
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
956
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
957 for addr in it.values(local_addresses) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
958 if not ip.new_ip(addr).private then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
959 external_addresses:add(addr);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
960 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
961 internal_addresses:add(addr);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
962 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
963 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
964
12320
f0be98bab9dd prosodyctl: check dns: Allow admin to specify undiscoverable external IPs in config
Matthew Wild <mwild1@gmail.com>
parents: 12319
diff changeset
965 -- Allow admin to specify additional (e.g. undiscoverable) IP addresses in the config
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
966 for _, address in ipairs(global:get_option_array("external_addresses", {})) do
12320
f0be98bab9dd prosodyctl: check dns: Allow admin to specify undiscoverable external IPs in config
Matthew Wild <mwild1@gmail.com>
parents: 12319
diff changeset
967 external_addresses:add(address);
f0be98bab9dd prosodyctl: check dns: Allow admin to specify undiscoverable external IPs in config
Matthew Wild <mwild1@gmail.com>
parents: 12319
diff changeset
968 end
f0be98bab9dd prosodyctl: check dns: Allow admin to specify undiscoverable external IPs in config
Matthew Wild <mwild1@gmail.com>
parents: 12319
diff changeset
969
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
970 if external_addresses:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
971 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
972 print(" Failed to determine the external addresses of this server. Checks may be inaccurate.");
13219
22763b30e458 util.prosodyctl.check: Hint about the 'external_addresses' config option
Kim Alvefur <zash@zash.se>
parents: 13217
diff changeset
973 print(" If you know the correct external addresses you can specify them in the config like:")
22763b30e458 util.prosodyctl.check: Hint about the 'external_addresses' config option
Kim Alvefur <zash@zash.se>
parents: 13217
diff changeset
974 print(" external_addresses = { \"192.0.2.34\", \"2001:db8::abcd:1234\" }")
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
975 c2s_srv_required, s2s_srv_required = true, true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
976 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
977
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
978 local v6_supported = not not socket.tcp6;
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
979 local use_ipv4 = global:get_option_boolean("use_ipv4", true);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
980 local use_ipv6 = global:get_option_boolean("use_ipv6", true);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
981
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
982 local function trim_dns_name(n)
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
983 return (n:gsub("%.$", ""));
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
984 end
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
985
12319
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
986 local unknown_addresses = set.new();
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
987
13708
9f8e9aabc00b prosodyctl: check: Skip DNS checks for known invalid domains (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 13707
diff changeset
988 local function is_valid_domain(domain)
9f8e9aabc00b prosodyctl: check: Skip DNS checks for known invalid domains (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 13707
diff changeset
989 return idna.to_ascii(domain) ~= nil;
9f8e9aabc00b prosodyctl: check: Skip DNS checks for known invalid domains (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 13707
diff changeset
990 end
9f8e9aabc00b prosodyctl: check: Skip DNS checks for known invalid domains (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 13707
diff changeset
991
9f8e9aabc00b prosodyctl: check: Skip DNS checks for known invalid domains (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 13707
diff changeset
992 for jid in it.filter(is_valid_domain, enabled_hosts()) do
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
993 local all_targets_ok, some_targets_ok = true, false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
994 local node, host = jid_split(jid);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
995
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
996 local modules, component_module = modulemanager.get_modules_for_host(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
997 if component_module then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
998 modules:add(component_module);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
999 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1000
12842
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1001 -- TODO Refactor these DNS SRV checks since they are very similar
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1002 -- FIXME Suggest concrete actionable steps to correct issues so that
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1003 -- users don't have to copy-paste the message into the support chat and
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1004 -- ask what to do about it.
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1005 local is_component = not not component_module;
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1006 print("Checking DNS for "..(is_component and "component" or "host").." "..jid.."...");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1007 if node then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1008 print("Only the domain part ("..host..") is used in DNS.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1009 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1010 local target_hosts = set.new();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1011 if modules:contains("c2s") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1012 local res = dns.lookup("_xmpp-client._tcp."..idna.to_ascii(host)..".", "SRV");
11613
c8a9f77d48fd util.prosodyctl.check: Fix for net.dns vs unbound API difference
Kim Alvefur <zash@zash.se>
parents: 11612
diff changeset
1013 if res and #res > 0 then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1014 for _, record in ipairs(res) do
10932
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1015 if record.srv.target == "." then -- TODO is this an error if mod_c2s is enabled?
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1016 print(" 'xmpp-client' service disabled by pointing to '.'"); -- FIXME Explain better what this is
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1017 break;
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1018 end
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1019 local target = trim_dns_name(record.srv.target);
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1020 target_hosts:add(target);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1021 if not c2s_ports:contains(record.srv.port) then
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1022 print(" SRV target "..target.." contains unknown client port: "..record.srv.port);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1023 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1024 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1025 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1026 if c2s_srv_required then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1027 print(" No _xmpp-client SRV record found for "..host..", but it looks like you need one.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1028 all_targets_ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1029 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1030 target_hosts:add(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1031 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1032 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1033 end
12842
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1034 if modules:contains("c2s") then
11615
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1035 local res = dns.lookup("_xmpps-client._tcp."..idna.to_ascii(host)..".", "SRV");
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1036 if res and #res > 0 then
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1037 for _, record in ipairs(res) do
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1038 if record.srv.target == "." then -- TODO is this an error if mod_c2s is enabled?
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1039 print(" 'xmpps-client' service disabled by pointing to '.'"); -- FIXME Explain better what this is
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1040 break;
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1041 end
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1042 local target = trim_dns_name(record.srv.target);
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1043 target_hosts:add(target);
11615
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1044 if not c2s_tls_ports:contains(record.srv.port) then
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1045 print(" SRV target "..target.." contains unknown Direct TLS client port: "..record.srv.port);
11615
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1046 end
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1047 end
12842
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1048 elseif c2s_tls_srv_required then
11615
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1049 print(" No _xmpps-client SRV record found for "..host..", but it looks like you need one.");
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1050 all_targets_ok = false;
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1051 end
8e16fd976c57 util.prosodyctl.check: Add support for checking Direct TLS SRV records
Kim Alvefur <zash@zash.se>
parents: 11613
diff changeset
1052 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1053 if modules:contains("s2s") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1054 local res = dns.lookup("_xmpp-server._tcp."..idna.to_ascii(host)..".", "SRV");
11613
c8a9f77d48fd util.prosodyctl.check: Fix for net.dns vs unbound API difference
Kim Alvefur <zash@zash.se>
parents: 11612
diff changeset
1055 if res and #res > 0 then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1056 for _, record in ipairs(res) do
10932
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1057 if record.srv.target == "." then -- TODO Is this an error if mod_s2s is enabled?
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1058 print(" 'xmpp-server' service disabled by pointing to '.'"); -- FIXME Explain better what this is
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1059 break;
ea4a7619058f util.prosodyctl.check: Fix traceback by handling SRV '.' target to
Kim Alvefur <zash@zash.se>
parents: 10871
diff changeset
1060 end
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1061 local target = trim_dns_name(record.srv.target);
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1062 target_hosts:add(target);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1063 if not s2s_ports:contains(record.srv.port) then
11655
bbf50525faa5 util.prosodyctl.check: Normalize away trailing dot in some messages too
Kim Alvefur <zash@zash.se>
parents: 11654
diff changeset
1064 print(" SRV target "..target.." contains unknown server port: "..record.srv.port);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1065 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1066 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1067 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1068 if s2s_srv_required then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1069 print(" No _xmpp-server SRV record found for "..host..", but it looks like you need one.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1070 all_targets_ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1071 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1072 target_hosts:add(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1073 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1074 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1075 end
12842
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1076 if modules:contains("s2s") then
11776
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1077 local res = dns.lookup("_xmpps-server._tcp."..idna.to_ascii(host)..".", "SRV");
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1078 if res and #res > 0 then
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1079 for _, record in ipairs(res) do
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1080 if record.srv.target == "." then -- TODO is this an error if mod_s2s is enabled?
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1081 print(" 'xmpps-server' service disabled by pointing to '.'"); -- FIXME Explain better what this is
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1082 break;
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1083 end
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1084 local target = trim_dns_name(record.srv.target);
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1085 target_hosts:add(target);
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1086 if not s2s_tls_ports:contains(record.srv.port) then
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1087 print(" SRV target "..target.." contains unknown Direct TLS server port: "..record.srv.port);
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1088 end
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1089 end
12842
3edd39c55a8a prosodyctl check dns: Check for Direct TLS SRV records even if not configured (fix #1793)
Kim Alvefur <zash@zash.se>
parents: 12520
diff changeset
1090 elseif s2s_tls_srv_required then
11776
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1091 print(" No _xmpps-server SRV record found for "..host..", but it looks like you need one.");
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1092 all_targets_ok = false;
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1093 end
1132a1f1ca5a util.prosodyctl.check: Check for server-to-server Direct TLS records
Kim Alvefur <zash@zash.se>
parents: 11655
diff changeset
1094 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1095 if target_hosts:empty() then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1096 target_hosts:add(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1097 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1098
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1099 if target_hosts:contains("localhost") then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1100 print(" Target 'localhost' cannot be accessed from other servers");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1101 target_hosts:remove("localhost");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1102 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1103
13870
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1104 local function check_record(name, rtype)
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1105 local res, err = dns.lookup(name, rtype);
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1106 if err then
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1107 print(" Problem looking up "..rtype.." record for '"..name.."': "..err);
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1108 elseif res and res.bogus then
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1109 print(" Problem looking up "..rtype.." record for '"..name.."': "..res.bogus);
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1110 elseif res and res.rcode and res.rcode ~= 0 and res.rcode ~= 3 then
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1111 print(" Problem looking up "..rtype.." record for '"..name.."': "..res.status);
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1112 end
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1113 return res and #res > 0;
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1114 end
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1115
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1116 local function check_address(target)
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1117 local prob = {};
13870
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1118 local aname = idna.to_ascii(target);
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1119 if not aname then
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1120 print(" '" .. target .. "' is not a valid hostname");
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1121 return prob;
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1122 end
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1123 if use_ipv4 and not check_record(aname, "A") then table.insert(prob, "A"); end
8078eebf5601 util.prosodyctl.check: Improve reporting of DNS lookup problems
Kim Alvefur <zash@zash.se>
parents: 13841
diff changeset
1124 if use_ipv6 and not check_record(aname, "AAAA") then table.insert(prob, "AAAA"); end
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1125 return prob;
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1126 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1127
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1128 if modules:contains("proxy65") then
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1129 local proxy65_target = api(host):get_option_string("proxy65_address", host);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1130 if type(proxy65_target) == "string" then
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1131 local prob = check_address(proxy65_target);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1132 if #prob > 0 then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1133 print(" File transfer proxy "..proxy65_target.." has no "..table.concat(prob, "/")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1134 .." record. Create one or set 'proxy65_address' to the correct host/IP.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1135 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1136 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1137 print(" proxy65_address for "..host.." should be set to a string, unable to perform DNS check");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1138 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1139 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1140
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1141 local known_http_modules = set.new { "bosh"; "http_files"; "http_file_share"; "http_openmetrics"; "websocket" };
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1142
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1143 if modules:contains("http") or not set.intersection(modules, known_http_modules):empty()
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1144 or contains_match(modules, "^http_") or contains_match(modules, "_web$") then
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1145
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1146 local http_host = api(host):get_option_string("http_host", host);
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1147 local http_internal_host = http_host;
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1148 local http_url = api(host):get_option_string("http_external_url");
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1149 if http_url then
14079
0ea2848d7771 prosodyctl: Only import "socket" in the root of the module
Link Mauve <linkmauve@linkmauve.fr>
parents: 14050
diff changeset
1150 local external_url_parts = socket_url.parse(http_url);
12217
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1151 if external_url_parts then
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1152 http_host = external_url_parts.host;
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1153 else
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1154 print(" The 'http_external_url' setting is not a valid URL");
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1155 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1156 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1157
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1158 local prob = check_address(http_host);
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1159 if #prob > 1 then
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1160 print(" HTTP service " .. http_host .. " has no " .. table.concat(prob, "/") .. " record. Create one or change "
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1161 .. (http_url and "'http_external_url'" or "'http_host'").." to the correct host.");
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1162 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1163
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1164 if http_host ~= http_internal_host then
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1165 print(" Ensure the reverse proxy sets the HTTP Host header to '" .. http_internal_host .. "'");
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1166 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1167 end
39043233de04 util.prosodyctl.check: Add HTTP related DNS checks
Kim Alvefur <zash@zash.se>
parents: 12159
diff changeset
1168
11652
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1169 if not use_ipv4 and not use_ipv6 then
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1170 print(" Both IPv6 and IPv4 are disabled, Prosody will not listen on any ports");
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1171 print(" nor be able to connect to any remote servers.");
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1172 all_targets_ok = false;
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1173 end
887d7b15e21b util.prosodyctl.check: Warn if both use_ipv4 and use_ipv6 are set to false
Kim Alvefur <zash@zash.se>
parents: 11651
diff changeset
1174
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1175 for target_host in target_hosts do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1176 local host_ok_v4, host_ok_v6;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1177 do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1178 local res = dns.lookup(idna.to_ascii(target_host), "A");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1179 if res then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1180 for _, record in ipairs(res) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1181 if external_addresses:contains(record.a) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1182 some_targets_ok = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1183 host_ok_v4 = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1184 elseif internal_addresses:contains(record.a) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1185 host_ok_v4 = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1186 some_targets_ok = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1187 print(" "..target_host.." A record points to internal address, external connections might fail");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1188 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1189 print(" "..target_host.." A record points to unknown address "..record.a);
12319
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1190 unknown_addresses:add(record.a);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1191 all_targets_ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1192 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1193 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1194 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1195 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1196 do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1197 local res = dns.lookup(idna.to_ascii(target_host), "AAAA");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1198 if res then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1199 for _, record in ipairs(res) do
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1200 if external_addresses:contains(record.aaaa) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1201 some_targets_ok = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1202 host_ok_v6 = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1203 elseif internal_addresses:contains(record.aaaa) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1204 host_ok_v6 = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1205 some_targets_ok = true;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1206 print(" "..target_host.." AAAA record points to internal address, external connections might fail");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1207 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1208 print(" "..target_host.." AAAA record points to unknown address "..record.aaaa);
12319
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1209 unknown_addresses:add(record.aaaa);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1210 all_targets_ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1211 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1212 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1213 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1214 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1215
11653
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1216 if host_ok_v4 and not use_ipv4 then
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1217 print(" Host "..target_host.." does seem to resolve to this server but IPv4 has been disabled");
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1218 all_targets_ok = false;
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1219 end
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1220
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1221 if host_ok_v6 and not use_ipv6 then
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1222 print(" Host "..target_host.." does seem to resolve to this server but IPv6 has been disabled");
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1223 all_targets_ok = false;
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1224 end
51141309ffc4 util.prosodyctl.check: Point out if A/AAAA exists despite disabled IPvX
Kim Alvefur <zash@zash.se>
parents: 11652
diff changeset
1225
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1226 local bad_protos = {}
11651
c9f46d28ed7e util.prosodyctl.check: Silence IP protocol mismatches when disabled
Kim Alvefur <zash@zash.se>
parents: 11645
diff changeset
1227 if use_ipv4 and not host_ok_v4 then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1228 table.insert(bad_protos, "IPv4");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1229 end
11651
c9f46d28ed7e util.prosodyctl.check: Silence IP protocol mismatches when disabled
Kim Alvefur <zash@zash.se>
parents: 11645
diff changeset
1230 if use_ipv6 and not host_ok_v6 then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1231 table.insert(bad_protos, "IPv6");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1232 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1233 if #bad_protos > 0 then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1234 print(" Host "..target_host.." does not seem to resolve to this server ("..table.concat(bad_protos, "/")..")");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1235 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1236 if host_ok_v6 and not v6_supported then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1237 print(" Host "..target_host.." has AAAA records, but your version of LuaSocket does not support IPv6.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1238 print(" Please see https://prosody.im/doc/ipv6 for more information.");
11925
3e0d03a74285 util.prosodyctl.check: Highlight inconsistency of AAAA records and use_ipv6=false
Kim Alvefur <zash@zash.se>
parents: 11924
diff changeset
1239 elseif host_ok_v6 and not use_ipv6 then
3e0d03a74285 util.prosodyctl.check: Highlight inconsistency of AAAA records and use_ipv6=false
Kim Alvefur <zash@zash.se>
parents: 11924
diff changeset
1240 print(" Host "..target_host.." has AAAA records, but IPv6 is disabled.");
3e0d03a74285 util.prosodyctl.check: Highlight inconsistency of AAAA records and use_ipv6=false
Kim Alvefur <zash@zash.se>
parents: 11924
diff changeset
1241 -- TODO Tell them to drop the AAAA records or enable IPv6?
3e0d03a74285 util.prosodyctl.check: Highlight inconsistency of AAAA records and use_ipv6=false
Kim Alvefur <zash@zash.se>
parents: 11924
diff changeset
1242 print(" Please see https://prosody.im/doc/ipv6 for more information.");
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1243 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1244 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1245 if not all_targets_ok then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1246 print(" "..(some_targets_ok and "Only some" or "No").." targets for "..host.." appear to resolve to this server.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1247 if is_component then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1248 print(" DNS records are necessary if you want users on other servers to access this component.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1249 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1250 problem_hosts:add(host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1251 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1252 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1253 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1254 if not problem_hosts:empty() then
12319
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1255 if not unknown_addresses:empty() then
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1256 print("");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1257 print("Some of your DNS records point to unknown IP addresses. This may be expected if your server");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1258 print("is behind a NAT or proxy. The unrecognized addresses were:");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1259 print("");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1260 print(" Unrecognized: "..tostring(unknown_addresses));
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1261 print("");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1262 print("The addresses we found on this system are:");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1263 print("");
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1264 print(" Internal: "..tostring(internal_addresses));
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1265 print(" External: "..tostring(external_addresses));
13219
22763b30e458 util.prosodyctl.check: Hint about the 'external_addresses' config option
Kim Alvefur <zash@zash.se>
parents: 13217
diff changeset
1266 print("")
22763b30e458 util.prosodyctl.check: Hint about the 'external_addresses' config option
Kim Alvefur <zash@zash.se>
parents: 13217
diff changeset
1267 print("If the list of external external addresses is incorrect you can specify correct addresses in the config:")
22763b30e458 util.prosodyctl.check: Hint about the 'external_addresses' config option
Kim Alvefur <zash@zash.se>
parents: 13217
diff changeset
1268 print(" external_addresses = { \"192.0.2.34\", \"2001:db8::abcd:1234\" }")
12319
8fc3c06f922d prosodyctl: check dns: List discovered addresses for diagnostic purposes
Matthew Wild <mwild1@gmail.com>
parents: 12318
diff changeset
1269 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1270 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1271 print("For more information about DNS configuration please see https://prosody.im/doc/dns");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1272 print("");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1273 ok = false;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1274 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1275 end
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1276 function checks.certs()
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1277 local cert_ok;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1278 print"Checking certificates..."
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
1279 local x509_verify_identity = require"prosody.util.x509".verify_identity;
13302
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1280 local use_dane = configmanager.get("*", "use_dane");
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1281 local pem2der = require"prosody.util.x509".pem2der;
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1282 local sha256 = require"prosody.util.hashes".sha256;
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12899
diff changeset
1283 local create_context = require "prosody.core.certmanager".create_context;
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1284 local ssl = dependencies.softreq"ssl";
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1285 -- local datetime_parse = require"util.datetime".parse_x509;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1286 local load_cert = ssl and ssl.loadcertificate;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1287 -- or ssl.cert_from_pem
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1288 if not ssl then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1289 print("LuaSec not available, can't perform certificate checks")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1290 if what == "certs" then cert_ok = false end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1291 elseif not load_cert then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1292 print("This version of LuaSec (" .. ssl._VERSION .. ") does not support certificate checking");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1293 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1294 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1295 for host in it.filter(skip_bare_jid_hosts, enabled_hosts()) do
13324
6f371066d6e0 util.prosodyctl.check: Simplify conditions for c2s and s2s cert checks
Kim Alvefur <zash@zash.se>
parents: 13316
diff changeset
1296 local modules = modulemanager.get_modules_for_host(host);
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1297 print("Checking certificate for "..host);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1298 -- First, let's find out what certificate this host uses.
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1299 local host_ssl_config = configmanager.rawget(host, "ssl")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1300 or configmanager.rawget(host:match("%.(.*)"), "ssl");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1301 local global_ssl_config = configmanager.rawget("*", "ssl");
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1302 local ctx_ok, err, ssl_config = create_context(host, "server", host_ssl_config, global_ssl_config);
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1303 if not ctx_ok then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1304 print(" Error: "..err);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1305 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1306 elseif not ssl_config.certificate then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1307 print(" No 'certificate' found for "..host)
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1308 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1309 elseif not ssl_config.key then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1310 print(" No 'key' found for "..host)
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1311 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1312 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1313 local key, err = io.open(ssl_config.key); -- Permissions check only
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1314 if not key then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1315 print(" Could not open "..ssl_config.key..": "..err);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1316 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1317 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1318 key:close();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1319 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1320 local cert_fh, err = io.open(ssl_config.certificate); -- Load the file.
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1321 if not cert_fh then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1322 print(" Could not open "..ssl_config.certificate..": "..err);
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1323 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1324 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1325 print(" Certificate: "..ssl_config.certificate)
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1326 local cert = load_cert(cert_fh:read"*a"); cert_fh:close();
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1327 if not cert:validat(os.time()) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1328 print(" Certificate has expired.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1329 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1330 elseif not cert:validat(os.time() + 86400) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1331 print(" Certificate expires within one day.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1332 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1333 elseif not cert:validat(os.time() + 86400*7) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1334 print(" Certificate expires within one week.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1335 elseif not cert:validat(os.time() + 86400*31) then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1336 print(" Certificate expires within one month.")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1337 end
13324
6f371066d6e0 util.prosodyctl.check: Simplify conditions for c2s and s2s cert checks
Kim Alvefur <zash@zash.se>
parents: 13316
diff changeset
1338 if modules:contains("c2s") and not x509_verify_identity(host, "_xmpp-client", cert) then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1339 print(" Not valid for client connections to "..host..".")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1340 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1341 end
13325
f32faaea3461 util.prosodyctl.check: Update conditions for s2s cert checks
Kim Alvefur <zash@zash.se>
parents: 13324
diff changeset
1342 local anon = api(host):get_option_string("authentication", "internal_hashed") == "anonymous";
f32faaea3461 util.prosodyctl.check: Update conditions for s2s cert checks
Kim Alvefur <zash@zash.se>
parents: 13324
diff changeset
1343 local anon_s2s = api(host):get_option_boolean("allow_anonymous_s2s", false);
f32faaea3461 util.prosodyctl.check: Update conditions for s2s cert checks
Kim Alvefur <zash@zash.se>
parents: 13324
diff changeset
1344 if modules:contains("s2s") and (anon_s2s or not anon) and not x509_verify_identity(host, "_xmpp-server", cert) then
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1345 print(" Not valid for server-to-server connections to "..host..".")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1346 cert_ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1347 end
13326
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1348
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1349 local known_http_modules = set.new { "bosh"; "http_files"; "http_file_share"; "http_openmetrics"; "websocket" };
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1350 local http_loaded = modules:contains("http")
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1351 or not set.intersection(modules, known_http_modules):empty()
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1352 or contains_match(modules, "^http_")
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1353 or contains_match(modules, "_web$");
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1354
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1355 local http_host = api(host):get_option_string("http_host", host);
13327
f0fc6e7cc4de util.prosodyctl.check: Disable https cert check if http_external_url set
Kim Alvefur <zash@zash.se>
parents: 13326
diff changeset
1356 if api(host):get_option_string("http_external_url") then
f0fc6e7cc4de util.prosodyctl.check: Disable https cert check if http_external_url set
Kim Alvefur <zash@zash.se>
parents: 13326
diff changeset
1357 -- Assumed behind a reverse proxy
f0fc6e7cc4de util.prosodyctl.check: Disable https cert check if http_external_url set
Kim Alvefur <zash@zash.se>
parents: 13326
diff changeset
1358 http_loaded = false;
f0fc6e7cc4de util.prosodyctl.check: Disable https cert check if http_external_url set
Kim Alvefur <zash@zash.se>
parents: 13326
diff changeset
1359 end
13326
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1360 if http_loaded and not x509_verify_identity(http_host, nil, cert) then
13811
83478fc0806b prosodyctl check certs: Use correct hostname in warning message about HTTPS
Matthew Wild <mwild1@gmail.com>
parents: 13778
diff changeset
1361 print(" Not valid for HTTPS connections to "..http_host..".")
13326
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1362 cert_ok = false
76b6556c0f67 util.prosodyctl.check: Check cert for HTTPS if http module enabled
Kim Alvefur <zash@zash.se>
parents: 13325
diff changeset
1363 end
13302
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1364 if use_dane then
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1365 if cert.pubkey then
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1366 print(" DANE: TLSA 3 1 1 "..sha256(pem2der(cert:pubkey()), true))
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1367 elseif cert.pem then
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1368 print(" DANE: TLSA 3 0 1 "..sha256(pem2der(cert:pem()), true))
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1369 end
30b7cd40ee14 util.prosodyctl.check: Print DANE TLSA records for certificates
Kim Alvefur <zash@zash.se>
parents: 13301
diff changeset
1370 end
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1371 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1372 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1373 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1374 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1375 if cert_ok == false then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1376 print("")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1377 print("For more information about certificates please see https://prosody.im/doc/certificates");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1378 ok = false
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1379 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1380 print("")
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1381 end
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1382 -- intentionally not doing this by default
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1383 function checks.connectivity()
11782
d93107de52dd util.prosodyctl.check: Ignore unused "ok" variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 11780
diff changeset
1384 local _, prosody_is_running = is_prosody_running();
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1385 if api("*"):get_option_string("pidfile") and not prosody_is_running then
11780
98ae95235775 util.prosodyctl.check: Refuse to do ojn test unless prosody is running
Kim Alvefur <zash@zash.se>
parents: 11779
diff changeset
1386 print("Prosody does not appear to be running, which is required for this test.");
98ae95235775 util.prosodyctl.check: Refuse to do ojn test unless prosody is running
Kim Alvefur <zash@zash.se>
parents: 11779
diff changeset
1387 print("Start it and then try again.");
98ae95235775 util.prosodyctl.check: Refuse to do ojn test unless prosody is running
Kim Alvefur <zash@zash.se>
parents: 11779
diff changeset
1388 return 1;
98ae95235775 util.prosodyctl.check: Refuse to do ojn test unless prosody is running
Kim Alvefur <zash@zash.se>
parents: 11779
diff changeset
1389 end
98ae95235775 util.prosodyctl.check: Refuse to do ojn test unless prosody is running
Kim Alvefur <zash@zash.se>
parents: 11779
diff changeset
1390
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1391 local checker = "observe.jabber.network";
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1392 local probe_instance;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1393 local probe_modules = {
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1394 ["xmpp-client"] = "c2s_normal_auth";
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1395 ["xmpp-server"] = "s2s_normal";
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1396 ["xmpps-client"] = nil; -- TODO
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1397 ["xmpps-server"] = nil; -- TODO
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1398 };
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1399 local probe_settings = api("*"):get_option_string("connectivity_probe");
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1400 if type(probe_settings) == "string" then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1401 probe_instance = probe_settings;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1402 elseif type(probe_settings) == "table" and type(probe_settings.url) == "string" then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1403 probe_instance = probe_settings.url;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1404 if type(probe_settings.modules) == "table" then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1405 probe_modules = probe_settings.modules;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1406 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1407 elseif probe_settings ~= nil then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1408 print("The 'connectivity_probe' setting not understood.");
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1409 print("Expected an URL or a table with 'url' and 'modules' fields");
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1410 print("See https://prosody.im/doc/prosodyctl#check for more information."); -- FIXME
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1411 return 1;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1412 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1413
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1414 local check_api;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1415 if probe_instance then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1416 local parsed_url = socket_url.parse(probe_instance);
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1417 if not parsed_url then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1418 print(("'connectivity_probe' is not a valid URL: %q"):format(probe_instance));
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1419 print("Set it to the URL of an XMPP Blackbox Exporter instance and try again");
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1420 return 1;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1421 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1422 checker = parsed_url.host;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1423
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1424 function check_api(protocol, host)
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1425 local target = socket_url.build({scheme="xmpp",path=host});
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1426 local probe_module = probe_modules[protocol];
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1427 if not probe_module then
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1428 return nil, "Checking protocol '"..protocol.."' is currently unsupported";
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1429 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1430 return check_probe(probe_instance, probe_module, target);
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1431 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1432 else
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1433 check_api = check_ojn;
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1434 end
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1435
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1436 for host in it.filter(skip_bare_jid_hosts, enabled_hosts()) do
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1437 local modules, component_module = modulemanager.get_modules_for_host(host);
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1438 if component_module then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1439 modules:add(component_module)
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1440 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1441
11827
2359519260ec prosodyctl: Add alternate XMPP Blackbox Exporter connectivity check
Kim Alvefur <zash@zash.se>
parents: 11826
diff changeset
1442 print("Checking external connectivity for "..host.." via "..checker)
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1443 local function check_connectivity(protocol)
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1444 local success, err = check_api(protocol, host);
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1445 if not success and err ~= nil then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1446 print((" %s: Failed to request check at API: %s"):format(protocol, err))
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1447 elseif success then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1448 print((" %s: Works"):format(protocol))
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1449 else
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1450 print((" %s: Check service failed to establish (secure) connection"):format(protocol))
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1451 ok = false
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1452 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1453 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1454
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1455 if modules:contains("c2s") then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1456 check_connectivity("xmpp-client")
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1457 if not api("*"):get_option_set("c2s_direct_tls_ports", {}):empty() then
11957
3a7ce7df7806 util.prosodyctl.check: Support direct TLS connectivity checks
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
1458 check_connectivity("xmpps-client");
3a7ce7df7806 util.prosodyctl.check: Support direct TLS connectivity checks
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
1459 end
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1460 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1461
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1462 if modules:contains("s2s") then
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1463 check_connectivity("xmpp-server")
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1464 if not api("*"):get_option_set("s2s_direct_tls_ports", {}):empty() then
11957
3a7ce7df7806 util.prosodyctl.check: Support direct TLS connectivity checks
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
1465 check_connectivity("xmpps-server");
3a7ce7df7806 util.prosodyctl.check: Support direct TLS connectivity checks
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
1466 end
11779
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1467 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1468
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1469 print()
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1470 end
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1471 print("Note: The connectivity check only checks the reachability of the domain.")
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1472 print("Note: It does not ensure that the check actually reaches this specific prosody instance.")
f4f0bdaeabd2 prosodyctl: Add external connectivity check based on observe.jabber.network
Jonas Schäfer <jonas@wielicki.name>
parents: 11778
diff changeset
1473 end
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1474
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1475 function checks.turn()
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1476 local turn_enabled_hosts = {};
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1477 local turn_services = {};
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1478
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1479 for host in enabled_hosts() do
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1480 local has_external_turn = modulemanager.get_modules_for_host(host):contains("turn_external");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1481 if has_external_turn then
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1482 local hostapi = api(host);
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1483 table.insert(turn_enabled_hosts, host);
13216
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1484 local turn_host = hostapi:get_option_string("turn_external_host", host);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1485 local turn_port = hostapi:get_option_number("turn_external_port", 3478);
fcc052ca1652 util.prosodyctl.check: Get some config options via minimal moduleapi #896
Kim Alvefur <zash@zash.se>
parents: 13121
diff changeset
1486 local turn_secret = hostapi:get_option_string("turn_external_secret");
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1487 if not turn_secret then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1488 print("Error: Your configuration is missing a turn_external_secret for "..host);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1489 print("Error: TURN will not be advertised for this host.");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1490 ok = false;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1491 else
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1492 local turn_id = ("%s:%d"):format(turn_host, turn_port);
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1493 if turn_services[turn_id] and turn_services[turn_id].secret ~= turn_secret then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1494 print("Error: Your configuration contains multiple differing secrets");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1495 print(" for the TURN service at "..turn_id.." - we will only test one.");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1496 elseif not turn_services[turn_id] then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1497 turn_services[turn_id] = {
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1498 host = turn_host;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1499 port = turn_port;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1500 secret = turn_secret;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1501 };
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1502 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1503 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1504 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1505 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1506
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1507 if what == "turn" then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1508 local count = it.count(pairs(turn_services));
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1509 if count == 0 then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1510 print("Error: Unable to find any TURN services configured. Enable mod_turn_external!");
12488
3183f358a88f util.prosodyctl.check: turn: Report lack of TURN services as a problem #1749
Kim Alvefur <zash@zash.se>
parents: 12466
diff changeset
1511 ok = false;
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1512 else
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1513 print("Identified "..tostring(count).." TURN services.");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1514 print("");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1515 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1516 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1517
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1518 for turn_id, turn_service in pairs(turn_services) do
12377
317132bca8c0 prosodyctl: check: include TURN checks by default
Matthew Wild <mwild1@gmail.com>
parents: 12376
diff changeset
1519 print("Testing TURN service "..turn_id.."...");
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1520
12372
1ba451c10f41 prosodyctl: check turn: Add support for testing data relay with an external STUN server via --ping
Matthew Wild <mwild1@gmail.com>
parents: 12362
diff changeset
1521 local result = check_turn_service(turn_service, opts.ping);
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1522 if #result.warnings > 0 then
12381
d999c2b3e289 prosodyctl: check turn: fix formatting of multiple warnings
Matthew Wild <mwild1@gmail.com>
parents: 12380
diff changeset
1523 print(("%d warnings:\n"):format(#result.warnings));
d999c2b3e289 prosodyctl: check turn: fix formatting of multiple warnings
Matthew Wild <mwild1@gmail.com>
parents: 12380
diff changeset
1524 print(" "..table.concat(result.warnings, "\n "));
d999c2b3e289 prosodyctl: check turn: fix formatting of multiple warnings
Matthew Wild <mwild1@gmail.com>
parents: 12380
diff changeset
1525 print("");
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1526 end
12380
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1527
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1528 if opts.verbose then
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1529 if result.external_ip then
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1530 print(("External IP: %s"):format(result.external_ip.address));
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1531 end
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1532 if result.relayed_addresses then
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1533 for i, relayed_address in ipairs(result.relayed_addresses) do
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1534 print(("Relayed address %d: %s:%d"):format(i, relayed_address.address, relayed_address.port));
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1535 end
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1536 end
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1537 if result.external_ip_pong then
12390
71b5c9b8b07a prosodyctl: check turn: warn about external port mismatches behind NAT
Matthew Wild <mwild1@gmail.com>
parents: 12385
diff changeset
1538 print(("TURN external address: %s:%d"):format(result.external_ip_pong.address, result.external_ip_pong.port));
12380
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1539 end
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1540 end
3a702f37e87c prosodyctl: check turn: always show debug info even if test fails
Matthew Wild <mwild1@gmail.com>
parents: 12379
diff changeset
1541
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1542 if result.error then
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1543 print("Error: "..result.error.."\n");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1544 ok = false;
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1545 else
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1546 print("Success!\n");
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1547 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1548 end
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1549 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1550
13710
f7de36fed53c prosodyctl: check: Fix variable name (thanks luacheck)
Matthew Wild <mwild1@gmail.com>
parents: 13708
diff changeset
1551 function checks.features(check_host, quiet)
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1552 if not quiet then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1553 print("Feature report");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1554 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1555
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1556 local common_subdomains = {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1557 http_file_share = "share";
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1558 muc = "groups";
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1559 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1560
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1561 local recommended_component_modules = {
14042
2afb278326ce prosodyctl check features: change recommendation from mod_muc_mam to mod_mam
Matthew Wild <mwild1@gmail.com>
parents: 14041
diff changeset
1562 muc = { "mam" };
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1563 };
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1564
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1565 local function print_feature_status(feature, host)
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1566 if quiet then return; end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1567 print("", feature.ok and "OK" or "(!)", feature.name);
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1568 if feature.desc then
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1569 print("", "", feature.desc);
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1570 print("");
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1571 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1572 if not feature.ok then
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1573 if feature.problems then
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1574 table.sort(feature.problems);
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1575 print("", "", "Problems found:");
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1576 for _, problem in ipairs(feature.problems) do
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1577 print("", "", (" - %s"):format(problem));
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1578 end
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1579 print("");
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1580 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1581 if feature.lacking_modules then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1582 table.sort(feature.lacking_modules);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1583 print("", "", "Suggested modules: ");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1584 for _, module in ipairs(feature.lacking_modules) do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1585 print("", "", (" - %s: https://prosody.im/doc/modules/mod_%s"):format(module, module));
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1586 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1587 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1588 if feature.lacking_components then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1589 table.sort(feature.lacking_components);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1590 for _, component_module in ipairs(feature.lacking_components) do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1591 local subdomain = common_subdomains[component_module];
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1592 local recommended_mods = recommended_component_modules[component_module];
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1593 if subdomain then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1594 print("", "", "Suggested component:");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1595 print("");
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1596 print("", "", "", ("-- Documentation: https://prosody.im/doc/modules/mod_%s"):format(component_module));
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1597 print("", "", "", ("Component %q %q"):format(subdomain.."."..host, component_module));
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1598 if recommended_mods then
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1599 print("", "", "", " modules_enabled = {");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1600 table.sort(recommended_mods);
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1601 for _, mod in ipairs(recommended_mods) do
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1602 print("", "", "", (" %q;"):format(mod));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1603 end
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1604 print("", "", "", " }");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1605 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1606 else
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1607 print("", "", ("Suggested component: %s"):format(component_module));
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1608 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1609 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1610 print("");
13722
8bf5d07e3796 util.prosodyctl.check: Fix typo in informational message
Matthew Wild <mwild1@gmail.com>
parents: 13717
diff changeset
1611 print("", "", "If you have already configured any of these components, they may not be");
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1612 print("", "", "linked correctly to "..host..". For more info see https://prosody.im/doc/components");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1613 end
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1614 if feature.lacking_component_modules then
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1615 table.sort(feature.lacking_component_modules, function (a, b)
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1616 return a.host < b.host;
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1617 end);
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1618 for _, problem in ipairs(feature.lacking_component_modules) do
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1619 local hostapi = api(problem.host);
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1620 local current_modules_enabled = hostapi:get_option_array("modules_enabled", {});
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1621 print("", "", ("Component %q is missing the following modules: %s"):format(problem.host, table.concat(problem.missing_mods)));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1622 print("");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1623 print("","", "Add the missing modules to your modules_enabled under the Component, like this:");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1624 print("");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1625 print("");
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1626 print("", "", "", ("-- Documentation: https://prosody.im/doc/modules/mod_%s"):format(problem.component_module));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1627 print("", "", "", ("Component %q %q"):format(problem.host, problem.component_module));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1628 print("", "", "", (" modules_enabled = {"));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1629 for _, mod in ipairs(current_modules_enabled) do
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1630 print("", "", "", (" %q;"):format(mod));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1631 end
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1632 for _, mod in ipairs(problem.missing_mods) do
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1633 print("", "", "", (" %q; -- Add this!"):format(mod));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1634 end
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1635 print("", "", "", (" }"));
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1636 end
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1637 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1638 end
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1639 if feature.meta then
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1640 for k, v in it.sorted_pairs(feature.meta) do
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1641 print("", "", (" - %s: %s"):format(k, v));
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1642 end
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1643 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1644 print("");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1645 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1646
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1647 local all_ok = true;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1648
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1649 local config = configmanager.getconfig();
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1650
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1651 local f, s, v;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1652 if check_host then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1653 f, s, v = it.values({ check_host });
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1654 else
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1655 f, s, v = enabled_user_hosts();
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1656 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1657
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1658 for host in f, s, v do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1659 local modules_enabled = set.new(config["*"].modules_enabled);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1660 modules_enabled:include(set.new(config[host].modules_enabled));
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1661
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1662 -- { [component_module] = { hostname1, hostname2, ... } }
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1663 local host_components = setmetatable({}, { __index = function (t, k) return rawset(t, k, {})[k]; end });
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1664
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1665 do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1666 local hostapi = api(host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1667
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1668 -- Find implicitly linked components
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1669 for other_host in enabled_components() do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1670 local parent_host = other_host:match("^[^.]+%.(.+)$");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1671 if parent_host == host then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1672 local component_module = configmanager.get(other_host, "component_module");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1673 if component_module then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1674 table.insert(host_components[component_module], other_host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1675 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1676 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1677 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1678
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1679 -- And components linked explicitly
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1680 for _, disco_item in ipairs(hostapi:get_option_array("disco_items", {})) do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1681 local other_host = disco_item[1];
13778
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
1682 if type(other_host) == "string" then
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
1683 local component_module = configmanager.get(other_host, "component_module");
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
1684 if component_module then
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
1685 table.insert(host_components[component_module], other_host);
b6d0f1d79b60 prosodyctl check: Be more robust against invalid disco_items, and show warning
Matthew Wild <mwild1@gmail.com>
parents: 13768
diff changeset
1686 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1687 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1688 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1689 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1690
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1691 local current_feature;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1692
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1693 local function problem(message)
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1694 current_feature.problems = current_feature.problems or {};
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1695 table.insert(current_feature.problems, message);
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1696 end
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1697
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1698 local function check_module(suggested, alternate, ...)
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1699 if set.intersection(modules_enabled, set.new({suggested, alternate, ...})):empty() then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1700 current_feature.lacking_modules = current_feature.lacking_modules or {};
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1701 table.insert(current_feature.lacking_modules, suggested);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1702 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1703 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1704
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1705 local function soft_check_for_modules(...)
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1706 for _, mod in ipairs({...}) do
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1707 if modules_enabled:contains(mod) then
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1708 return mod;
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1709 end
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1710 end
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1711 end
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1712
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1713 local function check_component(suggested, alternate, ...)
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1714 local found;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1715 for _, component_module in ipairs({ suggested, alternate, ... }) do
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1716 found = host_components[component_module][1];
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1717 if found then
14041
9f84b26224e1 prosodyctl check features: Use modulemanager to calculate modules that will actually be loaded
Matthew Wild <mwild1@gmail.com>
parents: 13870
diff changeset
1718 local enabled_component_modules = modulemanager.get_modules_for_host(found);
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1719 local recommended_mods = recommended_component_modules[component_module];
13727
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1720 if recommended_mods then
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1721 local missing_mods = {};
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1722 for _, mod in ipairs(recommended_mods) do
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1723 if not enabled_component_modules:contains(mod) then
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1724 table.insert(missing_mods, mod);
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1725 end
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1726 end
13727
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1727 if #missing_mods > 0 then
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1728 if not current_feature.lacking_component_modules then
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1729 current_feature.lacking_component_modules = {};
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1730 end
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1731 table.insert(current_feature.lacking_component_modules, {
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1732 host = found;
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1733 component_module = component_module;
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1734 missing_mods = missing_mods;
704765bfe0a3 prosodyctl: check features: Fix traceback for components with no recommended modules (thanks Menel, riau)
Matthew Wild <mwild1@gmail.com>
parents: 13723
diff changeset
1735 });
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1736 end
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1737 end
13747
c25ab2f47876 prosodyctl: check features: stop searching after finding a matching component
Matthew Wild <mwild1@gmail.com>
parents: 13727
diff changeset
1738 break;
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1739 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1740 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1741 if not found then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1742 current_feature.lacking_components = current_feature.lacking_components or {};
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1743 table.insert(current_feature.lacking_components, suggested);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1744 end
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1745 return found;
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1746 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1747
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1748 local features = {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1749 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1750 name = "Basic functionality";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1751 desc = "Support for secure connections, authentication and messaging";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1752 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1753 check_module("disco");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1754 check_module("roster");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1755 check_module("saslauth");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1756 check_module("tls");
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1757 end;
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1758 };
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1759 {
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1760 name = "Multi-device messaging and data synchronization";
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1761 desc = "Multiple clients connected to the same account stay in sync";
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1762 check = function ()
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1763 check_module("carbons");
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1764 check_module("mam");
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1765 check_module("bookmarks");
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1766 check_module("pep");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1767 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1768 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1769 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1770 name = "Mobile optimizations";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1771 desc = "Help mobile clients reduce battery and data usage";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1772 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1773 check_module("smacks");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1774 check_module("csi_simple", "csi_battery_saver");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1775 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1776 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1777 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1778 name = "Web connections";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1779 desc = "Allow connections from browser-based web clients";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1780 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1781 check_module("bosh");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1782 check_module("websocket");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1783 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1784 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1785 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1786 name = "User profiles";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1787 desc = "Enable users to publish profile information";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1788 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1789 check_module("vcard_legacy", "vcard");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1790 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1791 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1792 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1793 name = "Blocking";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1794 desc = "Block communication with chosen entities";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1795 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1796 check_module("blocklist");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1797 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1798 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1799 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1800 name = "Push notifications";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1801 desc = "Receive notifications on platforms that don't support persistent connections";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1802 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1803 check_module("cloud_notify");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1804 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1805 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1806 {
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1807 name = "Audio/video calls and P2P";
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1808 desc = "Assist clients in setting up connections between each other";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1809 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1810 check_module(
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1811 "turn_external",
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1812 "external_services",
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1813 "turncredentials",
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1814 "extdisco"
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1815 );
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1816 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1817 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1818 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1819 name = "File sharing";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1820 desc = "Sharing of files to groups and offline users";
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1821 check = function (self)
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1822 local host_has_it = soft_check_for_modules("http_file_share", "http_upload", "http_upload_external");
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1823
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1824 local service = check_component("http_file_share", "http_upload", "http_upload_external");
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1825 if service then
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1826 local size_limit;
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1827 if api(service):get_option("component_module") == "http_file_share" then
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1828 size_limit = api(service):get_option_number("http_file_share_size_limit", 10*1024*1024);
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1829 end
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1830 if size_limit then
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1831 self.meta = {
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1832 ["Size limit"] = human_units.format(size_limit, "b", "b");
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1833 };
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1834 end
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1835 if host_has_it then
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1836 problem(("%s is present in modules_enabled, but you already have a component. Remove it from modules_enabled."):format(host_has_it));
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1837 end
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1838 end
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1839 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1840 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1841 {
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1842 name = "Group chats";
13767
56fad06904b1 prosodyctl check features: Add descriptions to features
Matthew Wild <mwild1@gmail.com>
parents: 13747
diff changeset
1843 desc = "Create group chats and channels";
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1844 check = function ()
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1845 check_component("muc");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1846 end;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1847 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1848 };
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1849
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1850 if not quiet then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1851 print(host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1852 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1853
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1854 for _, feature in ipairs(features) do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1855 current_feature = feature;
13768
4365f0f03c33 prosodyctl check features: Report size limit for HTTP upload
Matthew Wild <mwild1@gmail.com>
parents: 13767
diff changeset
1856 feature:check();
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1857 feature.ok = (
14096
48ea7a15957e prosodyctl check features: Warn if http file sharing enabled on both host and component
Matthew Wild <mwild1@gmail.com>
parents: 14043
diff changeset
1858 not feature.problems and
13717
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1859 not feature.lacking_modules and
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1860 not feature.lacking_components and
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1861 not feature.lacking_component_modules
4f173a44370b prosodyctl: check features: check for mod_muc_mam on MUC components
Matthew Wild <mwild1@gmail.com>
parents: 13710
diff changeset
1862 );
13707
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1863 -- For improved presentation, we group the (ok) and (not ok) features
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1864 if feature.ok then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1865 print_feature_status(feature, host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1866 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1867 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1868
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1869 for _, feature in ipairs(features) do
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1870 if not feature.ok then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1871 all_ok = false;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1872 print_feature_status(feature, host);
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1873 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1874 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1875
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1876 if not quiet then
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1877 print("");
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1878 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1879 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1880
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1881 return all_ok;
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1882 end
6c59b9072871 prosodyctl: check features: Check for recommended feature availability
Matthew Wild <mwild1@gmail.com>
parents: 13706
diff changeset
1883
13301
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1884 if what == nil or what == "all" then
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1885 local ret;
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1886 ret = checks.disabled();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1887 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1888 ret = checks.config();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1889 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1890 ret = checks.dns();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1891 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1892 ret = checks.certs();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1893 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1894 ret = checks.turn();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1895 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1896 elseif checks[what] then
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1897 local ret = checks[what]();
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1898 if ret ~= nil then return ret; end
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1899 else
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1900 show_warning("Don't know how to check '%s'. Try one of 'config', 'dns', 'certs', 'disabled', 'turn' or 'connectivity'.", what);
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1901 show_warning("Note: The connectivity check will connect to a remote server.");
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1902 return 1;
84d83f4a190f util.prosodyctl.check: Wrap each check in a function
Kim Alvefur <zash@zash.se>
parents: 13256
diff changeset
1903 end
12357
cd11d7c4af8b util.prosodyctl: check turn: New command to verify STUN/TURN service is operational
Matthew Wild <mwild1@gmail.com>
parents: 12233
diff changeset
1904
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1905 if not ok then
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1906 print("Problems found, see above.");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1907 else
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1908 print("All checks passed, congratulations!");
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1909 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1910 return ok and 0 or 2;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1911 end
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1912
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1913 return {
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1914 check = check;
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1915 };