X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=prosodyctl;h=358ec9eaacda242120512d5ad3471fefa5e76c8c;hb=a01a1e4bc9e3438fed2e8e51f302306f4a3ead9c;hp=0ddc6bcff4bde7bb2f5574196ff7695c0da8264f;hpb=42fb199341e9ddc5f2cd2ca025db50e697010c6b;p=prosody.git diff --git a/prosodyctl b/prosodyctl index 0ddc6bcf..358ec9ea 100755 --- a/prosodyctl +++ b/prosodyctl @@ -1,5 +1,5 @@ #!/usr/bin/env lua --- Prosody IM v0.4 +-- Prosody IM -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 Waqas Hussain -- @@ -66,19 +66,28 @@ 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.1"; local ok, pposix = pcall(require, "util.pposix"); + if ok and pposix then + if pposix._VERSION ~= want_pposix_version then print(string.format("Unknown version (%s) of binary pposix module, expected %s", tostring(pposix._VERSION), want_pposix_version)); return; end current_uid = pposix.getuid(); if current_uid == 0 then -- We haz root! local desired_user = config.get("*", "core", "prosody_user") or "prosody"; - local ok, err = pposix.setuid(desired_user); + local desired_group = config.get("*", "core", "prosody_group") or desired_user; + local ok, err = pposix.setgid(desired_group); if ok then - -- Yay! - switched_user = true; - else + ok, err = pposix.setuid(desired_user); + if ok then + -- Yay! + switched_user = true; + end + end + if not switched_user then -- Boo! - print("Warning: Couldn't switch to Prosody user '"..tostring(desired_user).."': "..tostring(err)); + print("Warning: Couldn't switch to Prosody user/group '"..tostring(desired_user).."'/'"..tostring(desired_group).."': "..tostring(err)); end end else @@ -95,6 +104,7 @@ local error_messages = setmetatable({ ["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-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 }); hosts = {}; @@ -124,17 +134,21 @@ end local function getchar(n) os.execute("stty raw -echo"); - local char = io.read(n or 1); + local ok, char = pcall(io.read, n or 1); os.execute("stty sane"); - return char; + if ok then + return char; + end end local function getpass() os.execute("stty -echo"); - local pass = io.read("*l"); + local ok, pass = pcall(io.read, "*l"); os.execute("stty sane"); io.write("\n"); - return pass; + if ok then + return pass; + end end function show_yesno(prompt) @@ -153,6 +167,10 @@ local function read_password() while true do io.write("Enter new password: "); password = getpass(); + if not password then + show_message("No password - cancelled"); + return; + end io.write("Retype new password: "); if getpass() ~= password then if not show_yesno [=[Passwords did not match, try again? [Y/n]]=] then @@ -164,6 +182,8 @@ local function read_password() end return password; end + +local prosodyctl_timeout = (config.get("*", "core", "prosodyctl_timeout") or 5) * 2; ----------------------- local commands = {}; local command = arg[1]; @@ -300,7 +320,7 @@ function commands.start(arg) break; elseif i == 5 then show_message("Still waiting..."); - elseif i >= 10 then + elseif i >= prosodyctl_timeout then show_message("Prosody is still not running. Please give it some time or check your log files for errors."); return 2; end @@ -370,7 +390,7 @@ function commands.stop(arg) break; elseif i == 5 then show_message("Still waiting..."); - elseif i >= 10 then + elseif i >= prosodyctl_timeout then show_message("Prosody is still running. Please give it some time or check your log files for errors."); return 2; end @@ -441,7 +461,7 @@ end --------------------- -if command:match("^mod_") then -- Is a command in a module +if command and command:match("^mod_") then -- Is a command in a module local module_name = command:match("^mod_(.+)"); local ret, err = modulemanager.load("*", module_name); if not ret then