util/startup.lua
author Kim Alvefur <zash@zash.se>
Sat, 02 Mar 2024 13:23:24 +0100
changeset 13456 69faf3552d52
parent 13428 0efb53a0852e
child 13458 b0c27628f588
permissions -rw-r--r--
mod_posix: Move POSIX signal handling into util.startup to avoid race When libunbound is initialized, it spawns a thread to work in. In case a module initializes libunbound, e.g. by triggering a s2s connection, Prosody would not handle signals, instead immediately quit on e.g. the reload (SIGHUP) signal. Likely because the libunbound thread would not have inherited the signal mask from the main Prosody thread. Thanks Menel, riau and franck-x for reporting and help narrowing down
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8641
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
     1
-- Ignore the CFG_* variables
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
     2
-- luacheck: ignore 113/CFG_CONFIGDIR 113/CFG_SOURCEDIR 113/CFG_DATADIR 113/CFG_PLUGINDIR
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local startup = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
     5
local prosody = { events = require "prosody.util.events".new() };
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
     6
local logger = require "prosody.util.logger";
8723
dba17a70fd22 util.startup: Initialize prosody.log / _G.log here instead of in loggingmanager to reduce dependencies
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
     7
local log = logger.init("startup");
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
     8
local parse_args = require "prosody.util.argparse".parse;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
    10
local config = require "prosody.core.configmanager";
9881
ded5303e1fde util.startup: Log configuration warnings at startup
Matthew Wild <mwild1@gmail.com>
parents: 9877
diff changeset
    11
local config_warnings;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
    13
local dependencies = require "prosody.util.dependencies";
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
8669
57780ba1938f util.startup: Move original_logging_config to a local variable
Matthew Wild <mwild1@gmail.com>
parents: 8668
diff changeset
    15
local original_logging_config;
57780ba1938f util.startup: Move original_logging_config to a local variable
Matthew Wild <mwild1@gmail.com>
parents: 8668
diff changeset
    16
11543
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    17
local default_gc_params = {
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    18
	mode = "incremental";
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    19
	-- Incremental mode defaults
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    20
	threshold = 105, speed = 500;
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    21
	-- Generational mode defaults
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    22
	minor_threshold = 20, major_threshold = 50;
3413fea9e6db util.startup: Set more aggressive defaults for GC
Matthew Wild <mwild1@gmail.com>
parents: 11077
diff changeset
    23
};
11077
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
    24
11833
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    25
local arg_settigs = {
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    26
	prosody = {
11873
d52a73425eba util.startup: Show brief usage on `prosody -h|-?|--help`
Kim Alvefur <zash@zash.se>
parents: 11870
diff changeset
    27
		short_params = { D = "daemonize"; F = "no-daemonize", h = "help", ["?"] = "help" };
11833
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    28
		value_params = { config = true };
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    29
	};
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    30
	prosodyctl = {
11874
1d1ed2be3491 util.startup: Understand -h, -? as --help in prosodyctl but ignore
Kim Alvefur <zash@zash.se>
parents: 11873
diff changeset
    31
		short_params = { v = "verbose", h = "help", ["?"] = "help" };
11833
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    32
		value_params = { config = true };
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    33
	};
4fad0ca42f66 util.startup: Allow separate command line argument settings for prosody and prosodyctl
Kim Alvefur <zash@zash.se>
parents: 11832
diff changeset
    34
}
10600
cb107ea49b35 util.startup: Add startup step for parsing command-line options
Matthew Wild <mwild1@gmail.com>
parents: 10394
diff changeset
    35
12164
ac654fb19203 util.startup: Allow supplying an argument parsing settings
Kim Alvefur <zash@zash.se>
parents: 11967
diff changeset
    36
function startup.parse_args(profile)
ac654fb19203 util.startup: Allow supplying an argument parsing settings
Kim Alvefur <zash@zash.se>
parents: 11967
diff changeset
    37
	local opts, err, where = parse_args(arg, arg_settigs[profile or prosody.process_type] or profile);
10940
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    38
	if not opts then
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    39
		if err == "param-not-found" then
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    40
			print("Unknown command-line option: "..tostring(where));
11851
2b3ce80ffece util.startup: Only ask if 'prosodyctl' was meant instead of 'prosody' (fix #1692)
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
    41
			if prosody.process_type == "prosody" then
2b3ce80ffece util.startup: Only ask if 'prosodyctl' was meant instead of 'prosody' (fix #1692)
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
    42
				print("Perhaps you meant to use prosodyctl instead?");
2b3ce80ffece util.startup: Only ask if 'prosodyctl' was meant instead of 'prosody' (fix #1692)
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
    43
			end
10940
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    44
		elseif err == "missing-value" then
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    45
			print("Expected a value to follow command-line option: "..where);
10604
08f2fe5ac30f util.startup: Fix logic to make --config work again
Matthew Wild <mwild1@gmail.com>
parents: 10601
diff changeset
    46
		end
10940
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    47
		os.exit(1);
10600
cb107ea49b35 util.startup: Add startup step for parsing command-line options
Matthew Wild <mwild1@gmail.com>
parents: 10394
diff changeset
    48
	end
12427
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    49
	if prosody.process_type == "prosody" then
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    50
		if #arg > 0 then
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    51
			print("Unrecognized option: "..arg[1]);
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    52
			print("(Did you mean 'prosodyctl "..arg[1].."'?)");
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    53
			print("");
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    54
		end
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    55
		if opts.help or #arg > 0 then
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    56
			print("prosody [ -D | -F ] [ --config /path/to/prosody.cfg.lua ]");
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    57
			print("  -D, --daemonize       Run in the background")
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    58
			print("  -F, --no-daemonize    Run in the foreground")
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    59
			print("  --config FILE         Specify config file")
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    60
			os.exit(0);
3ae9299d61d7 util.startup: Show error for unrecognized arguments passed to 'prosody' (fixes #1722)
Matthew Wild <mwild1@gmail.com>
parents: 12298
diff changeset
    61
		end
11873
d52a73425eba util.startup: Show brief usage on `prosody -h|-?|--help`
Kim Alvefur <zash@zash.se>
parents: 11870
diff changeset
    62
	end
10940
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
    63
	prosody.opts = opts;
10600
cb107ea49b35 util.startup: Add startup step for parsing command-line options
Matthew Wild <mwild1@gmail.com>
parents: 10394
diff changeset
    64
end
cb107ea49b35 util.startup: Add startup step for parsing command-line options
Matthew Wild <mwild1@gmail.com>
parents: 10394
diff changeset
    65
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
function startup.read_config()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
	local filenames = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
	local filename;
10601
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
    70
	if prosody.opts.config then
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
    71
		table.insert(filenames, prosody.opts.config);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
		if CFG_CONFIGDIR then
10601
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
    73
			table.insert(filenames, CFG_CONFIGDIR.."/"..prosody.opts.config);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
	elseif os.getenv("PROSODY_CONFIG") then -- Passed by prosodyctl
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
			table.insert(filenames, os.getenv("PROSODY_CONFIG"));
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
	else
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
		table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg.lua");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
	for _,_filename in ipairs(filenames) do
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
		filename = _filename;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
		local file = io.open(filename);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
		if file then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
			file:close();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
			prosody.config_file = filename;
10393
dbb8dae58265 util.startup: Update config path (fixes #1430)
Kim Alvefur <zash@zash.se>
parents: 9766
diff changeset
    86
			prosody.paths.config = filename:match("^(.*)[\\/][^\\/]*$");
dbb8dae58265 util.startup: Update config path (fixes #1430)
Kim Alvefur <zash@zash.se>
parents: 9766
diff changeset
    87
			CFG_CONFIGDIR = prosody.paths.config; -- luacheck: ignore 111
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
			break;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
	prosody.config_file = filename
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
	local ok, level, err = config.load(filename);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
	if not ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
		print("\n");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
		print("**************************");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
		if level == "parser" then
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8724
diff changeset
    97
			print("A problem occurred while reading the config file "..filename);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
			print("");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
			local err_line, err_message = tostring(err):match("%[string .-%]:(%d*): (.*)");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
			if err:match("chunk has too many syntax levels$") then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
				print("An Include statement in a config file is including an already-included");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
				print("file and causing an infinite loop. An Include statement in a config file is...");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
			else
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
				print("Error"..(err_line and (" on line "..err_line) or "")..": "..(err_message or tostring(err)));
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
			end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
			print("");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
		elseif level == "file" then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
			print("Prosody was unable to find the configuration file.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109
			print("We looked for: "..filename);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
			print("A sample config file is included in the Prosody download called prosody.cfg.lua.dist");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   111
			print("Copy or rename it to prosody.cfg.lua and edit as necessary.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   113
		print("More help on configuring Prosody can be found at https://prosody.im/doc/configure");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
		print("Good luck!");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
		print("**************************");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   116
		print("");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   117
		os.exit(1);
9881
ded5303e1fde util.startup: Log configuration warnings at startup
Matthew Wild <mwild1@gmail.com>
parents: 9877
diff changeset
   118
	elseif err and #err > 0 then
ded5303e1fde util.startup: Log configuration warnings at startup
Matthew Wild <mwild1@gmail.com>
parents: 9877
diff changeset
   119
		config_warnings = err;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   120
	end
9217
8b2b8f1a911f util.startup: Set flag when config fully loaded
Matthew Wild <mwild1@gmail.com>
parents: 8961
diff changeset
   121
	prosody.config_loaded = true;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   122
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   124
function startup.check_dependencies()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
	if not dependencies.check_dependencies() then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
		os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   128
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
-- luacheck: globals socket server
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   131
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   132
function startup.load_libraries()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
	-- Load socket framework
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
	-- luacheck: ignore 111/server 111/socket
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   135
	require "prosody.util.import"
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   136
	socket = require "socket";
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   137
	server = require "prosody.net.server"
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   138
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   139
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   140
function startup.init_logging()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
	-- Initialize logging
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   142
	local loggingmanager = require "prosody.core.loggingmanager"
8724
b773b15fee71 util.startup: Set up event hooks for reloading logging here instead of in loggingmanager to simplify startup dependencies
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
   143
	loggingmanager.reload_logging();
9766
34988a408b74 util.startup: Always reload logging after config (fixes #1284)
Kim Alvefur <zash@zash.se>
parents: 9217
diff changeset
   144
	prosody.events.add_handler("config-reloaded", function ()
34988a408b74 util.startup: Always reload logging after config (fixes #1284)
Kim Alvefur <zash@zash.se>
parents: 9217
diff changeset
   145
		prosody.events.fire_event("reopen-log-files");
34988a408b74 util.startup: Always reload logging after config (fixes #1284)
Kim Alvefur <zash@zash.se>
parents: 9217
diff changeset
   146
	end);
8724
b773b15fee71 util.startup: Set up event hooks for reloading logging here instead of in loggingmanager to simplify startup dependencies
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
   147
	prosody.events.add_handler("reopen-log-files", function ()
b773b15fee71 util.startup: Set up event hooks for reloading logging here instead of in loggingmanager to simplify startup dependencies
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
   148
		loggingmanager.reload_logging();
b773b15fee71 util.startup: Set up event hooks for reloading logging here instead of in loggingmanager to simplify startup dependencies
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
   149
		prosody.events.fire_event("logging-reloaded");
b773b15fee71 util.startup: Set up event hooks for reloading logging here instead of in loggingmanager to simplify startup dependencies
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
   150
	end);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
9877
dfaeea570f7e util.startup: Give function a more generic name so it can apply to all warnings
Matthew Wild <mwild1@gmail.com>
parents: 9766
diff changeset
   153
function startup.log_startup_warnings()
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
	dependencies.log_warnings();
9882
dd61201fc5af util.startup: Don't die if there are no config warnings to log (thanks buildbot)
Matthew Wild <mwild1@gmail.com>
parents: 9881
diff changeset
   155
	if config_warnings then
dd61201fc5af util.startup: Don't die if there are no config warnings to log (thanks buildbot)
Matthew Wild <mwild1@gmail.com>
parents: 9881
diff changeset
   156
		for _, warning in ipairs(config_warnings) do
dd61201fc5af util.startup: Don't die if there are no config warnings to log (thanks buildbot)
Matthew Wild <mwild1@gmail.com>
parents: 9881
diff changeset
   157
			log("warn", "Configuration warning: %s", warning);
dd61201fc5af util.startup: Don't die if there are no config warnings to log (thanks buildbot)
Matthew Wild <mwild1@gmail.com>
parents: 9881
diff changeset
   158
		end
9881
ded5303e1fde util.startup: Log configuration warnings at startup
Matthew Wild <mwild1@gmail.com>
parents: 9877
diff changeset
   159
	end
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   160
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   161
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   162
function startup.sanity_check()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
	for host, host_config in pairs(config.getconfig()) do
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
		if host ~= "*"
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
		and host_config.enabled ~= false
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   166
		and not host_config.component_module then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   167
			return;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   168
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   169
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   170
	log("error", "No enabled VirtualHost entries found in the config file.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   171
	log("error", "At least one active host is required for Prosody to function. Exiting...");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   172
	os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   173
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   174
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   175
function startup.sandbox_require()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   176
	-- Replace require() with one that doesn't pollute _G, required
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   177
	-- for neat sandboxing of modules
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   178
	-- luacheck: ignore 113/getfenv 111/require
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   179
	local _realG = _G;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   180
	local _real_require = require;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
	local getfenv = getfenv or function (f)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
		-- FIXME: This is a hack to replace getfenv() in Lua 5.2
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
		local name, env = debug.getupvalue(debug.getinfo(f or 1).func, 1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   184
		if name == "_ENV" then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   185
			return env;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   186
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   187
	end
8641
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
   188
	function require(...) -- luacheck: ignore 121
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   189
		local curr_env = getfenv(2);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   190
		local curr_env_mt = getmetatable(curr_env);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   191
		local _realG_mt = getmetatable(_realG);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   192
		if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   193
			local old_newindex, old_index;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   194
			old_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   195
			old_index, _realG_mt.__index = _realG_mt.__index, function (_G, k) -- luacheck: ignore 212/_G
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   196
				return rawget(curr_env, k);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   197
			end;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   198
			local ret = _real_require(...);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   199
			_realG_mt.__newindex = old_newindex;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   200
			_realG_mt.__index = old_index;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
			return ret;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   202
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
		return _real_require(...);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   205
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   206
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   207
function startup.set_function_metatable()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   208
	local mt = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
	function mt.__index(f, upvalue)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   210
		local i, name, value = 0;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   211
		repeat
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   212
			i = i + 1;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   213
			name, value = debug.getupvalue(f, i);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   214
		until name == upvalue or name == nil;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
		return value;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
	function mt.__newindex(f, upvalue, value)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   218
		local i, name = 0;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   219
		repeat
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   220
			i = i + 1;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   221
			name = debug.getupvalue(f, i);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   222
		until name == upvalue or name == nil;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   223
		if name then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
			debug.setupvalue(f, i, value);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   225
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   226
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   227
	function mt.__tostring(f)
11154
0cfa36fa707e util.startup: Include arguments in function string representation
Kim Alvefur <zash@zash.se>
parents: 11153
diff changeset
   228
		local info = debug.getinfo(f, "Su");
11156
89162d27e1b1 util.startup: Handle missing nparams field from debug info (not present in 5.1)
Matthew Wild <mwild1@gmail.com>
parents: 11154
diff changeset
   229
		local n_params = info.nparams or 0;
89162d27e1b1 util.startup: Handle missing nparams field from debug info (not present in 5.1)
Matthew Wild <mwild1@gmail.com>
parents: 11154
diff changeset
   230
		for i = 1, n_params do
11154
0cfa36fa707e util.startup: Include arguments in function string representation
Kim Alvefur <zash@zash.se>
parents: 11153
diff changeset
   231
			info[i] = debug.getlocal(f, i);
0cfa36fa707e util.startup: Include arguments in function string representation
Kim Alvefur <zash@zash.se>
parents: 11153
diff changeset
   232
		end
0cfa36fa707e util.startup: Include arguments in function string representation
Kim Alvefur <zash@zash.se>
parents: 11153
diff changeset
   233
		if info.isvararg then
11156
89162d27e1b1 util.startup: Handle missing nparams field from debug info (not present in 5.1)
Matthew Wild <mwild1@gmail.com>
parents: 11154
diff changeset
   234
			info[n_params+1] = "...";
11154
0cfa36fa707e util.startup: Include arguments in function string representation
Kim Alvefur <zash@zash.se>
parents: 11153
diff changeset
   235
		end
12986
fc0109c59807 util.startup: Tweak function string representation
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   236
		return ("function @%s:%d(%s)"):format(info.short_src:match("[^\\/]*$"), info.linedefined, table.concat(info, ", "));
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   237
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   238
	debug.setmetatable(function() end, mt);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   239
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   240
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   241
function startup.detect_platform()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   242
	prosody.platform = "unknown";
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   243
	if os.getenv("WINDIR") then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   244
		prosody.platform = "windows";
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   245
	elseif package.config:sub(1,1) == "/" then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   246
		prosody.platform = "posix";
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   247
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   248
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   249
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   250
function startup.detect_installed()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   251
	prosody.installed = nil;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   252
	if CFG_SOURCEDIR and (prosody.platform == "windows" or CFG_SOURCEDIR:match("^/")) then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   253
		prosody.installed = true;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   254
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   255
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   256
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
function startup.init_global_state()
8641
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
   258
	-- luacheck: ignore 121
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   259
	prosody.bare_sessions = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   260
	prosody.full_sessions = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   261
	prosody.hosts = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   262
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   263
	-- COMPAT: These globals are deprecated
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
	-- luacheck: ignore 111/bare_sessions 111/full_sessions 111/hosts
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   265
	bare_sessions = prosody.bare_sessions;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   266
	full_sessions = prosody.full_sessions;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   267
	hosts = prosody.hosts;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   268
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   269
	prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR or ".",
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   270
	                  plugins = CFG_PLUGINDIR or "plugins", data = "data" };
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   271
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   272
	prosody.arg = _G.arg;
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   273
8723
dba17a70fd22 util.startup: Initialize prosody.log / _G.log here instead of in loggingmanager to reduce dependencies
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
   274
	_G.log = logger.init("general");
dba17a70fd22 util.startup: Initialize prosody.log / _G.log here instead of in loggingmanager to reduce dependencies
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
   275
	prosody.log = logger.init("general");
dba17a70fd22 util.startup: Initialize prosody.log / _G.log here instead of in loggingmanager to reduce dependencies
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
   276
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   277
	startup.detect_platform();
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   278
	startup.detect_installed();
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   279
	_G.prosody = prosody;
12785
22066b02887f util.startup: Provide a common Lua 5.3+ math.type() for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 12783
diff changeset
   280
22066b02887f util.startup: Provide a common Lua 5.3+ math.type() for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 12783
diff changeset
   281
	-- COMPAT Lua < 5.3
22066b02887f util.startup: Provide a common Lua 5.3+ math.type() for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 12783
diff changeset
   282
	if not math.type then
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   283
		require "prosody.util.mathcompat"
12785
22066b02887f util.startup: Provide a common Lua 5.3+ math.type() for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 12783
diff changeset
   284
	end
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   285
end
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   286
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   287
function startup.setup_datadir()
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   288
	prosody.paths.data = config.get("*", "data_path") or CFG_DATADIR or "data";
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   289
end
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   290
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   291
function startup.setup_plugindir()
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   292
	local custom_plugin_paths = config.get("*", "plugin_paths");
10177
0513dd2830b7 util.startup: The .setup_plugindir function now correctly sets a default/specified path for custom plugins
João Duarte <jvsDuarte08@gmail.com>
parents: 10175
diff changeset
   293
	local path_sep = package.config:sub(3,3);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   294
	if custom_plugin_paths then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   295
		-- path1;path2;path3;defaultpath...
8641
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
   296
		-- luacheck: ignore 111
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   297
		CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins");
8736
6a234e77c99f util.startup: Fix traceback due to both plugin path becoming nil if plugin_paths is unset
Kim Alvefur <zash@zash.se>
parents: 8731
diff changeset
   298
		prosody.paths.plugins = CFG_PLUGINDIR;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   299
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   300
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   301
10408
29c10930a7b2 util.startup: Split plugin installer path setup into a separate function
Kim Alvefur <zash@zash.se>
parents: 10395
diff changeset
   302
function startup.setup_plugin_install_path()
11309
cd8516a77255 util.startup: Make installer_plugin_path relative to data directory
Kim Alvefur <zash@zash.se>
parents: 11308
diff changeset
   303
	local installer_plugin_path = config.get("*", "installer_plugin_path") or "custom_plugins";
10408
29c10930a7b2 util.startup: Split plugin installer path setup into a separate function
Kim Alvefur <zash@zash.se>
parents: 10395
diff changeset
   304
	local path_sep = package.config:sub(3,3);
11309
cd8516a77255 util.startup: Make installer_plugin_path relative to data directory
Kim Alvefur <zash@zash.se>
parents: 11308
diff changeset
   305
	installer_plugin_path = config.resolve_relative_path(CFG_DATADIR or "data", installer_plugin_path);
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   306
	require"prosody.util.paths".complement_lua_path(installer_plugin_path);
10408
29c10930a7b2 util.startup: Split plugin installer path setup into a separate function
Kim Alvefur <zash@zash.se>
parents: 10395
diff changeset
   307
	-- luacheck: ignore 111
10177
0513dd2830b7 util.startup: The .setup_plugindir function now correctly sets a default/specified path for custom plugins
João Duarte <jvsDuarte08@gmail.com>
parents: 10175
diff changeset
   308
	CFG_PLUGINDIR = installer_plugin_path..path_sep..(CFG_PLUGINDIR or "plugins");
11148
2b9f7c537acb util.startup: Save the path used by the installer to prosody.paths
Kim Alvefur <zash@zash.se>
parents: 11143
diff changeset
   309
	prosody.paths.installer = installer_plugin_path;
10175
628e238feb04 util.startup: Removed unnecessary if clause at startup.set_plugindir
João Duarte <jvsDuarte08@gmail.com>
parents: 10167
diff changeset
   310
	prosody.paths.plugins = CFG_PLUGINDIR;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   311
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   312
8667
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   313
function startup.chdir()
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   314
	if prosody.installed then
10394
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   315
		local lfs = require "lfs";
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   316
		-- Ensure paths are absolute, not relative to the working directory which we're about to change
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   317
		local cwd = lfs.currentdir();
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   318
		prosody.paths.source = config.resolve_relative_path(cwd, prosody.paths.source);
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   319
		prosody.paths.config = config.resolve_relative_path(cwd, prosody.paths.config);
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   320
		prosody.paths.data = config.resolve_relative_path(cwd, prosody.paths.data);
8667
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   321
		-- Change working directory to data path.
10394
82705ec87253 util.startup: Ensure prosody.paths are absolute (see #1430)
Kim Alvefur <zash@zash.se>
parents: 10393
diff changeset
   322
		lfs.chdir(prosody.paths.data);
8667
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   323
	end
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   324
end
d49acc9a8da2 util.startup: Fix chdir() to use correct path variable
Matthew Wild <mwild1@gmail.com>
parents: 8656
diff changeset
   325
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   326
function startup.add_global_prosody_functions()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   327
	-- Function to reload the config file
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   328
	function prosody.reload_config()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   329
		log("info", "Reloading configuration file");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   330
		prosody.events.fire_event("reloading-config");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   331
		local ok, level, err = config.load(prosody.config_file);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   332
		if not ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   333
			if level == "parser" then
10112
659ffa03f1e7 util.startup: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
   334
				log("error", "There was an error parsing the configuration file: %s", err);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   335
			elseif level == "file" then
10112
659ffa03f1e7 util.startup: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
   336
				log("error", "Couldn't read the config file when trying to reload: %s", err);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   337
			end
8695
a55574754e5f configmanager: Move firing of the 'config-reloaded' event into util.startup (fixes #1117)
Kim Alvefur <zash@zash.se>
parents: 8691
diff changeset
   338
		else
a55574754e5f configmanager: Move firing of the 'config-reloaded' event into util.startup (fixes #1117)
Kim Alvefur <zash@zash.se>
parents: 8691
diff changeset
   339
			prosody.events.fire_event("config-reloaded", {
a55574754e5f configmanager: Move firing of the 'config-reloaded' event into util.startup (fixes #1117)
Kim Alvefur <zash@zash.se>
parents: 8691
diff changeset
   340
				filename = prosody.config_file,
a55574754e5f configmanager: Move firing of the 'config-reloaded' event into util.startup (fixes #1117)
Kim Alvefur <zash@zash.se>
parents: 8691
diff changeset
   341
				config = config.getconfig(),
a55574754e5f configmanager: Move firing of the 'config-reloaded' event into util.startup (fixes #1117)
Kim Alvefur <zash@zash.se>
parents: 8691
diff changeset
   342
			});
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   343
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   344
		return ok, (err and tostring(level)..": "..tostring(err)) or nil;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   345
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   346
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   347
	-- Function to reopen logfiles
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   348
	function prosody.reopen_logfiles()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   349
		log("info", "Re-opening log files");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   350
		prosody.events.fire_event("reopen-log-files");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   351
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   352
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   353
	-- Function to initiate prosody shutdown
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   354
	function prosody.shutdown(reason, code)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   355
		log("info", "Shutting down: %s", reason or "unknown reason");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   356
		prosody.shutdown_reason = reason;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   357
		prosody.shutdown_code = code;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   358
		prosody.events.fire_event("server-stopping", {
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   359
			reason = reason;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   360
			code = code;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   361
		});
12557
cc0ec0277813 util.startup: Fix async waiting for last shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12427
diff changeset
   362
		prosody.main_thread:run(startup.shutdown);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   363
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   364
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   365
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   366
function startup.load_secondary_libraries()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   367
	--- Load and initialise core modules
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   368
	require "prosody.util.xmppstream"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   369
	require "prosody.core.stanza_router"
13124
be4058bb5a7e util.startup: Record current version in a metric
Kim Alvefur <zash@zash.se>
parents: 13123
diff changeset
   370
	require "prosody.core.statsmanager".metric("gauge", "prosody_info", "", "Prosody version", { "version" }):with_labels(prosody.version):set(1);
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   371
	require "prosody.core.hostmanager"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   372
	require "prosody.core.portmanager"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   373
	require "prosody.core.modulemanager"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   374
	require "prosody.core.usermanager"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   375
	require "prosody.core.rostermanager"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   376
	require "prosody.core.sessionmanager"
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   377
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   378
	require "prosody.util.array"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   379
	require "prosody.util.datetime"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   380
	require "prosody.util.iterators"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   381
	require "prosody.util.timer"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   382
	require "prosody.util.helpers"
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   383
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   384
	pcall(require, "prosody.util.signal") -- Not on Windows
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   385
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   386
	-- Commented to protect us from
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   387
	-- the second kind of people
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   388
	--[[
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   389
	pcall(require, "remdebug.engine");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   390
	if remdebug then remdebug.engine.start() end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   391
	]]
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   392
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   393
	require "prosody.util.stanza"
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   394
	require "prosody.util.jid"
13428
0efb53a0852e util.startup: Expose core.features.available as prosody.features
Matthew Wild <mwild1@gmail.com>
parents: 13346
diff changeset
   395
0efb53a0852e util.startup: Expose core.features.available as prosody.features
Matthew Wild <mwild1@gmail.com>
parents: 13346
diff changeset
   396
	prosody.features = require "prosody.core.features".available;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   397
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   398
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   399
function startup.init_http_client()
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   400
	local http = require "prosody.net.http"
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   401
	local config_ssl = config.get("*", "ssl") or {}
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   402
	local https_client = config.get("*", "client_https_ssl")
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   403
	http.default.options.sslctx = require "prosody.core.certmanager".create_context("client_https port 0", "client",
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   404
		{ capath = config_ssl.capath, cafile = config_ssl.cafile, verify = "peer", }, https_client);
12278
10447f940fec util.startup: Enable DANE in http client library with use_dane
Kim Alvefur <zash@zash.se>
parents: 12248
diff changeset
   405
	http.default.options.use_dane = config.get("*", "use_dane")
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   406
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   407
11952
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   408
function startup.init_promise()
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   409
	local promise = require "prosody.util.promise";
11952
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   410
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   411
	local timer = require "prosody.util.timer";
11952
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   412
	promise.set_nexttick(function(f) return timer.add_task(0, f); end);
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   413
end
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   414
11967
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   415
function startup.init_async()
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   416
	local async = require "prosody.util.async";
11967
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   417
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   418
	local timer = require "prosody.util.timer";
11967
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   419
	async.set_nexttick(function(f) return timer.add_task(0, f); end);
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   420
	async.set_schedule_function(timer.add_task);
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   421
end
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   422
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   423
function startup.init_data_store()
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   424
	require "prosody.core.storagemanager";
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   425
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   426
13346
d0a9b631a937 util.startup: Use prosody. module namespace
Kim Alvefur <zash@zash.se>
parents: 13315
diff changeset
   427
local running_state = require "prosody.util.fsm".new({
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   428
	default_state = "uninitialized";
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   429
	transitions = {
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   430
		{ name = "begin_startup",   from = "uninitialized",           to = "starting" };
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   431
		{ name = "finish_startup",  from = "starting",                to = "running" };
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   432
		{ name = "begin_shutdown",  from = { "running", "starting" }, to = "stopping" };
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   433
		{ name = "finish_shutdown", from = "stopping",                to = "stopped" };
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   434
	};
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   435
	handlers = {
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   436
		transitioned = function (transition)
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   437
			prosody.state = transition.to;
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   438
		end;
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   439
	};
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   440
	state_handlers = {
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   441
		starting = function ()
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   442
			prosody.log("debug", "Firing server-starting event");
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   443
			prosody.events.fire_event("server-starting");
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   444
			prosody.start_time = os.time();
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   445
		end;
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   446
		running = function ()
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   447
			prosody.log("debug", "Startup complete, firing server-started");
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   448
			prosody.events.fire_event("server-started");
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   449
		end;
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   450
	};
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   451
}):init();
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   452
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   453
function startup.prepare_to_start()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   454
	log("info", "Prosody is using the %s backend for connection handling", server.get_backend());
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   455
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   456
	-- Signal to modules that we are ready to start
13169
9c13c11b199d renamening: Fix newly added imports to use the new namespace
Kim Alvefur <zash@zash.se>
parents: 13124
diff changeset
   457
	prosody.started = require "prosody.util.promise".new(function (resolve)
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   458
		if prosody.state == "running" then
13018
06453c564141 util.startup: Add prosody.started promise to easily execute code after startup
Matthew Wild <mwild1@gmail.com>
parents: 12986
diff changeset
   459
			resolve();
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   460
		else
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   461
			prosody.events.add_handler("server-started", function ()
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   462
				resolve();
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   463
			end);
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   464
		end
13018
06453c564141 util.startup: Add prosody.started promise to easily execute code after startup
Matthew Wild <mwild1@gmail.com>
parents: 12986
diff changeset
   465
	end):catch(function (err)
06453c564141 util.startup: Add prosody.started promise to easily execute code after startup
Matthew Wild <mwild1@gmail.com>
parents: 12986
diff changeset
   466
		prosody.log("error", "Prosody startup error: %s", err);
06453c564141 util.startup: Add prosody.started promise to easily execute code after startup
Matthew Wild <mwild1@gmail.com>
parents: 12986
diff changeset
   467
	end);
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   468
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   469
	running_state:begin_startup();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   470
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   471
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   472
function startup.init_global_protection()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   473
	-- Catch global accesses
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   474
	-- luacheck: ignore 212/t
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   475
	local locked_globals_mt = {
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   476
		__index = function (t, k) log("warn", "%s", debug.traceback("Attempt to read a non-existent global '"..tostring(k).."'", 2)); end;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   477
		__newindex = function (t, k, v) error("Attempt to set a global: "..tostring(k).." = "..tostring(v), 2); end;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   478
	};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   479
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   480
	function prosody.unlock_globals()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   481
		setmetatable(_G, nil);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   482
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   483
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   484
	function prosody.lock_globals()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   485
		setmetatable(_G, locked_globals_mt);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   486
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   487
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   488
	-- And lock now...
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   489
	prosody.lock_globals();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   490
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   491
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   492
function startup.read_version()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   493
	-- Try to determine version
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   494
	local version_file = io.open((CFG_SOURCEDIR or ".").."/prosody.version");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   495
	prosody.version = "unknown";
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   496
	if version_file then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   497
		prosody.version = version_file:read("*a"):gsub("%s*$", "");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   498
		version_file:close();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   499
		if #prosody.version == 12 and prosody.version:match("^[a-f0-9]+$") then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   500
			prosody.version = "hg:"..prosody.version;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   501
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   502
	else
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   503
		local hg = require"prosody.util.mercurial";
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   504
		local hgid = hg.check_id(CFG_SOURCEDIR or ".");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   505
		if hgid then prosody.version = "hg:" .. hgid; end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   506
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   507
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   508
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   509
function startup.log_greeting()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   510
	log("info", "Hello and welcome to Prosody version %s", prosody.version);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   511
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   512
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   513
function startup.notify_started()
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   514
	running_state:finish_startup();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   515
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   516
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   517
-- Override logging config (used by prosodyctl)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   518
function startup.force_console_logging()
8669
57780ba1938f util.startup: Move original_logging_config to a local variable
Matthew Wild <mwild1@gmail.com>
parents: 8668
diff changeset
   519
	original_logging_config = config.get("*", "log");
11832
024ac556e907 prosodyctl: Add support for -v/--verbose to enable debug logging
Kim Alvefur <zash@zash.se>
parents: 11564
diff changeset
   520
	local log_level = os.getenv("PROSODYCTL_LOG_LEVEL");
12247
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   521
	if not log_level then
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   522
		if prosody.opts.verbose then
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   523
			log_level = "debug";
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   524
		elseif prosody.opts.quiet then
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   525
			log_level = "error";
12248
858d40d675ee util.startup: Teach prosodyctl to be completely --silent
Kim Alvefur <zash@zash.se>
parents: 12247
diff changeset
   526
		elseif prosody.opts.silent then
858d40d675ee util.startup: Teach prosodyctl to be completely --silent
Kim Alvefur <zash@zash.se>
parents: 12247
diff changeset
   527
			config.set("*", "log", {}); -- ssssshush!
858d40d675ee util.startup: Teach prosodyctl to be completely --silent
Kim Alvefur <zash@zash.se>
parents: 12247
diff changeset
   528
			return
12247
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   529
		end
73ecfe811526 util.startup: Teach prosodyctl to be --quiet as complement to --verbose
Kim Alvefur <zash@zash.se>
parents: 12164
diff changeset
   530
	end
11832
024ac556e907 prosodyctl: Add support for -v/--verbose to enable debug logging
Kim Alvefur <zash@zash.se>
parents: 11564
diff changeset
   531
	config.set("*", "log", { { levels = { min = log_level or "info" }, to = "console" } });
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   532
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   533
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   534
function startup.switch_user()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   535
	-- Switch away from root and into the prosody user --
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   536
	-- NOTE: This function is only used by prosodyctl.
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   537
	-- The prosody process is built with the assumption that
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   538
	-- it is already started as the appropriate user.
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   539
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   540
	local want_pposix_version = "0.4.0";
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   541
	local have_pposix, pposix = pcall(require, "prosody.util.pposix");
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   542
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   543
	if have_pposix and pposix then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   544
		if pposix._VERSION ~= want_pposix_version then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   545
			print(string.format("Unknown version (%s) of binary pposix module, expected %s",
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   546
				tostring(pposix._VERSION), want_pposix_version));
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   547
			os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   548
		end
8675
86b12ae8d427 util.startup: Expose user switching information via prosody global object
Matthew Wild <mwild1@gmail.com>
parents: 8670
diff changeset
   549
		prosody.current_uid = pposix.getuid();
10601
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
   550
		local arg_root = prosody.opts.root;
8675
86b12ae8d427 util.startup: Expose user switching information via prosody global object
Matthew Wild <mwild1@gmail.com>
parents: 8670
diff changeset
   551
		if prosody.current_uid == 0 and config.get("*", "run_as_root") ~= true and not arg_root then
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   552
			-- We haz root!
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   553
			local desired_user = config.get("*", "prosody_user") or "prosody";
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   554
			local desired_group = config.get("*", "prosody_group") or desired_user;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   555
			local ok, err = pposix.setgid(desired_group);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   556
			if ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   557
				ok, err = pposix.initgroups(desired_user);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   558
			end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   559
			if ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   560
				ok, err = pposix.setuid(desired_user);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   561
				if ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   562
					-- Yay!
8675
86b12ae8d427 util.startup: Expose user switching information via prosody global object
Matthew Wild <mwild1@gmail.com>
parents: 8670
diff changeset
   563
					prosody.switched_user = true;
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   564
				end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   565
			end
8675
86b12ae8d427 util.startup: Expose user switching information via prosody global object
Matthew Wild <mwild1@gmail.com>
parents: 8670
diff changeset
   566
			if not prosody.switched_user then
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   567
				-- Boo!
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   568
				print("Warning: Couldn't switch to Prosody user/group '"..tostring(desired_user).."'/'"..tostring(desired_group).."': "..tostring(err));
11870
515a89dee6ae util.startup: Skip config readability check in migrator (thanks eTaurus)
Kim Alvefur <zash@zash.se>
parents: 11851
diff changeset
   569
			elseif prosody.config_file then
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   570
				-- Make sure the Prosody user can read the config
10536
19ec384eb782 util.startup: Ignore unused errno variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10409
diff changeset
   571
				local conf, err, errno = io.open(prosody.config_file); --luacheck: ignore 211/errno
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   572
				if conf then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   573
					conf:close();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   574
				else
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   575
					print("The config file is not readable by the '"..desired_user.."' user.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   576
					print("Prosody will not be able to read it.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   577
					print("Error was "..err);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   578
					os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   579
				end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   580
			end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   581
		end
8640
c8368c7c81a1 util.startup: Trim trailing whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8639
diff changeset
   582
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   583
		-- Set our umask to protect data files
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   584
		pposix.umask(config.get("*", "umask") or "027");
8670
a05d36075c6a util.startup: Fix variable usage [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 8669
diff changeset
   585
		pposix.setenv("HOME", prosody.paths.data);
a05d36075c6a util.startup: Fix variable usage [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 8669
diff changeset
   586
		pposix.setenv("PROSODY_CONFIG", prosody.config_file);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   587
	else
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   588
		print("Error: Unable to load pposix module. Check that Prosody is installed correctly.")
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   589
		print("For more help send the below error to us through https://prosody.im/discuss");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   590
		print(tostring(pposix))
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   591
		os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   592
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   593
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   594
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   595
function startup.check_unwriteable()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   596
	local function test_writeable(filename)
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   597
		local f, err = io.open(filename, "a");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   598
		if not f then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   599
			return false, err;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   600
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   601
		f:close();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   602
		return true;
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   603
	end
8640
c8368c7c81a1 util.startup: Trim trailing whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8639
diff changeset
   604
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   605
	local unwriteable_files = {};
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   606
	if type(original_logging_config) == "string" and original_logging_config:sub(1,1) ~= "*" then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   607
		local ok, err = test_writeable(original_logging_config);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   608
		if not ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   609
			table.insert(unwriteable_files, err);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   610
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   611
	elseif type(original_logging_config) == "table" then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   612
		for _, rule in ipairs(original_logging_config) do
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   613
			if rule.filename then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   614
				local ok, err = test_writeable(rule.filename);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   615
				if not ok then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   616
					table.insert(unwriteable_files, err);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   617
				end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   618
			end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   619
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   620
	end
8640
c8368c7c81a1 util.startup: Trim trailing whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8639
diff changeset
   621
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   622
	if #unwriteable_files > 0 then
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   623
		print("One of more of the Prosody log files are not");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   624
		print("writeable, please correct the errors and try");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   625
		print("starting prosodyctl again.");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   626
		print("");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   627
		for _, err in ipairs(unwriteable_files) do
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   628
			print(err);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   629
		end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   630
		print("");
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   631
		os.exit(1);
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   632
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   633
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   634
11077
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   635
function startup.init_gc()
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   636
	-- Apply garbage collector settings from the config file
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   637
	local gc = require "prosody.util.gc";
11077
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   638
	local gc_settings = config.get("*", "gc") or { mode = default_gc_params.mode };
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   639
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   640
	local ok, err = gc.configure(gc_settings, default_gc_params);
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   641
	if not ok then
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   642
		log("error", "Failed to apply GC configuration: %s", err);
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   643
		return nil, err;
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   644
	end
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   645
	return true;
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   646
end
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   647
11054
51be24b16e8a util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents: 10952
diff changeset
   648
function startup.init_errors()
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   649
	require "prosody.util.error".configure(config.get("*", "error_library") or {});
11054
51be24b16e8a util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents: 10952
diff changeset
   650
end
51be24b16e8a util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents: 10952
diff changeset
   651
8676
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   652
function startup.make_host(hostname)
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   653
	return {
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   654
		type = "local",
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   655
		events = prosody.events,
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   656
		modules = {},
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   657
		sessions = {},
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
   658
		users = require "prosody.core.usermanager".new_null_provider(hostname)
8676
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   659
	};
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   660
end
6aeed79d9283 util.startup: Expose make_host() function
Matthew Wild <mwild1@gmail.com>
parents: 8675
diff changeset
   661
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   662
function startup.make_dummy_hosts()
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   663
	-- When running under prosodyctl, we don't want to
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   664
	-- fully initialize the server, so we populate prosody.hosts
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   665
	-- with just enough things for most code to work correctly
8641
f8f45bbbd8ba util.startup: Ignore various globals being read and written as part of startup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8640
diff changeset
   666
	-- luacheck: ignore 122/hosts
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   667
	prosody.core_post_stanza = function () end; -- TODO: mod_router!
8640
c8368c7c81a1 util.startup: Trim trailing whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8639
diff changeset
   668
8642
070a77c15f63 util.startup: Remove unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8641
diff changeset
   669
	for hostname in pairs(config.getconfig()) do
8718
25d8d6091ec3 util.startup: Access the hosts table via the prosody global for consistency
Kim Alvefur <zash@zash.se>
parents: 8716
diff changeset
   670
		prosody.hosts[hostname] = startup.make_host(hostname);
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   671
	end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   672
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   673
13456
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   674
function startup.hook_posix_signals()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   675
	if prosody.platform ~= "posix" then return end
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   676
	local have_signal, signal = pcall(require, "prosody.util.signal");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   677
	if not have_signal then
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   678
		log("warn", "Couldn't load signal library, won't respond to SIGTERM");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   679
		return
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   680
	end
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   681
	signal.signal("SIGTERM", function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   682
		log("warn", "Received SIGTERM");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   683
		prosody.main_thread:run(function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   684
			prosody.unlock_globals();
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   685
			prosody.shutdown("Received SIGTERM");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   686
			prosody.lock_globals();
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   687
		end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   688
	end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   689
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   690
	signal.signal("SIGHUP", function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   691
		log("info", "Received SIGHUP");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   692
		prosody.main_thread:run(function() prosody.reload_config(); end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   693
		-- this also reloads logging
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   694
	end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   695
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   696
	signal.signal("SIGINT", function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   697
		log("info", "Received SIGINT");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   698
		prosody.main_thread:run(function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   699
			prosody.unlock_globals();
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   700
			prosody.shutdown("Received SIGINT");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   701
			prosody.lock_globals();
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   702
		end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   703
	end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   704
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   705
	signal.signal("SIGUSR1", function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   706
		log("info", "Received SIGUSR1");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   707
		fire_event("signal/SIGUSR1");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   708
	end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   709
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   710
	signal.signal("SIGUSR2", function()
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   711
		log("info", "Received SIGUSR2");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   712
		fire_event("signal/SIGUSR2");
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   713
	end);
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   714
end
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   715
12298
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   716
function startup.cleanup()
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   717
	prosody.log("info", "Shutdown status: Cleaning up");
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   718
	prosody.events.fire_event("server-cleanup");
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   719
end
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   720
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   721
function startup.shutdown()
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   722
	running_state:begin_shutdown();
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   723
12298
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   724
	prosody.log("info", "Shutting down...");
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   725
	startup.cleanup();
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   726
	prosody.events.fire_event("server-stopped");
13315
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   727
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   728
	running_state:finish_shutdown();
ab36edc7c217 util.startup: Attempt to bring some order to startup/shutdown with util.fsm
Matthew Wild <mwild1@gmail.com>
parents: 13169
diff changeset
   729
12298
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   730
	prosody.log("info", "Shutdown complete");
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   731
	prosody.log("debug", "Shutdown reason was: %s", prosody.shutdown_reason or "not specified");
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   732
	prosody.log("debug", "Exiting with status code: %d", prosody.shutdown_code or 0);
12557
cc0ec0277813 util.startup: Fix async waiting for last shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12427
diff changeset
   733
	server.setquitting(true);
cc0ec0277813 util.startup: Fix async waiting for last shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12427
diff changeset
   734
end
cc0ec0277813 util.startup: Fix async waiting for last shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12427
diff changeset
   735
cc0ec0277813 util.startup: Fix async waiting for last shutdown steps
Kim Alvefur <zash@zash.se>
parents: 12427
diff changeset
   736
function startup.exit()
12867
891edd1ebde6 util.startup: Close state on exit to ensure GC finalizers are called
Kim Alvefur <zash@zash.se>
parents: 12783
diff changeset
   737
	os.exit(prosody.shutdown_code, true);
12298
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   738
end
81f147ddc4ab prosody: Move last cleanup and shutdown code into util.startup
Kim Alvefur <zash@zash.se>
parents: 12278
diff changeset
   739
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   740
-- prosodyctl only
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   741
function startup.prosodyctl()
10640
a9c975a0f113 util.startup: expose current process type (prosody/prosodyctl) in the global prosody object
Matthew Wild <mwild1@gmail.com>
parents: 10608
diff changeset
   742
	prosody.process_type = "prosodyctl";
10601
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
   743
	startup.parse_args();
8702
580c13ed0ca1 util.startup: Initialize the 'prosody' global earlier (various things needs the global util.events instance)
Kim Alvefur <zash@zash.se>
parents: 8701
diff changeset
   744
	startup.init_global_state();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   745
	startup.read_config();
8758
857d8f38a010 util.startup: Force console logging before initializing logging (see 2fdeb979cc7c)
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
   746
	startup.force_console_logging();
8751
2fdeb979cc7c util.startup: Initialize logging immediately after configuration is read (which is how it used to work)
Matthew Wild <mwild1@gmail.com>
parents: 8737
diff changeset
   747
	startup.init_logging();
11077
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   748
	startup.init_gc();
11054
51be24b16e8a util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents: 10952
diff changeset
   749
	startup.init_errors();
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   750
	startup.setup_plugindir();
11142
2a19d61f4ae4 util.startup: Re-enable installer path setup
Kim Alvefur <zash@zash.se>
parents: 11141
diff changeset
   751
	startup.setup_plugin_install_path();
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   752
	startup.setup_datadir();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   753
	startup.chdir();
8691
019b4b3dd5ad util.startup: Read version for prosodyctl (restores version in 'about' command)
Kim Alvefur <zash@zash.se>
parents: 8685
diff changeset
   754
	startup.read_version();
8668
4b260a3f8b94 util.startup: Restore user switching
Matthew Wild <mwild1@gmail.com>
parents: 8667
diff changeset
   755
	startup.switch_user();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   756
	startup.check_dependencies();
9877
dfaeea570f7e util.startup: Give function a more generic name so it can apply to all warnings
Matthew Wild <mwild1@gmail.com>
parents: 9766
diff changeset
   757
	startup.log_startup_warnings();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   758
	startup.check_unwriteable();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   759
	startup.load_libraries();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   760
	startup.init_http_client();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   761
	startup.make_dummy_hosts();
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   762
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   763
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   764
function startup.prosody()
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   765
	-- These actions are in a strict order, as many depend on
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   766
	-- previous steps to have already been performed
10640
a9c975a0f113 util.startup: expose current process type (prosody/prosodyctl) in the global prosody object
Matthew Wild <mwild1@gmail.com>
parents: 10608
diff changeset
   767
	prosody.process_type = "prosody";
10601
25a3c8134b0a prosody/util.startup: Switch to parse_args() for --root and --config
Matthew Wild <mwild1@gmail.com>
parents: 10600
diff changeset
   768
	startup.parse_args();
8702
580c13ed0ca1 util.startup: Initialize the 'prosody' global earlier (various things needs the global util.events instance)
Kim Alvefur <zash@zash.se>
parents: 8701
diff changeset
   769
	startup.init_global_state();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   770
	startup.read_config();
8751
2fdeb979cc7c util.startup: Initialize logging immediately after configuration is read (which is how it used to work)
Matthew Wild <mwild1@gmail.com>
parents: 8737
diff changeset
   771
	startup.init_logging();
11077
5691b9773c5b util.startup: Configure the GC on startup, using the config or built-in defaults
Matthew Wild <mwild1@gmail.com>
parents: 10951
diff changeset
   772
	startup.init_gc();
11054
51be24b16e8a util.error: Allow optional tracebacks to be injected on errors
Matthew Wild <mwild1@gmail.com>
parents: 10952
diff changeset
   773
	startup.init_errors();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   774
	startup.sanity_check();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   775
	startup.sandbox_require();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   776
	startup.set_function_metatable();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   777
	startup.check_dependencies();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   778
	startup.load_libraries();
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   779
	startup.setup_plugindir();
11142
2a19d61f4ae4 util.startup: Re-enable installer path setup
Kim Alvefur <zash@zash.se>
parents: 11141
diff changeset
   780
	startup.setup_plugin_install_path();
8701
0499f3da0ec4 util.startup: Factor out processing of plugin and data paths into a separate functions
Kim Alvefur <zash@zash.se>
parents: 8695
diff changeset
   781
	startup.setup_datadir();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   782
	startup.chdir();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   783
	startup.add_global_prosody_functions();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   784
	startup.read_version();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   785
	startup.log_greeting();
9877
dfaeea570f7e util.startup: Give function a more generic name so it can apply to all warnings
Matthew Wild <mwild1@gmail.com>
parents: 9766
diff changeset
   786
	startup.log_startup_warnings();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   787
	startup.load_secondary_libraries();
11952
dca75cc6fc5a util.startup: Integrate util.promise with net.server main loop
Kim Alvefur <zash@zash.se>
parents: 11874
diff changeset
   788
	startup.init_promise();
11967
f5c6be4a3ecc util.startup: Initialize util.async at startup
Matthew Wild <mwild1@gmail.com>
parents: 11952
diff changeset
   789
	startup.init_async();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   790
	startup.init_http_client();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   791
	startup.init_data_store();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   792
	startup.init_global_protection();
13456
69faf3552d52 mod_posix: Move POSIX signal handling into util.startup to avoid race
Kim Alvefur <zash@zash.se>
parents: 13428
diff changeset
   793
	startup.hook_posix_signals();
8685
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   794
	startup.prepare_to_start();
151ecd18d624 prosody, util.startup: Switch from async.once() to long-lived thread, to avoid GC
Matthew Wild <mwild1@gmail.com>
parents: 8676
diff changeset
   795
	startup.notify_started();
8638
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   796
end
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   797
47e3b8b6f17a prosody, prosodyctl, util.startup: Finally factor out startup-related and common code into a separate module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   798
return startup;