prosody, prosodyctl, util.dependencies: Split checking and logging of dependencies...
[prosody.git] / prosodyctl
index 88cf552ccb251034c5f822906b4597c52a7f256b..9630a9b8089280e5e7f3f7d79989b3b0b9f7f2a6 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/env lua
 -- Prosody IM
--- Copyright (C) 2008-2009 Matthew Wild
--- Copyright (C) 2008-2009 Waqas Hussain
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
 -- 
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 
 -- 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");
 
--- -- -- -- -- -- -- ---- -- -- -- -- -- -- -- --
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 
+-- Tell Lua where to find our libraries
 if CFG_SOURCEDIR then
-       package.path = CFG_SOURCEDIR.."/?.lua;"..package.path
-       package.cpath = CFG_SOURCEDIR.."/?.so;"..package.cpath
+       package.path = CFG_SOURCEDIR.."/?.lua;"..package.path;
+       package.cpath = CFG_SOURCEDIR.."/?.so;"..package.cpath;
 end
 
+-- Substitute ~ with path to home directory in data path
 if CFG_DATADIR then
        if os.getenv("HOME") then
                CFG_DATADIR = CFG_DATADIR:gsub("^~", os.getenv("HOME"));
@@ -31,18 +33,46 @@ end
 
 -- Global 'prosody' object
 prosody = {
-       hosts = {},
-       events = require "util.events".new(),
-       platform = "posix"
+       hosts = {};
+       events = require "util.events".new();
+       platform = "posix";
+       lock_globals = function () end;
+       unlock_globals = function () end;
 };
 local prosody = prosody;
 
+local dependencies = require "util.dependencies";
+if not dependencies.check_dependencies() then
+       os.exit(1);
+end
+
 config = require "core.configmanager"
 
 do
-       -- TODO: Check for other formats when we add support for them
-       -- Use lfs? Make a new conf/ dir?
-       local ok, level, err = config.load((CFG_CONFIGDIR or ".").."/prosody.cfg.lua");
+       local filenames = {};
+       
+       local filename;
+       if arg[1] == "--config" and arg[2] then
+               table.insert(filenames, arg[2]);
+               table.remove(arg, 1); table.remove(arg, 1);
+               if CFG_CONFIGDIR then
+                       table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
+               end
+       else
+               for _, format in ipairs(config.parsers()) do
+                       table.insert(filenames, (CFG_CONFIGDIR or ".").."/prosody.cfg."..format);
+               end
+       end
+       for _,_filename in ipairs(filenames) do
+               filename = _filename;
+               local file = io.open(filename);
+               if file then
+                       file:close();
+                       CFG_CONFIGDIR = filename:match("^(.*)[\\/][^\\/]*$");
+                       break;
+               end
+       end
+       local ok, level, err = config.load(filename);
        if not ok then
                print("\n");
                print("**************************");
@@ -69,9 +99,7 @@ config.set("*", "core", "log", { { levels = { min="info" }, to = "console" } });
 
 require "core.loggingmanager"
 
-if not require "util.dependencies".check_dependencies() then
-       os.exit(1);
-end
+dependencies.log_warnings();
 
 local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
 require "util.datamanager".set_data_path(data_path);
@@ -168,7 +196,11 @@ local error_messages = setmetatable({
 hosts = prosody.hosts;
 
 local function make_host(hostname)
-       return { events = prosody.events, users = require "core.usermanager".new_null_provider(hostname) };
+       return {
+               type = "local",
+               events = prosody.events,
+               users = require "core.usermanager".new_null_provider(hostname)
+       };
 end
 
 for hostname, config in pairs(config.getconfig()) do
@@ -302,7 +334,7 @@ function commands.adduser(arg)
        
        if ok then return 0; end
        
-       show_message(error_messages[msg])
+       show_message(msg)
        return 1;
 end
 
@@ -505,11 +537,8 @@ function commands.restart(arg)
                return 1;
        end
        
-       local ret = commands.stop(arg);
-       if ret == 0 then
-               ret = commands.start(arg);
-       end
-       return ret;
+       commands.stop(arg);
+       return commands.start(arg);
 end
 
 -- ejabberdctl compatibility