prosodyctl: Fix 'about' command to not show up where it shouldn't...
[prosody.git] / prosodyctl
index 2c31c641384a340d0e95916c81d4851a51829418..a9858c445eab4ff6de771760546145942207e770 100755 (executable)
@@ -110,8 +110,14 @@ local original_logging_config = config.get("*", "core", "log");
 config.set("*", "core", "log", { { levels = { min="info" }, to = "console" } });
 
 local data_path = config.get("*", "core", "data_path") or CFG_DATADIR or "data";
+local custom_plugin_paths = config.get("*", "core", "plugin_paths");
+if custom_plugin_paths then
+       local path_sep = package.config:sub(3,3);
+       -- path1;path2;path3;defaultpath...
+       CFG_PLUGINDIR = table.concat(custom_plugin_paths, path_sep)..path_sep..(CFG_PLUGINDIR or "plugins");
+end
 prosody.paths = { source = CFG_SOURCEDIR, config = CFG_CONFIGDIR, 
-                 plugins = CFG_PLUGINDIR, data = data_path };
+                 plugins = CFG_PLUGINDIR or "plugins", data = data_path };
 
 require "core.loggingmanager"
 
@@ -226,86 +232,11 @@ require "util.prosodyctl"
 require "socket"
 -----------------------
 
-function show_message(msg, ...)
-       print(msg:format(...));
-end
-
-function show_warning(msg, ...)
-       print(msg:format(...));
-end
-
-function show_usage(usage, desc)
-       print("Usage: "..arg[0].." "..usage);
-       if desc then
-               print(" "..desc);
-       end
-end
-
-local function getchar(n)
-       local stty_ret = os.execute("stty raw -echo 2>/dev/null");
-       local ok, char;
-       if stty_ret == 0 then
-               ok, char = pcall(io.read, n or 1);
-               os.execute("stty sane");
-       else
-               ok, char = pcall(io.read, "*l");
-               if ok then
-                       char = char:sub(1, n or 1);
-               end
-       end
-       if ok then
-               return char;
-       end
-end
-       
-local function getpass()
-       local stty_ret = os.execute("stty -echo 2>/dev/null");
-       if stty_ret ~= 0 then
-               io.write("\027[08m"); -- ANSI 'hidden' text attribute
-       end
-       local ok, pass = pcall(io.read, "*l");
-       if stty_ret == 0 then
-               os.execute("stty sane");
-       else
-               io.write("\027[00m");
-       end
-       io.write("\n");
-       if ok then
-               return pass;
-       end
-end
-
-function show_yesno(prompt)
-       io.write(prompt, " ");
-       local choice = getchar():lower();
-       io.write("\n");
-       if not choice:match("%a") then
-               choice = prompt:match("%[.-(%U).-%]$");
-               if not choice then return nil; end
-       end
-       return (choice == "y");
-end
-
-local function read_password()
-       local 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
-                               return;
-                       end
-               else
-                       break;
-               end
-       end
-       return password;
-end
+local show_message, show_warning = prosodyctl.show_message, prosodyctl.show_warning;
+local show_usage = prosodyctl.show_usage;
+local getchar, getpass = prosodyctl.getchar, prosodyctl.getpass;
+local show_yesno = prosodyctl.show_yesno;
+local read_password = prosodyctl.read_password;
 
 local prosodyctl_timeout = (config.get("*", "core", "prosodyctl_timeout") or 5) * 2;
 -----------------------
@@ -554,6 +485,54 @@ function commands.restart(arg)
        return commands.start(arg);
 end
 
+function commands.about(arg)
+       if arg[1] == "--help" then
+               show_usage([[about]], [[Show information about this Prosody installation]]);
+               return 1;
+       end
+       
+       require "util.array";
+       require "util.iterators";
+       
+       print("Prosody "..(prosody.version or "(unknown version)"));
+       print("");
+       print("# Prosody directories");
+       print("Data directory:  ", CFG_DATADIR or "./");
+       print("Plugin directory:", CFG_PLUGINDIR or "./");
+       print("Config directory:", CFG_CONFIGDIR or "./");
+       print("Source directory:", CFG_SOURCEDIR or "./");
+       print("");
+       print("# Lua environment");
+       print("Lua version:             ", _G._VERSION);
+       print("");
+       print("Lua module search paths:");
+       for path in package.path:gmatch("[^;]+") do
+               print("  "..path);
+       end
+       print("");
+       print("Lua C module search paths:");
+       for path in package.cpath:gmatch("[^;]+") do
+               print("  "..path);
+       end
+       print("");
+       print("# Lua module versions");
+       local module_versions, longest_name = {}, 8;
+       for name, module in pairs(package.loaded) do
+               if type(module) == "table" and rawget(module, "_VERSION")
+               and name ~= "_G" and not name:match("%.") then
+                       if #name > longest_name then
+                               longest_name = #name;
+                       end
+                       module_versions[name] = module._VERSION;
+               end
+       end
+       local sorted_keys = array.collect(keys(module_versions)):sort();
+       for _, name in ipairs(array.collect(keys(module_versions)):sort()) do
+               print(name..":"..string.rep(" ", longest_name-#name), module_versions[name]);
+       end
+       print("");
+end
+
 -- ejabberdctl compatibility
 
 function commands.register(arg)
@@ -657,7 +636,7 @@ if not commands[command] then -- Show help for all commands
        print("Where COMMAND may be one of:\n");
 
        local hidden_commands = require "util.set".new{ "register", "unregister", "addplugin" };
-       local commands_order = { "adduser", "passwd", "deluser", "start", "stop", "restart" };
+       local commands_order = { "adduser", "passwd", "deluser", "start", "stop", "restart", "about" };
 
        local done = {};