plugins/mod_posix.lua
author Jonas Schäfer <jonas@wielicki.name>
Mon, 10 Jan 2022 18:23:54 +0100
branch0.11
changeset 12185 783056b4e448
parent 10602 5cf481bee678
child 10603 4f655918fef1
permissions -rw-r--r--
util.xml: Do not allow doctypes, comments or processing instructions Yes. This is as bad as it sounds. CVE pending. In Prosody itself, this only affects mod_websocket, which uses util.xml to parse the <open/> frame, thus allowing unauthenticated remote DoS using Billion Laughs. However, third-party modules using util.xml may also be affected by this. This commit installs handlers which disallow the use of doctype declarations and processing instructions without any escape hatch. It, by default, also introduces such a handler for comments, however, there is a way to enable comments nontheless. This is because util.xml is used to parse human-facing data, where comments are generally a desirable feature, and also because comments are generally harmless.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1238
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2795
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2795
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5452
diff changeset
     4
--
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1238
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1238
diff changeset
     6
-- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1238
diff changeset
     7
--
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1238
diff changeset
     8
728
fa45dfb27ee5 mod_posix: Check version of pposix
Matthew Wild <mwild1@gmail.com>
parents: 723
diff changeset
     9
8015
e898c8fda986 util.pposix: Remove fallocate
Kim Alvefur <zash@zash.se>
parents: 8013
diff changeset
    10
local want_pposix_version = "0.4.0";
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
local pposix = assert(require "util.pposix");
5452
edf3db386a19 mod_posix: Improve error message for a pposix version mismatch
Matthew Wild <mwild1@gmail.com>
parents: 5451
diff changeset
    13
if pposix._VERSION ~= want_pposix_version then
8169
bbedf564b9f9 mod_posix: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8119
diff changeset
    14
	module:log("warn", "Unknown version (%s) of binary pposix module, expected %s."
bbedf564b9f9 mod_posix: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8119
diff changeset
    15
		.. "Perhaps you need to recompile?", tostring(pposix._VERSION), want_pposix_version);
5452
edf3db386a19 mod_posix: Improve error message for a pposix version mismatch
Matthew Wild <mwild1@gmail.com>
parents: 5451
diff changeset
    16
end
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
6878
12d68f7b1be0 mod_posix: Detect failure to load util.signal by first pcall return value not by type of the second
Kim Alvefur <zash@zash.se>
parents: 6877
diff changeset
    18
local have_signal, signal = pcall(require, "util.signal");
12d68f7b1be0 mod_posix: Detect failure to load util.signal by first pcall return value not by type of the second
Kim Alvefur <zash@zash.se>
parents: 6877
diff changeset
    19
if not have_signal then
1062
f9a1ac50782b mod_posix: Fix calls to log() (replace with module:log) and make some global accesses explicit
Matthew Wild <mwild1@gmail.com>
parents: 1061
diff changeset
    20
	module:log("warn", "Couldn't load signal library, won't respond to SIGTERM");
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
    21
end
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
    22
8231
cda9db4b881d loggingmanager, mod_posix: Import util.format correctly (fixes #985)
Kim Alvefur <zash@zash.se>
parents: 8229
diff changeset
    23
local format = require "util.format".format;
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    24
local lfs = require "lfs";
2795
d6fcd13c07e7 mod_posix: Adjust file open mode depending on whether file exists (take that fopen designers!!!)
Matthew Wild <mwild1@gmail.com>
parents: 2793
diff changeset
    25
local stat = lfs.attributes;
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    26
1238
f4c08caca3e7 mod_posix: Use global prosody object
Matthew Wild <mwild1@gmail.com>
parents: 1119
diff changeset
    27
local prosody = _G.prosody;
f4c08caca3e7 mod_posix: Use global prosody object
Matthew Wild <mwild1@gmail.com>
parents: 1119
diff changeset
    28
4623
403b56b78018 mod_posix, mod_bosh, mod_admin_telnet: Use module:set_global()
Kim Alvefur <zash@zash.se>
parents: 3555
diff changeset
    29
module:set_global(); -- we're a global module
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
7734
a0ee83c4a82c mod_posix: Use type-specific config API
Kim Alvefur <zash@zash.se>
parents: 6878
diff changeset
    31
local umask = module:get_option_string("umask", "027");
2440
11e3d16a128f mod_posix: Set umask to 'umask' from the config, or 027
Matthew Wild <mwild1@gmail.com>
parents: 2438
diff changeset
    32
pposix.umask(umask);
11e3d16a128f mod_posix: Set umask to 'umask' from the config, or 027
Matthew Wild <mwild1@gmail.com>
parents: 2438
diff changeset
    33
1680
f3d241915429 Add setuid and setgid support.
Tobias Markmann <tm@ayena.de>
parents: 1579
diff changeset
    34
-- Allow switching away from root, some people like strange ports.
3537
7bbb19804d82 mod_posix: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3481
diff changeset
    35
module:hook("server-started", function ()
6877
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    36
	local uid = module:get_option("setuid");
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    37
	local gid = module:get_option("setgid");
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    38
	if gid then
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    39
		local success, msg = pposix.setgid(gid);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    40
		if success then
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    41
			module:log("debug", "Changed group to %s successfully.", gid);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    42
		else
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    43
			module:log("error", "Failed to change group to %s. Error: %s", gid, msg);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    44
			prosody.shutdown("Failed to change group to %s", gid);
1680
f3d241915429 Add setuid and setgid support.
Tobias Markmann <tm@ayena.de>
parents: 1579
diff changeset
    45
		end
6877
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    46
	end
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    47
	if uid then
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    48
		local success, msg = pposix.setuid(uid);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    49
		if success then
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    50
			module:log("debug", "Changed user to %s successfully.", uid);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    51
		else
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    52
			module:log("error", "Failed to change user to %s. Error: %s", uid, msg);
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    53
			prosody.shutdown("Failed to change user to %s", uid);
1680
f3d241915429 Add setuid and setgid support.
Tobias Markmann <tm@ayena.de>
parents: 1579
diff changeset
    54
		end
6877
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    55
	end
e011f289ec77 mod_posix: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6367
diff changeset
    56
end);
1680
f3d241915429 Add setuid and setgid support.
Tobias Markmann <tm@ayena.de>
parents: 1579
diff changeset
    57
1092
b547967d87fc mod_posix: Don't let the server run as root without the magic run_as_root in config
Matthew Wild <mwild1@gmail.com>
parents: 1062
diff changeset
    58
-- Don't even think about it!
3022
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    59
if not prosody.start_time then -- server-starting
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    60
	local suid = module:get_option("setuid");
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    61
	if not suid or suid == 0 or suid == "root" then
8119
76ac8b617402 mod_posix: Use typed config API
Kim Alvefur <zash@zash.se>
parents: 8015
diff changeset
    62
		if pposix.getuid() == 0 and not module:get_option_boolean("run_as_root") then
3022
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    63
			module:log("error", "Danger, Will Robinson! Prosody doesn't need to be run as root, so don't do it!");
7362
a5a080c12c96 Update every link to the documentation to use HTTPS
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6878
diff changeset
    64
			module:log("error", "For more information on running Prosody as root, see https://prosody.im/doc/root");
3022
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    65
			prosody.shutdown("Refusing to run as root");
1092
b547967d87fc mod_posix: Don't let the server run as root without the magic run_as_root in config
Matthew Wild <mwild1@gmail.com>
parents: 1062
diff changeset
    66
		end
3022
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    67
	end
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
    68
end
1092
b547967d87fc mod_posix: Don't let the server run as root without the magic run_as_root in config
Matthew Wild <mwild1@gmail.com>
parents: 1062
diff changeset
    69
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    70
local pidfile;
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    71
local pidfile_handle;
1032
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    72
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    73
local function remove_pidfile()
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    74
	if pidfile_handle then
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    75
		pidfile_handle:close();
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    76
		os.remove(pidfile);
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    77
		pidfile, pidfile_handle = nil, nil;
1032
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    78
	end
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    79
end
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    80
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
    81
local function write_pidfile()
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    82
	if pidfile_handle then
1032
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    83
		remove_pidfile();
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
    84
	end
7995
51396e0836cf mod_posix: Use path variant of config API for pidfile option
Kim Alvefur <zash@zash.se>
parents: 7734
diff changeset
    85
	pidfile = module:get_option_path("pidfile", nil, "data");
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
    86
	if pidfile then
3026
dec4527a7499 mod_posix: Fixed a global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2923
diff changeset
    87
		local err;
2795
d6fcd13c07e7 mod_posix: Adjust file open mode depending on whether file exists (take that fopen designers!!!)
Matthew Wild <mwild1@gmail.com>
parents: 2793
diff changeset
    88
		local mode = stat(pidfile) and "r+" or "w+";
d6fcd13c07e7 mod_posix: Adjust file open mode depending on whether file exists (take that fopen designers!!!)
Matthew Wild <mwild1@gmail.com>
parents: 2793
diff changeset
    89
		pidfile_handle, err = io.open(pidfile, mode);
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    90
		if not pidfile_handle then
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    91
			module:log("error", "Couldn't write pidfile at %s; %s", pidfile, err);
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    92
			prosody.shutdown("Couldn't write pidfile");
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
    93
		else
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    94
			if not lfs.lock(pidfile_handle, "w") then -- Exclusive lock
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    95
				local other_pid = pidfile_handle:read("*a");
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    96
				module:log("error", "Another Prosody instance seems to be running with PID %s, quitting", other_pid);
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    97
				pidfile_handle = nil;
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    98
				prosody.shutdown("Prosody already running");
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
    99
			else
3341
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   100
				pidfile_handle:close();
3340
0769cc5f34b6 mod_posix: Truncate the pidfile before writing to ensure that we never overwrite with a PID shorter than the previous, and end with an invalid PID in the file.
Brian Cully <bjc@junctionnetworks.com>
parents: 3029
diff changeset
   101
				pidfile_handle, err = io.open(pidfile, "w+");
0769cc5f34b6 mod_posix: Truncate the pidfile before writing to ensure that we never overwrite with a PID shorter than the previous, and end with an invalid PID in the file.
Brian Cully <bjc@junctionnetworks.com>
parents: 3029
diff changeset
   102
				if not pidfile_handle then
0769cc5f34b6 mod_posix: Truncate the pidfile before writing to ensure that we never overwrite with a PID shorter than the previous, and end with an invalid PID in the file.
Brian Cully <bjc@junctionnetworks.com>
parents: 3029
diff changeset
   103
					module:log("error", "Couldn't write pidfile at %s; %s", pidfile, err);
0769cc5f34b6 mod_posix: Truncate the pidfile before writing to ensure that we never overwrite with a PID shorter than the previous, and end with an invalid PID in the file.
Brian Cully <bjc@junctionnetworks.com>
parents: 3029
diff changeset
   104
					prosody.shutdown("Couldn't write pidfile");
3341
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   105
				else
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   106
					if lfs.lock(pidfile_handle, "w") then
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   107
						pidfile_handle:write(tostring(pposix.getpid()));
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   108
						pidfile_handle:flush();
a8a3e662fea7 mod_posix: Some (perhaps temporary) changes to re-lock the pidfile after truncating, to avoid breaking prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 3340
diff changeset
   109
					end
3340
0769cc5f34b6 mod_posix: Truncate the pidfile before writing to ensure that we never overwrite with a PID shorter than the previous, and end with an invalid PID in the file.
Brian Cully <bjc@junctionnetworks.com>
parents: 3029
diff changeset
   110
				end
2793
08892e3f24bd mod_posix: Lock pidfile when in use, shut down if we can't write or lock the pidfile
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
   111
			end
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   112
		end
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   113
	end
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   114
end
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   115
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3537
diff changeset
   116
local syslog_opened;
8170
39188851811c mod_posix: Ignore currently unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8169
diff changeset
   117
function syslog_sink_maker(config) -- luacheck: ignore 212/config
1033
4a9f0d482028 mod_posix: Integrate with loggingmanager, register syslog sink, remove redundant logging code
Matthew Wild <mwild1@gmail.com>
parents: 1032
diff changeset
   118
	if not syslog_opened then
4794
25ce7720555f mod_posix: Support syslog_facility config option
Matthew Wild <mwild1@gmail.com>
parents: 3555
diff changeset
   119
		pposix.syslog_open("prosody", module:get_option_string("syslog_facility"));
1033
4a9f0d482028 mod_posix: Integrate with loggingmanager, register syslog sink, remove redundant logging code
Matthew Wild <mwild1@gmail.com>
parents: 1032
diff changeset
   120
		syslog_opened = true;
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   121
	end
8229
3463d82276de loggingmanager, mod_posix: Replace the old inconsistent log formatting with the new util.format
Waqas Hussain <waqas20@gmail.com>
parents: 8170
diff changeset
   122
	local syslog = pposix.syslog_log;
1033
4a9f0d482028 mod_posix: Integrate with loggingmanager, register syslog sink, remove redundant logging code
Matthew Wild <mwild1@gmail.com>
parents: 1032
diff changeset
   123
	return function (name, level, message, ...)
8229
3463d82276de loggingmanager, mod_posix: Replace the old inconsistent log formatting with the new util.format
Waqas Hussain <waqas20@gmail.com>
parents: 8170
diff changeset
   124
		syslog(level, name, format(message, ...));
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3537
diff changeset
   125
	end;
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   126
end
1033
4a9f0d482028 mod_posix: Integrate with loggingmanager, register syslog sink, remove redundant logging code
Matthew Wild <mwild1@gmail.com>
parents: 1032
diff changeset
   127
require "core.loggingmanager".register_sink_type("syslog", syslog_sink_maker);
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   128
10602
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   129
local daemonize = prosody.opts.daemonize;
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   130
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   131
if daemonize == nil then
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   132
	-- Fall back to config file if not specified on command-line
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   133
	daemonize = module:get_option("daemonize", prosody.installed);
5cf481bee678 mod_posix: Support for command-line flags to override 'daemonize' config option
Matthew Wild <mwild1@gmail.com>
parents: 9767
diff changeset
   134
end
2073
72784ce0c0e0 mod_posix: Switch config option to 'daemonize', fall back to 'no_daemonize' if not set, default behaviour remains the same... daemonize if mod_posix is loaded
Matthew Wild <mwild1@gmail.com>
parents: 1712
diff changeset
   135
5175
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   136
local function remove_log_sinks()
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   137
	local lm = require "core.loggingmanager";
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   138
	lm.register_sink_type("console", nil);
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   139
	lm.register_sink_type("stdout", nil);
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   140
	lm.reload_logging();
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   141
end
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   142
2073
72784ce0c0e0 mod_posix: Switch config option to 'daemonize', fall back to 'no_daemonize' if not set, default behaviour remains the same... daemonize if mod_posix is loaded
Matthew Wild <mwild1@gmail.com>
parents: 1712
diff changeset
   143
if daemonize then
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   144
	local function daemonize_server()
5177
add9ad38208e mod_posix: Log a message explaining that we are detaching from the console
Kim Alvefur <zash@zash.se>
parents: 5175
diff changeset
   145
		module:log("info", "Prosody is about to detach from the console, disabling further console output");
5175
fabaed7418a6 mod_posix: Remove console and stdout logging sinks before daemonizing
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   146
		remove_log_sinks();
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   147
		local ok, ret = pposix.daemonize();
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   148
		if not ok then
1062
f9a1ac50782b mod_posix: Fix calls to log() (replace with module:log) and make some global accesses explicit
Matthew Wild <mwild1@gmail.com>
parents: 1061
diff changeset
   149
			module:log("error", "Failed to daemonize: %s", ret);
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
		elseif ret and ret > 0 then
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
			os.exit(0);
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
		else
1062
f9a1ac50782b mod_posix: Fix calls to log() (replace with module:log) and make some global accesses explicit
Matthew Wild <mwild1@gmail.com>
parents: 1061
diff changeset
   153
			module:log("info", "Successfully daemonized to PID %d", pposix.getpid());
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   154
			write_pidfile();
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
		end
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   156
	end
3022
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   157
	if not prosody.start_time then -- server-starting
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   158
		daemonize_server();
948d511f479c mod_posix: Don't add a server-starting event handler while the server-starting event is being fired.
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
   159
	end
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   160
else
1032
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
   161
	-- Not going to daemonize, so write the pid of this process
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   162
	write_pidfile();
587
43f509a1519a Add mod_posix, fixes #5
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
end
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   164
3537
7bbb19804d82 mod_posix: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3481
diff changeset
   165
module:hook("server-stopped", remove_pidfile);
1032
409f22d0430f mod_posix: Remove pidfile on exit
Matthew Wild <mwild1@gmail.com>
parents: 991
diff changeset
   166
1118
239d4362a040 mod_posix: Reload the config and reopen log files on SIGHUP
Matthew Wild <mwild1@gmail.com>
parents: 1092
diff changeset
   167
-- Set signal handlers
6878
12d68f7b1be0 mod_posix: Detect failure to load util.signal by first pcall return value not by type of the second
Kim Alvefur <zash@zash.se>
parents: 6877
diff changeset
   168
if have_signal then
8666
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   169
	module:add_timer(0, function ()
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   170
		signal.signal("SIGTERM", function ()
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   171
			module:log("warn", "Received SIGTERM");
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   172
			prosody.unlock_globals();
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   173
			prosody.shutdown("Received SIGTERM");
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   174
			prosody.lock_globals();
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   175
		end);
1118
239d4362a040 mod_posix: Reload the config and reopen log files on SIGHUP
Matthew Wild <mwild1@gmail.com>
parents: 1092
diff changeset
   176
8666
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   177
		signal.signal("SIGHUP", function ()
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   178
			module:log("info", "Received SIGHUP");
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   179
			prosody.reload_config();
9767
982529dd0bed mod_posix: Don't reload logging twice
Kim Alvefur <zash@zash.se>
parents: 8666
diff changeset
   180
			-- this also reloads logging
8666
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   181
		end);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5452
diff changeset
   182
8666
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   183
		signal.signal("SIGINT", function ()
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   184
			module:log("info", "Received SIGINT");
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   185
			prosody.unlock_globals();
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   186
			prosody.shutdown("Received SIGINT");
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   187
			prosody.lock_globals();
a7a9d9511dc1 mod_posix: Delay setting signal handlers until in the main thread
Matthew Wild <mwild1@gmail.com>
parents: 8238
diff changeset
   188
		end);
2332
7772dde4010b mod_posix: Catch SIGINT
Matthew Wild <mwild1@gmail.com>
parents: 2074
diff changeset
   189
	end);
991
cd0d75de8345 mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Matthew Wild <mwild1@gmail.com>
parents: 735
diff changeset
   190
end