Comparison

plugins/mod_admin_shell.lua @ 12529:7dae6d29b71d

prosodyctl shell: Communicate width of terminal to mod_admin_shell This lets it adjust the width of tables to the actual terminal width.
author Kim Alvefur <zash@zash.se>
date Mon, 30 May 2022 15:28:44 +0200
parent 12506:d04f6f014636
child 12536:a8cb1d7a98db
comparison
equal deleted inserted replaced
12528:8e780079a424 12529:7dae6d29b71d
131 local session = event.origin.shell_session; 131 local session = event.origin.shell_session;
132 if not session then 132 if not session then
133 session = console:new_session(event.origin); 133 session = console:new_session(event.origin);
134 event.origin.shell_session = session; 134 event.origin.shell_session = session;
135 end 135 end
136
137 local default_width = 132; -- The common default of 80 is a bit too narrow for e.g. s2s:show(), 132 was another common width for hardware terminals
138 local margin = 2; -- To account for '| ' when lines are printed
139 session.width = (tonumber(event.stanza.attr.width) or default_width)-margin;
140
136 local line = event.stanza:get_text(); 141 local line = event.stanza:get_text();
137 local useglobalenv; 142 local useglobalenv;
138 143
139 local result = st.stanza("repl-result"); 144 local result = st.stanza("repl-result");
140 145
217 local section = data:match("^help (%w+)"); 222 local section = data:match("^help (%w+)");
218 if not section then 223 if not section then
219 print [[Commands are divided into multiple sections. For help on a particular section, ]] 224 print [[Commands are divided into multiple sections. For help on a particular section, ]]
220 print [[type: help SECTION (for example, 'help c2s'). Sections are: ]] 225 print [[type: help SECTION (for example, 'help c2s'). Sections are: ]]
221 print [[]] 226 print [[]]
222 local row = format_table({ { title = "Section"; width = 7 }; { title = "Description"; width = "100%" } }) 227 local row = format_table({ { title = "Section", width = 7 }, { title = "Description", width = "100%" } }, session.width)
223 print(row()) 228 print(row())
224 print(row { "c2s"; "Commands to manage local client-to-server sessions" }) 229 print(row { "c2s"; "Commands to manage local client-to-server sessions" })
225 print(row { "s2s"; "Commands to manage sessions between this server and others" }) 230 print(row { "s2s"; "Commands to manage sessions between this server and others" })
226 print(row { "http"; "Commands to inspect HTTP services" }) -- XXX plural but there is only one so far 231 print(row { "http"; "Commands to inspect HTTP services" }) -- XXX plural but there is only one so far
227 print(row { "module"; "Commands to load/reload/unload modules/plugins" }) 232 print(row { "module"; "Commands to load/reload/unload modules/plugins" })
339 for column, spec in pairs(available_columns) do 344 for column, spec in pairs(available_columns) do
340 meta_columns[1].width = math.max(meta_columns[1].width or 0, #column); 345 meta_columns[1].width = math.max(meta_columns[1].width or 0, #column);
341 meta_columns[2].width = math.max(meta_columns[2].width or 0, #(spec.title or "")); 346 meta_columns[2].width = math.max(meta_columns[2].width or 0, #(spec.title or ""));
342 meta_columns[3].width = math.max(meta_columns[3].width or 0, #(spec.description or "")); 347 meta_columns[3].width = math.max(meta_columns[3].width or 0, #(spec.description or ""));
343 end 348 end
344 local row = format_table(meta_columns, 120) 349 local row = format_table(meta_columns, session.width)
345 print(row()); 350 print(row());
346 for column, spec in iterators.sorted_pairs(available_columns) do 351 for column, spec in iterators.sorted_pairs(available_columns) do
347 print(row({ column, spec.title, spec.description })); 352 print(row({ column, spec.title, spec.description }));
348 end 353 end
349 print [[]] 354 print [[]]
933 end 938 end
934 939
935 function def_env.c2s:show(match_jid, colspec) 940 function def_env.c2s:show(match_jid, colspec)
936 local print = self.session.print; 941 local print = self.session.print;
937 local columns = get_colspec(colspec, { "id"; "jid"; "ipv"; "status"; "secure"; "smacks"; "csi" }); 942 local columns = get_colspec(colspec, { "id"; "jid"; "ipv"; "status"; "secure"; "smacks"; "csi" });
938 local row = format_table(columns, 120); 943 local row = format_table(columns, self.session.width);
939 944
940 local function match(session) 945 local function match(session)
941 local jid = get_jid(session) 946 local jid = get_jid(session)
942 return (not match_jid) or jid == match_jid; 947 return (not match_jid) or jid == match_jid;
943 end 948 end
1016 end 1021 end
1017 1022
1018 function def_env.s2s:show(match_jid, colspec) 1023 function def_env.s2s:show(match_jid, colspec)
1019 local print = self.session.print; 1024 local print = self.session.print;
1020 local columns = get_colspec(colspec, { "id"; "host"; "dir"; "remote"; "ipv"; "secure"; "s2s_sasl"; "dialback" }); 1025 local columns = get_colspec(colspec, { "id"; "host"; "dir"; "remote"; "ipv"; "secure"; "s2s_sasl"; "dialback" });
1021 local row = format_table(columns, 132); 1026 local row = format_table(columns, self.session.width);
1022 1027
1023 local function match(session) 1028 local function match(session)
1024 local host, remote = get_s2s_hosts(session); 1029 local host, remote = get_s2s_hosts(session);
1025 return not match_jid or host == match_jid or remote == match_jid; 1030 return not match_jid or host == match_jid or remote == match_jid;
1026 end 1031 end
1554 local print = self.session.print; 1559 local print = self.session.print;
1555 hosts = array.collect(set.new({ not hosts and "*" or nil }) + get_hosts_set(hosts)):sort(_sort_hosts); 1560 hosts = array.collect(set.new({ not hosts and "*" or nil }) + get_hosts_set(hosts)):sort(_sort_hosts);
1556 local output = format_table({ 1561 local output = format_table({
1557 { title = "Module", width = "20%" }, 1562 { title = "Module", width = "20%" },
1558 { title = "URL", width = "80%" }, 1563 { title = "URL", width = "80%" },
1559 }, 132); 1564 }, self.session.width);
1560 1565
1561 for _, host in ipairs(hosts) do 1566 for _, host in ipairs(hosts) do
1562 local http_apps = modulemanager.get_items("http-provider", host); 1567 local http_apps = modulemanager.get_items("http-provider", host);
1563 if #http_apps > 0 then 1568 if #http_apps > 0 then
1564 local http_host = module:context(host):get_option_string("http_host"); 1569 local http_host = module:context(host):get_option_string("http_host");