Let Google Hangouts contacts appear offline
[prosody.git] / prosody
diff --git a/prosody b/prosody
index 64021fd32f2548ce4ac65417229e957cebcf7109..446dbfb7344fb15263a1d9cc9d69e7d052be0051 100755 (executable)
--- a/prosody
+++ b/prosody
@@ -49,9 +49,6 @@ _G.prosody = prosody;
 
 -- Check dependencies
 local dependencies = require "util.dependencies";
-if not dependencies.check_dependencies() then
-       os.exit(1);
-end
 
 -- Load the config-parsing module
 config = require "core.configmanager"
@@ -70,6 +67,8 @@ function read_config()
                if CFG_CONFIGDIR then
                        table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
                end
+       elseif os.getenv("PROSODY_CONFIG") then -- Passed by prosodyctl
+                       table.insert(filenames, os.getenv("PROSODY_CONFIG"));
        else
                for _, format in ipairs(config.parsers()) do
                        table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg."..format);
@@ -84,6 +83,7 @@ function read_config()
                        break;
                end
        end
+       prosody.config_file = filename
        local ok, level, err = config.load(filename);
        if not ok then
                print("\n");
@@ -113,6 +113,12 @@ function read_config()
        end
 end
 
+function check_dependencies()
+       if not dependencies.check_dependencies() then
+               os.exit(1);
+       end
+end
+
 function load_libraries()
        -- Load socket framework
        server = require "net.server"
@@ -128,10 +134,10 @@ function log_dependency_warnings()
 end
 
 function sanity_check()
-       for host, host_config in pairs(configmanager.getconfig()) do
+       for host, host_config in pairs(config.getconfig()) do
                if host ~= "*"
-               and host_config.core.enabled ~= false
-               and not host_config.core.component_module then
+               and host_config.enabled ~= false
+               and not host_config.component_module then
                        return;
                end
        end
@@ -145,9 +151,13 @@ function sandbox_require()
        -- for neat sandboxing of modules
        local _realG = _G;
        local _real_require = require;
+       if not getfenv then
+               -- FIXME: This is a hack to replace getfenv() in Lua 5.2
+               function getfenv(f) return debug.getupvalue(debug.getinfo(f or 1).func, 1); end
+       end
        function require(...)
                local curr_env = getfenv(2);
-               local curr_env_mt = getmetatable(getfenv(2));
+               local curr_env_mt = getmetatable(curr_env);
                local _realG_mt = getmetatable(_realG);
                if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
                        local old_newindex, old_index;
@@ -192,6 +202,7 @@ function set_function_metatable()
 end
 
 function init_global_state()
+       -- COMPAT: These globals are deprecated
        bare_sessions = {};
        full_sessions = {};
        hosts = {};
@@ -200,8 +211,8 @@ function init_global_state()
        prosody.full_sessions = full_sessions;
        prosody.hosts = hosts;
        
-       local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
-       local custom_plugin_paths = config.get("*", "core", "plugin_paths");
+       local data_path = config.get("*", "data_path") or CFG_DATADIR or "data";
+       local custom_plugin_paths = config.get("*", "plugin_paths");
        if custom_plugin_paths then
                local path_sep = package.config:sub(3,3);
                -- path1;path2;path3;defaultpath...
@@ -224,11 +235,16 @@ function init_global_state()
                prosody.installed = true;
        end
        
+       if prosody.installed then
+               -- Change working directory to data path.
+               require "lfs".chdir(data_path);
+       end
+
        -- Function to reload the config file
        function prosody.reload_config()
                log("info", "Reloading configuration file");
                prosody.events.fire_event("reloading-config");
-               local ok, level, err = config.load((rawget(_G, "CFG_CONFIGDIR") or ".").."/prosody.cfg.lua");
+               local ok, level, err = config.load(prosody.config_file);
                if not ok then
                        if level == "parser" then
                                log("error", "There was an error parsing the configuration file: %s", tostring(err));
@@ -278,13 +294,13 @@ function load_secondary_libraries()
        --- Load and initialise core modules
        require "util.import"
        require "util.xmppstream"
-       require "core.rostermanager"
+       require "core.stanza_router"
        require "core.hostmanager"
        require "core.portmanager"
        require "core.modulemanager"
        require "core.usermanager"
+       require "core.rostermanager"
        require "core.sessionmanager"
-       require "core.stanza_router"
        package.loaded['core.componentmanager'] = setmetatable({},{__index=function()
                log("warn", "componentmanager is deprecated: %s", debug.traceback():match("\n[^\n]*\n[ \t]*([^\n]*)"));
                return function() end
@@ -365,43 +381,6 @@ end
 function cleanup()
        log("info", "Shutdown status: Cleaning up");
        prosody.events.fire_event("server-cleanup");
-       
-       -- Ok, we're quitting I know, but we
-       -- need to do some tidying before we go :)
-       server.setquitting(false);
-       
-       log("info", "Shutdown status: Closing all active sessions");
-       for hostname, host in pairs(hosts) do
-               log("debug", "Shutdown status: Closing client connections for %s", hostname)
-               if host.sessions then
-                       local reason = { condition = "system-shutdown", text = "Server is shutting down" };
-                       if prosody.shutdown_reason then
-                               reason.text = reason.text..": "..prosody.shutdown_reason;
-                       end
-                       for username, user in pairs(host.sessions) do
-                               for resource, session in pairs(user.sessions) do
-                                       log("debug", "Closing connection for %s@%s/%s", username, hostname, resource);
-                                       session:close(reason);
-                               end
-                       end
-               end
-       
-               log("debug", "Shutdown status: Closing outgoing s2s connections from %s", hostname);
-               if host.s2sout then
-                       for remotehost, session in pairs(host.s2sout) do
-                               if session.close then
-                                       session:close("system-shutdown");
-                               else
-                                       log("warn", "Unable to close outgoing s2s session to %s, no session:close()?!", remotehost);
-                               end
-                       end
-               end
-       end
-
-       log("info", "Shutdown status: Closing all server connections");
-       server.closeall();
-       
-       server.setquitting(true);
 end
 
 -- Are you ready? :)
@@ -412,6 +391,7 @@ init_logging();
 sanity_check();
 sandbox_require();
 set_function_metatable();
+check_dependencies();
 load_libraries();
 init_global_state();
 read_version();