Annotate

plugins/mod_admin_shell.lua @ 13813:fd7b0adada05 13.0

portmanager: Take automatic cert selection into account when setting SNI cert This fixes (another) issue with the fix in 4ea7bd7325be, where it no longer checked the automatic cert index for an appropriate certificate.
author Matthew Wild <mwild1@gmail.com>
date Thu, 03 Apr 2025 12:02:45 +0100
parent 13796:c8e534b4f2e2
child 13819:3ee95eb17045
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 --
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 -- luacheck: ignore 212/self
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 module:set_global();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 module:depends("admin_socket");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
13 local hostmanager = require "prosody.core.hostmanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
14 local modulemanager = require "prosody.core.modulemanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
15 local s2smanager = require "prosody.core.s2smanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
16 local portmanager = require "prosody.core.portmanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
17 local helpers = require "prosody.util.helpers";
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
18 local it = require "prosody.util.iterators";
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
19 local server = require "prosody.net.server";
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
20 local schema = require "prosody.util.jsonschema";
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
21 local st = require "prosody.util.stanza";
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
22 local parse_args = require "prosody.util.argparse".parse;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local _G = _G;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local prosody = _G.prosody;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27
12589
39ae08180c81 compat: Remove handling of Lua 5.1 location of 'unpack' function
Kim Alvefur <zash@zash.se>
parents: 12551
diff changeset
28 local unpack = table.unpack;
13593
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
29 local cache = require "prosody.util.cache";
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
30 local new_short_id = require "prosody.util.id".short;
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
31 local iterators = require "prosody.util.iterators";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local keys, values = iterators.keys, iterators.values;
13013
430333198e4c mod_admin_shell: Allow matching on host or bare JID in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
33 local jid_bare, jid_split, jid_join, jid_resource, jid_compare = import("prosody.util.jid", "bare", "prepped_split", "join", "resource", "compare");
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
34 local set, array = require "prosody.util.set", require "prosody.util.array";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
35 local cert_verify_identity = require "prosody.util.x509".verify_identity;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
36 local envload = require "prosody.util.envload".envload;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
37 local envloadfile = require "prosody.util.envload".envloadfile;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
38 local has_pposix, pposix = pcall(require, "prosody.util.pposix");
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
39 local async = require "prosody.util.async";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
40 local serialization = require "prosody.util.serialization";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local serialize_config = serialization.new ({ fatal = false, unquoted = true});
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
42 local time = require "prosody.util.time";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
43 local promise = require "prosody.util.promise";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
44 local logger = require "prosody.util.logger";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
46 local t_insert = table.insert;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
47 local t_concat = table.concat;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
48
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
49 local format_number = require "prosody.util.human.units".format;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
50 local format_table = require "prosody.util.human.io".table;
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
51
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
52 local function capitalize(s)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
53 if not s then return end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
54 return (s:gsub("^%a", string.upper):gsub("_", " "));
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
55 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
56
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
57 local function pre(prefix, str, alt)
12505
604bb5b8362d mod_admin_shell: Tighten up type checks to fix #1754 (thanks clouded)
Kim Alvefur <zash@zash.se>
parents: 12304
diff changeset
58 if type(str) ~= "string" or str == "" then return alt or ""; end
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
59 return prefix .. str;
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
60 end
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
61
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
62 local function suf(str, suffix, alt)
12505
604bb5b8362d mod_admin_shell: Tighten up type checks to fix #1754 (thanks clouded)
Kim Alvefur <zash@zash.se>
parents: 12304
diff changeset
63 if type(str) ~= "string" or str == "" then return alt or ""; end
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
64 return str .. suffix;
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
65 end
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
66
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 local commands = module:shared("commands")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 local def_env = module:shared("env");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local default_env_mt = { __index = def_env };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
71 local function new_section(section_desc)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
72 return setmetatable({}, {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
73 help = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
74 desc = section_desc;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
75 commands = {};
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
76 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
77 });
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
78 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
79
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
80 local help_topics = {};
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
81 local function help_topic(name)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
82 return function (desc)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
83 return function (content)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
84 help_topics[name] = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
85 desc = desc;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
86 content = content;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
87 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
88 end;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
89 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
90 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
91
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
92 -- Seed with default sections and their description text
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
93 help_topic "console" "Help regarding the console itself" [[
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
94 Hey! Welcome to Prosody's admin console.
13769
5cc4a3e0335c mod_admin_shell: Remove outdated help text (fixes #1898)
Matthew Wild <mwild1@gmail.com>
parents: 13737
diff changeset
95 If you're ever wondering how to get out, simply type 'quit' (ctrl+d should also
5cc4a3e0335c mod_admin_shell: Remove outdated help text (fixes #1898)
Matthew Wild <mwild1@gmail.com>
parents: 13737
diff changeset
96 work).
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
97
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
98 For those well-versed in Prosody's internals, or taking instruction from those who are,
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
99 you can prefix a command with > to escape the console sandbox, and access everything in
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
100 the running server. Great fun, but be careful not to break anything :)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
101 ]];
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
102
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
103 local available_columns; --forward declaration so it is reachable from the help
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
104
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
105 help_topic "columns" "Information about customizing session listings" (function (self, print)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
106 print [[The columns shown by c2s:show() and s2s:show() can be customizied via the]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
107 print [['columns' argument as described here.]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
108 print [[]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
109 print [[Columns can be specified either as "id jid ipv" or as {"id", "jid", "ipv"}.]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
110 print [[Available columns are:]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
111 local meta_columns = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
112 { title = "ID"; width = 5 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
113 { title = "Column Title"; width = 12 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
114 { title = "Description"; width = 12 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
115 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
116 -- auto-adjust widths
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
117 for column, spec in pairs(available_columns) do
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
118 meta_columns[1].width = math.max(meta_columns[1].width or 0, #column);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
119 meta_columns[2].width = math.max(meta_columns[2].width or 0, #(spec.title or ""));
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
120 meta_columns[3].width = math.max(meta_columns[3].width or 0, #(spec.description or ""));
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
121 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
122 local row = format_table(meta_columns, self.session.width)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
123 print(row());
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
124 for column, spec in iterators.sorted_pairs(available_columns) do
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
125 print(row({ column, spec.title, spec.description }));
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
126 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
127 print [[]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
128 print [[Most fields on the internal session structures can also be used as columns]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
129 -- Also, you can pass a table column specification directly, with mapper callback and all
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
130 end);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
131
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
132 help_topic "roles" "Show information about user roles" [[
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
133 Roles may grant access or restrict users from certain operations.
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
134
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
135 Built-in roles are:
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
136 prosody:guest - Guest/anonymous user
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
137 prosody:registered - Registered user
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
138 prosody:member - Provisioned user
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
139 prosody:admin - Host administrator
13641
d980c3e03637 mod_admin_shell: Fix column alignment in 'help roles'
Kim Alvefur <zash@zash.se>
parents: 13640
diff changeset
140 prosody:operator - Server administrator
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
141
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
142 Roles can be assigned using the user management commands (see 'help user').
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
143 ]];
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
144
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
145
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 local function redirect_output(target, session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 local env = setmetatable({ print = session.print }, { __index = function (_, k) return rawget(target, k); end });
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 env.dofile = function(name)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 local f, err = envloadfile(name, env);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 if not f then return f, err; end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 return f();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 return env;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 console = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 local runner_callbacks = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 function runner_callbacks:error(err)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 module:log("error", "Traceback[shell]: %s", err);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 self.data.print("Fatal error while running command, it did not complete");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 self.data.print("Error: "..tostring(err));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166
12397
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12304
diff changeset
167 local function send_repl_output(session, line, attr)
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12304
diff changeset
168 return session.send(st.stanza("repl-output", attr):text(tostring(line)));
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170
13593
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
171 local function request_repl_input(session, input_type)
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
172 if input_type ~= "password" then
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
173 return promise.reject("internal error - unsupported input type "..tostring(input_type));
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
174 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
175 local pending_inputs = session.pending_inputs;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
176 if not pending_inputs then
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
177 pending_inputs = cache.new(5, function (input_id, input_promise) --luacheck: ignore 212/input_id
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
178 input_promise.reject();
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
179 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
180 session.pending_inputs = pending_inputs;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
181 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
182
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
183 local input_id = new_short_id();
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
184 local p = promise.new(function (resolve, reject)
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
185 pending_inputs:set(input_id, { resolve = resolve, reject = reject });
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
186 end):finally(function ()
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
187 pending_inputs:set(input_id, nil);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
188 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
189 session.send(st.stanza("repl-request-input", { type = input_type, id = input_id }));
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
190 return p;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
191 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
192
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
193 module:hook("admin-disconnected", function (event)
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
194 local pending_inputs = event.session.pending_inputs;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
195 if not pending_inputs then return; end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
196 for input_promise in pending_inputs:values() do
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
197 input_promise.reject();
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
198 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
199 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
200
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
201 module:hook("admin/repl-requested-input", function (event)
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
202 local input_id = event.stanza.attr.id;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
203 local input_promise = event.origin.pending_inputs:get(input_id);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
204 if not input_promise then
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
205 event.origin.send(st.stanza("repl-result", { type = "error" }):text("Internal error - unexpected input"));
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
206 return true;
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
207 end
13796
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
208 local status = event.stanza.attr.status or "submit";
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
209 local text = event.stanza:get_text();
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
210 if status == "submit" then
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
211 input_promise.resolve(text);
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
212 else
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
213 input_promise.reject(status == "cancel" and (text ~= "" and text) or "cancelled");
c8e534b4f2e2 mod_admin_shell, prosodyctl shell: Report command failure when no password entered (fixes #1907)
Matthew Wild <mwild1@gmail.com>
parents: 13770
diff changeset
214 end
13596
85e8cc6870ae mod_admin_shell: Mark event as handled when requested input is submitted
Matthew Wild <mwild1@gmail.com>
parents: 13594
diff changeset
215 return true;
13593
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
216 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
217
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 function console:new_session(admin_session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 local session = {
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
220 send = function (t)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
221 return send_repl_output(admin_session, t);
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
222 end;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
223 print = function (...)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
224 local t = {};
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
225 for i=1,select("#", ...) do
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
226 t[i] = tostring(select(i, ...));
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
227 end
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
228 return send_repl_output(admin_session, table.concat(t, "\t"));
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
229 end;
12397
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12304
diff changeset
230 write = function (t)
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12304
diff changeset
231 return send_repl_output(admin_session, t, { eol = "0" });
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12304
diff changeset
232 end;
13593
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
233 request_input = function (input_type)
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
234 return request_repl_input(admin_session, input_type);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
235 end;
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
236 serialize = tostring;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
237 disconnect = function () admin_session:close(); end;
12398
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12397
diff changeset
238 is_connected = function ()
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12397
diff changeset
239 return not not admin_session.conn;
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12397
diff changeset
240 end
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
241 };
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 session.env = setmetatable({}, default_env_mt);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 session.thread = async.runner(function (line)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 console:process_line(session, line);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 end, runner_callbacks, session);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248 -- Load up environment with helper objects
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 for name, t in pairs(def_env) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 if type(t) == "table" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251 session.env[name] = setmetatable({ session = session }, { __index = t });
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 session.env.output:configure();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 return session;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259
13736
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
260 local function process_cmd_line(session, arg_line)
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
261 local chunk = load("return "..arg_line, "=shell", "t", {});
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
262 local ok, args = pcall(chunk);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
263 if not ok then return nil, args; end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
264
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
265 local section_name, command = args[1], args[2];
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
266
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
267 local section_mt = getmetatable(def_env[section_name]);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
268 local section_help = section_mt and section_mt.help;
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
269 local command_help = section_help and section_help.commands[command];
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
270
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
271 if not command_help then
13736
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
272 if commands[section_name] then
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
273 commands[section_name](session, table.concat(args, " "));
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
274 return;
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
275 end
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
276 if section_help then
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
277 return nil, "Command not found or necessary module not loaded. Try 'help "..section_name.." for a list of available commands.";
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
278 end
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
279 return nil, "Command not found. Is the necessary module loaded?";
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
280 end
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
281
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
282 local fmt = { "%s"; ":%s("; ")" };
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
283
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
284 if command_help.flags then
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
285 local flags, flags_err, flags_err_extra = parse_args(args, command_help.flags);
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
286 if not flags then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
287 if flags_err == "missing-value" then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
288 return nil, "Expected value after "..flags_err_extra;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
289 elseif flags_err == "param-not-found" then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
290 return nil, "Unknown parameter: "..flags_err_extra;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
291 end
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
292 return nil, flags_err;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
293 end
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
294
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
295 table.remove(flags, 2);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
296 table.remove(flags, 1);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
297
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
298 local n_fixed_args = #command_help.args;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
299
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
300 local arg_str = {};
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
301 for i = 1, n_fixed_args do
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
302 if flags[i] ~= nil then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
303 table.insert(arg_str, ("%q"):format(flags[i]));
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
304 else
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
305 table.insert(arg_str, "nil");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
306 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
307 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
308
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
309 table.insert(arg_str, "flags");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
310
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
311 for i = n_fixed_args + 1, #flags do
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
312 if flags[i] ~= nil then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
313 table.insert(arg_str, ("%q"):format(flags[i]));
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
314 else
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
315 table.insert(arg_str, "nil");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
316 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
317 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
318
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
319 table.insert(fmt, 3, "%s");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
320
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
321 return "local flags = ...; return "..string.format(table.concat(fmt), section_name, command, table.concat(arg_str, ", ")), flags;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
322 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
323
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
324 for i = 3, #args do
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
325 if args[i]:sub(1, 1) == ":" then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
326 table.insert(fmt, i, ")%s(");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
327 elseif i > 3 and fmt[i - 1]:match("%%q$") then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
328 table.insert(fmt, i, ", %q");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
329 else
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
330 table.insert(fmt, i, "%q");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
331 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
332 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
333
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
334 return "return "..string.format(table.concat(fmt), table.unpack(args));
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
335 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
336
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 local function handle_line(event)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 local session = event.origin.shell_session;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 if not session then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 session = console:new_session(event.origin);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 event.origin.shell_session = session;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 end
12529
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
343
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
344 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
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
345 local margin = 2; -- To account for '| ' when lines are printed
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
346 session.width = (tonumber(event.stanza.attr.width) or default_width)-margin;
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
347
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 local line = event.stanza:get_text();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 local useglobalenv;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350
13770
a28349b8a387 prosodyctl shell: More reliable detection of REPL/interactive mode (fixes #1895)
Matthew Wild <mwild1@gmail.com>
parents: 13769
diff changeset
351 session.repl = event.stanza.attr.repl ~= "0";
a28349b8a387 prosodyctl shell: More reliable detection of REPL/interactive mode (fixes #1895)
Matthew Wild <mwild1@gmail.com>
parents: 13769
diff changeset
352
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10856
diff changeset
353 local result = st.stanza("repl-result");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 if line:match("^>") then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 line = line:gsub("^>", "");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 useglobalenv = true;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 else
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
359 local command = line:match("^(%w+) ") or line:match("^%w+$") or line:match("%p");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 if commands[command] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 commands[command](session, line);
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10856
diff changeset
362 event.origin.send(result);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 session.env._ = line;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 if not useglobalenv and commands[line:lower()] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 commands[line:lower()](session, line);
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10856
diff changeset
371 event.origin.send(result);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372 return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374
11736
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
375 if useglobalenv and not session.globalenv then
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
376 session.globalenv = redirect_output(_G, session);
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
377 end
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
378
13591
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
379 local function send_result(taskok, message)
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
380 if not message then
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
381 if type(taskok) ~= "string" and useglobalenv then
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
382 taskok = session.serialize(taskok);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
383 end
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
384 result:text("Result: "..tostring(taskok));
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
385 elseif (not taskok) and message then
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
386 result.attr.type = "error";
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
387 result:text("Error: "..tostring(message));
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
388 else
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
389 result:text("OK: "..tostring(message));
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
390 end
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
391
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
392 event.origin.send(result);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
393 end
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
394
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
395 local taskok, message;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
396 local env = (useglobalenv and session.globalenv) or session.env or nil;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
397 local flags;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
398
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
399 local source;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
400 if line:match("^{") then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
401 -- Input is a serialized array of strings, typically from
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
402 -- a command-line invocation of 'prosodyctl shell something'
13736
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
403 source, flags = process_cmd_line(session, line);
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
404 if not source then
13736
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
405 if flags then -- err
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
406 send_result(false, flags);
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
407 else -- no err, but nothing more to do
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
408 -- This happens if it was a "simple" command
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
409 event.origin.send(result);
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
410 end
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
411 return;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
412 end
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
413 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
414
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
415 local chunkname = "=console";
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
416 -- luacheck: ignore 311/err
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
417 local chunk, err = envload(source or ("return "..line), chunkname, env);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
418 if not chunk then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
419 if not source then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
420 chunk, err = envload(line, chunkname, env);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
421 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
422 if not chunk then
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
423 err = err:gsub("^%[string .-%]:%d+: ", "");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
424 err = err:gsub("^:%d+: ", "");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
425 err = err:gsub("'<eof>'", "the end of the line");
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
426 result.attr.type = "error";
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
427 result:text("Sorry, I couldn't understand that... "..err);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
428 event.origin.send(result);
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
429 return;
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
430 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
431 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
432
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
433 taskok, message = chunk(flags);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434
11949
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11946
diff changeset
435 if promise.is_promise(taskok) then
13591
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
436 taskok:next(function (resolved_message)
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
437 send_result(true, resolved_message);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
438 end, function (rejected_message)
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
439 send_result(nil, rejected_message);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
440 end);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
441 else
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
442 send_result(taskok, message);
11949
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11946
diff changeset
443 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
444 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
445
10859
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10856
diff changeset
446 module:hook("admin/repl-input", function (event)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447 local ok, err = pcall(handle_line, event);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
448 if not ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
449 event.origin.send(st.stanza("repl-result", { type = "error" }):text(err));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
450 end
12887
68df46926c26 mod_admin_socket: Return error on unhandled input to prevent apparent freeze
Kim Alvefur <zash@zash.se>
parents: 12788
diff changeset
451 return true;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
452 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
453
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
454 local function describe_command(s, hidden)
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
455 local section, name, args, desc = s:match("^([%w_]+):([%w_]+)%(([^)]*)%) %- (.+)$");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
456 if not section then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
457 error("Failed to parse command description: "..s);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
458 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
459 local command_help = getmetatable(def_env[section]).help.commands;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
460 command_help[name] = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
461 desc = desc;
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
462 args = array.collect(args:gmatch("[%w_]+")):map(function (arg_name)
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
463 return { name = arg_name };
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
464 end);
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
465 hidden = hidden;
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
466 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
467 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
468
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
469 local function hidden_command(s)
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
470 return describe_command(s, true);
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
471 end
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
472
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
473 -- Console commands --
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
474 -- These are simple commands, not valid standalone in Lua
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
476 -- Help about individual topics is handled by def_env.help
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
477 function commands.help(session, data)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
478 local print = session.print;
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
479
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
480 local topic = data:match("^help (%w+)");
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
481 if topic then
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
482 return def_env.help[topic]({ session = session });
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
483 end
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
484
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
485 print [[Commands are divided into multiple sections. For help on a particular section, ]]
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
486 print [[type: help SECTION (for example, 'help c2s'). Sections are: ]]
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
487 print [[]]
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
488 local row = format_table({ { title = "Section", width = 7 }, { title = "Description", width = "100%" } }, session.width)
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
489 print(row())
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
490 for section_name, section in it.sorted_pairs(def_env) do
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
491 local section_mt = getmetatable(section);
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
492 local section_help = section_mt and section_mt.help;
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
493 print(row { section_name; section_help and section_help.desc or "" });
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
494 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
495
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
496 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
497
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
498 print [[In addition to info about commands, the following general topics are available:]]
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
499
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
500 print("");
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
501 for topic_name, topic_info in it.sorted_pairs(help_topics) do
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
502 print(topic_name .. " - "..topic_info.desc);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
503 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
504 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
505
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 -- Session environment --
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507 -- Anything in def_env will be accessible within the session as a global variable
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
509 --luacheck: ignore 212/self
13132
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
510 local serialize_defaults = module:get_option("console_prettyprint_settings", {
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
511 preset = "pretty";
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
512 maxdepth = 2;
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
513 table_iterator = "pairs";
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
514 })
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
515
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
516 def_env.output = new_section("Configure admin console output");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
517 function def_env.output:configure(opts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
518 if type(opts) ~= "table" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
519 opts = { preset = opts };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
520 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
521 if not opts.fallback then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
522 -- XXX Error message passed to fallback is lost, does it matter?
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 opts.fallback = tostring;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
524 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
525 for k,v in pairs(serialize_defaults) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
526 if opts[k] == nil then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 opts[k] = v;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
528 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
529 end
11891
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
530 if opts.table_iterator == "pairs" then
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
531 opts.table_iterator = pairs;
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
532 elseif type(opts.table_iterator) ~= "function" then
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
533 opts.table_iterator = nil; -- rawpairs is the default
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
534 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
535 self.session.serialize = serialization.new(opts);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
536 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
537
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
538 def_env.help = setmetatable({}, {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
539 help = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
540 desc = "Show this help about available commands";
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
541 commands = {};
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
542 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
543 __index = function (_, section_name)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
544 return function (self)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
545 local print = self.session.print;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
546 local section_mt = getmetatable(def_env[section_name]);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
547 local section_help = section_mt and section_mt.help;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
548
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
549 local c = 0;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
550
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
551 if section_help then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
552 print("Help: "..section_name);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
553 if section_help.desc then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
554 print(section_help.desc);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
555 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
556 print(("-"):rep(#(section_help.desc or section_name)));
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
557 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
558
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
559 if section_help.content then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
560 print(section_help.content);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
561 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
562 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
563
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
564 for command, command_help in it.sorted_pairs(section_help.commands or {}) do
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
565 if not command_help.hidden then
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
566 c = c + 1;
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
567 local desc = command_help.desc or command_help.module and ("Provided by mod_"..command_help.module) or "";
13737
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
568 if self.session.repl then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
569 local args = array.pluck(command_help.args, "name"):concat(", ");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
570 print(("%s:%s(%s) - %s"):format(section_name, command, args, desc));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
571 else
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
572 local args = array.pluck(command_help.args, "name"):concat("> <");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
573 if args ~= "" then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
574 args = "<"..args..">";
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
575 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
576 print(("%s %s %s"):format(section_name, command, args));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
577 print((" %s"):format(desc));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
578 if command_help.flags then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
579 local flags = command_help.flags;
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
580 print("");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
581 print((" Flags:"));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
582
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
583 if flags.kv_params then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
584 for name in it.sorted_pairs(flags.kv_params) do
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
585 print(" --"..name:gsub("_", "-"));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
586 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
587 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
588
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
589 if flags.value_params then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
590 for name in it.sorted_pairs(flags.value_params) do
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
591 print(" --"..name:gsub("_", "-").." <"..name..">");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
592 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
593 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
594
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
595 if flags.array_params then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
596 for name in it.sorted_pairs(flags.array_params) do
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
597 print(" --"..name:gsub("_", "-").." <"..name..">, ...");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
598 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
599 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
600
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
601 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
602 print("");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
603 end
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
604 end
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
605 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
606 elseif help_topics[section_name] then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
607 local topic = help_topics[section_name];
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
608 if type(topic.content) == "function" then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
609 topic.content(self, print);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
610 else
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
611 print(topic.content);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
612 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
613 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
614 return true, "Showing help topic '"..section_name.."'";
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
615 else
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
616 print("Unknown topic: "..section_name);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
617 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
618 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
619 return true, ("%d command(s) listed"):format(c);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
620 end;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
621 end;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
622 });
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
623
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
624 def_env.server = new_section("Uptime, version, shutting down, etc.");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
625
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
626 function def_env.server:insane_reload()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
627 prosody.unlock_globals();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 dofile "prosody"
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
629 prosody = _G.prosody;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
630 return true, "Server reloaded";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
631 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
632
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
633 describe_command [[server:version() - Show the server's version number]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634 function def_env.server:version()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
635 return true, tostring(prosody.version or "unknown");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
636 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
637
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
638 describe_command [[server:uptime() - Show how long the server has been running]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639 function def_env.server:uptime()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
640 local t = os.time()-prosody.start_time;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
641 local seconds = t%60;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
642 t = (t - seconds)/60;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
643 local minutes = t%60;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
644 t = (t - minutes)/60;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
645 local hours = t%24;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
646 t = (t - hours)/24;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
647 local days = t;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
648 return true, string.format("This server has been running for %d day%s, %d hour%s and %d minute%s (since %s)",
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
649 days, (days ~= 1 and "s") or "", hours, (hours ~= 1 and "s") or "",
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
650 minutes, (minutes ~= 1 and "s") or "", os.date("%c", prosody.start_time));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
651 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
652
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
653 describe_command [[server:shutdown(reason) - Shut down the server, with an optional reason to be broadcast to all connections]]
11831
94cd363116a3 mod_admin_shell: Allow passing an exit code to server:shutdown()
Kim Alvefur <zash@zash.se>
parents: 11736
diff changeset
654 function def_env.server:shutdown(reason, code)
94cd363116a3 mod_admin_shell: Allow passing an exit code to server:shutdown()
Kim Alvefur <zash@zash.se>
parents: 11736
diff changeset
655 prosody.shutdown(reason, code);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
656 return true, "Shutdown initiated";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
657 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
658
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
659 local function human(kb)
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
660 return format_number(kb*1024, "B", "b");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
661 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
662
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
663 describe_command [[server:memory() - Show details about the server's memory usage]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
664 function def_env.server:memory()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
665 if not has_pposix or not pposix.meminfo then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
666 return true, "Lua is using "..human(collectgarbage("count"));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
667 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
668 local mem, lua_mem = pposix.meminfo(), collectgarbage("count");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
669 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
670 print("Process: "..human((mem.allocated+mem.allocated_mmap)/1024));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
671 print(" Used: "..human(mem.used/1024).." ("..human(lua_mem).." by Lua)");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
672 print(" Free: "..human(mem.unused/1024).." ("..human(mem.returnable/1024).." returnable)");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
673 return true, "OK";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
674 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
675
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
676 def_env.module = new_section("Commands to load/reload/unload modules/plugins");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
678 local function get_hosts_set(hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
679 if type(hosts) == "table" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680 if hosts[1] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
681 return set.new(hosts);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
682 elseif hosts._items then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
683 return hosts;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
684 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
685 elseif type(hosts) == "string" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
686 return set.new { hosts };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
687 elseif hosts == nil then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
688 return set.new(array.collect(keys(prosody.hosts)));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
689 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
690 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
691
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
692 -- Hosts with a module or all virtualhosts if no module given
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693 -- matching modules_enabled in the global section
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 local function get_hosts_with_module(hosts, module)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
695 local hosts_set = get_hosts_set(hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
696 / function (host)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
697 if module then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
698 -- Module given, filter in hosts with this module loaded
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
699 if modulemanager.is_loaded(host, module) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
700 return host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
701 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
702 return nil;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
703 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
705 if not hosts then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 -- No hosts given, filter in VirtualHosts
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
707 if prosody.hosts[host].type == "local" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
708 return host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
709 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
710 return nil
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
711 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
713 -- No module given, but hosts are, don't filter at all
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
714 return host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
716 if module and modulemanager.get_module("*", module) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
717 hosts_set:add("*");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
719 return hosts_set;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
720 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
721
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
722 describe_command [[module:info(module, host) - Show information about a loaded module]]
11601
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
723 function def_env.module:info(name, hosts)
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
724 if not name then
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
725 return nil, "module name expected";
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
726 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
727 local print = self.session.print;
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
728 hosts = get_hosts_with_module(hosts, name);
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
729 if hosts:empty() then
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
730 return false, "mod_" .. name .. " does not appear to be loaded on the specified hosts";
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
731 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
732
11932
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
733 local function item_name(item) return item.name; end
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
734
12540
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
735 local function task_timefmt(t)
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
736 if not t then
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
737 return "no last run time"
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
738 elseif os.difftime(os.time(), t) < 86400 then
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
739 return os.date("last run today at %H:%M", t);
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
740 else
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
741 return os.date("last run %A at %H:%M", t);
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
742 end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
743 end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
744
11606
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
745 local friendly_descriptions = {
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
746 ["adhoc-provider"] = "Ad-hoc commands",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
747 ["auth-provider"] = "Authentication provider",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
748 ["http-provider"] = "HTTP services",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
749 ["net-provider"] = "Network service",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
750 ["storage-provider"] = "Storage driver",
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
751 ["measure"] = "Legacy metrics",
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
752 ["metric"] = "Metrics",
11991
bef2a59b00d1 mod_admin_shell: List periodic tasks in module:info
Kim Alvefur <zash@zash.se>
parents: 11954
diff changeset
753 ["task"] = "Periodic task",
11606
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
754 };
11607
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
755 local item_formatters = {
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
756 ["feature"] = tostring,
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
757 ["identity"] = function(ident) return ident.type .. "/" .. ident.category; end,
11932
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
758 ["adhoc-provider"] = item_name,
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
759 ["auth-provider"] = item_name,
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
760 ["storage-provider"] = item_name,
11943
cf47834d3698 mod_admin_shell: Fix showing default HTTP path in module:info
Kim Alvefur <zash@zash.se>
parents: 11932
diff changeset
761 ["http-provider"] = function(item, mod) return mod:http_url(item.name, item.default_path); end,
12538
0f56587bb37f mod_admin_shell: Drop unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 12537
diff changeset
762 ["net-provider"] = function(item)
12537
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
763 local service_name = item.name;
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
764 local ports_list = {};
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
765 for _, interface, port in portmanager.get_active_services():iter(service_name, nil, nil) do
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
766 table.insert(ports_list, "["..interface.."]:"..port);
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
767 end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
768 if not ports_list[1] then
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
769 return service_name..": not listening on any ports";
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
770 end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
771 return service_name..": "..table.concat(ports_list, ", ");
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
772 end,
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
773 ["measure"] = function(item) return item.name .. " (" .. suf(item.conf and item.conf.unit, " ") .. item.type .. ")"; end,
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
774 ["metric"] = function(item)
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
775 return ("%s (%s%s)%s"):format(item.name, suf(item.mf.unit, " "), item.mf.type_, pre(": ", item.mf.description));
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
776 end,
12540
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
777 ["task"] = function (item) return string.format("%s (%s, %s)", item.name or item.id, item.when, task_timefmt(item.last)); end
11607
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
778 };
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
779
11601
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
780 for host in hosts do
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
781 local mod = modulemanager.get_module(host, name);
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
782 if mod.module.host == "*" then
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
783 print("in global context");
11604
7466bf65d7c8 mod_admin_shell: module:info: Use existing host string representation
Kim Alvefur <zash@zash.se>
parents: 11603
diff changeset
784 else
7466bf65d7c8 mod_admin_shell: module:info: Use existing host string representation
Kim Alvefur <zash@zash.se>
parents: 11603
diff changeset
785 print("on " .. tostring(prosody.hosts[mod.module.host]));
11601
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
786 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
787 print(" path: " .. (mod.module.path or "n/a"));
11602
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11601
diff changeset
788 if mod.module.status_message then
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11601
diff changeset
789 print(" status: [" .. mod.module.status_type .. "] " .. mod.module.status_message);
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11601
diff changeset
790 end
11605
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
791 if mod.module.items and next(mod.module.items) ~= nil then
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
792 print(" provides:");
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
793 for kind, items in pairs(mod.module.items) do
11606
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
794 local label = friendly_descriptions[kind] or kind:gsub("%-", " "):gsub("^%a", string.upper);
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
795 print(string.format(" - %s (%d item%s)", label, #items, #items > 1 and "s" or ""));
11607
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
796 local formatter = item_formatters[kind];
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
797 if formatter then
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
798 for _, item in ipairs(items) do
11850
bfa85965106e mod_admin_shell: Show HTTP base-URLs in module:info()
Kim Alvefur <zash@zash.se>
parents: 11831
diff changeset
799 print(" - " .. formatter(item, mod.module));
11607
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
800 end
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
801 end
11605
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
802 end
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
803 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
804 if mod.module.dependencies and next(mod.module.dependencies) ~= nil then
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
805 print(" dependencies:");
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
806 for dep in pairs(mod.module.dependencies) do
12927
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
807 -- Dependencies are per module instance, not per host, so dependencies
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
808 -- of/on global modules may list modules not actually loaded on the
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
809 -- current host.
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
810 if modulemanager.is_loaded(host, dep) then
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
811 print(" - mod_" .. dep);
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
812 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
813 end
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
814 end
12922
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12908
diff changeset
815 if mod.module.reverse_dependencies and next(mod.module.reverse_dependencies) ~= nil then
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12908
diff changeset
816 print(" reverse dependencies:");
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12908
diff changeset
817 for dep in pairs(mod.module.reverse_dependencies) do
12927
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
818 if modulemanager.is_loaded(host, dep) then
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
819 print(" - mod_" .. dep);
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
820 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
821 end
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
822 end
11601
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
823 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
824 return true;
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
825 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
826
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
827 describe_command [[module:load(module, host) - Load the specified module on the specified host (or all hosts if none given)]]
12603
05ca75309fa0 mod_admin_shell: Remove obsolete module:load() argument from 0.8 time
Kim Alvefur <zash@zash.se>
parents: 12589
diff changeset
828 function def_env.module:load(name, hosts)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
829 hosts = get_hosts_with_module(hosts);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
830
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
831 local already_loaded = set.new();
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
832 -- Load the module for each host
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
833 local ok, err, count, mod = true, nil, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
834 for host in hosts do
13128
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
835 local configured_modules, component = modulemanager.get_modules_for_host(host);
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
836
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
837 if (not modulemanager.is_loaded(host, name)) then
12603
05ca75309fa0 mod_admin_shell: Remove obsolete module:load() argument from 0.8 time
Kim Alvefur <zash@zash.se>
parents: 12589
diff changeset
838 mod, err = modulemanager.load(host, name);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
839 if not mod then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
840 ok = false;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
841 if err == "global-module-already-loaded" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
842 if count > 0 then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
843 ok, err, count = true, nil, 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
844 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
845 break;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
846 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
847 self.session.print(err or "Unknown error loading module");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
848 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
849 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
850 self.session.print("Loaded for "..mod.module.host);
13128
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
851
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
852 if not (configured_modules:contains(name) or name == component) then
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
853 self.session.print("Note: Module will not be loaded after restart unless enabled in configuration");
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
854 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
855 end
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
856 else
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
857 already_loaded:add(host);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
858 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
859 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
860
13561
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
861 if not ok then
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
862 return ok, "Last error: "..tostring(err);
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
863 end
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
864 if already_loaded == hosts then
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
865 return ok, "Module already loaded";
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
866 end
13561
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
867 return ok, "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
868 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
869
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
870 describe_command [[module:unload(module, host) - The same, but just unloads the module from memory]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
871 function def_env.module:unload(name, hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
872 hosts = get_hosts_with_module(hosts, name);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
873
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
874 -- Unload the module for each host
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
875 local ok, err, count = true, nil, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
876 for host in hosts do
13128
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
877 local configured_modules, component = modulemanager.get_modules_for_host(host);
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
878
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
879 if modulemanager.is_loaded(host, name) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
880 ok, err = modulemanager.unload(host, name);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
881 if not ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
882 ok = false;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
883 self.session.print(err or "Unknown error unloading module");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
884 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
885 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
886 self.session.print("Unloaded from "..host);
13128
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
887
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
888 if configured_modules:contains(name) or name == component then
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
889 self.session.print("Note: Module will be loaded after restart unless disabled in configuration");
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
890 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
891 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
892 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
893 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
894 return ok, (ok and "Module unloaded from "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
895 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
896
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
897 local function _sort_hosts(a, b)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898 if a == "*" then return true
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
899 elseif b == "*" then return false
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
900 else return a:gsub("[^.]+", string.reverse):reverse() < b:gsub("[^.]+", string.reverse):reverse(); end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
901 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
902
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
903 describe_command [[module:reload(module, host) - The same, but unloads and loads the module (saving state if the module supports it)]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
904 function def_env.module:reload(name, hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
905 hosts = array.collect(get_hosts_with_module(hosts, name)):sort(_sort_hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
906
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
907 -- Reload the module for each host
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
908 local ok, err, count = true, nil, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
909 for _, host in ipairs(hosts) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
910 if modulemanager.is_loaded(host, name) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
911 ok, err = modulemanager.reload(host, name);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
912 if not ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
913 ok = false;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
914 self.session.print(err or "Unknown error reloading module");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
915 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
916 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
917 if ok == nil then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 ok = true;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
919 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
920 self.session.print("Reloaded on "..host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
921 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
922 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
923 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
924 return ok, (ok and "Module reloaded on "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
925 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
926
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
927 describe_command [[module:list(host) - List the modules loaded on the specified host]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
928 function def_env.module:list(hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
929 hosts = array.collect(set.new({ not hosts and "*" or nil }) + get_hosts_set(hosts)):sort(_sort_hosts);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
930
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
931 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
932 for _, host in ipairs(hosts) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
933 print((host == "*" and "Global" or host)..":");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
934 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
935 if #modules == 0 then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
936 if prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
937 print(" No modules loaded");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
938 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
939 print(" Host not found");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
940 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
942 for _, name in ipairs(modules) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 local status, status_text = modulemanager.get_module(host, name).module:get_status();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 local status_summary = "";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
945 if status == "warn" or status == "error" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
946 status_summary = (" (%s: %s)"):format(status, status_text);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
947 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
948 print((" %s%s"):format(name, status_summary));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
949 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
950 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
951 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
952 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
953
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
954 def_env.config = new_section("Reloading the configuration, etc.");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
955
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
956 function def_env.config:load(filename, format)
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
957 local config_load = require "prosody.core.configmanager".load;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
958 local ok, err = config_load(filename, format);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
959 if not ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
960 return false, err or "Unknown error loading config";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
961 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
962 return true, "Config loaded";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
963 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
964
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
965 describe_command [[config:get([host,] option) - Show the value of a config option.]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
966 function def_env.config:get(host, key)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
967 if key == nil then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
968 host, key = "*", host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
969 end
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
970 local config_get = require "prosody.core.configmanager".get
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
971 return true, serialize_config(config_get(host, key));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
972 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
973
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
974 describe_command [[config:set([host,] option, value) - Update the value of a config option without writing to the config file.]]
13062
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
975 function def_env.config:set(host, key, value)
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
976 if host ~= "*" and not prosody.hosts[host] then
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
977 host, key, value = "*", host, key;
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
978 end
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
979 return require "prosody.core.configmanager".set(host, key, value);
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
980 end
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
981
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
982 describe_command [[config:reload() - Reload the server configuration. Modules may need to be reloaded for changes to take effect.]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
983 function def_env.config:reload()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
984 local ok, err = prosody.reload_config();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
985 return ok, (ok and "Config reloaded (you may need to reload modules to take effect)") or tostring(err);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
986 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
987
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
988 def_env.c2s = new_section("Commands to manage local client-to-server sessions");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
989
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
990 local function get_jid(session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
991 if session.username then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
992 return session.full_jid or jid_join(session.username, session.host, session.resource);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
993 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
994
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
995 local conn = session.conn;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
996 local ip = session.ip or "?";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
997 local clientport = conn and conn:clientport() or "?";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
998 local serverip = conn and conn.server and conn:server():ip() or "?";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
999 local serverport = conn and conn:serverport() or "?"
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1000 return jid_join("["..ip.."]:"..clientport, session.host or "["..serverip.."]:"..serverport);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1001 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1002
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1003 local function get_c2s()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1004 local c2s = array.collect(values(prosody.full_sessions));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1005 c2s:append(array.collect(values(module:shared"/*/c2s/sessions")));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1006 c2s:append(array.collect(values(module:shared"/*/bosh/sessions")));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1007 c2s:unique();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1008 return c2s;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1009 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1010
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1011 local function _sort_by_jid(a, b)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1012 if a.host == b.host then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1013 if a.username == b.username then return (a.resource or "") > (b.resource or ""); end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1014 return (a.username or "") > (b.username or "");
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1015 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1016 return _sort_hosts(a.host or "", b.host or "");
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1017 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1018
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1019 local function show_c2s(callback)
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1020 get_c2s():sort(_sort_by_jid):map(function (session)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1021 callback(get_jid(session), session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1022 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1023 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1024
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1025 describe_command [[c2s:count() - Count sessions without listing them]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1026 function def_env.c2s:count()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1027 local c2s = get_c2s();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1028 return true, "Total: ".. #c2s .." clients";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1029 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1030
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1031 local function get_s2s_hosts(session) --> local,remote
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1032 if session.direction == "outgoing" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1033 return session.host or session.from_host, session.to_host;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1034 elseif session.direction == "incoming" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1035 return session.host or session.to_host, session.from_host;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1036 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1037 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1038
12224
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12209
diff changeset
1039 available_columns = {
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1040 jid = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1041 title = "JID";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1042 description = "Full JID of user session";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1043 width = "3p";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1044 key = "full_jid";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1045 mapper = function(full_jid, session) return full_jid or get_jid(session) end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1046 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1047 host = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1048 title = "Host";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1049 description = "Local hostname";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1050 key = "host";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1051 width = "1p";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1052 mapper = function(host, session)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1053 return host or get_s2s_hosts(session) or "?";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1054 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1055 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1056 remote = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1057 title = "Remote";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1058 description = "Remote hostname";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1059 width = "1p";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1060 mapper = function(_, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1061 return select(2, get_s2s_hosts(session));
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1062 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1063 };
12023
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1064 port = {
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1065 title = "Port";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1066 description = "Server port used";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1067 width = #string.format("%d", 0xffff); -- max 16 bit unsigned integer
12023
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1068 align = "right";
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1069 key = "conn";
12787
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1070 mapper = function(conn)
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1071 if conn then
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1072 return conn:serverport();
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1073 end
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1074 end;
12023
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1075 };
13473
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1076 created = {
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1077 title = "Connection Created";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1078 description = "Time when connection was created";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1079 width = #"YYYY MM DD HH:MM:SS";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1080 align = "right";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1081 key = "conn";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1082 mapper = function(conn)
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1083 if conn then
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1084 return os.date("%F %T", math.floor(conn.created));
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1085 end
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1086 end;
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1087 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1088 dir = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1089 title = "Dir";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1090 description = "Direction of server-to-server connection";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1091 width = #"<->";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1092 key = "direction";
11888
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11887
diff changeset
1093 mapper = function(dir, session)
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11887
diff changeset
1094 if session.incoming and session.outgoing then return "<->"; end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1095 if dir == "outgoing" then return "-->"; end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1096 if dir == "incoming" then return "<--"; end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1097 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1098 };
13036
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1099 id = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1100 title = "Session ID";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1101 description = "Internal session ID used in logging";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1102 -- Depends on log16(?) of pointers which may vary over runtime, so + some margin
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1103 width = math.max(#"c2s", #"s2sin", #"s2sout") + #(tostring({}):match("%x+$")) + 2;
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1104 key = "id";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1105 };
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1106 type = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1107 title = "Type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1108 description = "Session type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1109 width = math.max(#"c2s_unauthed", #"s2sout_unauthed");
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1110 key = "type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1111 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1112 method = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1113 title = "Method";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1114 description = "Connection method";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1115 width = math.max(#"BOSH", #"WebSocket", #"TCP");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1116 mapper = function(_, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1117 if session.bosh_version then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1118 return "BOSH";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1119 elseif session.websocket_request then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1120 return "WebSocket";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1121 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1122 return "TCP";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1123 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1124 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1125 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1126 ipv = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1127 title = "IPv";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1128 description = "Internet Protocol version (4 or 6)";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1129 width = #"IPvX";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1130 key = "ip";
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1131 mapper = function(ip) if ip then return ip:find(":") and "IPv6" or "IPv4"; end end;
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1132 };
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1133 ip = {
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1134 title = "IP address";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1135 description = "IP address the session connected from";
13043
d4f7118d1531 mod_admin_shell: Make IP column thinner if IPv6 is disabled
Kim Alvefur <zash@zash.se>
parents: 13042
diff changeset
1136 width = module:get_option_boolean("use_ipv6", true) and #"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" or #"198.051.100.255";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1137 key = "ip";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1138 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1139 status = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1140 title = "Status";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1141 description = "Presence status";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1142 width = math.max(#"online", #"chat");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1143 key = "presence";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1144 mapper = function(p)
11946
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11945
diff changeset
1145 if not p then return ""; end
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11945
diff changeset
1146 return p:get_child_text("show") or "online";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1147 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1148 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1149 secure = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1150 title = "Security";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1151 description = "TLS version or security status";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1152 key = "conn";
13041
61b00bd20074 mod_admin_shell: Fix attempt to compare number with string
Kim Alvefur <zash@zash.se>
parents: 13037
diff changeset
1153 width = math.max(#"secure", #"TLSvX.Y");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1154 mapper = function(conn, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1155 if not session.secure then return "insecure"; end
11905
bbfa707a4756 mod_admin_shell: Handle absence of connection in security column (thanks arcseconds)
Kim Alvefur <zash@zash.se>
parents: 11892
diff changeset
1156 if not conn or not conn:ssl() then return "secure" end
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12464
diff changeset
1157 local tls_info = conn.ssl_info and conn:ssl_info();
11945
142b9c4010fe mod_admin_shell: Reduce width of 'Security' column (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 11943
diff changeset
1158 return tls_info and tls_info.protocol or "secure";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1159 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1160 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1161 encryption = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1162 title = "Encryption";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1163 description = "Encryption algorithm used (TLS cipher suite)";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1164 -- openssl ciphers 'ALL:COMPLEMENTOFALL' | tr : \\n | awk 'BEGIN {n=1} length() > n {n=length()} END {print(n)}'
13036
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1165 width = #"ECDHE-ECDSA-CHACHA20-POLY1305";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1166 key = "conn";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1167 mapper = function(conn)
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12464
diff changeset
1168 local info = conn and conn.ssl_info and conn:ssl_info();
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1169 if info then return info.cipher end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1170 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1171 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1172 cert = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1173 title = "Certificate";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1174 description = "Validation status of certificate";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1175 key = "cert_identity_status";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1176 width = math.max(#"Expired", #"Self-signed", #"Untrusted", #"Mismatched", #"Unknown");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1177 mapper = function(cert_status, session)
13089
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1178 if cert_status == "invalid" then
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1179 -- non-nil cert_identity_status implies valid chain, which covers just
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1180 -- about every error condition except mismatched certificate names
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1181 return "Mismatched";
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1182 elseif cert_status then
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1183 -- basically only "valid"
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1184 return capitalize(cert_status);
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1185 end
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1186 -- no certificate status,
13517
4bf889e94831 mod_admin_shell: Prevent traceback due to type error
Kim Alvefur <zash@zash.se>
parents: 13489
diff changeset
1187 if type(session.cert_chain_errors) == "table" then
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1188 local cert_errors = set.new(session.cert_chain_errors[1]);
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1189 if cert_errors:contains("certificate has expired") then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1190 return "Expired";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1191 elseif cert_errors:contains("self signed certificate") then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1192 return "Self-signed";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1193 end
13089
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1194 -- Some other cert issue, or something up the chain
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1195 -- TODO borrow more logic from mod_s2s/friendly_cert_error()
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1196 return "Untrusted";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1197 end
13517
4bf889e94831 mod_admin_shell: Prevent traceback due to type error
Kim Alvefur <zash@zash.se>
parents: 13489
diff changeset
1198 -- TODO cert_chain_errors can be a string, handle that
12293
145cb8305c67 mod_admin_shell: Squeeze some characters out of the Certificate column
Kim Alvefur <zash@zash.se>
parents: 12291
diff changeset
1199 return "Unknown";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1200 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1201 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1202 sni = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1203 title = "SNI";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1204 description = "Hostname requested in TLS";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1205 width = "1p"; -- same as host, remote etc
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1206 mapper = function(_, session)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1207 if not session.conn then return end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1208 local sock = session.conn:socket();
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1209 return sock and sock.getsniname and sock:getsniname() or "";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1210 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1211 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1212 alpn = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1213 title = "ALPN";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1214 description = "Protocol requested in TLS";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1215 width = math.max(#"http/1.1", #"xmpp-client", #"xmpp-server");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1216 mapper = function(_, session)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1217 if not session.conn then return end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1218 local sock = session.conn:socket();
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1219 return sock and sock.getalpn and sock:getalpn() or "";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1220 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1221 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1222 smacks = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1223 title = "SM";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1224 description = "Stream Management (XEP-0198) status";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1225 key = "smacks";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1226 -- FIXME shorter synonym for hibernating
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1227 width = math.max(#"yes", #"no", #"hibernating");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1228 mapper = function(smacks_xmlns, session)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1229 if not smacks_xmlns then return "no"; end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1230 if session.hibernating then return "hibernating"; end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1231 return "yes";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1232 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1233 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1234 smacks_queue = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1235 title = "SM Queue";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1236 description = "Length of Stream Management stanza queue";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1237 key = "outgoing_stanza_queue";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1238 width = 8;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1239 align = "right";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1240 mapper = function (queue)
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
1241 return queue and tostring(queue:count_unacked());
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1242 end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1243 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1244 csi = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1245 title = "CSI State";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1246 description = "Client State Indication (XEP-0352)";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1247 key = "state";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1248 -- TODO include counter
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1249 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1250 s2s_sasl = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1251 title = "SASL";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1252 description = "Server authentication status";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1253 key = "external_auth";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1254 width = 10;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1255 mapper = capitalize
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1256 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1257 dialback = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1258 title = "Dialback";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1259 description = "Legacy server verification";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1260 key = "dialback_key";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1261 width = math.max(#"Not used", #"Not initiated", #"Initiated", #"Completed");
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1262 mapper = function (dialback_key, session)
11892
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
1263 if not dialback_key then
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1264 if session.type == "s2sin" or session.type == "s2sout" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1265 return "Not used";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1266 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1267 return "Not initiated";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1268 elseif session.type == "s2sin_unauthed" or session.type == "s2sout_unauthed" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1269 return "Initiated";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1270 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1271 return "Completed";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1272 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1273 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1274 };
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1275 role = {
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1276 title = "Role";
13034
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13013
diff changeset
1277 description = "Session role with 'prosody:' prefix removed";
13287
1e2d65403867 mod_admin_shell: Make 'Role' column dynamically sized
Kim Alvefur <zash@zash.se>
parents: 13170
diff changeset
1278 width = "1p";
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1279 key = "role";
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1280 mapper = function(role)
13034
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13013
diff changeset
1281 local name = role and role.name;
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13013
diff changeset
1282 return name and name:match"^prosody:(%w+)" or name;
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1283 end;
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1284 }
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1285 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1286
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1287 local function get_colspec(colspec, default)
11887
b043e1bb8e8e mod_admin_shell: Allow passing columns as a string for convenience
Kim Alvefur <zash@zash.se>
parents: 11886
diff changeset
1288 if type(colspec) == "string" then colspec = array(colspec:gmatch("%S+")); end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1289 local columns = {};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1290 for i, col in pairs(colspec or default) do
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1291 if type(col) == "string" then
13042
0f05804e974d mod_admin_shell: Make default column width 1 part
Kim Alvefur <zash@zash.se>
parents: 13041
diff changeset
1292 columns[i] = available_columns[col] or { title = capitalize(col); width = "1p"; key = col };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1293 elseif type(col) ~= "table" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1294 return false, ("argument %d: expected string|table but got %s"):format(i, type(col));
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1295 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1296 columns[i] = col;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1297 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1298 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1299
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1300 return columns;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1301 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1302
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1303 describe_command [[c2s:show(jid, columns) - Show all client sessions with the specified JID (or all if no JID given)]]
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1304 function def_env.c2s:show(match_jid, colspec)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1305 local print = self.session.print;
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1306 local columns = get_colspec(colspec, { "id"; "jid"; "role"; "ipv"; "status"; "secure"; "smacks"; "csi" });
12529
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
1307 local row = format_table(columns, self.session.width);
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1308
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1309 local function match(session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1310 local jid = get_jid(session)
13053
8128c4f1b08b mod_admin_shell: Allow "*" as substitute for 'nil' for easier CLI usage
Kim Alvefur <zash@zash.se>
parents: 13043
diff changeset
1311 return (not match_jid) or match_jid == "*" or jid_compare(jid, match_jid);
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1312 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1313
11886
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1314 local group_by_host = true;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1315 for _, col in ipairs(columns) do
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1316 if col.key == "full_jid" or col.key == "host" then
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1317 group_by_host = false;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1318 break
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1319 end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1320 end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1321
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1322 if not group_by_host then print(row()); end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1323 local currenthost = nil;
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1324
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1325 local c2s_sessions = get_c2s();
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1326 local total_count = #c2s_sessions;
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1327 c2s_sessions:filter(match):sort(_sort_by_jid);
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1328 local shown_count = #c2s_sessions;
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1329 for _, session in ipairs(c2s_sessions) do
11886
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1330 if group_by_host and session.host ~= currenthost then
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1331 currenthost = session.host;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1332 print("#",prosody.hosts[currenthost] or "Unknown host");
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1333 print(row());
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1334 end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1335
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1336 print(row(session));
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1337 end
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1338 if total_count ~= shown_count then
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1339 return true, ("%d out of %d c2s sessions shown"):format(shown_count, total_count);
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1340 end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1341 return true, ("%d c2s sessions shown"):format(total_count);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1342 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1343
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1344 describe_command [[c2s:show_tls(jid) - Show TLS cipher info for encrypted sessions]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1345 function def_env.c2s:show_tls(match_jid)
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1346 return self:show(match_jid, { "jid"; "id"; "secure"; "encryption" });
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1347 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1348
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1349 local function build_reason(text, condition)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1350 if text or condition then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1351 return {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1352 text = text,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1353 condition = condition or "undefined-condition",
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1354 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1355 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1356 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1357
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1358 describe_command [[c2s:close(jid) - Close all sessions for the specified JID]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1359 function def_env.c2s:close(match_jid, text, condition)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1360 local count = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1361 show_c2s(function (jid, session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1362 if jid == match_jid or jid_bare(jid) == match_jid then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1363 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1364 session:close(build_reason(text, condition));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1365 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1366 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1367 return true, "Total: "..count.." sessions closed";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1368 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1369
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1370 describe_command [[c2s:closeall() - Close all active c2s connections ]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1371 function def_env.c2s:closeall(text, condition)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1372 local count = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1373 --luacheck: ignore 212/jid
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1374 show_c2s(function (jid, session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1375 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1376 session:close(build_reason(text, condition));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1377 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1378 return true, "Total: "..count.." sessions closed";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1379 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1380
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1381
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1382 def_env.s2s = new_section("Commands to manage sessions between this server and others");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1383
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1384 local function _sort_s2s(a, b)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1385 local a_local, a_remote = get_s2s_hosts(a);
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1386 local b_local, b_remote = get_s2s_hosts(b);
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1387 if (a_local or "") == (b_local or "") then return _sort_hosts(a_remote or "", b_remote or ""); end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1388 return _sort_hosts(a_local or "", b_local or "");
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1389 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1390
13071
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1391 local function match_wildcard(match_jid, jid)
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1392 -- host == host or (host) == *.(host) or sub(.host) == *(.host)
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1393 return jid == match_jid or jid == match_jid:sub(3) or jid:sub(-#match_jid + 1) == match_jid:sub(2);
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1394 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1395
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1396 local function match_s2s_jid(session, match_jid)
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1397 local host, remote = get_s2s_hosts(session);
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1398 if not match_jid or match_jid == "*" then
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1399 return true;
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1400 elseif host == match_jid or remote == match_jid then
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1401 return true;
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1402 elseif match_jid:sub(1, 2) == "*." then
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1403 return match_wildcard(match_jid, host) or match_wildcard(match_jid, remote);
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1404 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1405 return false;
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1406 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1407
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1408 describe_command [[s2s:show(domain, columns) - Show all s2s connections for the given domain (or all if no domain given)]]
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1409 function def_env.s2s:show(match_jid, colspec)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1410 local print = self.session.print;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1411 local columns = get_colspec(colspec, { "id"; "host"; "dir"; "remote"; "ipv"; "secure"; "s2s_sasl"; "dialback" });
12529
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
1412 local row = format_table(columns, self.session.width);
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1413
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1414 local function match(session)
13071
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1415 return match_s2s_jid(session, match_jid);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1416 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1417
11886
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1418 local group_by_host = true;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1419 local currenthost = nil;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1420 for _, col in ipairs(columns) do
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1421 if col.key == "host" then
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1422 group_by_host = false;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1423 break
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1424 end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1425 end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1426
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1427 if not group_by_host then print(row()); end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1428
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1429 local s2s_sessions = array(iterators.values(module:shared"/*/s2s/sessions"));
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1430 local total_count = #s2s_sessions;
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1431 s2s_sessions:filter(match):sort(_sort_s2s);
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1432 local shown_count = #s2s_sessions;
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1433
11886
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1434 for _, session in ipairs(s2s_sessions) do
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1435 if group_by_host and currenthost ~= get_s2s_hosts(session) then
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1436 currenthost = get_s2s_hosts(session);
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1437 print("#",prosody.hosts[currenthost] or "Unknown host");
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1438 print(row());
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1439 end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1440
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1441 print(row(session));
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1442 end
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1443 if total_count ~= shown_count then
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1444 return true, ("%d out of %d s2s connections shown"):format(shown_count, total_count);
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1445 end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1446 return true, ("%d s2s connections shown"):format(total_count);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1447 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1448
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1449 describe_command [[s2s:show_tls(domain) - Show TLS cipher info for encrypted sessions]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1450 function def_env.s2s:show_tls(match_jid)
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1451 return self:show(match_jid, { "id"; "host"; "dir"; "remote"; "secure"; "encryption"; "cert" });
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1452 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1453
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1454 local function print_subject(print, subject)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1455 for _, entry in ipairs(subject) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1456 print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1457 (" %s: %q"):format(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1458 entry.name or entry.oid,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1459 entry.value:gsub("[\r\n%z%c]", " ")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1460 )
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1461 );
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1462 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1463 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1464
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1465 -- As much as it pains me to use the 0-based depths that OpenSSL does,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1466 -- I think there's going to be more confusion among operators if we
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1467 -- break from that.
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1468 local function print_errors(print, errors)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1469 for depth, t in pairs(errors) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1470 print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1471 (" %d: %s"):format(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1472 depth-1,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1473 table.concat(t, "\n| ")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1474 )
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1475 );
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1476 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1477 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1478
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1479 function def_env.s2s:showcert(domain)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1480 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1481 local s2s_sessions = module:shared"/*/s2s/sessions";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1482 local domain_sessions = set.new(array.collect(values(s2s_sessions)))
13072
7fcf41b541e0 mod_admin_shell: Use same wildcard matching in other s2s command
Kim Alvefur <zash@zash.se>
parents: 13071
diff changeset
1483 /function(session) return match_s2s_jid(session, domain) and session or nil; end;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1484 local cert_set = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1485 for session in domain_sessions do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1486 local conn = session.conn;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1487 conn = conn and conn:socket();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1488 if not conn.getpeerchain then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1489 if conn.dohandshake then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1490 error("This version of LuaSec does not support certificate viewing");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1491 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1492 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1493 local cert = conn:getpeercertificate();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1494 if cert then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1495 local certs = conn:getpeerchain();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1496 local digest = cert:digest("sha1");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1497 if not cert_set[digest] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1498 local chain_valid, chain_errors = conn:getpeerverification();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1499 cert_set[digest] = {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1500 {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1501 from = session.from_host,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1502 to = session.to_host,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1503 direction = session.direction
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1504 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1505 chain_valid = chain_valid;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1506 chain_errors = chain_errors;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1507 certs = certs;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1508 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1509 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1510 table.insert(cert_set[digest], {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1511 from = session.from_host,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1512 to = session.to_host,
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1513 direction = session.direction
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1514 });
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1515 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1516 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1517 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1518 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1519 local domain_certs = array.collect(values(cert_set));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1520 -- Phew. We now have a array of unique certificates presented by domain.
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1521 local n_certs = #domain_certs;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1522
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1523 if n_certs == 0 then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1524 return "No certificates found for "..domain;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1525 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1526
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1527 local function _capitalize_and_colon(byte)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1528 return string.upper(byte)..":";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1529 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1530 local function pretty_fingerprint(hash)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1531 return hash:gsub("..", _capitalize_and_colon):sub(1, -2);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1532 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1533
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1534 for cert_info in values(domain_certs) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1535 local certs = cert_info.certs;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1536 local cert = certs[1];
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1537 print("---")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1538 print("Fingerprint (SHA1): "..pretty_fingerprint(cert:digest("sha1")));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1539 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1540 local n_streams = #cert_info;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1541 print("Currently used on "..n_streams.." stream"..(n_streams==1 and "" or "s")..":");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1542 for _, stream in ipairs(cert_info) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1543 if stream.direction == "incoming" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1544 print(" "..stream.to.." <- "..stream.from);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1545 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1546 print(" "..stream.from.." -> "..stream.to);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1547 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1548 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1549 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1550 local chain_valid, errors = cert_info.chain_valid, cert_info.chain_errors;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1551 local valid_identity = cert_verify_identity(domain, "xmpp-server", cert);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1552 if chain_valid then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1553 print("Trusted certificate: Yes");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1554 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1555 print("Trusted certificate: No");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1556 print_errors(print, errors);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1557 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1558 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1559 print("Issuer: ");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1560 print_subject(print, cert:issuer());
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1561 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1562 print("Valid for "..domain..": "..(valid_identity and "Yes" or "No"));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1563 print("Subject:");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1564 print_subject(print, cert:subject());
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1565 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1566 print("---");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1567 return ("Showing "..n_certs.." certificate"
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1568 ..(n_certs==1 and "" or "s")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1569 .." presented by "..domain..".");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1570 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1571
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1572 describe_command [[s2s:close(from, to) - Close a connection from one domain to another]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1573 function def_env.s2s:close(from, to, text, condition)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1574 local print, count = self.session.print, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1575 local s2s_sessions = module:shared"/*/s2s/sessions";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1576
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1577 local match_id;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1578 if from and not to then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1579 match_id, from = from, nil;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1580 elseif not to then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1581 return false, "Syntax: s2s:close('from', 'to') - Closes all s2s sessions from 'from' to 'to'";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1582 elseif from == to then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1583 return false, "Both from and to are the same... you can't do that :)";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1584 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1585
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1586 for _, session in pairs(s2s_sessions) do
13072
7fcf41b541e0 mod_admin_shell: Use same wildcard matching in other s2s command
Kim Alvefur <zash@zash.se>
parents: 13071
diff changeset
1587 local id = session.id or (session.type .. tostring(session):match("[a-f0-9]+$"));
7fcf41b541e0 mod_admin_shell: Use same wildcard matching in other s2s command
Kim Alvefur <zash@zash.se>
parents: 13071
diff changeset
1588 if (match_id and match_id == id) or ((from and match_wildcard(from, session.to_host)) or (to and match_wildcard(to, session.to_host))) then
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1589 print(("Closing connection from %s to %s [%s]"):format(session.from_host, session.to_host, id));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1590 (session.close or s2smanager.destroy_session)(session, build_reason(text, condition));
13072
7fcf41b541e0 mod_admin_shell: Use same wildcard matching in other s2s command
Kim Alvefur <zash@zash.se>
parents: 13071
diff changeset
1591 count = count + 1;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1592 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1593 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1594 return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1595 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1596
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1597 describe_command [[s2s:closeall(host) - Close all the incoming/outgoing s2s sessions to specified host]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1598 function def_env.s2s:closeall(host, text, condition)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1599 local count = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1600 local s2s_sessions = module:shared"/*/s2s/sessions";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1601 for _,session in pairs(s2s_sessions) do
13072
7fcf41b541e0 mod_admin_shell: Use same wildcard matching in other s2s command
Kim Alvefur <zash@zash.se>
parents: 13071
diff changeset
1602 if not host or host == "*" or match_s2s_jid(session, host) then
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1603 session:close(build_reason(text, condition));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1604 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1605 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1606 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1607 if count == 0 then return false, "No sessions to close.";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1608 else return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s"); end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1609 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1610
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1611 def_env.host = new_section("Commands to activate, deactivate and list virtual hosts");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1612
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1613 describe_command [[host:activate(hostname) - Activates the specified host]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1614 function def_env.host:activate(hostname, config)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1615 return hostmanager.activate(hostname, config);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1616 end
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1617
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1618 describe_command [[host:deactivate(hostname) - Disconnects all clients on this host and deactivates]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1619 function def_env.host:deactivate(hostname, reason)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1620 return hostmanager.deactivate(hostname, reason);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1621 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1622
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1623 describe_command [[host:list() - List the currently-activated hosts]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1624 function def_env.host:list()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1625 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1626 local i = 0;
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1627 local host_type;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1628 for host, host_session in iterators.sorted_pairs(prosody.hosts, _sort_hosts) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1629 i = i + 1;
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1630 host_type = host_session.type;
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1631 if host_type == "local" then
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1632 print(host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1633 else
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1634 host_type = module:context(host):get_option_string("component_module", host_type);
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1635 if host_type ~= "component" then
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1636 host_type = host_type .. " component";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1637 end
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1638 print(("%s (%s)"):format(host, host_type));
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1639 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1640 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1641 return true, i.." hosts";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1642 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1643
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1644 def_env.port = new_section("Commands to manage ports the server is listening on");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1645
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1646 describe_command [[port:list() - Lists all network ports prosody currently listens on]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1647 function def_env.port:list()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1648 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1649 local services = portmanager.get_active_services().data;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1650 local n_services, n_ports = 0, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1651 for service, interfaces in iterators.sorted_pairs(services) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1652 n_services = n_services + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1653 local ports_list = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1654 for interface, ports in pairs(interfaces) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1655 for port in pairs(ports) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1656 table.insert(ports_list, "["..interface.."]:"..port);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1657 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1658 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1659 n_ports = n_ports + #ports_list;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1660 print(service..": "..table.concat(ports_list, ", "));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1661 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1662 return true, n_services.." services listening on "..n_ports.." ports";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1663 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1664
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1665 describe_command [[port:close(port, interface) - Close a port]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1666 function def_env.port:close(close_port, close_interface)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1667 close_port = assert(tonumber(close_port), "Invalid port number");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1668 local n_closed = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1669 local services = portmanager.get_active_services().data;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1670 for service, interfaces in pairs(services) do -- luacheck: ignore 213
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1671 for interface, ports in pairs(interfaces) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1672 if not close_interface or close_interface == interface then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1673 if ports[close_port] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1674 self.session.print("Closing ["..interface.."]:"..close_port.."...");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1675 local ok, err = portmanager.close(interface, close_port)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1676 if not ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1677 self.session.print("Failed to close "..interface.." "..close_port..": "..err);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1678 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1679 n_closed = n_closed + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1680 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1681 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1682 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1683 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1684 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1685 return true, "Closed "..n_closed.." ports";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1686 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1687
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1688 def_env.muc = new_section("Commands to create, list and manage chat rooms");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1689
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1690 local console_room_mt = {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1691 __index = function (self, k) return self.room[k]; end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1692 __tostring = function (self)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1693 return "MUC room <"..self.room.jid..">";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1694 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1695 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1696
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1697 local function check_muc(jid)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1698 local room_name, host = jid_split(jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1699 if not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1700 return nil, "No such host: "..host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1701 elseif not prosody.hosts[host].modules.muc then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1702 return nil, "Host '"..host.."' is not a MUC service";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1703 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1704 return room_name, host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1705 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1706
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1707 local function get_muc(room_jid)
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1708 local room_name, host = check_muc(room_jid);
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1709 if not room_name then
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1710 return room_name, host;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1711 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1712 local room_obj = prosody.hosts[host].modules.muc.get_room_from_jid(room_jid);
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1713 if not room_obj then
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1714 return nil, "No such room: "..room_jid;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1715 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1716 return room_obj;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1717 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1718
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1719 local muc_util = module:require"muc/util";
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1720
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1721 describe_command [[muc:create(roomjid, { config }) - Create the specified MUC room with the given config]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1722 function def_env.muc:create(room_jid, config)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1723 local room_name, host = check_muc(room_jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1724 if not room_name then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1725 return room_name, host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1726 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1727 if not room_name then return nil, host end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1728 if config ~= nil and type(config) ~= "table" then return nil, "Config must be a table"; end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1729 if prosody.hosts[host].modules.muc.get_room_from_jid(room_jid) then return nil, "Room exists already" end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1730 return prosody.hosts[host].modules.muc.create_room(room_jid, config);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1731 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1732
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1733 describe_command [[muc:room(roomjid) - Reference the specified MUC room to access MUC API methods]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1734 function def_env.muc:room(room_jid)
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1735 local room_obj, err = get_muc(room_jid);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1736 if not room_obj then
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1737 return room_obj, err;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1738 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1739 return setmetatable({ room = room_obj }, console_room_mt);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1740 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1741
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1742 describe_command [[muc:list(host) - List rooms on the specified MUC component]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1743 function def_env.muc:list(host)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1744 local host_session = prosody.hosts[host];
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1745 if not host_session or not host_session.modules.muc then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1746 return nil, "Please supply the address of a local MUC component";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1747 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1748 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1749 local c = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1750 for room in host_session.modules.muc.each_room() do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1751 print(room.jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1752 c = c + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1753 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1754 return true, c.." rooms";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1755 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1756
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1757 describe_command [[muc:occupants(roomjid, filter) - List room occupants, optionally filtered on substring or role]]
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1758 function def_env.muc:occupants(room_jid, filter)
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1759 local room_obj, err = get_muc(room_jid);
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1760 if not room_obj then
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1761 return room_obj, err;
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1762 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1763
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1764 local print = self.session.print;
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1765 local row = format_table({
12869
70ee82579076 mod_admin_shell: Make Role and Affiliation columns the same width for aesthetics
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
1766 { title = "Role"; width = 12; key = "role" }; -- longest role name
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1767 { title = "JID"; width = "75%"; key = "bare_jid" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1768 { title = "Nickname"; width = "25%"; key = "nick"; mapper = jid_resource };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1769 }, self.session.width);
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1770 local occupants = array.collect(iterators.select(2, room_obj:each_occupant()));
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1771 local total = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1772 if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1773 occupants:filter(function(occupant)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1774 return occupant.role == filter or jid_resource(occupant.nick):find(filter, 1, true);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1775 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1776 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1777 local displayed = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1778 occupants:sort(function(a, b)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1779 if a.role ~= b.role then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1780 return muc_util.valid_roles[a.role] > muc_util.valid_roles[b.role];
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1781 else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1782 return a.bare_jid < b.bare_jid;
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1783 end
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1784 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1785
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1786 if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1787 return true, ("%d out of %d occupant%s listed"):format(displayed, total, total ~= 1 and "s" or "")
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1788 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1789
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1790 print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1791 for _, occupant in ipairs(occupants) do
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1792 print(row(occupant));
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1793 end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1794
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1795 if total == displayed then
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1796 return true, ("%d occupant%s listed"):format(total, total ~= 1 and "s" or "")
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1797 else
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1798 return true, ("%d out of %d occupant%s listed"):format(displayed, total, total ~= 1 and "s" or "")
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1799 end
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1800 end
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1801
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1802 describe_command [[muc:affiliations(roomjid, filter) - List affiliated members of the room, optionally filtered on substring or affiliation]]
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1803 function def_env.muc:affiliations(room_jid, filter)
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1804 local room_obj, err = get_muc(room_jid);
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1805 if not room_obj then
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1806 return room_obj, err;
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1807 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1808
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1809 local print = self.session.print;
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1810 local row = format_table({
12869
70ee82579076 mod_admin_shell: Make Role and Affiliation columns the same width for aesthetics
Kim Alvefur <zash@zash.se>
parents: 12868
diff changeset
1811 { title = "Affiliation"; width = 12 }; -- longest affiliation name
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1812 { title = "JID"; width = "75%" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1813 { title = "Nickname"; width = "25%"; key = "reserved_nickname" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1814 }, self.session.width);
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1815 local affiliated = array();
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1816 for affiliated_jid, affiliation, affiliation_data in room_obj:each_affiliation() do
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1817 affiliated:push(setmetatable({ affiliation; affiliated_jid }, { __index = affiliation_data }));
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1818 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1819
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1820 local total = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1821 if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1822 affiliated:filter(function(affiliation)
12871
885323e2a1ce mod_admin_shell: Match substring in muc:affiliations() like muc:occupants()
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
1823 return filter == affiliation[1] or affiliation[2]:find(filter, 1, true);
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1824 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1825 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1826 local displayed = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1827 local aff_ranking = muc_util.valid_affiliations;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1828 affiliated:sort(function(a, b)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1829 if a[1] ~= b[1] then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1830 return aff_ranking[a[1]] > aff_ranking[b[1]];
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1831 else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1832 return a[2] < b[2];
12868
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1833 end
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1834 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1835
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1836 if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1837 return true, ("%d out of %d affiliations%s listed"):format(displayed, total, total ~= 1 and "s" or "")
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1838 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1839
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1840 print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1841 for _, affiliation in ipairs(affiliated) do
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1842 print(row(affiliation));
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1843 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1844
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1845
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1846 if total == displayed then
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1847 return true, ("%d affiliation%s listed"):format(total, total ~= 1 and "s" or "")
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1848 else
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1849 return true, ("%d out of %d affiliation%s listed"):format(displayed, total, total ~= 1 and "s" or "")
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1850 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1851 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1852
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
1853 local um = require"prosody.core.usermanager";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1854
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1855 def_env.user = new_section("Commands to create and delete users, and change their passwords");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1856
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1857 describe_command [[user:create(jid, password, role) - Create the specified user account]]
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1858 function def_env.user:create(jid, password, role)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1859 local username, host = jid_split(jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1860 if not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1861 return nil, "No such host: "..host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1862 elseif um.user_exists(username, host) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1863 return nil, "User exists";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1864 end
12672
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12670
diff changeset
1865
13170
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 13132
diff changeset
1866 if not role then
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 13132
diff changeset
1867 role = module:get_option_string("default_provisioned_role", "prosody:member");
12672
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12670
diff changeset
1868 end
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12670
diff changeset
1869
13594
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1870 return promise.resolve(password or self.session.request_input("password")):next(function (password_)
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1871 local ok, err = um.create_user_with_role(username, password_, host, role);
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1872 if not ok then
13597
62aca6adcfd3 mod_admin_shell: user:create(): Reject promise with error message on failure
Matthew Wild <mwild1@gmail.com>
parents: 13596
diff changeset
1873 return promise.reject("Could not create user: "..err);
13594
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1874 end
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1875 return ("Created %s with role '%s'"):format(jid, role);
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1876 end);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1877 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1878
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1879 describe_command [[user:disable(jid) - Disable the specified user account, preventing login]]
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1880 function def_env.user:disable(jid)
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1881 local username, host = jid_split(jid);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1882 if not prosody.hosts[host] then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1883 return nil, "No such host: "..host;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1884 elseif not um.user_exists(username, host) then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1885 return nil, "No such user";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1886 end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1887 local ok, err = um.disable_user(username, host);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1888 if ok then
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1889 return true, "User disabled";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1890 else
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1891 return nil, "Could not disable user: "..err;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1892 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1893 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1894
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1895 describe_command [[user:enable(jid) - Enable the specified user account, restoring login access]]
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1896 function def_env.user:enable(jid)
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1897 local username, host = jid_split(jid);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1898 if not prosody.hosts[host] then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1899 return nil, "No such host: "..host;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1900 elseif not um.user_exists(username, host) then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1901 return nil, "No such user";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1902 end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1903 local ok, err = um.enable_user(username, host);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1904 if ok then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1905 return true, "User enabled";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1906 else
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1907 return nil, "Could not enable user: "..err;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1908 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1909 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1910
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1911 describe_command [[user:delete(jid) - Permanently remove the specified user account]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1912 function def_env.user:delete(jid)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1913 local username, host = jid_split(jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1914 if not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1915 return nil, "No such host: "..host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1916 elseif not um.user_exists(username, host) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1917 return nil, "No such user";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1918 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1919 local ok, err = um.delete_user(username, host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1920 if ok then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1921 return true, "User deleted";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1922 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1923 return nil, "Could not delete user: "..err;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1924 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1925 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1926
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1927 describe_command [[user:password(jid, password) - Set the password for the specified user account]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1928 function def_env.user:password(jid, password)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1929 local username, host = jid_split(jid);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1930 if not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1931 return nil, "No such host: "..host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1932 elseif not um.user_exists(username, host) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1933 return nil, "No such user";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1934 end
13598
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1935
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1936 return promise.resolve(password or self.session.request_input("password")):next(function (password_)
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1937 local ok, err = um.set_password(username, password_, host, nil);
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1938 if ok then
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1939 return "User password changed";
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1940 else
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1941 return promise.reject("Could not change password for user: "..err);
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1942 end
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1943 end);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1944 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1945
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1946 describe_command [[user:role(jid, host) - Show primary role for a user]]
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1947 function def_env.user:role(jid, host)
12209
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1948 local username, userhost = jid_split(jid);
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1949 if host == nil then host = userhost; end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1950 if not prosody.hosts[host] then
12209
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1951 return nil, "No such host: "..host;
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1952 elseif prosody.hosts[userhost] and not um.user_exists(username, userhost) then
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1953 return nil, "No such user";
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1954 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1955
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1956 local primary_role = um.get_user_role(username, host);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1957 local secondary_roles = um.get_user_secondary_roles(username, host);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1958
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1959 local primary_role_desc = primary_role and primary_role.name or "<none>";
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1960
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1961 print(primary_role and primary_role.name or "<none>");
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1962
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1963 local n_secondary = 0;
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1964 for role_name in pairs(secondary_roles or {}) do
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1965 n_secondary = n_secondary + 1;
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1966 print(role_name.." (secondary)");
12209
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1967 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1968
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1969 if n_secondary > 0 then
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1970 return true, primary_role_desc.." (primary)";
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1971 end
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1972 return true, primary_role_desc;
12209
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1973 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1974 def_env.user.roles = def_env.user.role;
12209
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12208
diff changeset
1975
13685
b9fce1651699 mod_admin_shell: Rename user:setrole to user:set_roles
Matthew Wild <mwild1@gmail.com>
parents: 13684
diff changeset
1976 describe_command [[user:set_role(jid, host, role) - Set primary role of a user (see 'help roles')]]
b9fce1651699 mod_admin_shell: Rename user:setrole to user:set_roles
Matthew Wild <mwild1@gmail.com>
parents: 13684
diff changeset
1977 -- user:set_role("someone@example.com", "example.com", "prosody:admin")
b9fce1651699 mod_admin_shell: Rename user:setrole to user:set_roles
Matthew Wild <mwild1@gmail.com>
parents: 13684
diff changeset
1978 -- user:set_role("someone@example.com", "prosody:admin")
b9fce1651699 mod_admin_shell: Rename user:setrole to user:set_roles
Matthew Wild <mwild1@gmail.com>
parents: 13684
diff changeset
1979 function def_env.user:set_role(jid, host, new_role)
12014
efbf288b529e mod_admin_shell: Support setting roles on hosts other than the users'
Kim Alvefur <zash@zash.se>
parents: 12013
diff changeset
1980 local username, userhost = jid_split(jid);
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1981 if new_role == nil then host, new_role = userhost, host; end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1982 if not prosody.hosts[host] then
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1983 return nil, "No such host: "..host;
12018
c65789f5004e mod_admin_shell: Only check that local users exist locally
Kim Alvefur <zash@zash.se>
parents: 12014
diff changeset
1984 elseif prosody.hosts[userhost] and not um.user_exists(username, userhost) then
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1985 return nil, "No such user";
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1986 end
13540
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1987 if userhost == host then
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1988 return um.set_user_role(username, userhost, new_role);
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1989 else
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1990 return um.set_jid_role(jid, host, new_role);
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1991 end
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1992 end
12012
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11991
diff changeset
1993
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1994 hidden_command [[user:addrole(jid, host, role) - Add a secondary role to a user]]
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1995 function def_env.user:addrole(jid, host, new_role)
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1996 local username, userhost = jid_split(jid);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1997 if new_role == nil then host, new_role = userhost, host; end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1998 if not prosody.hosts[host] then
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1999 return nil, "No such host: "..host;
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2000 elseif prosody.hosts[userhost] and not um.user_exists(username, userhost) then
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2001 return nil, "No such user";
13542
67288253d9a2 mod_admin_shell: Reject attempt to add or remove roles for unrelated hosts
Kim Alvefur <zash@zash.se>
parents: 13540
diff changeset
2002 elseif userhost ~= host then
67288253d9a2 mod_admin_shell: Reject attempt to add or remove roles for unrelated hosts
Kim Alvefur <zash@zash.se>
parents: 13540
diff changeset
2003 return nil, "Can't add roles outside users own host"
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2004 end
13681
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2005 local role, err = um.add_user_secondary_role(username, host, new_role);
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2006 if not role then
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2007 return nil, err;
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2008 end
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2009 return true, "Role added";
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2010 end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2011
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
2012 hidden_command [[user:delrole(jid, host, role) - Remove a secondary role from a user]]
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2013 function def_env.user:delrole(jid, host, role_name)
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2014 local username, userhost = jid_split(jid);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2015 if role_name == nil then host, role_name = userhost, host; end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2016 if not prosody.hosts[host] then
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2017 return nil, "No such host: "..host;
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2018 elseif prosody.hosts[userhost] and not um.user_exists(username, userhost) then
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2019 return nil, "No such user";
13542
67288253d9a2 mod_admin_shell: Reject attempt to add or remove roles for unrelated hosts
Kim Alvefur <zash@zash.se>
parents: 13540
diff changeset
2020 elseif userhost ~= host then
67288253d9a2 mod_admin_shell: Reject attempt to add or remove roles for unrelated hosts
Kim Alvefur <zash@zash.se>
parents: 13540
diff changeset
2021 return nil, "Can't remove roles outside users own host"
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2022 end
13681
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2023 local ok, err = um.remove_user_secondary_role(username, host, role_name);
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2024 if not ok then
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2025 return nil, err;
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2026 end
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2027 return true, "Role removed";
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
2028 end
12012
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11991
diff changeset
2029
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2030 describe_command [[user:list(hostname, pattern) - List users on the specified host, optionally filtering with a pattern]]
12012
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11991
diff changeset
2031 -- TODO switch to table view, include roles
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2032 function def_env.user:list(host, pat)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2033 if not host then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2034 return nil, "No host given";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2035 elseif not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2036 return nil, "No such host";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2037 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2038 local print = self.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2039 local total, matches = 0, 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2040 for user in um.users(host) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2041 if not pat or user:match(pat) then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2042 print(user.."@"..host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2043 matches = matches + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2044 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2045 total = total + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2046 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2047 return true, "Showing "..(pat and (matches.." of ") or "all " )..total.." users";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2048 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2049
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2050 def_env.xmpp = new_section("Commands for sending XMPP stanzas");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2051
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2052 describe_command [[xmpp:ping(localhost, remotehost) - Sends a ping to a remote XMPP server and reports the response]]
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2053 local new_id = require "prosody.util.id".medium;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2054 function def_env.xmpp:ping(localhost, remotehost, timeout)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2055 localhost = select(2, jid_split(localhost));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2056 remotehost = select(2, jid_split(remotehost));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2057 if not localhost then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2058 return nil, "Invalid sender hostname";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2059 elseif not prosody.hosts[localhost] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2060 return nil, "No such local host";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2061 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2062 if not remotehost then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2063 return nil, "Invalid destination hostname";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2064 elseif prosody.hosts[remotehost] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2065 return nil, "Both hosts are local";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2066 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2067 local iq = st.iq{ from=localhost, to=remotehost, type="get", id=new_id()}
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2068 :tag("ping", {xmlns="urn:xmpp:ping"});
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2069 local time_start = time.now();
12122
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2070 local print = self.session.print;
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2071 local function onchange(what)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2072 return function(event)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2073 local s2s_session = event.session;
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2074 if (s2s_session.from_host == localhost and s2s_session.to_host == remotehost)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2075 or (s2s_session.to_host == localhost and s2s_session.from_host == remotehost) then
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2076 local dir = available_columns.dir.mapper(s2s_session.direction, s2s_session);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2077 print(("Session %s (%s%s%s) %s (%gs)"):format(s2s_session.id, localhost, dir, remotehost, what,
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2078 time.now() - time_start));
12126
0d8e6646ce42 mod_admin_shell: Log creation of incoming s2s connections during ping
Kim Alvefur <zash@zash.se>
parents: 12122
diff changeset
2079 elseif s2s_session.type == "s2sin_unauthed" and s2s_session.to_host == nil and s2s_session.from_host == nil then
0d8e6646ce42 mod_admin_shell: Log creation of incoming s2s connections during ping
Kim Alvefur <zash@zash.se>
parents: 12122
diff changeset
2080 print(("Session %s %s (%gs)"):format(s2s_session.id, what, time.now() - time_start));
12122
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2081 end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2082 end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2083 end
12281
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12258
diff changeset
2084 local onconnected = onchange("connected");
12122
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2085 local onauthenticated = onchange("authenticated");
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2086 local onestablished = onchange("established");
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2087 local ondestroyed = onchange("destroyed");
12281
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12258
diff changeset
2088 module:hook("s2s-connected", onconnected, 1);
12122
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2089 module:context(localhost):hook("s2s-authenticated", onauthenticated, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2090 module:hook("s2sout-established", onestablished, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2091 module:hook("s2sin-established", onestablished, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2092 module:hook("s2s-destroyed", ondestroyed, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2093 return module:context(localhost):send_iq(iq, nil, timeout):finally(function()
12281
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12258
diff changeset
2094 module:unhook("s2s-connected", onconnected, 1);
12122
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2095 module:context(localhost):unhook("s2s-authenticated", onauthenticated);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2096 module:unhook("s2sout-established", onestablished);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2097 module:unhook("s2sin-established", onestablished);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2098 module:unhook("s2s-destroyed", ondestroyed);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2099 end):next(function(pong)
12551
3b7e97e0a8ef mod_admin_shell: Show session id ping reply came
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
2100 return ("pong from %s on %s in %gs"):format(pong.stanza.attr.from, pong.origin.id, time.now() - time_start);
11953
848a522fd731 mod_admin_shell: Remove now redundant promise awaiting in xmpp:ping()
Kim Alvefur <zash@zash.se>
parents: 11950
diff changeset
2101 end);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2102 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2103
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2104 def_env.dns = new_section("Commands to manage and inspect the internal DNS resolver");
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2105 local adns = require"prosody.net.adns";
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2106
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2107 local function get_resolver(session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2108 local resolver = session.dns_resolver;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2109 if not resolver then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2110 resolver = adns.resolver();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2111 session.dns_resolver = resolver;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2112 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2113 return resolver;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2114 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2115
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2116 describe_command [[dns:lookup(name, type, class) - Do a DNS lookup]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2117 function def_env.dns:lookup(name, typ, class)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2118 local resolver = get_resolver(self.session);
11954
b963ac00c967 mod_admin_shell: Remove now redundant promise awaiting in dns:lookup()
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
2119 return resolver:lookup_promise(name, typ, class)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2120 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2121
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2122 describe_command [[dns:addnameserver(nameserver) - Add a nameserver to the list]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2123 function def_env.dns:addnameserver(...)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2124 local resolver = get_resolver(self.session);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2125 resolver._resolver:addnameserver(...)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2126 return true
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2127 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2128
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2129 describe_command [[dns:setnameserver(nameserver) - Replace the list of name servers with the supplied one]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2130 function def_env.dns:setnameserver(...)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2131 local resolver = get_resolver(self.session);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2132 resolver._resolver:setnameserver(...)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2133 return true
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2134 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2135
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2136 describe_command [[dns:purge() - Clear the DNS cache]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2137 function def_env.dns:purge()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2138 local resolver = get_resolver(self.session);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2139 resolver._resolver:purge()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2140 return true
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2141 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2142
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2143 describe_command [[dns:cache() - Show cached records]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2144 function def_env.dns:cache()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2145 local resolver = get_resolver(self.session);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2146 return true, "Cache:\n"..tostring(resolver._resolver.cache)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2147 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2148
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2149 def_env.http = new_section("Commands to inspect HTTP services");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2150
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2151 describe_command [[http:list(hosts) - Show HTTP endpoints]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2152 function def_env.http:list(hosts)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2153 local print = self.session.print;
11361
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2154 hosts = array.collect(set.new({ not hosts and "*" or nil }) + get_hosts_set(hosts)):sort(_sort_hosts);
13117
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2155 local output_simple = format_table({
13108
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2156 { title = "Module"; width = "1p" };
13117
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2157 { title = "External URL"; width = "6p" };
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2158 }, self.session.width);
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2159 local output_split = format_table({
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2160 { title = "Module"; width = "1p" };
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2161 { title = "External URL"; width = "3p" };
13108
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2162 { title = "Internal URL"; width = "3p" };
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2163 }, self.session.width);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2164
11361
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2165 for _, host in ipairs(hosts) do
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2166 local http_apps = modulemanager.get_items("http-provider", host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2167 if #http_apps > 0 then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2168 local http_host = module:context(host):get_option_string("http_host");
11361
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2169 if host == "*" then
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2170 print("Global HTTP endpoints available on all hosts:");
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2171 else
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2172 print("HTTP endpoints on "..host..(http_host and (" (using "..http_host.."):") or ":"));
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2173 end
13117
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2174 print(output_split());
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2175 for _, provider in ipairs(http_apps) do
11362
52d93fba2ee1 mod_admin_shell: List modules providing each HTTP endpoint
Kim Alvefur <zash@zash.se>
parents: 11361
diff changeset
2176 local mod = provider._provided_by;
13108
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2177 local external = module:context(host):http_url(provider.name, provider.default_path);
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2178 local internal = module:context(host):http_url(provider.name, provider.default_path, "internal");
6cd768e6ac7c mod_admin_shell: Show internal URL in addition to external in http:list
Kim Alvefur <zash@zash.se>
parents: 13105
diff changeset
2179 if external==internal then internal="" end
11362
52d93fba2ee1 mod_admin_shell: List modules providing each HTTP endpoint
Kim Alvefur <zash@zash.se>
parents: 11361
diff changeset
2180 mod = mod and "mod_"..mod or ""
13117
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2181 print((internal=="" and output_simple or output_split){mod, external, internal});
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2182 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2183 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2184 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2185 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2186
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2187 local default_host = module:get_option_string("http_default_host");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2188 if not default_host then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2189 print("HTTP requests to unknown hosts will return 404 Not Found");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2190 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2191 print("HTTP requests to unknown hosts will be handled by "..default_host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2192 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2193 return true;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2194 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2195
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2196 def_env.watch = new_section("Commands for watching live logs from the server");
12399
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2197
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2198 describe_command [[watch:log() - Follow debug logs]]
12399
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2199 function def_env.watch:log()
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2200 local writing = false;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2201 local sink = logger.add_simple_sink(function (source, level, message)
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2202 if writing then return; end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2203 writing = true;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2204 self.session.print(source, level, message);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2205 writing = false;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2206 end);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2207
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2208 while self.session.is_connected() do
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2209 async.sleep(3);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2210 end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2211 if not logger.remove_sink(sink) then
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2212 module:log("warn", "Unable to remove watch:log() sink");
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2213 end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2214 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2215
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2216 describe_command [[watch:stanzas(target, filter) - Watch live stanzas matching the specified target and filter]]
12464
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2217 local stanza_watchers = module:require("mod_debug_stanzas/watcher");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2218 function def_env.watch:stanzas(target_spec, filter_spec)
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2219 local function handler(event_type, stanza, session)
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2220 if stanza then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2221 if event_type == "sent" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2222 self.session.print(("\n<!-- sent to %s -->"):format(session.id));
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2223 elseif event_type == "received" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2224 self.session.print(("\n<!-- received from %s -->"):format(session.id));
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2225 else
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2226 self.session.print(("\n<!-- %s (%s) -->"):format(event_type, session.id));
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2227 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2228 self.session.print(stanza);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2229 elseif session then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2230 self.session.print("\n<!-- session "..session.id.." "..event_type.." -->");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2231 elseif event_type then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2232 self.session.print("\n<!-- "..event_type.." -->");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2233 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2234 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2235
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2236 stanza_watchers.add({
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2237 target_spec = {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2238 jid = target_spec;
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2239 };
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2240 filter_spec = filter_spec and {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2241 with_jid = filter_spec;
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2242 };
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2243 }, handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2244
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2245 while self.session.is_connected() do
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2246 async.sleep(3);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2247 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2248
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2249 stanza_watchers.remove(handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2250 end
12399
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2251
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2252 def_env.debug = new_section("Commands for debugging the server");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2253
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2254 describe_command [[debug:logevents(host) - Enable logging of fired events on host]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2255 function def_env.debug:logevents(host)
13104
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2256 if host == "*" then
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2257 helpers.log_events(prosody.events);
13105
7d9e26003b05 mod_admin_shell: Allow logging HTTP events with debug:logevents("http")
Kim Alvefur <zash@zash.se>
parents: 13104
diff changeset
2258 elseif host == "http" then
7d9e26003b05 mod_admin_shell: Allow logging HTTP events with debug:logevents("http")
Kim Alvefur <zash@zash.se>
parents: 13104
diff changeset
2259 helpers.log_events(require "prosody.net.http.server"._events);
7d9e26003b05 mod_admin_shell: Allow logging HTTP events with debug:logevents("http")
Kim Alvefur <zash@zash.se>
parents: 13104
diff changeset
2260 return true
13104
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2261 else
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2262 helpers.log_host_events(host);
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2263 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2264 return true;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2265 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2266
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2267 describe_command [[debug:events(host, event) - Show registered event handlers]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2268 function def_env.debug:events(host, event)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2269 local events_obj;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2270 if host and host ~= "*" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2271 if host == "http" then
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2272 events_obj = require "prosody.net.http.server"._events;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2273 elseif not prosody.hosts[host] then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2274 return false, "Unknown host: "..host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2275 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2276 events_obj = prosody.hosts[host].events;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2277 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2278 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2279 events_obj = prosody.events;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2280 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2281 return true, helpers.show_events(events_obj, event);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2282 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2283
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2284 describe_command [[debug:timers() - Show information about scheduled timers]]
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2285 function def_env.debug:timers()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2286 local print = self.session.print;
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2287 local add_task = require"prosody.util.timer".add_task;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2288 local h, params = add_task.h, add_task.params;
10988
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2289 local function normalize_time(t)
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2290 return t;
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2291 end
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2292 local function format_time(t)
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2293 return os.date("%F %T", math.floor(normalize_time(t)));
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2294 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2295 if h then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2296 print("-- util.timer");
10986
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2297 elseif server.timer then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2298 print("-- net.server.timer");
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2299 h = server.timer.add_task.timers;
10988
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2300 normalize_time = server.timer.to_absolute_time or normalize_time;
10986
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2301 end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2302 if h then
11478
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2303 local timers = {};
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2304 for i, id in ipairs(h.ids) do
10986
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2305 local t, cb = h.priorities[i], h.items[id];
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2306 if not params then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2307 local param = cb.param;
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2308 if param then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2309 cb = param.callback;
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2310 else
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2311 cb = cb.timer_callback or cb;
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2312 end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2313 elseif params[id] then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2314 cb = params[id].callback or cb;
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2315 end
11478
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2316 table.insert(timers, { format_time(t), cb });
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2317 end
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2318 table.sort(timers, function (a, b) return a[1] < b[1] end);
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2319 for _, t in ipairs(timers) do
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2320 print(t[1], t[2])
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2321 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2322 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2323 if server.event_base then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2324 local count = 0;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2325 for _, v in pairs(debug.getregistry()) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2326 if type(v) == "function" and v.callback and v.callback == add_task._on_timer then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2327 count = count + 1;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2328 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2329 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2330 print(count .. " libevent callbacks");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2331 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2332 if h then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2333 local next_time = h:peek();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2334 if next_time then
10988
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2335 return true, ("Next event at %s (in %.6fs)"):format(format_time(next_time), normalize_time(next_time) - time.now());
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2336 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2337 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2338 return true;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2339 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2340
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2341 describe_command [[debug:async() - Show information about pending asynchronous tasks]]
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2342 function def_env.debug:async(runner_id)
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2343 local print = self.session.print;
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2344 local time_now = time.now();
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2345
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2346 if runner_id then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2347 for runner, since in pairs(async.waiting_runners) do
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2348 if runner.id == runner_id then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2349 print("ID ", runner.id);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2350 local f = runner.func;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2351 if f == async.default_runner_func then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2352 print("Function ", tostring(runner.current_item).." (from work queue)");
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2353 else
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2354 print("Function ", tostring(f));
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2355 if st.is_stanza(runner.current_item) then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2356 print("Stanza:")
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2357 print("\t"..runner.current_item:indent(2):pretty_print());
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2358 else
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2359 print("Work item", self.session.serialize(runner.current_item, "debug"));
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2360 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2361 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2362
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2363 print("Coroutine ", tostring(runner.thread).." ("..coroutine.status(runner.thread)..")");
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2364 print("Since ", since);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2365 print("Status ", ("%s since %s (%0.2f seconds ago)"):format(runner.state, os.date("%Y-%m-%d %R:%S", math.floor(since)), time_now-since));
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2366 print("");
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2367 print(debug.traceback(runner.thread));
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2368 return true, "Runner is "..runner.state;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2369 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2370 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2371 return nil, "Runner not found or is currently idle";
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2372 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2373
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2374 local row = format_table({
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2375 { title = "ID"; width = 12 };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2376 { title = "Function"; width = "10p" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2377 { title = "Status"; width = "16" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2378 { title = "Location"; width = "10p" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2379 }, self.session.width);
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2380 print(row())
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2381
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2382 local c = 0;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2383 for runner, since in pairs(async.waiting_runners) do
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2384 c = c + 1;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2385 local f = runner.func;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2386 if f == async.default_runner_func then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2387 f = runner.current_item;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2388 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2389 -- We want to fetch the location in the code that the runner yielded from,
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2390 -- excluding util.async's wrapper code. A level of `2` assumes that we
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2391 -- yielded directly from a function in util.async. This is *currently* true
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2392 -- of all util.async yields, but it's fragile.
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2393 local location = debug.getinfo(runner.thread, 2);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2394 print(row {
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2395 runner.id;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2396 tostring(f);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2397 ("%s (%0.2fs)"):format(runner.state, time_now - since);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2398 location.short_src..(location.currentline and ":"..location.currentline or "");
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2399 });
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2400 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2401 return true, ("%d runners pending"):format(c);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2402 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2403
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2404 def_env.stats = new_section("Commands to show internal statistics");
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2405
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2406 local short_units = {
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2407 seconds = "s",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2408 bytes = "B",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2409 };
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2410
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2411 local stats_methods = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2412
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2413 function stats_methods:render_single_fancy_histogram_ex(print, prefix, metric_family, metric, cumulative)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2414 local creation_timestamp, sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2415 local buckets = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2416 local prev_bucket_count = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2417 for suffix, extra_labels, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2418 if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2419 creation_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2420 elseif suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2421 sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2422 elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2423 count = value
12226
7db81c9cbbbf mod_admin_shell: Fix traceback on rendering graph of stats without extra labels
Kim Alvefur <zash@zash.se>
parents: 12225
diff changeset
2424 elseif extra_labels then
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2425 local bucket_threshold = extra_labels["le"]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2426 local bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2427 if cumulative then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2428 bucket_count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2429 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2430 bucket_count = value - prev_bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2431 prev_bucket_count = value
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2432 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2433 if bucket_threshold == "+Inf" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2434 t_insert(buckets, {threshold = 1/0, count = bucket_count})
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2435 elseif bucket_threshold ~= nil then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2436 t_insert(buckets, {threshold = tonumber(bucket_threshold), count = bucket_count})
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2437 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2438 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2439 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2440
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2441 if #buckets == 0 or not creation_timestamp or not sum or not count then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2442 print("[no data or not a histogram]")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2443 return false
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2444 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2445
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2446 local graph_width, graph_height, wscale = #buckets, 10, 1;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2447 if graph_width < 8 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2448 wscale = 8
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2449 elseif graph_width < 16 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2450 wscale = 4
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2451 elseif graph_width < 32 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2452 wscale = 2
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2453 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2454 local eighth_chars = " ▁▂▃▄▅▆▇█";
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2455
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2456 local max_bin_samples = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2457 for _, bucket in ipairs(buckets) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2458 if bucket.count > max_bin_samples then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2459 max_bin_samples = bucket.count
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2460 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2461 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2462
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2463 print("");
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2464 print(prefix)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2465 print(("_"):rep(graph_width*wscale).." "..max_bin_samples);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2466 for row = graph_height, 1, -1 do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2467 local row_chars = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2468 local min_eighths, max_eighths = 8, 0;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2469 for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2470 local char_eighths = math.ceil(math.max(math.min((graph_height/(max_bin_samples/buckets[i].count))-(row-1), 1), 0)*8);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2471 if char_eighths < min_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2472 min_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2473 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2474 if char_eighths > max_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2475 max_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2476 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2477 if char_eighths == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2478 row_chars[i] = ("-"):rep(wscale);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2479 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2480 local char = eighth_chars:sub(char_eighths*3+1, char_eighths*3+3);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2481 row_chars[i] = char:rep(wscale);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2482 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2483 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2484 print(table.concat(row_chars).."|- "..string.format("%.8g", math.ceil((max_bin_samples/graph_height)*(row-0.5))));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2485 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2486
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2487 local legend_pat = string.format("%%%d.%dg", wscale-1, wscale-1)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2488 local row = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2489 for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2490 local threshold = buckets[i].threshold
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2491 t_insert(row, legend_pat:format(threshold))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2492 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2493 t_insert(row, " " .. metric_family.unit)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2494 print(t_concat(row, "/"))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2495
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2496 return true
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2497 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2498
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2499 function stats_methods:render_single_fancy_histogram(print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2500 return self:render_single_fancy_histogram_ex(print, prefix, metric_family, metric, false)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2501 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2502
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2503 function stats_methods:render_single_fancy_histogram_cf(print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2504 -- cf = cumulative frequency
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2505 return self:render_single_fancy_histogram_ex(print, prefix, metric_family, metric, true)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2506 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2507
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2508 function stats_methods:cfgraph()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2509 for _, stat_info in ipairs(self) do
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2510 local family_name, metric_family = unpack(stat_info, 1, 2)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2511 local function print(s)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2512 table.insert(stat_info.output, s);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2513 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2514
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2515 if not self:render_family(print, family_name, metric_family, self.render_single_fancy_histogram_cf) then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2516 return self
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2517 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2518 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2519 return self;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2520 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2521
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2522 function stats_methods:histogram()
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2523 for _, stat_info in ipairs(self) do
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2524 local family_name, metric_family = unpack(stat_info, 1, 2)
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2525 local function print(s)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2526 table.insert(stat_info.output, s);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2527 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2528
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2529 if not self:render_family(print, family_name, metric_family, self.render_single_fancy_histogram) then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2530 return self
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2531 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2532 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2533 return self;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2534 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2535
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2536 function stats_methods:render_single_counter(print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2537 local created_timestamp, current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2538 for suffix, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2539 if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2540 created_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2541 elseif suffix == "_total" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2542 current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2543 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2544 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2545 if current_value and created_timestamp then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2546 local base_unit = short_units[metric_family.unit] or metric_family.unit
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2547 local unit = base_unit .. "/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2548 local factor = 1
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2549 if base_unit == "s" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2550 -- be smart!
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2551 unit = "%"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2552 factor = 100
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2553 elseif base_unit == "" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2554 unit = "events/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2555 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2556 print(("%-50s %s"):format(prefix, format_number(factor * current_value / (self.now - created_timestamp), unit.." [avg]")));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2557 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2558 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2559
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2560 function stats_methods:render_single_gauge(print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2561 local current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2562 for _, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2563 current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2564 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2565 if current_value then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2566 local unit = short_units[metric_family.unit] or metric_family.unit
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2567 print(("%-50s %s"):format(prefix, format_number(current_value, unit)));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2568 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2569 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2570
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2571 function stats_methods:render_single_summary(print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2572 local sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2573 for suffix, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2574 if suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2575 sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2576 elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2577 count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2578 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2579 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2580 if sum and count then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2581 local unit = short_units[metric_family.unit] or metric_family.unit
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2582 if count == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2583 print(("%-50s %s"):format(prefix, "no obs."));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2584 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2585 print(("%-50s %s"):format(prefix, format_number(sum / count, unit.."/event [avg]")));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2586 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2587 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2588 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2589
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2590 function stats_methods:render_family(print, family_name, metric_family, render_func)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2591 local labelkeys = metric_family.label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2592 if #labelkeys > 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2593 print(family_name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2594 for labelset, metric in metric_family:iter_metrics() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2595 local labels = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2596 for i, k in ipairs(labelkeys) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2597 local v = labelset[i]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2598 t_insert(labels, ("%s=%s"):format(k, v))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2599 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2600 local prefix = " "..t_concat(labels, " ")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2601 render_func(self, print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2602 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2603 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2604 for _, metric in metric_family:iter_metrics() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2605 render_func(self, print, family_name, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2606 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2607 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2608 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2609
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2610 local function stats_tostring(stats)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2611 local print = stats.session.print;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2612 for _, stat_info in ipairs(stats) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2613 if #stat_info.output > 0 then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2614 print("\n#"..stat_info[1]);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2615 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2616 for _, v in ipairs(stat_info.output) do
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2617 print(v);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2618 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2619 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2620 else
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2621 local metric_family = stat_info[2]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2622 if metric_family.type_ == "counter" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2623 stats:render_family(print, stat_info[1], metric_family, stats.render_single_counter)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2624 elseif metric_family.type_ == "gauge" or metric_family.type_ == "unknown" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2625 stats:render_family(print, stat_info[1], metric_family, stats.render_single_gauge)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2626 elseif metric_family.type_ == "summary" or metric_family.type_ == "histogram" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2627 stats:render_family(print, stat_info[1], metric_family, stats.render_single_summary)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2628 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2629 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2630 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2631 return #stats.." statistics displayed";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2632 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2633
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2634 local stats_mt = {__index = stats_methods, __tostring = stats_tostring }
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2635 local function new_stats_context(self)
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2636 -- TODO: instead of now(), it might be better to take the time of the last
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2637 -- interval, if the statistics backend is set to use periodic collection
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2638 -- Otherwise we get strange stuff like average cpu usage decreasing until
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2639 -- the next sample and so on.
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2640 return setmetatable({ session = self.session, stats = true, now = time.now() }, stats_mt);
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2641 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2642
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2643 describe_command [[stats:show(pattern) - Show internal statistics, optionally filtering by name with a pattern.]]
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2644 -- Undocumented currently, you can append :histogram() or :cfgraph() to stats:show() for rendered graphs.
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2645 function def_env.stats:show(name_filter)
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2646 local statsman = require "prosody.core.statsmanager"
13582
67c9fc643873 mod_admin_shell: stats:show(): Friendlier error message when statistics disabled
Matthew Wild <mwild1@gmail.com>
parents: 13562
diff changeset
2647 local metric_registry = statsman.get_metric_registry();
67c9fc643873 mod_admin_shell: stats:show(): Friendlier error message when statistics disabled
Matthew Wild <mwild1@gmail.com>
parents: 13562
diff changeset
2648 if not metric_registry then
67c9fc643873 mod_admin_shell: stats:show(): Friendlier error message when statistics disabled
Matthew Wild <mwild1@gmail.com>
parents: 13562
diff changeset
2649 return nil, [[Statistics disabled. Try `statistics = "internal"` in the global section of the config file and restart.]];
67c9fc643873 mod_admin_shell: stats:show(): Friendlier error message when statistics disabled
Matthew Wild <mwild1@gmail.com>
parents: 13562
diff changeset
2650 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2651 local collect = statsman.collect
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2652 if collect then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2653 -- force collection if in manual mode
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2654 collect()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2655 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2656 local displayed_stats = new_stats_context(self);
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2657 for family_name, metric_family in iterators.sorted_pairs(metric_registry:get_metric_families()) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2658 if not name_filter or family_name:match(name_filter) then
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2659 table.insert(displayed_stats, {
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2660 family_name,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2661 metric_family,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2662 output = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2663 })
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2664 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2665 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2666 return displayed_stats;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2667 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2668
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2669 local command_metadata_schema = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2670 type = "object";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2671 properties = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2672 section = { type = "string" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2673 section_desc = { type = "string" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2674
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2675 name = { type = "string" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2676 desc = { type = "string" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2677 help = { type = "string" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2678 args = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2679 type = "array";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2680 items = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2681 type = "object";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2682 properties = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2683 name = { type = "string", required = true };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2684 type = { type = "string", required = false };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2685 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2686 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2687 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2688 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2689
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2690 required = { "name", "section", "desc", "args" };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2691 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2692
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2693 -- host_commands[section..":"..name][host] = handler
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2694 -- host_commands[section..":"..name][false] = metadata
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2695 local host_commands = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2696
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2697 local function new_item_handlers(command_host)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2698 local function on_command_added(event)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2699 local command = event.item;
13603
6e5124f72e9a mod_admin_shell: Fix reporting origin module for commands
Kim Alvefur <zash@zash.se>
parents: 13598
diff changeset
2700 local mod_name = event.source and ("mod_"..event.source.name) or "<unknown module>";
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2701 if not schema.validate(command_metadata_schema, command) or type(command.handler) ~= "function" then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2702 module:log("warn", "Ignoring command added by %s: missing or invalid data", mod_name);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2703 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2704 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2705
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2706 local handler = command.handler;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2707
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2708 if command_host then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2709 if type(command.host_selector) ~= "string" then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2710 module:log("warn", "Ignoring command %s:%s() added by %s - missing/invalid host_selector", command.section, command.name, mod_name);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2711 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2712 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2713 local qualified_name = command.section..":"..command.name;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2714 local host_command_info = host_commands[qualified_name];
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2715 if not host_command_info then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2716 local selector_index;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2717 for i, arg in ipairs(command.args) do
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2718 if arg.name == command.host_selector then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2719 selector_index = i + 1; -- +1 to account for 'self'
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2720 break;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2721 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2722 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2723 if not selector_index then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2724 module:log("warn", "Command %s() host selector argument '%s' not found - not registering", qualified_name, command.host_selector);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2725 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2726 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2727 host_command_info = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2728 [false] = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2729 host_selector = command.host_selector;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2730 handler = function (...)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2731 local selected_host = select(2, jid_split((select(selector_index, ...))));
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2732 if type(selected_host) ~= "string" then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2733 return nil, "Invalid or missing argument '"..command.host_selector.."'";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2734 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2735 if not prosody.hosts[selected_host] then
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2736 return nil, "Unknown host: "..selected_host;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2737 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2738 local host_handler = host_commands[qualified_name][selected_host];
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2739 if not host_handler then
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2740 return nil, "This command is not available on "..selected_host;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2741 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2742 return host_handler(...);
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2743 end;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2744 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2745 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2746 host_commands[qualified_name] = host_command_info;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2747 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2748 if host_command_info[command_host] then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2749 module:log("warn", "Command %s() is already registered - overwriting with %s", qualified_name, mod_name);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2750 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2751 host_command_info[command_host] = handler;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2752 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2753
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2754 local section_t = def_env[command.section];
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2755 if not section_t then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2756 section_t = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2757 def_env[command.section] = section_t;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2758 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2759
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2760 if command_host then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2761 section_t[command.name] = host_commands[command.section..":"..command.name][false].handler;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2762 else
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2763 section_t[command.name] = command.handler;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2764 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2765
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2766 local section_mt = getmetatable(section_t);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2767 if not section_mt then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2768 section_mt = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2769 setmetatable(section_t, section_mt);
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2770 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2771 local section_help = section_mt.help;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2772 if not section_help then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2773 section_help = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2774 desc = command.section_desc;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2775 commands = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2776 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2777 section_mt.help = section_help;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2778 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2779
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2780 if command.flags then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2781 if command.flags.stop_on_positional == nil then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2782 command.flags.stop_on_positional = false;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2783 end
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2784 if command.flags.strict == nil then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2785 command.flags.strict = true;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2786 end
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
2787 end
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
2788
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2789 section_help.commands[command.name] = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2790 desc = command.desc;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2791 full = command.help;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2792 args = array(command.args);
13732
1465b1e305df mod_admin_shell, util.prosodyctl.shell: Process command-line args on server-side, with argparse support
Matthew Wild <mwild1@gmail.com>
parents: 13687
diff changeset
2793 flags = command.flags;
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2794 module = command._provided_by;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2795 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2796
13605
74a8006ee7f6 mod_admin_shell: Remove redundant 'mod_' prefix from debug message
Kim Alvefur <zash@zash.se>
parents: 13603
diff changeset
2797 module:log("debug", "Shell command added by %s: %s:%s()", mod_name, command.section, command.name);
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2798 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2799
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2800 local function on_command_removed(event)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2801 local command = event.item;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2802
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2803 local handler = event.item.handler;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2804 if type(handler) ~= "function" or not schema.validate(command_metadata_schema, command) then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2805 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2806 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2807
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2808 local section_t = def_env[command.section];
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2809 if not section_t or section_t[command.name] ~= handler then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2810 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2811 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2812
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2813 section_t[command.name] = nil;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2814 if next(section_t) == nil then -- Delete section if empty
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2815 def_env[command.section] = nil;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2816 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2817
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2818 if command_host then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2819 local host_command_info = host_commands[command.section..":"..command.name];
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2820 if host_command_info then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2821 -- Remove our host handler
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2822 host_command_info[command_host] = nil;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2823 -- Clean up entire command entry if there are no per-host handlers left
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2824 local any_hosts = false;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2825 for k in pairs(host_command_info) do
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2826 if k then -- metadata is false, ignore it
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2827 any_hosts = true;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2828 break;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2829 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2830 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2831 if not any_hosts then
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2832 host_commands[command.section..":"..command.name] = nil;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2833 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2834 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2835 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2836 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2837 return on_command_added, on_command_removed;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2838 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2839
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2840 module:handle_items("shell-command", new_item_handlers());
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2841
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2842 function module.add_host(host_module)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2843 host_module:handle_items("shell-command", new_item_handlers(host_module.host));
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2844 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2845
12464
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2846 function module.unload()
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2847 stanza_watchers.cleanup();
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2848 end
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2849
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2850
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2851 -------------
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2852
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2853 function printbanner(session)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2854 local option = module:get_option_string("console_banner", "full");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2855 if option == "full" or option == "graphic" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2856 session.print [[
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2857 ____ \ / _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2858 | _ \ _ __ ___ ___ _-_ __| |_ _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2859 | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2860 | __/| | | (_) \__ \ |_| | (_| | |_| |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2861 |_| |_| \___/|___/\___/ \__,_|\__, |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2862 A study in simplicity |___/
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2863
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2864 ]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2865 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2866 if option == "short" or option == "full" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2867 session.print("Welcome to the Prosody administration console. For a list of commands, type: help");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2868 session.print("You may find more help on using this console in our online documentation at ");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2869 session.print("https://prosody.im/doc/console\n");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2870 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2871 if option ~= "short" and option ~= "full" and option ~= "graphic" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2872 session.print(option);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2873 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2874 end