Annotate

util/prosodyctl/shell.lua @ 13745:994ea8d54b72 13.0

core.configmanager: Pass name and line number in context Delays the string interpolation until the warning is logged, which may slightly lower memory usage. Allows retrieving the filename and line number easily.
author Kim Alvefur <zash@zash.se>
date Sat, 22 Feb 2025 00:04:51 +0100
parent 13732:1465b1e305df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
1 local config = require "prosody.core.configmanager";
13590
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
2 local human_io = require "prosody.util.human.io";
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
3 local server = require "prosody.net.server";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
4 local st = require "prosody.util.stanza";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
5 local path = require "prosody.util.paths";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
6 local parse_args = require "prosody.util.argparse".parse;
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
7 local tc = require "prosody.util.termcolours";
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
8 local isatty = require "prosody.util.pposix".isatty;
13046
4c3dc767fb11 util.prosodyctl.shell: Use new term_width() for width
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
9 local term_width = require"prosody.util.human.io".term_width;
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local have_readline, readline = pcall(require, "readline");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12864
diff changeset
13 local adminstream = require "prosody.util.adminstream";
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 if have_readline then
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 readline.set_readline_name("prosody");
10877
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
17 readline.set_options({
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
18 histfile = path.join(prosody.paths.data, ".shell_history");
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
19 ignoredups = true;
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
20 });
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
11890
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
23 local function read_line(prompt_string)
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 if have_readline then
11890
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
25 return readline.readline(prompt_string);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 else
11890
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
27 io.write(prompt_string);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 return io.read("*line");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local function send_line(client, line)
13050
4ae759490e31 util.prosodyctl.shell: Coerce terminal width to string (for util.stanza)
Kim Alvefur <zash@zash.se>
parents: 13047
diff changeset
33 client.send(st.stanza("repl-input", { width = tostring(term_width()) }):text(line));
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local function repl(client)
11890
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
37 local line = read_line(client.prompt_string or "prosody> ");
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 if not line or line == "quit" or line == "exit" or line == "bye" then
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 if not line then
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 print("");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
10877
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
42 if have_readline then
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
43 readline.save_history();
2b015ef8cd06 util.prosodyctl.shell: Save readline history
Kim Alvefur <zash@zash.se>
parents: 10875
diff changeset
44 end
12862
3dfb87814d65 util.prosodyctl.shell: Close state on exit to fix saving shell history
Kim Alvefur <zash@zash.se>
parents: 11902
diff changeset
45 os.exit(0, true);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 send_line(client, line);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local function printbanner()
11902
98fd531594bd util.prosodyctl.shell: Bring back banner set from config!
Kim Alvefur <zash@zash.se>
parents: 11890
diff changeset
51 local banner = config.get("*", "console_banner");
98fd531594bd util.prosodyctl.shell: Bring back banner set from config!
Kim Alvefur <zash@zash.se>
parents: 11890
diff changeset
52 if banner then return print(banner); end
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 print([[
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 ____ \ / _
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 | _ \ _ __ ___ ___ _-_ __| |_ _
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 | __/| | | (_) \__ \ |_| | (_| | |_| |
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 |_| |_| \___/|___/\___/ \__,_|\__, |
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 A study in simplicity |___/
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 ]]);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 print("Welcome to the Prosody administration console. For a list of commands, type: help");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 print("You may find more help on using this console in our online documentation at ");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 print("https://prosody.im/doc/console\n");
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66
13643
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
67 local function check()
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
68 local lfs = require "lfs";
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
69 local socket_path = path.resolve_relative_path(prosody.paths.data, config.get("*", "admin_socket") or "prosody.sock");
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
70 local state = lfs.attributes(socket_path, "mode");
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
71 return state == "socket";
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
72 end
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
73
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 local function start(arg) --luacheck: ignore 212/arg
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local client = adminstream.client();
10938
a5b8ae066688 util.prosodyctl.shell: Collect extra return values
Kim Alvefur <zash@zash.se>
parents: 10937
diff changeset
76 local opts, err, where = parse_args(arg);
12539
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
77 local ttyout = isatty(io.stdout);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78
10937
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
79 if not opts then
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
80 if err == "param-not-found" then
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
81 print("Unknown command-line option: "..tostring(where));
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
82 elseif err == "missing-value" then
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
83 print("Expected a value to follow command-line option: "..where);
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
84 end
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
85 os.exit(1);
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
86 end
d86f59c31458 util.prosodyctl.shell: Handle argument parsing errors
Kim Alvefur <zash@zash.se>
parents: 10877
diff changeset
87
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
88 if arg[1] then
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
89 if arg[2] then
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13643
diff changeset
90 arg[1] = ("{"..string.rep("%q", #arg, ", ").."}"):format(table.unpack(arg, 1, #arg));
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
91 end
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
92
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
93 client.events.add_handler("connected", function()
13052
585bd71a1a97 util.prosodyctl.shell: Fix sending terminal width with single argument
Kim Alvefur <zash@zash.se>
parents: 13050
diff changeset
94 send_line(client, arg[1]);
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
95 return true;
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
96 end, 1);
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
97
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
98 local errors = 0; -- TODO This is weird, but works for now.
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
99 client.events.add_handler("received", function(stanza)
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
100 if stanza.name == "repl-output" or stanza.name == "repl-result" then
12396
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
101 local dest = io.stdout;
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
102 if stanza.attr.type == "error" then
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
103 errors = errors + 1;
12396
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
104 dest = io.stderr;
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
105 end
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
106 if stanza.attr.eol == "0" then
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
107 dest:write(stanza:get_text());
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
108 else
12396
bdb9577a4830 util.prosodyctl.shell: Support for receiving partial lines (no automatic \n)
Matthew Wild <mwild1@gmail.com>
parents: 11902
diff changeset
109 dest:write(stanza:get_text(), "\n");
11423
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
110 end
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
111 end
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
112 if stanza.name == "repl-result" then
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
113 os.exit(errors);
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
114 end
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
115 return true;
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
116 end, 1);
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
117 end
0a10bb3b129b util.prosodyctl.shell: Allow passing a single command as argument
Kim Alvefur <zash@zash.se>
parents: 11422
diff changeset
118
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 client.events.add_handler("connected", function ()
11422
fa5a23d7aabc util.prosodyctl.shell: Fix check for --quiet
Kim Alvefur <zash@zash.se>
parents: 10938
diff changeset
120 if not opts.quiet then
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 printbanner();
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 repl(client);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 end);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 client.events.add_handler("disconnected", function ()
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 print("--- session closed ---");
12862
3dfb87814d65 util.prosodyctl.shell: Close state on exit to fix saving shell history
Kim Alvefur <zash@zash.se>
parents: 11902
diff changeset
128 os.exit(0, true);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 end);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 client.events.add_handler("received", function (stanza)
13590
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
132 if stanza.name ~= "repl-request-input" then
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
133 return;
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
134 end
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
135 if stanza.attr.type == "password" then
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
136 local password = human_io.read_password();
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
137 client.send(st.stanza("repl-requested-input", { type = stanza.attr.type, id = stanza.attr.id }):text(password));
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
138 else
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
139 io.stderr:write("Internal error - unexpected input request type "..tostring(stanza.attr.type).."\n");
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
140 os.exit(1);
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
141 end
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
142 return true;
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
143 end, 2);
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
144
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
145
d66f30855822 util.prosodyctl.shell: Support for requesting special inputs, e.g. passwords
Matthew Wild <mwild1@gmail.com>
parents: 13483
diff changeset
146 client.events.add_handler("received", function (stanza)
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10858
diff changeset
147 if stanza.name == "repl-output" or stanza.name == "repl-result" then
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 local result_prefix = stanza.attr.type == "error" and "!" or "|";
12539
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
149 local out = result_prefix.." "..stanza:get_text();
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
150 if ttyout and stanza.attr.type == "error" then
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
151 out = tc.getstring(tc.getstyle("red"), out);
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
152 end
cfdc8cca64d3 util.prosodyctl.shell: Print errors in red to highlight them
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
153 print(out);
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10858
diff changeset
154 end
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10858
diff changeset
155 if stanza.name == "repl-result" then
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 repl(client);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 end);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159
11890
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
160 client.prompt_string = config.get("*", "admin_shell_prompt");
b9aab1962a2b util.prosodyctl.shell: Allow setting custom prompt (admin_shell_prompt)
Matthew Wild <mwild1@gmail.com>
parents: 11522
diff changeset
161
10874
98c535531450 util.prosodyctl.shell: Really fix --socket option
Kim Alvefur <zash@zash.se>
parents: 10873
diff changeset
162 local socket_path = path.resolve_relative_path(prosody.paths.data, opts.socket or config.get("*", "admin_socket") or "prosody.sock");
10875
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
163 local conn = adminstream.connection(socket_path, client.listeners);
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 local ok, err = conn:connect();
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 if not ok then
10875
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
166 if err == "no unix socket support" then
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
167 print("** LuaSocket unix socket support not available or incompatible, ensure your");
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
168 print("** version is up to date.");
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
169 else
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
170 print("** Unable to connect to server - is it running? Is mod_admin_shell enabled?");
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
171 print("** Connection error: "..err);
09674bbb833f util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents: 10874
diff changeset
172 end
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 os.exit(1);
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 server.loop();
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 return {
10871
e5dee71d0ebb prosodyctl+util.prosodyctl.*: Start breaking up the ever-growing prosodyctl
Matthew Wild <mwild1@gmail.com>
parents: 10869
diff changeset
179 shell = start;
13643
e5f62871e6a5 util.prosodyctl.shell: Export function to check for availability of admin socket
Matthew Wild <mwild1@gmail.com>
parents: 13607
diff changeset
180 available = check;
10858
efa49d484560 prosodyctl, util.prosodyctl.shell: `prosodyctl shell` - a client to access the prosodyctl admin shell
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 };