util/dependencies.lua
author Matthew Wild <mwild1@gmail.com>
Mon, 20 Feb 2023 18:10:15 +0000
branch0.12
changeset 12898 0598d822614f
parent 12335 49739369dcad
child 12573 b5d9f1829b15
permissions -rw-r--r--
mod_websocket: Fire pre-session-close event (fixes #1800) This event was added in a7c183bb4e64 and is required to make mod_smacks know that a session was intentionally closed and shouldn't be hibernated (see fcea4d9e7502). Because this was missing from mod_websocket's session.close(), mod_smacks would always attempt to hibernate websocket sessions even if they closed cleanly. That mod_websocket has its own copy of session.close() is something to fix another day (probably not in the stable branch). So for now this commit makes the minimal change to get things working again. Thanks to Damian and the Jitsi team for reporting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2815
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2815
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 743
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 743
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 449
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 449
diff changeset
     8
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
     9
local function softreq(...) local ok, lib =  pcall(require, ...); if ok then return lib; else return nil, lib; end end
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    10
local platform_table = require "util.human.io".table({ { width = 15, align = "right" }, { width = "100%" } });
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
2513
a8aa7616b154 util.dependencies: Load luarocks.loader/luarocks.require
Matthew Wild <mwild1@gmail.com>
parents: 2510
diff changeset
    12
-- Required to be able to find packages installed with luarocks
a8aa7616b154 util.dependencies: Load luarocks.loader/luarocks.require
Matthew Wild <mwild1@gmail.com>
parents: 2510
diff changeset
    13
if not softreq "luarocks.loader" then -- LuaRocks 2.x
a8aa7616b154 util.dependencies: Load luarocks.loader/luarocks.require
Matthew Wild <mwild1@gmail.com>
parents: 2510
diff changeset
    14
	softreq "luarocks.require"; -- LuaRocks <1.x
a8aa7616b154 util.dependencies: Load luarocks.loader/luarocks.require
Matthew Wild <mwild1@gmail.com>
parents: 2510
diff changeset
    15
end
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    17
local function missingdep(name, sources, msg, err) -- luacheck: ignore err
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    18
	-- TODO print something about the underlying error, useful for debugging
409
2269e9cbe153 Add MD5 to the list of checked dependencies
Matthew Wild <mwild1@gmail.com>
parents: 408
diff changeset
    19
	print("");
2269e9cbe153 Add MD5 to the list of checked dependencies
Matthew Wild <mwild1@gmail.com>
parents: 408
diff changeset
    20
	print("**************************");
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
	print("Prosody was unable to find "..tostring(name));
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	print("This package can be obtained in the following ways:");
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	print("");
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    24
	for _, row in ipairs(sources) do
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    25
		print(platform_table(row));
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
	end
410
5ce6801ad2e4 Trivial whitespace fix in the missing dependency message
Matthew Wild <mwild1@gmail.com>
parents: 409
diff changeset
    27
	print("");
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
	print(msg or (name.." is required for Prosody to run, so we will now exit."));
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7267
diff changeset
    29
	print("More help can be found on our website, at https://prosody.im/doc/depends");
409
2269e9cbe153 Add MD5 to the list of checked dependencies
Matthew Wild <mwild1@gmail.com>
parents: 408
diff changeset
    30
	print("**************************");
2269e9cbe153 Add MD5 to the list of checked dependencies
Matthew Wild <mwild1@gmail.com>
parents: 408
diff changeset
    31
	print("");
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
end
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
    34
local function check_dependencies()
6781
4009ae66e0f0 util.dependencies: Only abort on Lua versions before 5.1, log a warning about 5.2 and above for now
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    35
	if _VERSION < "Lua 5.1" then
6065
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    36
		print "***********************************"
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    37
		print("Unsupported Lua version: ".._VERSION);
6781
4009ae66e0f0 util.dependencies: Only abort on Lua versions before 5.1, log a warning about 5.2 and above for now
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    38
		print("At least Lua 5.1 is required.");
6065
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    39
		print "***********************************"
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    40
		return false;
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    41
	end
9ab23488a17c util.dependencies: Check for Lua 5.1. We don't currently support any other versions. LuaJIT identifies as 5.1.
Waqas Hussain <waqas20@gmail.com>
parents: 6043
diff changeset
    42
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    43
	local fatal;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    44
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    45
	local lxp, err = softreq "lxp"
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    46
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    47
	if not lxp then
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    48
		missingdep("luaexpat", {
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
    49
				{ "Debian/Ubuntu", "sudo apt install lua-expat" };
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    50
				{ "luarocks", "luarocks install luaexpat" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    51
				{ "Source", "http://matthewwild.co.uk/projects/luaexpat/" };
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    52
			}, nil, err);
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    53
		fatal = true;
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    54
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    55
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    56
	local socket, err = softreq "socket"
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    57
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    58
	if not socket then
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    59
		missingdep("luasocket", {
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
    60
				{ "Debian/Ubuntu", "sudo apt install lua-socket" };
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    61
				{ "luarocks", "luarocks install luasocket" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    62
				{ "Source", "http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/" };
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    63
			}, nil, err);
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    64
		fatal = true;
9497
b19f676203fd util.dependencies: Add compat code for normalization of socket constructors
Kim Alvefur <zash@zash.se>
parents: 8238
diff changeset
    65
	elseif not socket.tcp4 then
b19f676203fd util.dependencies: Add compat code for normalization of socket constructors
Kim Alvefur <zash@zash.se>
parents: 8238
diff changeset
    66
		-- COMPAT LuaSocket before being IP-version agnostic
b19f676203fd util.dependencies: Add compat code for normalization of socket constructors
Kim Alvefur <zash@zash.se>
parents: 8238
diff changeset
    67
		socket.tcp4 = socket.tcp;
b19f676203fd util.dependencies: Add compat code for normalization of socket constructors
Kim Alvefur <zash@zash.se>
parents: 8238
diff changeset
    68
		socket.udp4 = socket.udp;
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    69
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    70
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    71
	local lfs, err = softreq "lfs"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    72
	if not lfs then
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    73
		missingdep("luafilesystem", {
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    74
			{ "luarocks", "luarocks install luafilesystem" };
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
    75
			{ "Debian/Ubuntu", "sudo apt install lua-filesystem" };
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    76
			{ "Source", "http://www.keplerproject.org/luafilesystem/" };
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    77
		}, nil, err);
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    78
		fatal = true;
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    79
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    80
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    81
	local ssl, err = softreq "ssl"
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    82
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
    83
	if not ssl then
2157
7cb0aa497326 util.dependencies: Clearer message, add homepages, etc.
Matthew Wild <mwild1@gmail.com>
parents: 2156
diff changeset
    84
		missingdep("LuaSec", {
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
    85
				{ "Debian/Ubuntu", "sudo apt install lua-sec" };
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    86
				{ "luarocks", "luarocks install luasec" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    87
				{ "Source", "https://github.com/brunoos/luasec" };
12335
49739369dcad core.certmanager: Turn soft dependency on LuaSec into a hard
Kim Alvefur <zash@zash.se>
parents: 12290
diff changeset
    88
			}, nil, err);
413
4b61529d0884 Refuse to run without SSL/TLS unless run_without_ssl is set in config
Matthew Wild <mwild1@gmail.com>
parents: 410
diff changeset
    89
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4421
diff changeset
    90
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    91
	local bit, err = softreq"util.bitcompat";
7770
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
    92
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
    93
	if not bit then
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
    94
		missingdep("lua-bitops", {
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
    95
			{ "Debian/Ubuntu", "sudo apt install lua-bitop" };
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    96
			{ "luarocks", "luarocks install luabitop" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
    97
			{ "Source", "http://bitop.luajit.org/" };
10539
29c1a3bf1d29 util.dependencies: Pass require error to error formatting function
Kim Alvefur <zash@zash.se>
parents: 10410
diff changeset
    98
		}, "WebSocket support will not be available", err);
7770
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
    99
	end
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
   100
10979
f997e3e8bc23 util.dependencies: Quiet luacheck
Kim Alvefur <zash@zash.se>
parents: 10978
diff changeset
   101
	local unbound, err = softreq"lunbound"; -- luacheck: ignore 211/err
12151
02481502c3dc util.dependencies: Enable warning about missing lua-unbound
Kim Alvefur <zash@zash.se>
parents: 11977
diff changeset
   102
	if not unbound then
10967
80733851be8b util.dependencies: Add awareness of luaunbound
Kim Alvefur <zash@zash.se>
parents: 10910
diff changeset
   103
		missingdep("lua-unbound", {
12290
ad88732eea51 util.dependencies: Refer to 'apt' instead of 'apt-get'
Kim Alvefur <zash@zash.se>
parents: 12151
diff changeset
   104
				{ "Debian/Ubuntu", "sudo apt install lua-unbound" };
10967
80733851be8b util.dependencies: Add awareness of luaunbound
Kim Alvefur <zash@zash.se>
parents: 10910
diff changeset
   105
				{ "luarocks", "luarocks install luaunbound" };
80733851be8b util.dependencies: Add awareness of luaunbound
Kim Alvefur <zash@zash.se>
parents: 10910
diff changeset
   106
				{ "Source", "https://www.zash.se/luaunbound.html" };
80733851be8b util.dependencies: Add awareness of luaunbound
Kim Alvefur <zash@zash.se>
parents: 10910
diff changeset
   107
			}, "Old DNS resolver library will be used", err);
10969
f5d5fc409680 util.dependencies: Prefer net.unbound over net.adns
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
   108
	else
f5d5fc409680 util.dependencies: Prefer net.unbound over net.adns
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
   109
		package.preload["net.adns"] = function ()
f5d5fc409680 util.dependencies: Prefer net.unbound over net.adns
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
   110
			local ub = require "net.unbound";
f5d5fc409680 util.dependencies: Prefer net.unbound over net.adns
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
   111
			return ub;
f5d5fc409680 util.dependencies: Prefer net.unbound over net.adns
Kim Alvefur <zash@zash.se>
parents: 10967
diff changeset
   112
		end
7770
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
   113
	end
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
   114
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   115
	local encodings, err = softreq "util.encodings"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   116
	if not encodings then
7267
6d97895c2bd7 util.dependencies: Show the full error when a symbol is not found (i.e., when running Prosody with the wrong version of Lua).
Thijs Alkemade <me@thijsalkema.de>
parents: 7010
diff changeset
   117
		if err:match("module '[^']*' not found") then
7878
3fbfd7210d78 util.dependencies: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 7816
diff changeset
   118
			missingdep("util.encodings", {
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
   119
				{ "Windows", "Make sure you have encodings.dll from the Prosody distribution in util/" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
   120
				{ "GNU/Linux", "Run './configure' and 'make' in the Prosody source directory to build util/encodings.so" };
7878
3fbfd7210d78 util.dependencies: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 7816
diff changeset
   121
			});
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   122
		else
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   123
			print "***********************************"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   124
			print("util/encodings couldn't be loaded. Check that you have a recent version of libidn");
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   125
			print ""
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   126
			print("The full error was:");
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   127
			print(err)
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   128
			print "***********************************"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   129
		end
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   130
		fatal = true;
2169
c06fdb6b57bd util.dependencies: Log an error if the current version of LuaSec installed contains The Bug (thanks Remko)
Matthew Wild <mwild1@gmail.com>
parents: 2158
diff changeset
   131
	end
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   133
	local hashes, err = softreq "util.hashes"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   134
	if not hashes then
7267
6d97895c2bd7 util.dependencies: Show the full error when a symbol is not found (i.e., when running Prosody with the wrong version of Lua).
Thijs Alkemade <me@thijsalkema.de>
parents: 7010
diff changeset
   135
		if err:match("module '[^']*' not found") then
7878
3fbfd7210d78 util.dependencies: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 7816
diff changeset
   136
			missingdep("util.hashes", {
10910
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
   137
				{ "Windows", "Make sure you have hashes.dll from the Prosody distribution in util/" };
a1fed82c44b9 util.dependencies: Use util.human.io.table to replace custom layout code
Matthew Wild <mwild1@gmail.com>
parents: 10539
diff changeset
   138
				{ "GNU/Linux", "Run './configure' and 'make' in the Prosody source directory to build util/hashes.so" };
7878
3fbfd7210d78 util.dependencies: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 7816
diff changeset
   139
			});
3fbfd7210d78 util.dependencies: Normalize whitespace
Kim Alvefur <zash@zash.se>
parents: 7816
diff changeset
   140
		else
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   141
			print "***********************************"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   142
			print("util/hashes couldn't be loaded. Check that you have a recent version of OpenSSL (libcrypto in particular)");
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   143
			print ""
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   144
			print("The full error was:");
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   145
			print(err)
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   146
			print "***********************************"
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   147
		end
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   148
		fatal = true;
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   149
	end
7770
36bf9ed87ae1 util.dependencies: Add check and info about lua-bitops (for mod_websockets)
Kim Alvefur <zash@zash.se>
parents: 7769
diff changeset
   150
2510
97b5ea975cb9 util.dependencies, prosody, prosodyctl: Give util.dependencies a check_dependencies() function so the caller can decide what to do when dependencies aren't met - update prosody/prosodyctl for this change
Matthew Wild <mwild1@gmail.com>
parents: 2299
diff changeset
   151
	return not fatal;
408
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
end
eb1a0960cefb Friendlier messages on missing dependencies
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   153
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   154
local function log_warnings()
11962
31f83a645ce6 util.dependencies: Consider Lua 5.4 Supported:tm:
Kim Alvefur <zash@zash.se>
parents: 11145
diff changeset
   155
	if _VERSION > "Lua 5.4" then
7010
e28fbe6dd424 util.dependencies: Use prosody.log() instead of global log()
Matthew Wild <mwild1@gmail.com>
parents: 6781
diff changeset
   156
		prosody.log("warn", "Support for %s is experimental, please report any issues", _VERSION);
11963
814b750aa2d0 util.dependencies: Discourage Lua 5.1
Kim Alvefur <zash@zash.se>
parents: 11962
diff changeset
   157
	elseif _VERSION < "Lua 5.2" then
11977
d4730ae60226 util.dependencies: Fix typo (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 11963
diff changeset
   158
		prosody.log("warn", "%s has several issues and support is being phased out, consider upgrading", _VERSION);
6781
4009ae66e0f0 util.dependencies: Only abort on Lua versions before 5.1, log a warning about 5.2 and above for now
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
   159
	end
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   160
	local ssl = softreq"ssl";
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   161
	if ssl then
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   162
		local major, minor, veryminor, patched = ssl._VERSION:match("(%d+)%.(%d+)%.?(%d*)(M?)");
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   163
		if not major or ((tonumber(major) == 0 and (tonumber(minor) or 0) <= 3 and (tonumber(veryminor) or 0) <= 2) and patched ~= "M") then
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7267
diff changeset
   164
			prosody.log("error", "This version of LuaSec contains a known bug that causes disconnects, see https://prosody.im/doc/depends");
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   165
		end
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   166
	end
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   167
	local lxp = softreq"lxp";
4421
ee65aa40ef60 util.dependencies, util.xmppstream: Move LuaExpat version checking to util.dependencies.
Waqas Hussain <waqas20@gmail.com>
parents: 4236
diff changeset
   168
	if lxp then
ee65aa40ef60 util.dependencies, util.xmppstream: Move LuaExpat version checking to util.dependencies.
Waqas Hussain <waqas20@gmail.com>
parents: 4236
diff changeset
   169
		if not pcall(lxp.new, { StartDoctypeDecl = false }) then
7010
e28fbe6dd424 util.dependencies: Use prosody.log() instead of global log()
Matthew Wild <mwild1@gmail.com>
parents: 6781
diff changeset
   170
			prosody.log("error", "The version of LuaExpat on your system leaves Prosody "
4421
ee65aa40ef60 util.dependencies, util.xmppstream: Move LuaExpat version checking to util.dependencies.
Waqas Hussain <waqas20@gmail.com>
parents: 4236
diff changeset
   171
				.."vulnerable to denial-of-service attacks. You should upgrade to "
6043
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   172
				.."LuaExpat 1.3.0 or higher as soon as possible. See "
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7267
diff changeset
   173
				.."https://prosody.im/doc/depends#luaexpat for more information.");
6043
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   174
		end
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   175
		if not lxp.new({}).getcurrentbytecount then
7010
e28fbe6dd424 util.dependencies: Use prosody.log() instead of global log()
Matthew Wild <mwild1@gmail.com>
parents: 6781
diff changeset
   176
			prosody.log("error", "The version of LuaExpat on your system does not support "
6043
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   177
				.."stanza size limits, which may leave servers on untrusted "
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   178
				.."networks (e.g. the internet) vulnerable to denial-of-service "
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   179
				.."attacks. You should upgrade to LuaExpat 1.3.0 or higher as "
29d2dd705148 util.dependencies: Log error when LuaExpat is not capable of enforcing stanza size limits
Matthew Wild <mwild1@gmail.com>
parents: 4421
diff changeset
   180
				.."soon as possible. See "
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7267
diff changeset
   181
				.."https://prosody.im/doc/depends#luaexpat for more information.");
4421
ee65aa40ef60 util.dependencies, util.xmppstream: Move LuaExpat version checking to util.dependencies.
Waqas Hussain <waqas20@gmail.com>
parents: 4236
diff changeset
   182
		end
ee65aa40ef60 util.dependencies, util.xmppstream: Move LuaExpat version checking to util.dependencies.
Waqas Hussain <waqas20@gmail.com>
parents: 4236
diff changeset
   183
	end
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
   184
end
742
b9f59372eb4e util.dependencies: Show useful messages when our own libraries are not found, too
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   185
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   186
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   187
	softreq = softreq;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   188
	missingdep = missingdep;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   189
	check_dependencies = check_dependencies;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   190
	log_warnings = log_warnings;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   191
};