X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=prosodyctl;h=9bb8d4ad7173137887bd36d9e00b8e36d3eaf245;hb=d67b44d083d688733b9e4f8fe66e0b4c6995dccb;hp=ccc1e2f9cfe5d86f8d3d55353d3842911aad35be;hpb=af9323473bde0236bfbc32ecb2c7c39f8aec75bf;p=prosody.git diff --git a/prosodyctl b/prosodyctl index ccc1e2f9..9bb8d4ad 100755 --- a/prosodyctl +++ b/prosodyctl @@ -29,6 +29,14 @@ if CFG_DATADIR then end end +-- Global 'prosody' object +prosody = { + hosts = {}, + events = require "util.events".new(), + platform = "posix" +}; +local prosody = prosody; + config = require "core.configmanager" do @@ -56,6 +64,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" @@ -63,8 +73,6 @@ if not require "util.dependencies".check_dependencies() then os.exit(1); end -prosody = { hosts = {}, events = events, platform = "posix" }; - local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data"; require "util.datamanager".set_data_path(data_path); @@ -103,6 +111,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"; @@ -114,12 +161,14 @@ local error_messages = setmetatable({ ["not-running"] = "Prosody is not running"; }, { __index = function (t,k) return "Error: "..(tostring(k):gsub("%-", " "):gsub("^.", string.upper)); end }); -local events = require "util.events".new(); - hosts = prosody.hosts; +local function make_host(hostname) + return { events = prosody.events, users = require "core.usermanager".new_null_provider(hostname) }; +end + for hostname, config in pairs(config.getconfig()) do - hosts[hostname] = { events = events }; + hosts[hostname] = make_host(hostname); end require "core.modulemanager" @@ -231,14 +280,15 @@ function commands.adduser(arg) return 1; end - if prosodyctl.user_exists{ user = user, host = host } then - show_message [[That user already exists]]; - return 1; - end - if not hosts[host] then 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); + end + + if prosodyctl.user_exists{ user = user, host = host } then + show_message [[That user already exists]]; + return 1; end local password = read_password(); @@ -269,6 +319,12 @@ function commands.passwd(arg) return 1; end + if not hosts[host] then + 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); + end + if not prosodyctl.user_exists { user = user, host = host } then show_message [[That user does not exist, use prosodyctl adduser to create a new user]] return 1; @@ -302,6 +358,12 @@ function commands.deluser(arg) return 1; end + if not hosts[host] then + 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); + end + if not prosodyctl.user_exists { user = user, host = host } then show_message [[That user does not exist on this server]] return 1; @@ -499,37 +561,6 @@ function commands.unregister(arg) return 1; end -local http_errors = { - [404] = "Plugin not found, did you type the address correctly?" - }; - -function commands.addplugin(arg) - if not arg[1] or arg[1] == "--help" then - show_usage("addplugin URL", "Download and install a plugin from a URL"); - return 1; - end - local url = arg[1]; - if url:match("^http://") then - local http = require "socket.http"; - show_message("Fetching..."); - local code, err = http.request(url); - if not code or not tostring(err):match("^[23]") then - show_message("Failed: "..(http_errors[err] or ("HTTP error "..err))); - return 1; - end - if url:match("%.lua$") then - local ok, err = datamanager.store(url:match("/mod_([^/]+)$"), "*", "plugins", {code}); - if not ok then - show_message("Failed to save to data store: "..err); - return 1; - end - end - show_message("Saved. Don't forget to load the module using the config file or admin console!"); - else - show_message("Sorry, I don't understand how to fetch plugins from there."); - end -end - --------------------- if command and command:match("^mod_") then -- Is a command in a module