prosody
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Feb 2018 15:30:00 +0000
changeset 8531 67311cda0625
parent 8288 433b2a41351f
child 8638 47e3b8b6f17a
permissions -rwxr-xr-x
net.server_select: Better detection of errors for outgoing connections On connection failure, a socket is marked readable and writable. So to detect initial connection failures (connection refused, etc.) we now watch for sockets becoming readable during initial connection, and also read from readable sockets before writing to writable sockets. This should fix 'onconnect' being called for outgoing connections that actually failed.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
     1
#!/usr/bin/env lua
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1493
diff changeset
     2
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2877
diff changeset
     3
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2877
diff changeset
     4
-- Copyright (C) 2008-2010 Waqas Hussain
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
     5
--
761
67ec69001fd7 Update main prosody file, since it doesn't match *.lua pattern, and sed -i treats symlinks badly
Matthew Wild <mwild1@gmail.com>
parents: 755
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
67ec69001fd7 Update main prosody file, since it doesn't match *.lua pattern, and sed -i treats symlinks badly
Matthew Wild <mwild1@gmail.com>
parents: 755
diff changeset
     7
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 502
diff changeset
     8
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 502
diff changeset
     9
3740
69f95537e9e4 prosody: Added a comment, to match prosodyctl.
Waqas Hussain <waqas20@gmail.com>
parents: 3713
diff changeset
    10
-- prosody - main executable for Prosody XMPP server
69f95537e9e4 prosody: Added a comment, to match prosodyctl.
Waqas Hussain <waqas20@gmail.com>
parents: 3713
diff changeset
    11
843
1d2dab41b0db prosody: Protect main loop. Dare I say crashing finally becomes impossible.
Matthew Wild <mwild1@gmail.com>
parents: 793
diff changeset
    12
-- Will be modified by configure script if run --
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    13
7300
b34a42a10c9f prosody, prosodyctl: Allow setting CFG_* variables via Lua interpreter before loading Prosody. Fixes #308.
Matthew Wild <mwild1@gmail.com>
parents: 7084
diff changeset
    14
CFG_SOURCEDIR=CFG_SOURCEDIR or os.getenv("PROSODY_SRCDIR");
b34a42a10c9f prosody, prosodyctl: Allow setting CFG_* variables via Lua interpreter before loading Prosody. Fixes #308.
Matthew Wild <mwild1@gmail.com>
parents: 7084
diff changeset
    15
CFG_CONFIGDIR=CFG_CONFIGDIR or os.getenv("PROSODY_CFGDIR");
b34a42a10c9f prosody, prosodyctl: Allow setting CFG_* variables via Lua interpreter before loading Prosody. Fixes #308.
Matthew Wild <mwild1@gmail.com>
parents: 7084
diff changeset
    16
CFG_PLUGINDIR=CFG_PLUGINDIR or os.getenv("PROSODY_PLUGINDIR");
b34a42a10c9f prosody, prosodyctl: Allow setting CFG_* variables via Lua interpreter before loading Prosody. Fixes #308.
Matthew Wild <mwild1@gmail.com>
parents: 7084
diff changeset
    17
CFG_DATADIR=CFG_DATADIR or os.getenv("PROSODY_DATADIR");
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    18
2147
119323e35c32 Mainfile: Fixed some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 2087
diff changeset
    19
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    20
3999
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    21
local function is_relative(path)
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    22
	local path_sep = package.config:sub(1,1);
8267
23aee8ccfe9b prosody: Tiny whitespace fix
Kim Alvefur <zash@zash.se>
parents: 8205
diff changeset
    23
	return ((path_sep == "/" and path:sub(1,1) ~= "/")
23aee8ccfe9b prosody: Tiny whitespace fix
Kim Alvefur <zash@zash.se>
parents: 8205
diff changeset
    24
		or (path_sep == "\\" and (path:sub(1,1) ~= "/" and path:sub(2,3) ~= ":\\")))
3999
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    25
end
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    26
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    27
-- Tell Lua where to find our libraries
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    28
if CFG_SOURCEDIR then
3999
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    29
	local function filter_relative_paths(path)
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    30
		if is_relative(path) then return ""; end
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    31
	end
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    32
	local function sanitise_paths(paths)
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    33
		return (paths:gsub("[^;]+;?", filter_relative_paths):gsub(";;+", ";"));
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    34
	end
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    35
	package.path = sanitise_paths(CFG_SOURCEDIR.."/?.lua;"..package.path);
58c0de7c6da0 prosody, prosodyctl: Filter out relative paths from package.(c)path when installed
Matthew Wild <mwild1@gmail.com>
parents: 3998
diff changeset
    36
	package.cpath = sanitise_paths(CFG_SOURCEDIR.."/?.so;"..package.cpath);
455
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    37
end
2eeae9c314b0 main.lua -> prosody
Matthew Wild <mwild1@gmail.com>
parents: 452
diff changeset
    38
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    39
-- Substitute ~ with path to home directory in data path
502
21dc299387a6 Installation improvements (auto-creation of data directories)
Matthew Wild <mwild1@gmail.com>
parents: 500
diff changeset
    40
if CFG_DATADIR then
467
66f145f5c932 Update Makefile to now pass config paths to prosody. Update prosody, modulemanager and connectionlisteners to obey these paths.
Matthew Wild <mwild1@gmail.com>
parents: 455
diff changeset
    41
	if os.getenv("HOME") then
502
21dc299387a6 Installation improvements (auto-creation of data directories)
Matthew Wild <mwild1@gmail.com>
parents: 500
diff changeset
    42
		CFG_DATADIR = CFG_DATADIR:gsub("^~", os.getenv("HOME"));
467
66f145f5c932 Update Makefile to now pass config paths to prosody. Update prosody, modulemanager and connectionlisteners to obey these paths.
Matthew Wild <mwild1@gmail.com>
parents: 455
diff changeset
    43
	end
502
21dc299387a6 Installation improvements (auto-creation of data directories)
Matthew Wild <mwild1@gmail.com>
parents: 500
diff changeset
    44
end
467
66f145f5c932 Update Makefile to now pass config paths to prosody. Update prosody, modulemanager and connectionlisteners to obey these paths.
Matthew Wild <mwild1@gmail.com>
parents: 455
diff changeset
    45
6988
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    46
if #arg > 0 and arg[1] ~= "--config" then
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    47
	print("Unknown command-line option: "..tostring(arg[1]));
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    48
	print("Perhaps you meant to use prosodyctl instead?");
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    49
	return 1;
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    50
end
a2e1f5ebdb53 prosody: Don't silently ignore unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 6924
diff changeset
    51
2986
fff153f7f4de eventmanager, prosody: Adapt eventmanager to use prosody.events, as a step towards removing it entirely
Matthew Wild <mwild1@gmail.com>
parents: 2985
diff changeset
    52
-- Global 'prosody' object
3998
009d1ad84b49 prosody, prosodyctl: Create prosody object as a local before exporting as a global
Matthew Wild <mwild1@gmail.com>
parents: 3985
diff changeset
    53
local prosody = { events = require "util.events".new(); };
009d1ad84b49 prosody, prosodyctl: Create prosody object as a local before exporting as a global
Matthew Wild <mwild1@gmail.com>
parents: 3985
diff changeset
    54
_G.prosody = prosody;
2986
fff153f7f4de eventmanager, prosody: Adapt eventmanager to use prosody.events, as a step towards removing it entirely
Matthew Wild <mwild1@gmail.com>
parents: 2985
diff changeset
    55
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
    56
-- Check dependencies
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
    57
local dependencies = require "util.dependencies";
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
    58
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    59
-- Load the config-parsing module
433
afbf29498123 Fix to make a global configmanager instance
Matthew Wild <mwild1@gmail.com>
parents: 412
diff changeset
    60
config = require "core.configmanager"
612
0d44fc0a78f8 Add commented line to disable logging entirely
Matthew Wild <mwild1@gmail.com>
parents: 605
diff changeset
    61
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    62
-- -- -- --
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
    63
-- Define the functions we call during startup, the
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    64
-- actual startup happens right at the end, where these
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
    65
-- functions get called
612
0d44fc0a78f8 Add commented line to disable logging entirely
Matthew Wild <mwild1@gmail.com>
parents: 605
diff changeset
    66
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
    67
function read_config()
2154
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    68
	local filenames = {};
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
    69
2154
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    70
	local filename;
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    71
	if arg[1] == "--config" and arg[2] then
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    72
		table.insert(filenames, arg[2]);
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    73
		if CFG_CONFIGDIR then
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    74
			table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    75
		end
5296
78b7a4ad2f32 prosodyctl, prosody: Pass the selected config file from prosodyctl to prosody
Kim Alvefur <zash@zash.se>
parents: 5281
diff changeset
    76
	elseif os.getenv("PROSODY_CONFIG") then -- Passed by prosodyctl
78b7a4ad2f32 prosodyctl, prosody: Pass the selected config file from prosodyctl to prosody
Kim Alvefur <zash@zash.se>
parents: 5281
diff changeset
    77
			table.insert(filenames, os.getenv("PROSODY_CONFIG"));
2154
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    78
	else
8156
c22d5680ca68 configmanager: Remove support for multiple parsers, fixes #852.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7881
diff changeset
    79
		table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg.lua");
2154
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    80
	end
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    81
	for _,_filename in ipairs(filenames) do
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    82
		filename = _filename;
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    83
		local file = io.open(filename);
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    84
		if file then
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    85
			file:close();
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    86
			CFG_CONFIGDIR = filename:match("^(.*)[\\/][^\\/]*$");
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    87
			break;
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    88
		end
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    89
	end
5937
bcad61007a4e prosody: Store the config file name so the same file can be used when reloading
Kim Alvefur <zash@zash.se>
parents: 5428
diff changeset
    90
	prosody.config_file = filename
2154
b8635ebd7f57 prosody: Added support for command line argument '--config'.
Waqas Hussain <waqas20@gmail.com>
parents: 2147
diff changeset
    91
	local ok, level, err = config.load(filename);
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 359
diff changeset
    92
	if not ok then
1001
4bd375bde3cb prosody: Simple whitespace fix in error output
Matthew Wild <mwild1@gmail.com>
parents: 992
diff changeset
    93
		print("\n");
744
328b702fb80c Friendlier message when config file not found
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
    94
		print("**************************");
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
    95
		if level == "parser" then
8279
5ebad58b2548 prosody, prosodyctl: Print the actual config file name used when a problem loading it was encountered (see #990)
Kim Alvefur <zash@zash.se>
parents: 8267
diff changeset
    96
			print("A problem occured while reading the config file "..filename);
3930
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
    97
			print("");
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
    98
			local err_line, err_message = tostring(err):match("%[string .-%]:(%d*): (.*)");
3930
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
    99
			if err:match("chunk has too many syntax levels$") then
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
   100
				print("An Include statement in a config file is including an already-included");
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
   101
				print("file and causing an infinite loop. An Include statement in a config file is...");
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
   102
			else
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
   103
				print("Error"..(err_line and (" on line "..err_line) or "")..": "..(err_message or tostring(err)));
46d9cf613bb1 prosody: Catch a recursive Include error and print a more friendly error
Matthew Wild <mwild1@gmail.com>
parents: 3904
diff changeset
   104
			end
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   105
			print("");
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   106
		elseif level == "file" then
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   107
			print("Prosody was unable to find the configuration file.");
8279
5ebad58b2548 prosody, prosodyctl: Print the actual config file name used when a problem loading it was encountered (see #990)
Kim Alvefur <zash@zash.se>
parents: 8267
diff changeset
   108
			print("We looked for: "..filename);
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   109
			print("A sample config file is included in the Prosody download called prosody.cfg.lua.dist");
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   110
			print("Copy or rename it to prosody.cfg.lua and edit as necessary.");
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   111
		end
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7300
diff changeset
   112
		print("More help on configuring Prosody can be found at https://prosody.im/doc/configure");
744
328b702fb80c Friendlier message when config file not found
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
   113
		print("Good luck!");
328b702fb80c Friendlier message when config file not found
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
   114
		print("**************************");
793
55add3b87c01 Report errors in the config file to the user
Matthew Wild <mwild1@gmail.com>
parents: 761
diff changeset
   115
		print("");
744
328b702fb80c Friendlier message when config file not found
Matthew Wild <mwild1@gmail.com>
parents: 739
diff changeset
   116
		os.exit(1);
376
6d87944df37c New configmanager. Old-style config files still work, but will print a warning
Matthew Wild <mwild1@gmail.com>
parents: 359
diff changeset
   117
	end
0
3e3171b59028 First commit, where do you want to go tomorrow?
matthew
parents:
diff changeset
   118
end
36
62998e5319e3 Moved hosts to a config file, still need better config though
Matthew Wild <mwild1@gmail.com>
parents: 34
diff changeset
   119
6066
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   120
function check_dependencies()
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   121
	if not dependencies.check_dependencies() then
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   122
		os.exit(1);
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   123
	end
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   124
end
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   125
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   126
-- luacheck: globals socket server
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   127
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   128
function load_libraries()
2147
119323e35c32 Mainfile: Fixed some comments.
Waqas Hussain <waqas20@gmail.com>
parents: 2087
diff changeset
   129
	-- Load socket framework
7880
23c7e3bfd299 prosody: Silence warnings about setting the globals 'server' and 'socket' [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7879
diff changeset
   130
	-- luacheck: ignore 111/server 111/socket
6811
f076dac78155 prosody: Set a luasocket global, fixes undefined global access in loop() (pending util.startup)
Kim Alvefur <zash@zash.se>
parents: 6557
diff changeset
   131
	socket = require "socket";
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   132
	server = require "net.server"
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   133
end
755
c9f4f7f08a48 Load net.server after util.dependencies to catch missing luasocket
Matthew Wild <mwild1@gmail.com>
parents: 744
diff changeset
   134
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   135
-- The global log() gets defined by loggingmanager
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   136
-- luacheck: ignore 113/log
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   137
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   138
function init_logging()
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   139
	-- Initialize logging
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   140
	require "core.loggingmanager"
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   141
end
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   142
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
   143
function log_dependency_warnings()
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
   144
	dependencies.log_warnings();
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   145
end
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   146
4249
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   147
function sanity_check()
5023
dcc8e789df36 mod_admin_telnet, prosody, prosodyctl, ejabberd2prosody: Don't depend on modules setting globals
Florian Zeitz <florob@babelmonkeys.de>
parents: 5022
diff changeset
   148
	for host, host_config in pairs(config.getconfig()) do
4249
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   149
		if host ~= "*"
5357
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5296
diff changeset
   150
		and host_config.enabled ~= false
ac530c44772e configmanager, hostmanager, prosody: Almost complete removal of section-related code, and the infamous 'core' section. Still backwards-compatible with API users.
Matthew Wild <mwild1@gmail.com>
parents: 5296
diff changeset
   151
		and not host_config.component_module then
4249
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   152
			return;
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   153
		end
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   154
	end
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   155
	log("error", "No enabled VirtualHost entries found in the config file.");
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   156
	log("error", "At least one active host is required for Prosody to function. Exiting...");
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   157
	os.exit(1);
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   158
end
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   159
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   160
function sandbox_require()
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   161
	-- Replace require() with one that doesn't pollute _G, required
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   162
	-- for neat sandboxing of modules
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   163
	-- luacheck: ignore 113/getfenv 111/require
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   164
	local _realG = _G;
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   165
	local _real_require = require;
6473
67501b5576d3 prosody: Make getfenv() replacement for require() sandboxing local to avoid polluting the globals table
Kim Alvefur <zash@zash.se>
parents: 6419
diff changeset
   166
	local getfenv = getfenv or function (f)
5022
776a57ca0d84 prosody: Define a getfenv() replacement for Lua 5.2
Florian Zeitz <florob@babelmonkeys.de>
parents: 4877
diff changeset
   167
		-- FIXME: This is a hack to replace getfenv() in Lua 5.2
6473
67501b5576d3 prosody: Make getfenv() replacement for require() sandboxing local to avoid polluting the globals table
Kim Alvefur <zash@zash.se>
parents: 6419
diff changeset
   168
		local name, env = debug.getupvalue(debug.getinfo(f or 1).func, 1);
67501b5576d3 prosody: Make getfenv() replacement for require() sandboxing local to avoid polluting the globals table
Kim Alvefur <zash@zash.se>
parents: 6419
diff changeset
   169
		if name == "_ENV" then
67501b5576d3 prosody: Make getfenv() replacement for require() sandboxing local to avoid polluting the globals table
Kim Alvefur <zash@zash.se>
parents: 6419
diff changeset
   170
			return env;
6419
9af742bb45b2 prosody: Fix getfenv replacement for Lua 5.2
Kim Alvefur <zash@zash.se>
parents: 6067
diff changeset
   171
		end
5022
776a57ca0d84 prosody: Define a getfenv() replacement for Lua 5.2
Florian Zeitz <florob@babelmonkeys.de>
parents: 4877
diff changeset
   172
	end
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   173
	function require(...)
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   174
		local curr_env = getfenv(2);
5022
776a57ca0d84 prosody: Define a getfenv() replacement for Lua 5.2
Florian Zeitz <florob@babelmonkeys.de>
parents: 4877
diff changeset
   175
		local curr_env_mt = getmetatable(curr_env);
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   176
		local _realG_mt = getmetatable(_realG);
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   177
		if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
4549
15fe442e70c5 prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
Matthew Wild <mwild1@gmail.com>
parents: 4547
diff changeset
   178
			local old_newindex, old_index;
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   179
			old_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env;
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   180
			old_index, _realG_mt.__index = _realG_mt.__index, function (_G, k) -- luacheck: ignore 212/_G
4549
15fe442e70c5 prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
Matthew Wild <mwild1@gmail.com>
parents: 4547
diff changeset
   181
				return rawget(curr_env, k);
15fe442e70c5 prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
Matthew Wild <mwild1@gmail.com>
parents: 4547
diff changeset
   182
			end;
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   183
			local ret = _real_require(...);
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   184
			_realG_mt.__newindex = old_newindex;
4549
15fe442e70c5 prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
Matthew Wild <mwild1@gmail.com>
parents: 4547
diff changeset
   185
			_realG_mt.__index = old_index;
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   186
			return ret;
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   187
		end
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   188
		return _real_require(...);
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   189
	end
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   190
end
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   191
2976
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   192
function set_function_metatable()
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   193
	local mt = {};
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   194
	function mt.__index(f, upvalue)
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   195
		local i, name, value = 0;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   196
		repeat
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   197
			i = i + 1;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   198
			name, value = debug.getupvalue(f, i);
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   199
		until name == upvalue or name == nil;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   200
		return value;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   201
	end
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   202
	function mt.__newindex(f, upvalue, value)
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   203
		local i, name = 0;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   204
		repeat
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   205
			i = i + 1;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   206
			name = debug.getupvalue(f, i);
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   207
		until name == upvalue or name == nil;
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   208
		if name then
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   209
			debug.setupvalue(f, i, value);
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   210
		end
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   211
	end
3024
9c74785c6351 prosody: Modified function metatable for better string representation of functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3023
diff changeset
   212
	function mt.__tostring(f)
9c74785c6351 prosody: Modified function metatable for better string representation of functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3023
diff changeset
   213
		local info = debug.getinfo(f);
9c74785c6351 prosody: Modified function metatable for better string representation of functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3023
diff changeset
   214
		return ("function(%s:%d)"):format(info.short_src:match("[^\\/]*$"), info.linedefined);
9c74785c6351 prosody: Modified function metatable for better string representation of functions.
Waqas Hussain <waqas20@gmail.com>
parents: 3023
diff changeset
   215
	end
2976
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   216
	debug.setmetatable(function() end, mt);
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   217
end
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   218
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   219
function init_global_state()
7732
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   220
	prosody.bare_sessions = {};
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   221
	prosody.full_sessions = {};
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   222
	prosody.hosts = {};
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   223
5358
4d37d792c4d5 prosody: Add COMPAT note about globals
Matthew Wild <mwild1@gmail.com>
parents: 5357
diff changeset
   224
	-- COMPAT: These globals are deprecated
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   225
	-- luacheck: ignore 111/bare_sessions 111/full_sessions 111/hosts
7732
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   226
	bare_sessions = prosody.bare_sessions;
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   227
	full_sessions = prosody.full_sessions;
f8b81a82e8b6 prosody: Set session tables on the 'prosody' global first, then export them as globals
Kim Alvefur <zash@zash.se>
parents: 7300
diff changeset
   228
	hosts = prosody.hosts;
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   229
5384
24f4aed5824f prosody, prosodyctl: Remove last trace of "core" \o/
Kim Alvefur <zash@zash.se>
parents: 5358
diff changeset
   230
	local data_path = config.get("*", "data_path") or CFG_DATADIR or "data";
24f4aed5824f prosody, prosodyctl: Remove last trace of "core" \o/
Kim Alvefur <zash@zash.se>
parents: 5358
diff changeset
   231
	local custom_plugin_paths = config.get("*", "plugin_paths");
4155
3c5d6a7f07e1 prosody: Change plugin_path -> plugin_paths and make it an array instead of a string
Matthew Wild <mwild1@gmail.com>
parents: 4122
diff changeset
   232
	if custom_plugin_paths then
4167
9c60cc8dc142 prosody, prosodyctl: Use plugin_paths in addition to, not instead of, the default plugin path
Matthew Wild <mwild1@gmail.com>
parents: 4155
diff changeset
   233
		local path_sep = package.config:sub(3,3);
9c60cc8dc142 prosody, prosodyctl: Use plugin_paths in addition to, not instead of, the default plugin path
Matthew Wild <mwild1@gmail.com>
parents: 4155
diff changeset
   234
		-- path1;path2;path3;defaultpath...
9c60cc8dc142 prosody, prosodyctl: Use plugin_paths in addition to, not instead of, the default plugin path
Matthew Wild <mwild1@gmail.com>
parents: 4155
diff changeset
   235
		CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins");
4155
3c5d6a7f07e1 prosody: Change plugin_path -> plugin_paths and make it an array instead of a string
Matthew Wild <mwild1@gmail.com>
parents: 4122
diff changeset
   236
	end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   237
	prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR or ".",
4167
9c60cc8dc142 prosody, prosodyctl: Use plugin_paths in addition to, not instead of, the default plugin path
Matthew Wild <mwild1@gmail.com>
parents: 4155
diff changeset
   238
	                  plugins = CFG_PLUGINDIR or "plugins", data = data_path };
4094
38f3dfe88d4f prosody: Instead of calling datamanager.set_path(), just ensure prosody.paths.data always contains the correct value (including config)
Matthew Wild <mwild1@gmail.com>
parents: 3999
diff changeset
   239
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   240
	prosody.arg = _G.arg;
1236
eca772495e20 prosody: New global 'prosody' object
Matthew Wild <mwild1@gmail.com>
parents: 1221
diff changeset
   241
1789
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   242
	prosody.platform = "unknown";
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   243
	if os.getenv("WINDIR") then
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   244
		prosody.platform = "windows";
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   245
	elseif package.config:sub(1,1) == "/" then
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   246
		prosody.platform = "posix";
23a66fdf541e prosody: Add prosody.platform which can be either 'windows', 'posix' or 'unknown'
Matthew Wild <mwild1@gmail.com>
parents: 1622
diff changeset
   247
	end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   248
1790
f06688f9b6c6 prosody: Add prosody.installed flag to indicate whether Prosody has been installed or is running from checkout
Matthew Wild <mwild1@gmail.com>
parents: 1789
diff changeset
   249
	prosody.installed = nil;
f06688f9b6c6 prosody: Add prosody.installed flag to indicate whether Prosody has been installed or is running from checkout
Matthew Wild <mwild1@gmail.com>
parents: 1789
diff changeset
   250
	if CFG_SOURCEDIR and (prosody.platform == "windows" or CFG_SOURCEDIR:match("^/")) then
f06688f9b6c6 prosody: Add prosody.installed flag to indicate whether Prosody has been installed or is running from checkout
Matthew Wild <mwild1@gmail.com>
parents: 1789
diff changeset
   251
		prosody.installed = true;
f06688f9b6c6 prosody: Add prosody.installed flag to indicate whether Prosody has been installed or is running from checkout
Matthew Wild <mwild1@gmail.com>
parents: 1789
diff changeset
   252
	end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   253
5134
43c5227fdd3b prosody, prosodyctl: chdir() to data directory on startup
Matthew Wild <mwild1@gmail.com>
parents: 5023
diff changeset
   254
	if prosody.installed then
43c5227fdd3b prosody, prosodyctl: chdir() to data directory on startup
Matthew Wild <mwild1@gmail.com>
parents: 5023
diff changeset
   255
		-- Change working directory to data path.
43c5227fdd3b prosody, prosodyctl: chdir() to data directory on startup
Matthew Wild <mwild1@gmail.com>
parents: 5023
diff changeset
   256
		require "lfs".chdir(data_path);
43c5227fdd3b prosody, prosodyctl: chdir() to data directory on startup
Matthew Wild <mwild1@gmail.com>
parents: 5023
diff changeset
   257
	end
43c5227fdd3b prosody, prosodyctl: chdir() to data directory on startup
Matthew Wild <mwild1@gmail.com>
parents: 5023
diff changeset
   258
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   259
	-- Function to reload the config file
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   260
	function prosody.reload_config()
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   261
		log("info", "Reloading configuration file");
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   262
		prosody.events.fire_event("reloading-config");
5937
bcad61007a4e prosody: Store the config file name so the same file can be used when reloading
Kim Alvefur <zash@zash.se>
parents: 5428
diff changeset
   263
		local ok, level, err = config.load(prosody.config_file);
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   264
		if not ok then
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   265
			if level == "parser" then
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   266
				log("error", "There was an error parsing the configuration file: %s", tostring(err));
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   267
			elseif level == "file" then
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   268
				log("error", "Couldn't read the config file when trying to reload: %s", tostring(err));
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   269
			end
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   270
		end
1557
64837ed2d112 prosody: Return success/error from prosody.reload_config()
Matthew Wild <mwild1@gmail.com>
parents: 1532
diff changeset
   271
		return ok, (err and tostring(level)..": "..tostring(err)) or nil;
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   272
	end
1242
6c459c279bbe Added new prosody.events object
Waqas Hussain <waqas20@gmail.com>
parents: 1239
diff changeset
   273
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   274
	-- Function to reopen logfiles
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   275
	function prosody.reopen_logfiles()
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   276
		log("info", "Re-opening log files");
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   277
		prosody.events.fire_event("reopen-log-files");
1313
6c7347696caa prosody: Prefix hg: to changeset ids in the version
Matthew Wild <mwild1@gmail.com>
parents: 1311
diff changeset
   278
	end
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   279
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   280
	-- Function to initiate prosody shutdown
7084
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   281
	function prosody.shutdown(reason, code)
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   282
		log("info", "Shutting down: %s", reason or "unknown reason");
1561
04442f3ebe40 prosody: Send friendly text with system-shutdown stream error
Matthew Wild <mwild1@gmail.com>
parents: 1557
diff changeset
   283
		prosody.shutdown_reason = reason;
7084
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   284
		prosody.shutdown_code = code;
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   285
		prosody.events.fire_event("server-stopping", {
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   286
			reason = reason;
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   287
			code = code;
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   288
		});
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   289
		server.setquitting(true);
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   290
	end
1311
fc113027a1d5 prosody: Read version from prosody.version file and set, er, prosody.version!
Matthew Wild <mwild1@gmail.com>
parents: 1298
diff changeset
   291
end
fc113027a1d5 prosody: Read version from prosody.version file and set, er, prosody.version!
Matthew Wild <mwild1@gmail.com>
parents: 1298
diff changeset
   292
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   293
function read_version()
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   294
	-- Try to determine version
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   295
	local version_file = io.open((CFG_SOURCEDIR or ".").."/prosody.version");
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   296
	if version_file then
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   297
		prosody.version = version_file:read("*a"):gsub("%s*$", "");
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   298
		version_file:close();
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   299
		if #prosody.version == 12 and prosody.version:match("^[a-f0-9]+$") then
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   300
			prosody.version = "hg:"..prosody.version;
1116
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   301
		end
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   302
	else
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   303
		prosody.version = "unknown";
1116
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   304
	end
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   305
end
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   306
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   307
function load_secondary_libraries()
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   308
	--- Load and initialise core modules
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   309
	require "util.import"
3033
0194d7eab8a5 prosody: Load util.xmppstream :(
Matthew Wild <mwild1@gmail.com>
parents: 3029
diff changeset
   310
	require "util.xmppstream"
4877
6f5b53cb3565 prosody, stanza_router: Load stanza_router earlier. Put routing functions in the global prosody table. Fixes module:send()
Kim Alvefur <zash@zash.se>
parents: 4673
diff changeset
   311
	require "core.stanza_router"
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents: 6473
diff changeset
   312
	require "core.statsmanager"
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   313
	require "core.hostmanager"
4673
2fb5882fdef1 prosody: Load portmanager at startup, to ensure it is ready to receive item-added events when modules are loaded
Matthew Wild <mwild1@gmail.com>
parents: 4648
diff changeset
   314
	require "core.portmanager"
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   315
	require "core.modulemanager"
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   316
	require "core.usermanager"
5428
4cc7df30f521 prosody: load rostermanager after usermanager during environment initialization.
Marco Cirillo <maranda@lightwitch.org>
parents: 5384
diff changeset
   317
	require "core.rostermanager"
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   318
	require "core.sessionmanager"
3705
ddbac8737c2d prosody: Added a stub implementation of core.componentmanager to the package.loaded table (re-commiting, as this was accidentally removed).
Waqas Hussain <waqas20@gmail.com>
parents: 3609
diff changeset
   319
	package.loaded['core.componentmanager'] = setmetatable({},{__index=function()
4382
29581d16450c prosody: Invalid escape sequence in componentmanager deprecation warning (can cause luajit to throw).
Waqas Hussain <waqas20@gmail.com>
parents: 4322
diff changeset
   320
		log("warn", "componentmanager is deprecated: %s", debug.traceback():match("\n[^\n]*\n[ \t]*([^\n]*)"));
3705
ddbac8737c2d prosody: Added a stub implementation of core.componentmanager to the package.loaded table (re-commiting, as this was accidentally removed).
Waqas Hussain <waqas20@gmail.com>
parents: 3609
diff changeset
   321
		return function() end
ddbac8737c2d prosody: Added a stub implementation of core.componentmanager to the package.loaded table (re-commiting, as this was accidentally removed).
Waqas Hussain <waqas20@gmail.com>
parents: 3609
diff changeset
   322
	end});
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 524
diff changeset
   323
8201
db82ce3decee prosody, prosodyctl: Set up TLS settings for HTTPS requests in net.http (part of fix for #659)
Kim Alvefur <zash@zash.se>
parents: 7880
diff changeset
   324
	local http = require "net.http"
8205
85a60e863509 prosody, prosodyctl: Fix traceback if ssl config is missing (thanks lookshe and sol)
Kim Alvefur <zash@zash.se>
parents: 8201
diff changeset
   325
	local config_ssl = config.get("*", "ssl") or {}
8201
db82ce3decee prosody, prosodyctl: Set up TLS settings for HTTPS requests in net.http (part of fix for #659)
Kim Alvefur <zash@zash.se>
parents: 7880
diff changeset
   326
	local https_client = config.get("*", "client_https_ssl")
db82ce3decee prosody, prosodyctl: Set up TLS settings for HTTPS requests in net.http (part of fix for #659)
Kim Alvefur <zash@zash.se>
parents: 7880
diff changeset
   327
	http.default.options.sslctx = require "core.certmanager".create_context("client_https port 0", "client",
db82ce3decee prosody, prosodyctl: Set up TLS settings for HTTPS requests in net.http (part of fix for #659)
Kim Alvefur <zash@zash.se>
parents: 7880
diff changeset
   328
		{ capath = config_ssl.capath, cafile = config_ssl.cafile, verify = "peer", }, https_client);
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   329
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   330
	require "util.array"
1967
f78a019efeb0 prosody: Require some core/util libraries which core modules depend upon, C modules and other modules which write to _G
Matthew Wild <mwild1@gmail.com>
parents: 1966
diff changeset
   331
	require "util.datetime"
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   332
	require "util.iterators"
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   333
	require "util.timer"
1532
9150aeca9755 prosody: Load util.helpers at startup
Matthew Wild <mwild1@gmail.com>
parents: 1530
diff changeset
   334
	require "util.helpers"
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   335
1967
f78a019efeb0 prosody: Require some core/util libraries which core modules depend upon, C modules and other modules which write to _G
Matthew Wild <mwild1@gmail.com>
parents: 1966
diff changeset
   336
	pcall(require, "util.signal") -- Not on Windows
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   337
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   338
	-- Commented to protect us from
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   339
	-- the second kind of people
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   340
	--[[
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   341
	pcall(require, "remdebug.engine");
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   342
	if remdebug then remdebug.engine.start() end
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   343
	]]
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 524
diff changeset
   344
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   345
	require "util.stanza"
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   346
	require "util.jid"
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   347
end
576
c8442d9f02a5 Move the setting of data_path to fix #unfiledbug
Matthew Wild <mwild1@gmail.com>
parents: 573
diff changeset
   348
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   349
function init_data_store()
3413
7d34bcbf104c prosody: Enable storage manager.
Waqas Hussain <waqas20@gmail.com>
parents: 3402
diff changeset
   350
	require "core.storagemanager";
1116
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   351
end
507702cf44f8 prosody: Add functions to reload the config and re-open log files
Matthew Wild <mwild1@gmail.com>
parents: 1106
diff changeset
   352
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   353
function prepare_to_start()
3303
79ae027a3c09 Backed out changeset 454e1cf18daf (this isn't for debugging, it's to inform the user)
Matthew Wild <mwild1@gmail.com>
parents: 3023
diff changeset
   354
	log("info", "Prosody is using the %s backend for connection handling", server.get_backend());
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   355
	-- Signal to modules that we are ready to start
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   356
	prosody.events.fire_event("server-starting");
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   357
	prosody.start_time = os.time();
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   358
end
382
9daf1e3d278e Add initial mod_console
Matthew Wild <mwild1@gmail.com>
parents: 381
diff changeset
   359
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   360
function init_global_protection()
2825
914d7afb8212 Mainfile: Broke up a really long line.
Waqas Hussain <waqas20@gmail.com>
parents: 2154
diff changeset
   361
	-- Catch global accesses
7733
0656392b1685 prosody: Add annotations to ignore various globals and unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7732
diff changeset
   362
	-- luacheck: ignore 212/t
2825
914d7afb8212 Mainfile: Broke up a really long line.
Waqas Hussain <waqas20@gmail.com>
parents: 2154
diff changeset
   363
	local locked_globals_mt = {
2827
b9df83793d84 prosody: Call tostring on the key being used for nil global read before concatenating it with a string.
Waqas Hussain <waqas20@gmail.com>
parents: 2826
diff changeset
   364
		__index = function (t, k) log("warn", "%s", debug.traceback("Attempt to read a non-existent global '"..tostring(k).."'", 2)); end;
2825
914d7afb8212 Mainfile: Broke up a really long line.
Waqas Hussain <waqas20@gmail.com>
parents: 2154
diff changeset
   365
		__newindex = function (t, k, v) error("Attempt to set a global: "..tostring(k).." = "..tostring(v), 2); end;
914d7afb8212 Mainfile: Broke up a really long line.
Waqas Hussain <waqas20@gmail.com>
parents: 2154
diff changeset
   366
	};
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   367
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   368
	function prosody.unlock_globals()
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   369
		setmetatable(_G, nil);
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   370
	end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   371
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   372
	function prosody.lock_globals()
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   373
		setmetatable(_G, locked_globals_mt);
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   374
	end
943
7f161205121d Add lock_globals() and unlock_globals() functions (for when you really need to use globals)
Matthew Wild <mwild1@gmail.com>
parents: 942
diff changeset
   375
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   376
	-- And lock now...
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   377
	prosody.lock_globals();
943
7f161205121d Add lock_globals() and unlock_globals() functions (for when you really need to use globals)
Matthew Wild <mwild1@gmail.com>
parents: 942
diff changeset
   378
end
7f161205121d Add lock_globals() and unlock_globals() functions (for when you really need to use globals)
Matthew Wild <mwild1@gmail.com>
parents: 942
diff changeset
   379
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   380
function loop()
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   381
	-- Error handler for errors that make it this far
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   382
	local function catch_uncaught_error(err)
2769
826f6fb7036d prosody: Less strict matching for the magic 'interrupted' error
Matthew Wild <mwild1@gmail.com>
parents: 2321
diff changeset
   383
		if type(err) == "string" and err:match("interrupted!$") then
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   384
			return "quitting";
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   385
		end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   386
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   387
		log("error", "Top-level error, please report:\n%s", tostring(err));
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   388
		local traceback = debug.traceback("", 2);
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   389
		if traceback then
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   390
			log("error", "%s", traceback);
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   391
		end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   392
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   393
		prosody.events.fire_event("very-bad-error", {error = err, traceback = traceback});
992
3153eff6dae2 prosody: Add prosody_shutdown() function to initiate a server shutdown, add code to gracefully close connections before stopping
Matthew Wild <mwild1@gmail.com>
parents: 978
diff changeset
   394
	end
7879
c028555866b3 prosody: Trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 7804
diff changeset
   395
6924
45fa2e554c79 prosody: Fix sleep call that relied on the no longer existing socket global
Kim Alvefur <zash@zash.se>
parents: 6811
diff changeset
   396
	local sleep = require"socket".sleep;
45fa2e554c79 prosody: Fix sleep call that relied on the no longer existing socket global
Kim Alvefur <zash@zash.se>
parents: 6811
diff changeset
   397
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   398
	while select(2, xpcall(server.loop, catch_uncaught_error)) ~= "quitting" do
6924
45fa2e554c79 prosody: Fix sleep call that relied on the no longer existing socket global
Kim Alvefur <zash@zash.se>
parents: 6811
diff changeset
   399
		sleep(0.2);
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   400
	end
992
3153eff6dae2 prosody: Add prosody_shutdown() function to initiate a server shutdown, add code to gracefully close connections before stopping
Matthew Wild <mwild1@gmail.com>
parents: 978
diff changeset
   401
end
1026
e640df2e4e9b prosody: Fire events during server shutdown process
Matthew Wild <mwild1@gmail.com>
parents: 1017
diff changeset
   402
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   403
function cleanup()
1529
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   404
	log("info", "Shutdown status: Cleaning up");
b5e4215f797d prosody: Start of refactoring of main file
Matthew Wild <mwild1@gmail.com>
parents: 1523
diff changeset
   405
	prosody.events.fire_event("server-cleanup");
1091
5ca2d3a33269 prosody: Define prosody_shutdown() before emitting the server-starting event
Matthew Wild <mwild1@gmail.com>
parents: 1086
diff changeset
   406
end
5ca2d3a33269 prosody: Define prosody_shutdown() before emitting the server-starting event
Matthew Wild <mwild1@gmail.com>
parents: 1086
diff changeset
   407
2337
9eb20b3f3bbb prosody: Clarify and add some comments to describe what we're doing when and why
Matthew Wild <mwild1@gmail.com>
parents: 2330
diff changeset
   408
-- Are you ready? :)
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   409
-- These actions are in a strict order, as many depend on
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   410
-- previous steps to have already been performed
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   411
read_config();
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   412
init_logging();
4249
896e8793e7a4 prosody: Add sanity_check() to startup sequence. Check that we have at least one vhost enabled to avoid Bad Things.
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
   413
sanity_check();
2587
c37f971f0fe6 prosody, prosodyctl: Re-jiggle load order again, fixes logging config not being obeyed (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 2567
diff changeset
   414
sandbox_require();
2976
15c056c1d9eb prosody: Set metatable on functions to allow easy access to upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   415
set_function_metatable();
6066
95b3a59d7932 prosody: Check dependencies later in the startup sequence
Kim Alvefur <zash@zash.se>
parents: 5937
diff changeset
   416
check_dependencies();
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   417
load_libraries();
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   418
init_global_state();
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   419
read_version();
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   420
log("info", "Hello and welcome to Prosody version %s", prosody.version);
3904
f93163081b3c prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies so we can check hard deps before the config and logging is loaded
Matthew Wild <mwild1@gmail.com>
parents: 3740
diff changeset
   421
log_dependency_warnings();
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   422
load_secondary_libraries();
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   423
init_data_store();
1969
805f548aa57b prosody: Move global protection earlier (to before modules are loaded, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 1968
diff changeset
   424
init_global_protection();
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   425
prepare_to_start();
1493
42a6a197bed1 prosody: Record time the server started
Matthew Wild <mwild1@gmail.com>
parents: 1455
diff changeset
   426
1365
864a99eff6d7 Main: Don't use empty event data objects for some global events. Some handlers don't expect it.
Waqas Hussain <waqas20@gmail.com>
parents: 1364
diff changeset
   427
prosody.events.fire_event("server-started");
359
8fbfa8f885a6 Add event for server startup completed: server-started
Matthew Wild <mwild1@gmail.com>
parents: 260
diff changeset
   428
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   429
loop();
853
c0a40522041e prosody: Log top-level errors
Matthew Wild <mwild1@gmail.com>
parents: 843
diff changeset
   430
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   431
log("info", "Shutting down...");
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   432
cleanup();
1365
864a99eff6d7 Main: Don't use empty event data objects for some global events. Some handlers don't expect it.
Waqas Hussain <waqas20@gmail.com>
parents: 1364
diff changeset
   433
prosody.events.fire_event("server-stopped");
1530
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   434
log("info", "Shutdown complete");
0494f5e3be23 prosody: Call initialisation functions at once
Matthew Wild <mwild1@gmail.com>
parents: 1529
diff changeset
   435
7084
a22d6a46d2ed prosody: Allow prosody.shutdown() to take an exit code for the process (thanks daurnimator)
Matthew Wild <mwild1@gmail.com>
parents: 6988
diff changeset
   436
os.exit(prosody.shutdown_code)