Software / code / prosody
Comparison
util/prosodyctl/shell.lua @ 10858:efa49d484560
prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 01 Jun 2020 15:44:44 +0100 |
| child | 10859:8de0057b4279 |
comparison
equal
deleted
inserted
replaced
| 10857:826023c3322b | 10858:efa49d484560 |
|---|---|
| 1 local have_unix, unix = pcall(require, "socket.unix"); | |
| 2 | |
| 3 if not have_unix or type(unix) ~= "table" then | |
| 4 print("** LuaSocket unix socket support not available or incompatible, ensure your"); | |
| 5 print("** version is up to date."); | |
| 6 os.exit(1); | |
| 7 end | |
| 8 | |
| 9 local server = require "net.server"; | |
| 10 local st = require "util.stanza"; | |
| 11 | |
| 12 local have_readline, readline = pcall(require, "readline"); | |
| 13 | |
| 14 local adminstream = require "util.adminstream"; | |
| 15 | |
| 16 if have_readline then | |
| 17 readline.set_readline_name("prosody"); | |
| 18 end | |
| 19 | |
| 20 local function read_line() | |
| 21 if have_readline then | |
| 22 return readline.readline("prosody> "); | |
| 23 else | |
| 24 io.write("prosody> "); | |
| 25 return io.read("*line"); | |
| 26 end | |
| 27 end | |
| 28 | |
| 29 local function send_line(client, line) | |
| 30 client.send(st.stanza("repl-line"):text(line)); | |
| 31 end | |
| 32 | |
| 33 local function repl(client) | |
| 34 local line = read_line(); | |
| 35 if not line or line == "quit" or line == "exit" or line == "bye" then | |
| 36 if not line then | |
| 37 print(""); | |
| 38 end | |
| 39 os.exit(); | |
| 40 end | |
| 41 send_line(client, line); | |
| 42 end | |
| 43 | |
| 44 local function connection(socket_path, listeners) | |
| 45 local conn, sock; | |
| 46 | |
| 47 return { | |
| 48 connect = function () | |
| 49 if sock or conn then | |
| 50 return nil, "already connected"; | |
| 51 end | |
| 52 sock = unix.stream(); | |
| 53 sock:settimeout(0); | |
| 54 local ok, err = sock:connect(socket_path); | |
| 55 if not ok then | |
| 56 return nil, err; | |
| 57 end | |
| 58 conn = server.wrapclient(sock, nil, nil, listeners, "*a"); | |
| 59 return true; | |
| 60 end; | |
| 61 disconnect = function () | |
| 62 if conn then | |
| 63 conn:close(); | |
| 64 conn = nil; | |
| 65 end | |
| 66 if sock then | |
| 67 sock:close(); | |
| 68 sock = nil; | |
| 69 end | |
| 70 return true; | |
| 71 end; | |
| 72 }; | |
| 73 end | |
| 74 | |
| 75 local function printbanner() | |
| 76 print([[ | |
| 77 ____ \ / _ | |
| 78 | _ \ _ __ ___ ___ _-_ __| |_ _ | |
| 79 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | | |
| 80 | __/| | | (_) \__ \ |_| | (_| | |_| | | |
| 81 |_| |_| \___/|___/\___/ \__,_|\__, | | |
| 82 A study in simplicity |___/ | |
| 83 | |
| 84 ]]); | |
| 85 print("Welcome to the Prosody administration console. For a list of commands, type: help"); | |
| 86 print("You may find more help on using this console in our online documentation at "); | |
| 87 print("https://prosody.im/doc/console\n"); | |
| 88 end | |
| 89 | |
| 90 local function start(arg) --luacheck: ignore 212/arg | |
| 91 local client = adminstream.client(); | |
| 92 | |
| 93 client.events.add_handler("connected", function () | |
| 94 if not arg.quiet then | |
| 95 printbanner(); | |
| 96 end | |
| 97 repl(client); | |
| 98 end); | |
| 99 | |
| 100 client.events.add_handler("disconnected", function () | |
| 101 print("--- session closed ---"); | |
| 102 os.exit(); | |
| 103 end); | |
| 104 | |
| 105 client.events.add_handler("received", function (stanza) | |
| 106 if stanza.name == "repl-result" then | |
| 107 local result_prefix = stanza.attr.type == "error" and "!" or "|"; | |
| 108 print(result_prefix.." "..stanza:get_text()); | |
| 109 repl(client); | |
| 110 end | |
| 111 end); | |
| 112 | |
| 113 local conn = connection("data/prosody.sock", client.listeners); | |
| 114 local ok, err = conn:connect(); | |
| 115 if not ok then | |
| 116 print("** Unable to connect to server - is it running? Is mod_admin_shell enabled?"); | |
| 117 print("** Connection error: "..err); | |
| 118 os.exit(1); | |
| 119 end | |
| 120 server.loop(); | |
| 121 end | |
| 122 | |
| 123 return { | |
| 124 start = start; | |
| 125 }; |