Software / code / prosody
Comparison
util/prosodyctl.lua @ 10871:e5dee71d0ebb
prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 02 Jun 2020 08:01:21 +0100 |
| parent | 10722:3ddc7c9f35dc |
| child | 11132:287d0d80aa57 |
comparison
equal
deleted
inserted
replaced
| 10870:3f1889608f3e | 10871:e5dee71d0ebb |
|---|---|
| 13 local storagemanager = require "core.storagemanager"; | 13 local storagemanager = require "core.storagemanager"; |
| 14 local usermanager = require "core.usermanager"; | 14 local usermanager = require "core.usermanager"; |
| 15 local signal = require "util.signal"; | 15 local signal = require "util.signal"; |
| 16 local set = require "util.set"; | 16 local set = require "util.set"; |
| 17 local lfs = require "lfs"; | 17 local lfs = require "lfs"; |
| 18 local pcall = pcall; | |
| 19 local type = type; | 18 local type = type; |
| 20 | 19 |
| 21 local nodeprep, nameprep = stringprep.nodeprep, stringprep.nameprep; | 20 local nodeprep, nameprep = stringprep.nodeprep, stringprep.nameprep; |
| 22 | 21 |
| 23 local io, os = io, os; | 22 local io, os = io, os; |
| 25 local tonumber = tonumber; | 24 local tonumber = tonumber; |
| 26 | 25 |
| 27 local _G = _G; | 26 local _G = _G; |
| 28 local prosody = prosody; | 27 local prosody = prosody; |
| 29 | 28 |
| 29 local error_messages = setmetatable({ | |
| 30 ["invalid-username"] = "The given username is invalid in a Jabber ID"; | |
| 31 ["invalid-hostname"] = "The given hostname is invalid"; | |
| 32 ["no-password"] = "No password was supplied"; | |
| 33 ["no-such-user"] = "The given user does not exist on the server"; | |
| 34 ["no-such-host"] = "The given hostname does not exist in the config"; | |
| 35 ["unable-to-save-data"] = "Unable to store, perhaps you don't have permission?"; | |
| 36 ["no-pidfile"] = "There is no 'pidfile' option in the configuration file, see https://prosody.im/doc/prosodyctl#pidfile for help"; | |
| 37 ["invalid-pidfile"] = "The 'pidfile' option in the configuration file is not a string, see https://prosody.im/doc/prosodyctl#pidfile for help"; | |
| 38 ["no-posix"] = "The mod_posix module is not enabled in the Prosody config file, see https://prosody.im/doc/prosodyctl for more info"; | |
| 39 ["no-such-method"] = "This module has no commands"; | |
| 40 ["not-running"] = "Prosody is not running"; | |
| 41 }, { __index = function (_,k) return "Error: "..(tostring(k):gsub("%-", " "):gsub("^.", string.upper)); end }); | |
| 42 | |
| 30 -- UI helpers | 43 -- UI helpers |
| 31 local function show_message(msg, ...) | 44 local show_message = require "util.human.io".printf; |
| 32 print(msg:format(...)); | |
| 33 end | |
| 34 | 45 |
| 35 local function show_usage(usage, desc) | 46 local function show_usage(usage, desc) |
| 36 print("Usage: ".._G.arg[0].." "..usage); | 47 print("Usage: ".._G.arg[0].." "..usage); |
| 37 if desc then | 48 if desc then |
| 38 print(" "..desc); | 49 print(" "..desc); |
| 47 print("More info about: ") | 58 print("More info about: ") |
| 48 print(" modules_enabled: https://prosody.im/doc/modules_enabled") | 59 print(" modules_enabled: https://prosody.im/doc/modules_enabled") |
| 49 print(" "..mod_name..": https://modules.prosody.im/"..mod_name..".html") | 60 print(" "..mod_name..": https://modules.prosody.im/"..mod_name..".html") |
| 50 end | 61 end |
| 51 | 62 |
| 52 local function getchar(n) | |
| 53 local stty_ret = os.execute("stty raw -echo 2>/dev/null"); | |
| 54 local ok, char; | |
| 55 if stty_ret == true or stty_ret == 0 then | |
| 56 ok, char = pcall(io.read, n or 1); | |
| 57 os.execute("stty sane"); | |
| 58 else | |
| 59 ok, char = pcall(io.read, "*l"); | |
| 60 if ok then | |
| 61 char = char:sub(1, n or 1); | |
| 62 end | |
| 63 end | |
| 64 if ok then | |
| 65 return char; | |
| 66 end | |
| 67 end | |
| 68 | |
| 69 local function getline() | |
| 70 local ok, line = pcall(io.read, "*l"); | |
| 71 if ok then | |
| 72 return line; | |
| 73 end | |
| 74 end | |
| 75 | |
| 76 local function getpass() | |
| 77 local stty_ret, _, status_code = os.execute("stty -echo 2>/dev/null"); | |
| 78 if status_code then -- COMPAT w/ Lua 5.1 | |
| 79 stty_ret = status_code; | |
| 80 end | |
| 81 if stty_ret ~= 0 then | |
| 82 io.write("\027[08m"); -- ANSI 'hidden' text attribute | |
| 83 end | |
| 84 local ok, pass = pcall(io.read, "*l"); | |
| 85 if stty_ret == 0 then | |
| 86 os.execute("stty sane"); | |
| 87 else | |
| 88 io.write("\027[00m"); | |
| 89 end | |
| 90 io.write("\n"); | |
| 91 if ok then | |
| 92 return pass; | |
| 93 end | |
| 94 end | |
| 95 | |
| 96 local function show_yesno(prompt) | |
| 97 io.write(prompt, " "); | |
| 98 local choice = getchar():lower(); | |
| 99 io.write("\n"); | |
| 100 if not choice:match("%a") then | |
| 101 choice = prompt:match("%[.-(%U).-%]$"); | |
| 102 if not choice then return nil; end | |
| 103 end | |
| 104 return (choice == "y"); | |
| 105 end | |
| 106 | |
| 107 local function read_password() | |
| 108 local password; | |
| 109 while true do | |
| 110 io.write("Enter new password: "); | |
| 111 password = getpass(); | |
| 112 if not password then | |
| 113 show_message("No password - cancelled"); | |
| 114 return; | |
| 115 end | |
| 116 io.write("Retype new password: "); | |
| 117 if getpass() ~= password then | |
| 118 if not show_yesno [=[Passwords did not match, try again? [Y/n]]=] then | |
| 119 return; | |
| 120 end | |
| 121 else | |
| 122 break; | |
| 123 end | |
| 124 end | |
| 125 return password; | |
| 126 end | |
| 127 | |
| 128 local function show_prompt(prompt) | |
| 129 io.write(prompt, " "); | |
| 130 local line = getline(); | |
| 131 line = line and line:gsub("\n$",""); | |
| 132 return (line and #line > 0) and line or nil; | |
| 133 end | |
| 134 | |
| 135 -- Server control | 63 -- Server control |
| 136 local function adduser(params) | 64 local function adduser(params) |
| 137 local user, host, password = nodeprep(params.user, true), nameprep(params.host), params.password; | 65 local user, host, password = nodeprep(params.user, true), nameprep(params.host), params.password; |
| 138 if not user then | 66 if not user then |
| 139 return false, "invalid-username"; | 67 return false, "invalid-username"; |
| 316 return { | 244 return { |
| 317 show_message = show_message; | 245 show_message = show_message; |
| 318 show_warning = show_message; | 246 show_warning = show_message; |
| 319 show_usage = show_usage; | 247 show_usage = show_usage; |
| 320 show_module_configuration_help = show_module_configuration_help; | 248 show_module_configuration_help = show_module_configuration_help; |
| 321 getchar = getchar; | |
| 322 getline = getline; | |
| 323 getpass = getpass; | |
| 324 show_yesno = show_yesno; | |
| 325 read_password = read_password; | |
| 326 show_prompt = show_prompt; | |
| 327 adduser = adduser; | 249 adduser = adduser; |
| 328 user_exists = user_exists; | 250 user_exists = user_exists; |
| 329 passwd = passwd; | 251 passwd = passwd; |
| 330 deluser = deluser; | 252 deluser = deluser; |
| 331 getpid = getpid; | 253 getpid = getpid; |
| 333 start = start; | 255 start = start; |
| 334 stop = stop; | 256 stop = stop; |
| 335 reload = reload; | 257 reload = reload; |
| 336 get_path_custom_plugins = get_path_custom_plugins; | 258 get_path_custom_plugins = get_path_custom_plugins; |
| 337 call_luarocks = call_luarocks; | 259 call_luarocks = call_luarocks; |
| 260 error_messages = error_messages; | |
| 338 }; | 261 }; |