Minor changes; outgoing TLS works.
[prosody.git] / prosody
diff --git a/prosody b/prosody
index b5f5232abf850dbd3487719807f5d47011e23620..01f2a982342d48e3431c1d42c801baf03eae21a2 100755 (executable)
--- a/prosody
+++ b/prosody
@@ -9,9 +9,9 @@
 
 -- Will be modified by configure script if run --
 
-CFG_SOURCEDIR=nil;
+CFG_SOURCEDIR=os.getenv("PROSODY_SRCDIR");
 CFG_CONFIGDIR=os.getenv("PROSODY_CFGDIR");
-CFG_PLUGINDIR=nil;
+CFG_PLUGINDIR=os.getenv("PROSODY_PLUGINDIR");
 CFG_DATADIR=os.getenv("PROSODY_DATADIR");
 
 -- -- -- -- -- -- -- ---- -- -- -- -- -- -- -- --
@@ -62,8 +62,6 @@ function read_config()
        end
 end
 
-read_config();
-
 function load_libraries()
        --- Initialize logging
        require "core.loggingmanager"
@@ -74,7 +72,6 @@ function load_libraries()
        --- Load socket framework
        server = require "net.server"
 end    
-load_libraries();
 
 function init_global_state()
        bare_sessions = {};
@@ -95,9 +92,49 @@ function init_global_state()
        prosody.arg = _G.arg;
 
        prosody.events = require "util.events".new();
-end
-init_global_state();
+       
+       prosody.platform = "unknown";
+       if os.getenv("WINDIR") then
+               prosody.platform = "windows";
+       elseif package.config:sub(1,1) == "/" then
+               prosody.platform = "posix";
+       end
+       
+       prosody.installed = nil;
+       if CFG_SOURCEDIR and (prosody.platform == "windows" or CFG_SOURCEDIR:match("^/")) then
+               prosody.installed = true;
+       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");
+               if not ok then
+                       if level == "parser" then
+                               log("error", "There was an error parsing the configuration file: %s", tostring(err));
+                       elseif level == "file" then
+                               log("error", "Couldn't read the config file when trying to reload: %s", tostring(err));
+                       end
+               end
+               return ok, (err and tostring(level)..": "..tostring(err)) or nil;
+       end
 
+       -- Function to reopen logfiles
+       function prosody.reopen_logfiles()
+               log("info", "Re-opening log files");
+               eventmanager.fire_event("reopen-log-files"); -- Handled by appropriate log sinks
+               prosody.events.fire_event("reopen-log-files");
+       end
+
+       -- Function to initiate prosody shutdown
+       function prosody.shutdown(reason)
+               log("info", "Shutting down: %s", reason or "unknown reason");
+               prosody.shutdown_reason = reason;
+               prosody.events.fire_event("server-stopping", {reason = reason});
+               server.setquitting(true);
+       end
+end
 
 function read_version()
        -- Try to determine version
@@ -112,8 +149,6 @@ function read_version()
                prosody.version = "unknown";
        end
 end
-read_version();
-log("info", "Hello and welcome to Prosody version %s", prosody.version);
 
 function load_secondary_libraries()
        --- Load and initialise core modules
@@ -130,7 +165,8 @@ function load_secondary_libraries()
        require "util.array"
        require "util.iterators"
        require "util.timer"
-
+       require "util.helpers"
+       
        -- Commented to protect us from 
        -- the second kind of people
        --[[ 
@@ -143,8 +179,6 @@ function load_secondary_libraries()
        require "util.stanza"
        require "util.jid"
 end
-load_secondary_libraries();
-
 
 function init_data_store()
        local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
@@ -156,37 +190,8 @@ function init_data_store()
                return username, host, datastore, data;
        end);
 end
-init_data_store();
 
--- 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");
-       if not ok then
-               if level == "parser" then
-                       log("error", "There was an error parsing the configuration file: %s", tostring(err));
-               elseif level == "file" then
-                       log("error", "Couldn't read the config file when trying to reload: %s", tostring(err));
-               end
-       end
-end
-
--- Function to reopen logfiles
-function prosody.reopen_logfiles()
-       log("info", "Re-opening log files");
-       eventmanager.fire_event("reopen-log-files"); -- Handled by appropriate log sinks
-       prosody.events.fire_event("reopen-log-files");
-end
-
--- Function to initiate prosody shutdown
-function prosody.shutdown(reason)
-       log("info", "Shutting down: %s", reason or "unknown reason");
-       prosody.events.fire_event("server-stopping", {reason = reason});
-       server.setquitting(true);
-end
-
-function prosody.prepare_to_start()
+function prepare_to_start()
        -- Signal to modules that we are ready to start
        eventmanager.fire_event("server-starting");
        prosody.events.fire_event("server-starting");
@@ -201,6 +206,7 @@ function prosody.prepare_to_start()
        local cl = require "net.connlisteners";
        -- start listening on sockets
        function net_activate_ports(option, listener, default, conntype)
+               if not cl.get(listener) then return; end
                local ports = config.get("*", "core", option.."_ports") or default;
                if type(ports) == "number" then ports = {ports} end;
                
@@ -225,19 +231,15 @@ function prosody.prepare_to_start()
        end
 
        net_activate_ports("c2s", "xmppclient", {5222}, (global_ssl_ctx and "tls") or "tcp");
-       net_activate_ports("s2s", "xmppserver", {5269}, "tcp");
+       net_activate_ports("s2s", "xmppserver", {5269}, (global_ssl_ctx and "tls") or "tcp");
        net_activate_ports("component", "xmppcomponent", {}, "tcp");
        net_activate_ports("legacy_ssl", "xmppclient", {}, "ssl");
-       
-       if cl.get("console") then
-               cl.start("console", { interface = config.get("*", "core", "console_interface") or "127.0.0.1" })
-       end
+       net_activate_ports("console", "console", {5582}, "tcp");
 
        prosody.start_time = os.time();
 end    
-prosody.prepare_to_start();
 
-function prosody.init_global_protection()
+function init_global_protection()
        -- Catch global accesses --
        local locked_globals_mt = { __index = function (t, k) error("Attempt to read a non-existent global '"..k.."'", 2); end, __newindex = function (t, k, v) error("Attempt to set a global: "..tostring(k).." = "..tostring(v), 2); end }
                
@@ -252,13 +254,8 @@ function prosody.init_global_protection()
        -- And lock now...
        prosody.lock_globals();
 end
-prosody.init_global_protection();
 
-
-eventmanager.fire_event("server-started");
-prosody.events.fire_event("server-started");
-
-function prosody.loop()
+function loop()
        -- Error handler for errors that make it this far
        local function catch_uncaught_error(err)
                if err:match("%d*: interrupted!$") then
@@ -278,9 +275,8 @@ function prosody.loop()
                socket.sleep(0.2);
        end
 end
-prosody.loop();
 
-function prosody.cleanup()
+function cleanup()
        log("info", "Shutdown status: Cleaning up");
        prosody.events.fire_event("server-cleanup");
        
@@ -292,10 +288,14 @@ function prosody.cleanup()
        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("system-shutdown");
+                                       session:close(reason);
                                end
                        end
                end
@@ -317,8 +317,25 @@ function prosody.cleanup()
        
        server.setquitting(true);
 end
-prosody.cleanup();
 
+read_config();
+load_libraries();
+init_global_state();
+read_version();
+log("info", "Hello and welcome to Prosody version %s", prosody.version);
+load_secondary_libraries();
+init_data_store();
+prepare_to_start();
+init_global_protection();
+
+eventmanager.fire_event("server-started");
+prosody.events.fire_event("server-started");
+
+loop();
+
+log("info", "Shutting down...");
+cleanup();
 eventmanager.fire_event("server-stopped");
 prosody.events.fire_event("server-stopped");
-log("info", "Shutdown status: Complete!");
+log("info", "Shutdown complete");
+