X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=prosodyctl;h=cfc5ca77a979d74268a5483455984ec2da170462;hb=eecf63b9e5aff94dc3d3e88e3b5dfa853d92fc1a;hp=4aaf90c5a1a8f3ff2ff8665bc4c0ce295e190cc9;hpb=2311917ec824e5d08d7f8742a89670d70d2ce990;p=prosody.git diff --git a/prosodyctl b/prosodyctl index 4aaf90c5..cfc5ca77 100755 --- a/prosodyctl +++ b/prosodyctl @@ -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. @@ -11,18 +11,20 @@ -- 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,41 @@ 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; 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("**************************"); @@ -64,6 +89,8 @@ do os.exit(1); end end +local original_logging_config = config.get("*", "core", "log"); +config.set("*", "core", "log", { { levels = { min="info" }, to = "console" } }); require "core.loggingmanager" @@ -77,7 +104,7 @@ require "util.datamanager".set_data_path(data_path); -- Switch away from root and into the prosody user -- local switched_user, current_uid; -local want_pposix_version = "0.3.3"; +local want_pposix_version = "0.3.5"; local ok, pposix = pcall(require, "util.pposix"); if ok and pposix then @@ -88,6 +115,9 @@ if ok and pposix then local desired_user = config.get("*", "core", "prosody_user") or "prosody"; local desired_group = config.get("*", "core", "prosody_group") or desired_user; local ok, err = pposix.setgid(desired_group); + if ok then + ok, err = pposix.initgroups(desired_user); + end if ok then ok, err = pposix.setuid(desired_user); if ok then @@ -109,6 +139,45 @@ else print(tostring(pposix)) end +local function test_writeable(filename) + local f, err = io.open(filename, "a"); + if not f then + return false, err; + end + f:close(); + return true; +end + +local unwriteable_files = {}; +if type(original_logging_config) == "string" and original_logging_config:sub(1,1) ~= "*" then + local ok, err = test_writeable(original_logging_config); + if not ok then + table.insert(unwriteable_files, err); + end +elseif type(original_logging_config) == "table" then + for _, rule in ipairs(original_logging_config) do + if rule.filename then + local ok, err = test_writeable(rule.filename); + if not ok then + table.insert(unwriteable_files, err); + end + end + end +end + +if #unwriteable_files > 0 then + print("One of more of the Prosody log files are not"); + print("writeable, please correct the errors and try"); + print("starting prosodyctl again."); + print(""); + for _, err in ipairs(unwriteable_files) do + print(err); + end + print(""); + os.exit(1); +end + + local error_messages = setmetatable({ ["invalid-username"] = "The given username is invalid in a Jabber ID"; ["invalid-hostname"] = "The given hostname is invalid"; @@ -116,6 +185,7 @@ local error_messages = setmetatable({ ["no-such-user"] = "The given user does not exist on the server"; ["unable-to-save-data"] = "Unable to store, perhaps you don't have permission?"; ["no-pidfile"] = "There is no 'pidfile' option in the configuration file, see http://prosody.im/doc/prosodyctl#pidfile for help"; + ["no-posix"] = "The mod_posix module is not enabled in the Prosody config file, see http://prosody.im/doc/prosodyctl for more info"; ["no-such-method"] = "This module has no commands"; ["not-running"] = "Prosody is not running"; }, { __index = function (t,k) return "Error: "..(tostring(k):gsub("%-", " "):gsub("^.", string.upper)); end }); @@ -123,7 +193,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 @@ -243,12 +317,6 @@ function commands.adduser(arg) show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) show_warning("The user will not be able to log in until this is changed."); hosts[host] = make_host(host); - elseif config.get(host, "core", "authentication") - and config.get(host, "core", "authentication") ~= "default" then - show_warning("The host '%s' is configured to use the '%s' authentication provider", host, - config.get(host, "core", "authentication")); - show_warning("prosodyctl currently only supports the default provider, sorry :("); - return 1; end if prosodyctl.user_exists{ user = user, host = host } then @@ -263,7 +331,7 @@ function commands.adduser(arg) if ok then return 0; end - show_message(error_messages[msg]) + show_message(msg) return 1; end @@ -288,12 +356,6 @@ function commands.passwd(arg) show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) show_warning("The user will not be able to log in until this is changed."); hosts[host] = make_host(host); - elseif config.get(host, "core", "authentication") - and config.get(host, "core", "authentication") ~= "default" then - show_warning("The host '%s' is configured to use the '%s' authentication provider", host, - config.get(host, "core", "authentication")); - show_warning("prosodyctl currently only supports the default provider, sorry :("); - return 1; end if not prosodyctl.user_exists { user = user, host = host } then @@ -333,12 +395,6 @@ function commands.deluser(arg) show_warning("The host '%s' is not listed in the configuration file (or is not enabled).", host) show_warning("The user will not be able to log in until this is changed."); hosts[host] = make_host(host); - elseif config.get(host, "core", "authentication") - and config.get(host, "core", "authentication") ~= "default" then - show_warning("The host '%s' is configured to use the '%s' authentication provider", host, - config.get(host, "core", "authentication")); - show_warning("prosodyctl currently only supports the default provider, sorry :("); - return 1; end if not prosodyctl.user_exists { user = user, host = host } then @@ -478,11 +534,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