componentmanager: Don't error on stanzas to bare component JID
[prosody.git] / plugins / mod_posix.lua
index 2c56f694451ffcd51c70f7d3afd404e5a426ac9c..f8a168f0ad0cf9594ee43c349ed49be038ddbd23 100644 (file)
@@ -6,7 +6,7 @@ if pposix._VERSION ~= want_pposix_version then module:log("warn", "Unknown versi
 
 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");
+       module:log("warn", "Couldn't load signal library, won't respond to SIGTERM");
 end
 
 local config_get = require "core.configmanager".get;
@@ -14,86 +14,90 @@ local logger_set = require "util.logger".setwriter;
 
 module.host = "*"; -- we're a global module
 
+-- Don't even think about it!
+module:add_event_hook("server-starting", function ()
+               if pposix.getuid() == 0 and not config_get("*", "core", "run_as_root") then
+                       module:log("error", "Danger, Will Robinson! Prosody doesn't need to be run as root, so don't do it!");
+                       module:log("error", "For more information on running Prosody as root, see http://prosody.im/doc/root");
+                       _G.prosody_shutdown("Refusing to run as root");
+               end
+       end);
+
+local pidfile_written;
+
+local function remove_pidfile()
+       if pidfile_written then
+               os.remove(pidfile_written);
+               pidfile_written = nil;
+       end
+end
+
 local function write_pidfile()
-       local pidfile = config.get("*", "core", "pidfile");
+       if pidfile_written then
+               remove_pidfile();
+       end
+       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);
+                       module:log("error", "Couldn't write pidfile; %s", err);
                else
                        pf:write(tostring(pposix.getpid()));
                        pf:close();
+                       pidfile_written = pidfile;
                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);
+local syslog_opened 
+function syslog_sink_maker(config)
+       if not syslog_opened then
+               pposix.syslog_open("prosody");
+               syslog_opened = true;
        end
+       local syslog, format = pposix.syslog_log, string.format;
+       return function (name, level, message, ...)
+                       if ... then
+                               syslog(level, format(message, ...));
+                       else
+                               syslog(level, message);
+                       end
+               end;
 end
+require "core.loggingmanager".register_sink_type("syslog", syslog_sink_maker);
 
 if not config_get("*", "core", "no_daemonize") then
        local function daemonize_server()
-               local logwriter;
-               
-               
                local ok, ret = pposix.daemonize();
                if not ok then
-                       log("error", "Failed to daemonize: %s", ret);
+                       module:log("error", "Failed to daemonize: %s", ret);
                elseif ret and ret > 0 then
                        os.exit(0);
                else
-                       log("info", "Successfully daemonized to PID %d", pposix.getpid());
+                       module:log("info", "Successfully daemonized to PID %d", pposix.getpid());
                        write_pidfile();
                end
        end
        module:add_event_hook("server-starting", daemonize_server);
 else
+       -- Not going to daemonize, so write the pid of this process
        write_pidfile();
-       -- Not going to daemonize, but let's write the pidfile anyway
 end
 
--- Set signal handler
+module:add_event_hook("server-stopped", remove_pidfile);
+
+-- Set signal handlers
 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();
+               module:log("warn", "Received SIGTERM");
+               _G.unlock_globals();
+               _G.prosody_shutdown("Received SIGTERM");
+               _G.lock_globals();
+       end);
+
+       signal.signal("SIGHUP", function ()
+               module:log("info", "Received SIGHUP");
+               _G.prosody_reload_config();
+               _G.prosody_reopen_logfiles();
        end);
 end