aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_posix.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-04-12 02:57:52 +0100
committerMatthew Wild <mwild1@gmail.com>2009-04-12 02:57:52 +0100
commit8a5a7e3e62e477e3075a9b941e282b4f65bab05b (patch)
treebac8b4acac5d3f5ba8ca5ddd179fa2717f39934f /plugins/mod_posix.lua
parent9bbe48073efa31d1bdf330911a9bc1aea7fa8d0f (diff)
downloadprosody-8a5a7e3e62e477e3075a9b941e282b4f65bab05b.tar.gz
prosody-8a5a7e3e62e477e3075a9b941e282b4f65bab05b.zip
mod_posix: Allow logging and pidfile options to take effect without needing to daemonize. Add the ability to catch SIGTERM.
Diffstat (limited to 'plugins/mod_posix.lua')
-rw-r--r--plugins/mod_posix.lua117
1 files changed, 72 insertions, 45 deletions
diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua
index 901cb53d..2c56f694 100644
--- a/plugins/mod_posix.lua
+++ b/plugins/mod_posix.lua
@@ -4,43 +4,69 @@ local want_pposix_version = "0.3.0";
local pposix = assert(require "util.pposix");
if pposix._VERSION ~= want_pposix_version then module:log("warn", "Unknown version (%s) of binary pposix module, expected %s", tostring(pposix._VERSION), want_pposix_version); end
+local signal = select(2, pcall(require, "util.signal"));
+if type(signal) == "string" then
+ log("warn", "Couldn't load signal library, won't respond to SIGTERM");
+end
+
local config_get = require "core.configmanager".get;
local logger_set = require "util.logger".setwriter;
module.host = "*"; -- we're a global module
+local function write_pidfile()
+ local pidfile = config.get("*", "core", "pidfile");
+ if pidfile then
+ local pf, err = io.open(pidfile, "w+");
+ if not pf then
+ log("error", "Couldn't write pidfile; %s", err);
+ else
+ pf:write(tostring(pposix.getpid()));
+ pf:close();
+ end
+ end
+end
+
+local logfilename = config_get("*", "core", "log");
+if logfilename == "syslog" then
+ pposix.syslog_open("prosody");
+ pposix.syslog_setminlevel(config.get("*", "core", "minimum_log_level") or "info");
+ local syslog, format = pposix.syslog_log, string.format;
+ logwriter = function (name, level, message, ...)
+ if ... then
+ syslog(level, format(message, ...));
+ else
+ syslog(level, message);
+ end
+ end;
+elseif logfilename then
+ local logfile = io.open(logfilename, "a+");
+ if logfile then
+ local write, format, flush = logfile.write, string.format, logfile.flush;
+ logwriter = function (name, level, message, ...)
+ if ... then
+ write(logfile, name, "\t", level, "\t", format(message, ...), "\n");
+ else
+ write(logfile, name, "\t" , level, "\t", message, "\n");
+ end
+ flush(logfile);
+ end;
+ end
+else
+ log("debug", "No logging specified, will continue with default");
+end
+
+if logwriter then
+ local ok, ret = logger_set(logwriter);
+ if not ok then
+ log("error", "Couldn't set new log output: %s", ret);
+ end
+end
+
if not config_get("*", "core", "no_daemonize") then
local function daemonize_server()
local logwriter;
- local logfilename = config_get("*", "core", "log");
- if logfilename == "syslog" then
- pposix.syslog_open("prosody");
- pposix.syslog_setminlevel(config.get("*", "core", "minimum_log_level") or "info");
- local syslog, format = pposix.syslog_log, string.format;
- logwriter = function (name, level, message, ...)
- if ... then
- syslog(level, format(message, ...));
- else
- syslog(level, message);
- end
- end;
- elseif logfilename then
- local logfile = io.open(logfilename, "a+");
- if logfile then
- local write, format, flush = logfile.write, string.format, logfile.flush;
- logwriter = function (name, level, message, ...)
- if ... then
- write(logfile, name, "\t", level, "\t", format(message, ...), "\n");
- else
- write(logfile, name, "\t" , level, "\t", message, "\n");
- end
- flush(logfile);
- end;
- end
- else
- log("debug", "No logging specified, will continue with default");
- end
local ok, ret = pposix.daemonize();
if not ok then
@@ -48,25 +74,26 @@ if not config_get("*", "core", "no_daemonize") then
elseif ret and ret > 0 then
os.exit(0);
else
- if logwriter then
- local ok, ret = logger_set(logwriter);
- if not ok then
- log("error", "Couldn't set new log output: %s", ret);
- end
- end
log("info", "Successfully daemonized to PID %d", pposix.getpid());
-
- local pidfile = config.get("*", "core", "pidfile");
- if pidfile then
- local pf, err = io.open(pidfile, "w+");
- if not pf then
- log("error", "Couldn't write pidfile; %s", err);
- else
- pf:write(tostring(pposix.getpid()));
- pf:close();
- end
- end
+ write_pidfile();
end
end
module:add_event_hook("server-starting", daemonize_server);
+else
+ write_pidfile();
+ -- Not going to daemonize, but let's write the pidfile anyway
+end
+
+-- Set signal handler
+if signal.signal then
+ signal.signal("SIGTERM", function ()
+ log("warn", "Received SIGTERM...");
+ unlock_globals();
+ if prosody_shutdown then
+ prosody_shutdown("Received SIGTERM");
+ else
+ log("warn", "...no prosody_shutdown(), ignoring.");
+ end
+ lock_globals();
+ end);
end