Annotate

plugins/mod_admin_shell.lua @ 13834:61df1404dd7a 13.0

mod_http: Fix IP address normalization (Thanks Boris) This fixes the problem that an un-bracketed IPv6 address will not match the first pattern (since it matches brackets) and instead the first decimal digits will match the pattern meant to strip port numbers from IPv4 addresses, e.g. 2001:db8::1 --> 2000 This pattern instead matches enough of a regular IPv4 address to make an IPv6 address fall back to the last case.
author Kim Alvefur <zash@zash.se>
date Wed, 09 Apr 2025 15:54:54 +0200
parent 13828:a071b20ccc0f
child 13869:f44f2a8a8c37
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
13828
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
142 To view roles and policies, see the commands in 'help role'.
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
143
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
144 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
145 ]];
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
146
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
147
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 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
149 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
150 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
151 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
152 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
153 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
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 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
156 end
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 console = {};
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 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
161
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 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
163 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
164
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 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
166 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
167 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168
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
169 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
170 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
171 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172
13593
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
173 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
174 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
175 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
176 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
177 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
178 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
179 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
180 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
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 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
183 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
184
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
185 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
186 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
187 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
188 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
189 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
190 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
191 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
192 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
193 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
194
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
195 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
196 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
197 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
198 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
199 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
200 end
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
201 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
202
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
203 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
204 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
205 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
206 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
207 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
208 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
209 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
210 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
211 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
212 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
213 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
214 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
215 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
216 end
13596
85e8cc6870ae mod_admin_shell: Mark event as handled when requested input is submitted
Matthew Wild <mwild1@gmail.com>
parents: 13594
diff changeset
217 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
218 end);
f57872788424 mod_admin_shell: Add session method to request (password) input from shell client
Matthew Wild <mwild1@gmail.com>
parents: 13591
diff changeset
219
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 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
221 local session = {
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
222 send = function (t)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
223 return send_repl_output(admin_session, t);
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
224 end;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
225 print = function (...)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
226 local t = {};
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
227 for i=1,select("#", ...) do
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
228 t[i] = tostring(select(i, ...));
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
229 end
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
230 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
231 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
232 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
233 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
234 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
235 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
236 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
237 end;
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
238 serialize = tostring;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
239 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
240 is_connected = function ()
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12397
diff changeset
241 return not not admin_session.conn;
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12397
diff changeset
242 end
11950
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
243 };
10856
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.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
245
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 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
247 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
248 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
249
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 -- 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
251 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
252 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
253 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
254 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255 end
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 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
258
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 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
260 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261
13736
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
262 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
263 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
264 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
265 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
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_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
268
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
269 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
270 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
271 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
272
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
273 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
274 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
275 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
276 return;
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
277 end
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
278 if section_help then
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
279 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
280 end
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
281 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
282 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
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 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
285
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
286 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
287 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
288 if not flags then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
289 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
290 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
291 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
292 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
293 end
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
294 return nil, flags_err;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
295 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
296
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 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
298 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
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 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
301
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 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
303 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
304 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
305 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
306 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
307 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
308 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
309 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
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 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
312
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 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
314 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
315 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
316 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
317 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
318 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
319 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
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 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
322
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 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
324 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
325
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 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
327 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
328 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
329 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
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 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
332 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
333 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
334 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
335
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 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
337 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
338
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 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
340 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
341 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
342 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
343 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
344 end
12529
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
345
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12506
diff changeset
346 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
347 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
348 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
349
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 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
351 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
352
13770
a28349b8a387 prosodyctl shell: More reliable detection of REPL/interactive mode (fixes #1895)
Matthew Wild <mwild1@gmail.com>
parents: 13769
diff changeset
353 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
354
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
355 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
356
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 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
358 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
359 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
360 else
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
361 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
362 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
363 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
364 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
365 return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 end
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 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
370
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371 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
372 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
373 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
374 return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376
11736
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
377 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
378 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
379 end
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
380
13591
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
381 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
382 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
383 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
384 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
385 end
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: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
387 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
388 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
389 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
390 else
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
391 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
392 end
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
393
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
394 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
395 end
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
396
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
397 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
398 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
399 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
400
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 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
402 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
403 -- 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
404 -- 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
405 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
406 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
407 if flags then -- err
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
408 send_result(false, flags);
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
409 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
410 -- 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
411 event.origin.send(result);
42367f7e6e94 mod_admin_shell: Fix simple command execution (e.g. help)
Matthew Wild <mwild1@gmail.com>
parents: 13735
diff changeset
412 end
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
413 return;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
414 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
415 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
416
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 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
418 -- 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
419 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431 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
432 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
433 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
434
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
435 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
436
11949
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11946
diff changeset
437 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
438 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
439 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
440 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
441 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
442 end);
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
443 else
382d1a92006f mod_admin_shell: Don't pause async thread while waiting for promise result
Matthew Wild <mwild1@gmail.com>
parents: 13582
diff changeset
444 send_result(taskok, message);
11949
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11946
diff changeset
445 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
446 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
447
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
448 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
449 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
450 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
451 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
452 end
12887
68df46926c26 mod_admin_socket: Return error on unhandled input to prevent apparent freeze
Kim Alvefur <zash@zash.se>
parents: 12788
diff changeset
453 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
454 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
455
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
456 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
457 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
458 if not section then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
459 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
460 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
461 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
462 command_help[name] = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
463 desc = desc;
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
464 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
465 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
466 end);
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
467 hidden = hidden;
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
468 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
469 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
470
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
471 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
472 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
473 end
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
474
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
475 -- 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
476 -- 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
477
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
478 -- 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
479 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
480 local print = session.print;
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
481
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
482 local topic = data:match("^help (%w+)");
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
483 if topic then
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
484 return def_env.help[topic]({ session = session });
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
485 end
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
486
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
487 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
488 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
489 print [[]]
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
490 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
491 print(row())
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
492 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
493 local section_mt = getmetatable(section);
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
494 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
495 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
496 end
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("");
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 [[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
501
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
502 print("");
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
503 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
504 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
505 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
506 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
507
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
508 -- 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
509 -- 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
510
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
511 --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
512 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
513 preset = "pretty";
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
514 maxdepth = 2;
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
515 table_iterator = "pairs";
5bfcfd12c423 mod_admin_shell: Use new serialize preset to simplify default config
Kim Alvefur <zash@zash.se>
parents: 13128
diff changeset
516 })
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
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
518 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
519 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
520 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
521 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
522 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
523 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
524 -- 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
525 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
526 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
527 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
528 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
529 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
530 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
531 end
11891
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
532 if opts.table_iterator == "pairs" then
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
533 opts.table_iterator = pairs;
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
534 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
535 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
536 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
537 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
538 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
539
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
540 def_env.help = setmetatable({}, {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
541 help = {
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
542 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
543 commands = {};
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
544 };
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
545 __index = function (_, section_name)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
546 return function (self)
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
547 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
548 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
549 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
550
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
551 local c = 0;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
552
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
553 if section_help then
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
554 print("Help: "..section_name);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
555 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
556 print(section_help.desc);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
557 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
558 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
559 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
560
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
561 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
562 print(section_help.content);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
563 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
564 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
565
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
566 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
567 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
568 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
569 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
570 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
571 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
572 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
573 else
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
574 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
575 if args ~= "" then
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
576 args = "<"..args..">";
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
577 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
578 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
579 print((" %s"):format(desc));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
580 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
581 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
582 print("");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
583 print((" Flags:"));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
584
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
585 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
586 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
587 print(" --"..name:gsub("_", "-"));
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
588 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
589 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
590
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
591 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
592 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
593 print(" --"..name:gsub("_", "-").." <"..name..">");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
594 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
595 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
596
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
597 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
598 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
599 print(" --"..name:gsub("_", "-").." <"..name..">, ...");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
600 end
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
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
603 end
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
604 print("");
46e7cc4de5e6 mod_admin_shell: Improve help listing in non-REPL mode
Matthew Wild <mwild1@gmail.com>
parents: 13736
diff changeset
605 end
13683
4c1f26b4883b mod_admin_shell: Support for hiding certain commands from default help listing
Matthew Wild <mwild1@gmail.com>
parents: 13681
diff changeset
606 end
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
607 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
608 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
609 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
610 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
611 topic.content(self, print);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
612 else
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
613 print(topic.content);
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
614 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
615 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
616 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
617 else
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
618 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
619 end
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
620 print("");
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
621 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
622 end;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
623 end;
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
624 });
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
625
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
626 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
627
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
628 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
629 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
630 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
631 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
632 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
633 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
634
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
635 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
636 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
637 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
638 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
639
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
640 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
641 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
642 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
643 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
644 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
645 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
646 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
647 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
648 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
649 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
650 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
651 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
652 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
653 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
654
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
655 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
656 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
657 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
658 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
659 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
660
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
661 local function human(kb)
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
662 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
663 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
664
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
665 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
666 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
667 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
668 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
669 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
670 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
671 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
672 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
673 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
674 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
675 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
676 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
677
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
678 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
679
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
680 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
681 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
682 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
683 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
684 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
685 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
686 end
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 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
688 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
689 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
690 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
691 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
692 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
693
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
694 -- 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
695 -- 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
696 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
697 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
698 / 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
699 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
700 -- 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
701 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
702 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
703 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
704 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
705 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
706 end
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 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
708 -- 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
709 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
710 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
711 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
712 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
713 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
714 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
715 -- 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
716 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
717 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
718 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
719 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
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 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
722 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
723
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
724 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
725 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
726 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
727 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
728 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
729 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
730 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
731 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
732 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
733 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
734
11932
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11931
diff changeset
735 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
736
12540
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
737 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
738 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
739 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
740 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
741 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
742 else
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
743 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
744 end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
745 end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12538
diff changeset
746
11606
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
747 local friendly_descriptions = {
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
748 ["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
749 ["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
750 ["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
751 ["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
752 ["storage-provider"] = "Storage driver",
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
753 ["measure"] = "Legacy metrics",
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
754 ["metric"] = "Metrics",
11991
bef2a59b00d1 mod_admin_shell: List periodic tasks in module:info
Kim Alvefur <zash@zash.se>
parents: 11954
diff changeset
755 ["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
756 };
11607
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
757 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
758 ["feature"] = tostring,
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
759 ["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
760 ["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
761 ["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
762 ["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
763 ["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
764 ["net-provider"] = function(item)
12537
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
765 local service_name = item.name;
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
766 local ports_list = {};
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
767 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
768 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
769 end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
770 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
771 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
772 end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12536
diff changeset
773 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
774 end,
11931
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
775 ["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
776 ["metric"] = function(item)
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11930
diff changeset
777 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
778 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
779 ["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
780 };
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
781
11601
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
782 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
783 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
784 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
785 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
786 else
7466bf65d7c8 mod_admin_shell: module:info: Use existing host string representation
Kim Alvefur <zash@zash.se>
parents: 11603
diff changeset
787 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
788 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
789 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
790 if mod.module.status_message then
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11601
diff changeset
791 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
792 end
11605
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
793 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
794 print(" provides:");
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
795 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
796 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
797 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
798 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
799 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
800 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
801 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
802 end
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
803 end
11605
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
804 end
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11604
diff changeset
805 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
806 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
807 print(" dependencies:");
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
808 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
809 -- 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
810 -- 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
811 -- current host.
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12922
diff changeset
812 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
813 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
814 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
815 end
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
816 end
12922
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12908
diff changeset
817 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
818 print(" reverse dependencies:");
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12908
diff changeset
819 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
820 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
821 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
822 end
11603
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
823 end
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11602
diff changeset
824 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
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 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
827 end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11523
diff changeset
828
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
829 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
830 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
831 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
832
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
833 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
834 -- 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
835 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
836 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
837 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
838
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 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
840 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
841 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
842 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
843 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
844 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
845 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
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 break;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
848 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
849 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
850 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
851 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
852 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
853
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
854 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
855 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
856 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
857 end
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
858 else
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
859 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
860 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
861 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
862
13561
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
863 if not ok then
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
864 return ok, "Last error: "..tostring(err);
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
865 end
13562
f77c247258cc mod_admin_shell: Report when a module is already loaded
Kim Alvefur <zash@zash.se>
parents: 13561
diff changeset
866 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
867 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
868 end
13561
d8f7a8a26965 mod_admin_shell: Refactor end of module:load
Kim Alvefur <zash@zash.se>
parents: 13542
diff changeset
869 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
870 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
871
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
872 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
873 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
874 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
875
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
876 -- 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
877 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
878 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
879 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
880
10856
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 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
882 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
883 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
884 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
885 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
886 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
887 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
888 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
889
38582771b593 mod_admin_shell: Warn when (un-)loading module would be undone by restart
Kim Alvefur <zash@zash.se>
parents: 13117
diff changeset
890 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
891 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
892 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
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 end
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 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
897 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
898
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
899 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
900 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
901 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
902 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
903 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
904
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
905 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
906 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
907 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
908
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
909 -- 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
910 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
911 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
912 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
913 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
914 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
915 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
916 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
917 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
918 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
919 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
920 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
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 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
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 end
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 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
927 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
928
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
929 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
930 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
931 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
932
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
933 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
934 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
935 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
936 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
937 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
938 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
939 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
940 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
941 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
942 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
943 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
944 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
945 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
946 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
947 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
948 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
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 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
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 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
954 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
955
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
956 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
957
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 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
959 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
960 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
961 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
962 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
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 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
965 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
966
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
967 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
968 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
969 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
970 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
971 end
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
972 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
973 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
974 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
975
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
976 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
977 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
978 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
979 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
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 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
982 end
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13061
diff changeset
983
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
984 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
985 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
986 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
987 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
988 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
989
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
990 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
991
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
992 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
993 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
994 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
995 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
996
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 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
998 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
999 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
1000 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
1001 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
1002 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
1003 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1004
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1005 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
1006 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
1007 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
1008 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
1009 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
1010 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
1011 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1012
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1013 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
1014 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
1015 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
1016 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
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 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
1019 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1020
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 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
1022 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
1023 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
1024 end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1025 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1026
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1027 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
1028 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
1029 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
1030 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
1031 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1032
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1033 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
1034 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
1035 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
1036 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
1037 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
1038 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
1039 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1040
12224
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12209
diff changeset
1041 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
1042 jid = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1043 title = "JID";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1044 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
1045 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
1046 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
1047 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
1048 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1049 host = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1050 title = "Host";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1051 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
1052 key = "host";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1053 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
1054 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
1055 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
1056 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1057 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1058 remote = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1059 title = "Remote";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1060 description = "Remote hostname";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1061 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
1062 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
1063 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
1064 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1065 };
12023
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1066 port = {
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1067 title = "Port";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1068 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
1069 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
1070 align = "right";
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1071 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
1072 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
1073 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
1074 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
1075 end
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12637
diff changeset
1076 end;
12023
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12019
diff changeset
1077 };
13473
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1078 created = {
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1079 title = "Connection Created";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1080 description = "Time when connection was created";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1081 width = #"YYYY MM DD HH:MM:SS";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1082 align = "right";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1083 key = "conn";
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1084 mapper = function(conn)
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1085 if conn then
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1086 return os.date("%F %T", math.floor(conn.created));
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1087 end
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1088 end;
9eb081616842 mod_admin_shell: Add connection created time
aidan@jmad.org
parents: 13354
diff changeset
1089 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1090 dir = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1091 title = "Dir";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1092 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
1093 width = #"<->";
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1094 key = "direction";
11888
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11887
diff changeset
1095 mapper = function(dir, session)
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11887
diff changeset
1096 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
1097 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
1098 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
1099 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1100 };
13036
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1101 id = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1102 title = "Session ID";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1103 description = "Internal session ID used in logging";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1104 -- 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
1105 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
1106 key = "id";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1107 };
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1108 type = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1109 title = "Type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1110 description = "Session type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1111 width = math.max(#"c2s_unauthed", #"s2sout_unauthed");
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1112 key = "type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13035
diff changeset
1113 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1114 method = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1115 title = "Method";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1116 description = "Connection method";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1117 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
1118 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
1119 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
1120 return "BOSH";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1121 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
1122 return "WebSocket";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1123 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1124 return "TCP";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1125 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1126 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1127 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1128 ipv = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1129 title = "IPv";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1130 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
1131 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
1132 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
1133 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
1134 };
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1135 ip = {
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1136 title = "IP address";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1137 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
1138 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
1139 key = "ip";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1140 };
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1141 status = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1142 title = "Status";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1143 description = "Presence status";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1144 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
1145 key = "presence";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1146 mapper = function(p)
11946
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11945
diff changeset
1147 if not p then return ""; end
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11945
diff changeset
1148 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
1149 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1150 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1151 secure = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1152 title = "Security";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1153 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
1154 key = "conn";
13041
61b00bd20074 mod_admin_shell: Fix attempt to compare number with string
Kim Alvefur <zash@zash.se>
parents: 13037
diff changeset
1155 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
1156 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
1157 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
1158 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
1159 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
1160 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
1161 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1162 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1163 encryption = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1164 title = "Encryption";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1165 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
1166 -- 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
1167 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
1168 key = "conn";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1169 mapper = function(conn)
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12464
diff changeset
1170 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
1171 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
1172 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1173 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1174 cert = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1175 title = "Certificate";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1176 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
1177 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
1178 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
1179 mapper = function(cert_status, session)
13089
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1180 if cert_status == "invalid" then
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1181 -- 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
1182 -- about every error condition except mismatched certificate names
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1183 return "Mismatched";
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1184 elseif cert_status then
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1185 -- basically only "valid"
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1186 return capitalize(cert_status);
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1187 end
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1188 -- no certificate status,
13517
4bf889e94831 mod_admin_shell: Prevent traceback due to type error
Kim Alvefur <zash@zash.se>
parents: 13489
diff changeset
1189 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
1190 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
1191 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
1192 return "Expired";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1193 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
1194 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
1195 end
13089
41598b7ec543 mod_admin_shell: Refactor 'cert' column
Kim Alvefur <zash@zash.se>
parents: 13079
diff changeset
1196 -- 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
1197 -- 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
1198 return "Untrusted";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1199 end
13517
4bf889e94831 mod_admin_shell: Prevent traceback due to type error
Kim Alvefur <zash@zash.se>
parents: 13489
diff changeset
1200 -- 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
1201 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
1202 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1203 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1204 sni = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1205 title = "SNI";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1206 description = "Hostname requested in TLS";
13037
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13036
diff changeset
1207 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
1208 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
1209 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
1210 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
1211 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
1212 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1213 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1214 alpn = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1215 title = "ALPN";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1216 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
1217 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
1218 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
1219 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
1220 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
1221 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
1222 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1223 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1224 smacks = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1225 title = "SM";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1226 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
1227 key = "smacks";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1228 -- 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
1229 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
1230 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
1231 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
1232 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
1233 return "yes";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1234 end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1235 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1236 smacks_queue = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1237 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
1238 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
1239 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
1240 width = 8;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1241 align = "right";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1242 mapper = function (queue)
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
1243 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
1244 end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1245 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1246 csi = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1247 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
1248 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
1249 key = "state";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1250 -- 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
1251 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1252 s2s_sasl = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1253 title = "SASL";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1254 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
1255 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
1256 width = 10;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1257 mapper = capitalize
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1258 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1259 dialback = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1260 title = "Dialback";
12229
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
1261 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
1262 key = "dialback_key";
13035
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13034
diff changeset
1263 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
1264 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
1265 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
1266 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
1267 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
1268 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1269 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
1270 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
1271 return "Initiated";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1272 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1273 return "Completed";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1274 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1275 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1276 };
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1277 role = {
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1278 title = "Role";
13034
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13013
diff changeset
1279 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
1280 width = "1p";
12660
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1281 key = "role";
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1282 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
1283 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
1284 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
1285 end;
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12638
diff changeset
1286 }
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1287 };
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1288
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1289 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
1290 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
1291 local columns = {};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1292 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
1293 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
1294 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
1295 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
1296 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
1297 else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1298 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
1299 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1300 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1301
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1302 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
1303 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1304
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1305 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
1306 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
1307 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
1308 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
1309 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
1310
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1311 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
1312 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
1313 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
1314 end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1315
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
1316 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
1317 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
1318 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
1319 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
1320 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
1321 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
1322 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
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1324 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
1325 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
1326
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1327 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
1328 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
1329 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
1330 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
1331 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
1332 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
1333 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
1334 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
1335 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
1336 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
1337
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1338 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
1339 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
1340 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
1341 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
1342 end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1343 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
1344 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1345
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1346 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
1347 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
1348 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
1349 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1350
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1351 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
1352 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
1353 return {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1354 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
1355 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
1356 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1357 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1358 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1359
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1360 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
1361 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
1362 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
1363 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
1364 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
1365 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
1366 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
1367 end
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 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
1370 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1371
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1372 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
1373 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
1374 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
1375 --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
1376 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
1377 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
1378 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
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 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
1381 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1382
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1383
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1384 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
1385
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1386 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
1387 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
1388 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
1389 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
1390 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
1391 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
1392
13071
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1393 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
1394 -- 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
1395 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
1396 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1397
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1398 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
1399 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
1400 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
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 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
1403 return true;
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1404 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
1405 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
1406 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1407 return false;
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1408 end
b5a419ac0f84 mod_admin_shell: Factor apart wildcard matching into function for reuse
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
1409
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1410 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
1411 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
1412 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
1413 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
1414 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
1415
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1416 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
1417 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
1418 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1419
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
1420 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
1421 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
1422 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
1423 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
1424 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
1425 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
1426 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
1427 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
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11885
diff changeset
1429 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
1430
11917
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1431 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
1432 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
1433 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
1434 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
1435
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
1436 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
1437 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
1438 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
1439 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
1440 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
1441 end
11885
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1442
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11850
diff changeset
1443 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
1444 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
1445 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
1446 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
1447 end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11905
diff changeset
1448 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
1449 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1450
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1451 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
1452 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
1453 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
1454 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1455
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1456 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
1457 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
1458 print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1459 (" %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
1460 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
1461 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
1462 )
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1463 );
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1464 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1465 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1466
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1467 -- 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
1468 -- 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
1469 -- 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
1470 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
1471 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
1472 print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1473 (" %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
1474 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
1475 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
1476 )
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1477 );
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1478 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1479 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1480
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1481 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
1482 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
1483 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
1484 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
1485 /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
1486 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
1487 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
1488 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
1489 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
1490 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
1491 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
1492 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
1493 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1494 else
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 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
1496 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
1497 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
1498 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
1499 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
1500 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
1501 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
1502 {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1503 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
1504 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
1505 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
1506 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1507 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
1508 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
1509 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
1510 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1511 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1512 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
1513 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
1514 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
1515 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
1516 });
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 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1520 end
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 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
1522 -- 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
1523 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
1524
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1525 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
1526 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
1527 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1528
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1529 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
1530 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
1531 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1532 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
1533 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
1534 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1535
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1536 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
1537 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
1538 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
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 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
1541 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1542 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
1543 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
1544 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
1545 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
1546 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
1547 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1548 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
1549 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1550 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1551 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1552 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
1553 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
1554 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
1555 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
1556 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1557 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
1558 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
1559 end
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("");
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("Issuer: ");
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_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
1563 print("");
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("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
1565 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
1566 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
1567 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1568 print("---");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1569 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
1570 ..(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
1571 .." 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
1572 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1573
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1574 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
1575 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
1576 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
1577 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
1578
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1579 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
1580 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
1581 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
1582 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
1583 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
1584 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
1585 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
1586 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1587
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1588 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
1589 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
1590 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
1591 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
1592 (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
1593 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
1594 end
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 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
1597 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1598
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1599 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
1600 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
1601 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
1602 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
1603 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
1604 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
1605 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
1606 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
1607 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1608 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 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
1610 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
1611 end
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 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
1614
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1615 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
1616 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
1617 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
1618 end
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1619
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1620 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
1621 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
1622 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
1623 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1624
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1625 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
1626 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
1627 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
1628 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
1629 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
1630 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
1631 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
1632 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
1633 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
1634 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
1635 else
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1636 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
1637 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
1638 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
1639 end
12676
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12675
diff changeset
1640 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
1641 end
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 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
1644 end
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 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
1647
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1648 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
1649 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
1650 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
1651 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
1652 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
1653 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
1654 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
1655 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
1656 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
1657 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
1658 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
1659 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1660 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1661 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
1662 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
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 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
1665 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1666
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1667 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
1668 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
1669 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
1670 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
1671 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
1672 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
1673 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
1674 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
1675 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
1676 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
1677 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
1678 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
1679 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
1680 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1681 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
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 end
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 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
1688 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1689
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1690 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
1691
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1692 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
1693 __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
1694 __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
1695 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
1696 end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1697 };
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1698
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1699 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
1700 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
1701 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
1702 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
1703 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
1704 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
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 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
1707 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1708
12867
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1709 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
1710 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
1711 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
1712 return room_name, host;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1713 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1714 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
1715 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
1716 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
1717 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1718 return room_obj;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1719 end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12866
diff changeset
1720
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1721 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
1722
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1723 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
1724 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
1725 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
1726 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
1727 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
1728 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 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
1730 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
1731 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
1732 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
1733 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1734
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1735 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
1736 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
1737 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
1738 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
1739 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
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 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
1742 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1743
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1744 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
1745 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
1746 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
1747 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
1748 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
1749 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1750 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
1751 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
1752 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
1753 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
1754 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
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 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
1757 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1758
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1759 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
1760 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
1761 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
1762 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
1763 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
1764 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
1765
12865
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1766 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
1767 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
1768 { 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
1769 { 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
1770 { 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
1771 }, self.session.width);
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1772 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
1773 local total = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1774 if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1775 occupants:filter(function(occupant)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1776 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
1777 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1778 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1779 local displayed = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1780 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
1781 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
1782 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
1783 else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1784 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
1785 end
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1786 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1787
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1788 if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1789 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
1790 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1791
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1792 print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1793 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
1794 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
1795 end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1796
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1797 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
1798 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
1799 else
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12789
diff changeset
1800 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
1801 end
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1802 end
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1803
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1804 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
1805 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
1806 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
1807 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
1808 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
1809 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1810
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1811 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
1812 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
1813 { 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
1814 { title = "JID"; width = "75%" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12867
diff changeset
1815 { 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
1816 }, self.session.width);
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1817 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
1818 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
1819 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
1820 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1821
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1822 local total = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1823 if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1824 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
1825 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
1826 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1827 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1828 local displayed = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1829 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
1830 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
1831 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
1832 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
1833 else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1834 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
1835 end
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1836 end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1837
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1838 if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1839 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
1840 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1841
12870
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1842 print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1843 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
1844 print(row(affiliation));
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1845 end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1846
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
1847
12866
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1848 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
1849 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
1850 else
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1851 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
1852 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1853 end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12865
diff changeset
1854
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
1855 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
1856
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1857 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
1858
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1859 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
1860 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
1861 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
1862 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
1863 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
1864 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
1865 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
1866 end
12672
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12670
diff changeset
1867
13170
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 13132
diff changeset
1868 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
1869 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
1870 end
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12670
diff changeset
1871
13594
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1872 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
1873 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
1874 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
1875 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
1876 end
abbdcef552fb mod_admin_shell: user:create(): request password via prompt if none given
Matthew Wild <mwild1@gmail.com>
parents: 13593
diff changeset
1877 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
1878 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
1879 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1880
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1881 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
1882 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
1883 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
1884 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
1885 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
1886 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
1887 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
1888 end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1889 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
1890 if ok then
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1891 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
1892 else
12908
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1893 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
1894 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1895 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1896
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1897 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
1898 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
1899 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
1900 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
1901 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
1902 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
1903 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
1904 end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1905 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
1906 if ok then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1907 return true, "User enabled";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1908 else
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12888
diff changeset
1909 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
1910 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1911 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1912
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1913 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
1914 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
1915 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
1916 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
1917 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
1918 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
1919 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
1920 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1921 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
1922 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
1923 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
1924 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1925 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
1926 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1927 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1928
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
1929 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
1930 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
1931 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
1932 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
1933 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
1934 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
1935 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
1936 end
13598
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1937
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1938 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
1939 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
1940 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
1941 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
1942 else
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1943 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
1944 end
2cd43975a15c mod_admin_shell: user:password(): Support prompting for password if none given
Matthew Wild <mwild1@gmail.com>
parents: 13597
diff changeset
1945 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
1946 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1947
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1948 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
1949 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
1950 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
1951 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
1952 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
1953 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
1954 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
1955 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
1956 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1957
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1958 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
1959 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
1960
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1961 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
1962
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1963 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
1964
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1965 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
1966 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
1967 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
1968 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
1969 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1970
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1971 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
1972 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
1973 end
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1974 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
1975 end
12668
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
1976 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
1977
13685
b9fce1651699 mod_admin_shell: Rename user:setrole to user:set_roles
Matthew Wild <mwild1@gmail.com>
parents: 13684
diff changeset
1978 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
1979 -- 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
1980 -- 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
1981 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
1982 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
1983 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
1984 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
1985 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
1986 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
1987 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
1988 end
13540
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1989 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
1990 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
1991 else
cc67109ce502 mod_admin_shell: Allow assigning roles to arbitrary JIDs when supported
Kim Alvefur <zash@zash.se>
parents: 13517
diff changeset
1992 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
1993 end
12013
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12012
diff changeset
1994 end
12012
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11991
diff changeset
1995
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
1996 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
1997 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
1998 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
1999 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
2000 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
2001 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
2002 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
2003 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
2004 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
2005 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
2006 end
13681
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2007 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
2008 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
2009 return nil, err;
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2010 end
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2011 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
2012 end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12660
diff changeset
2013
13684
026a75a443de mod_admin_shell: Hide secondary role commands, focus on primary roles
Matthew Wild <mwild1@gmail.com>
parents: 13683
diff changeset
2014 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
2015 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
2016 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
2017 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
2018 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
2019 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
2020 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
2021 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
2022 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
2023 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
2024 end
13681
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2025 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
2026 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
2027 return nil, err;
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2028 end
8f43b954bdac mod_admin_shell: Fix result handling of user addrole/delrole commands
Matthew Wild <mwild1@gmail.com>
parents: 13641
diff changeset
2029 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
2030 end
12012
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11991
diff changeset
2031
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2032 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
2033 -- 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
2034 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
2035 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
2036 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
2037 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
2038 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
2039 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2040 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
2041 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
2042 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
2043 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
2044 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
2045 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
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 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
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 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
2050 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2051
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2052 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
2053
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2054 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
2055 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
2056 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
2057 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
2058 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
2059 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
2060 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
2061 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
2062 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
2063 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2064 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
2065 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
2066 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
2067 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
2068 end
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 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
2070 :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
2071 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
2072 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
2073 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
2074 return function(event)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2075 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
2076 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
2077 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
2078 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
2079 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
2080 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
2081 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
2082 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
2083 end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2084 end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
2085 end
12281
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12258
diff changeset
2086 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
2087 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
2088 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
2089 local ondestroyed = onchange("destroyed");
12281
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12258
diff changeset
2090 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
2091 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
2092 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
2093 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
2094 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
2095 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
2096 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
2097 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
2098 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
2099 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
2100 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
2101 end):next(function(pong)
12551
3b7e97e0a8ef mod_admin_shell: Show session id ping reply came
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
2102 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
2103 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
2104 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2105
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2106 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
2107 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
2108
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2109 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
2110 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
2111 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
2112 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
2113 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
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 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
2116 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2117
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2118 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
2119 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
2120 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
2121 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
2122 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2123
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2124 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
2125 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
2126 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
2127 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
2128 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
2129 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2130
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2131 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
2132 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
2133 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
2134 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
2135 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
2136 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2137
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2138 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
2139 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
2140 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
2141 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
2142 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
2143 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2144
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2145 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
2146 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
2147 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
2148 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
2149 end
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 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
2152
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2153 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
2154 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
2155 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
2156 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
2157 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
2158 { 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
2159 { 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
2160 }, self.session.width);
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2161 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
2162 { title = "Module"; width = "1p" };
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2163 { 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
2164 { 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
2165 }, 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
2166
11361
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2167 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
2168 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
2169 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
2170 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
2171 if host == "*" then
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2172 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
2173 else
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11042
diff changeset
2174 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
2175 end
13117
7eb6244b4984 mod_admin_shell: Show internal URL where different from external
Kim Alvefur <zash@zash.se>
parents: 13108
diff changeset
2176 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
2177 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
2178 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
2179 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
2180 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
2181 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
2182 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
2183 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
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 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2186 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2187 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2188
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2189 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
2190 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
2191 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
2192 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2193 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
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 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
2196 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
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 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
2199
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2200 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
2201 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
2202 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
2203 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
2204 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
2205 writing = true;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2206 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
2207 writing = false;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2208 end);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2209
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2210 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
2211 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
2212 end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2213 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
2214 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
2215 end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
diff changeset
2216 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
2217
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2218 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
2219 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
2220 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
2221 local function handler(event_type, stanza, session)
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2222 if stanza then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2223 if event_type == "sent" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2224 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
2225 elseif event_type == "received" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2226 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
2227 else
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2228 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
2229 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2230 self.session.print(stanza);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2231 elseif session then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2232 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
2233 elseif event_type then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2234 self.session.print("\n<!-- "..event_type.." -->");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2235 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2236 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2237
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2238 stanza_watchers.add({
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2239 target_spec = {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2240 jid = target_spec;
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2241 };
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2242 filter_spec = filter_spec and {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2243 with_jid = filter_spec;
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 }, handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2246
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2247 while self.session.is_connected() do
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2248 async.sleep(3);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2249 end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2250
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2251 stanza_watchers.remove(handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2252 end
12399
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12398
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 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
2255
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2256 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
2257 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
2258 if host == "*" then
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2259 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
2260 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
2261 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
2262 return true
13104
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2263 else
8c786880e28d mod_admin_shell: Allow logging global events with debug:logevents("*")
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
2264 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
2265 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
2266 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
2267 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2268
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2269 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
2270 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
2271 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
2272 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
2273 if host == "http" then
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2274 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
2275 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
2276 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
2277 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2278 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
2279 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2280 else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2281 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
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 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
2284 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2285
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2286 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
2287 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
2288 local print = self.session.print;
12977
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12927
diff changeset
2289 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
2290 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
2291 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
2292 return t;
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2293 end
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
2294 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
2295 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
2296 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
2297 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
2298 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
2299 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
2300 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
2301 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
2302 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
2303 end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2304 if h then
11478
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2305 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
2306 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
2307 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
2308 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
2309 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
2310 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
2311 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
2312 else
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2313 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
2314 end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10929
diff changeset
2315 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
2316 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
2317 end
11478
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2318 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
2319 end
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
2320 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
2321 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
2322 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
2323 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2324 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2325 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
2326 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
2327 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
2328 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
2329 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
2330 end
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 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
2333 end
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 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
2335 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
2336 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
2337 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
2338 end
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 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
2341 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2342
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2343 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
2344 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
2345 local print = self.session.print;
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2346 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
2347
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 then
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2349 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
2350 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
2351 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
2352 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
2353 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
2354 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
2355 else
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2356 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
2357 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
2358 print("Stanza:")
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2359 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
2360 else
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2361 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
2362 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2363 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
2364
13334
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2365 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
2366 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
2367 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
2368 print("");
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2369 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
2370 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
2371 end
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 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
2374 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2375
13338
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2376 local row = format_table({
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2377 { title = "ID"; width = 12 };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2378 { title = "Function"; width = "10p" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2379 { title = "Status"; width = "16" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2380 { title = "Location"; width = "10p" };
470ab6b55e93 mod_admin_shell: Fix lint [luacheck]
Kim Alvefur <zash@zash.se>
parents: 13334
diff changeset
2381 }, 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
2382 print(row())
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2383
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2384 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
2385 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
2386 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
2387 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
2388 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
2389 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
2390 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2391 -- 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
2392 -- 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
2393 -- 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
2394 -- 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
2395 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
2396 print(row {
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2397 runner.id;
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2398 tostring(f);
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2399 ("%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
2400 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
2401 });
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 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
2404 end
aefcb6b4f47d mod_admin_shell: Add debug:async() command to show blocked async runners
Matthew Wild <mwild1@gmail.com>
parents: 13287
diff changeset
2405
13819
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2406 describe_command [[debug:cert_index([path]) - Show Prosody's view of a directory of certs]]
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2407 function def_env.debug:cert_index(path)
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2408 local print = self.session.print;
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2409 local cm = require "core.certmanager";
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2410
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2411 path = path or module:get_option("certificates", "certs");
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2412
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2413 local sink = logger.add_simple_sink(function (source, level, message)
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2414 if source == "certmanager" then
13823
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2415 if level == "debug" or level == "info" then
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2416 level = "II";
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2417 elseif level == "warn" or level == "error" then
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2418 level = "EE";
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2419 end
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2420 self.session.print(level..": "..message);
13819
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2421 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2422 end);
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2423
13823
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2424 print("II: Scanning "..path.."...");
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2425
13819
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2426 local index = {};
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2427 cm.index_certs(path, index)
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2428
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2429 if not logger.remove_sink(sink) then
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2430 module:log("warn", "Unable to remove log sink");
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2431 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2432
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2433 local c, max_domain = 0, 8;
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2434 for domain in pairs(index) do
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2435 if #domain > max_domain then
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2436 max_domain = #domain;
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2437 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2438 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2439
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2440 print("");
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2441
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2442 local row = format_table({
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2443 { title = "Domain", width = max_domain };
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2444 { title = "Certificate", width = "100%" };
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2445 { title = "Service", width = 5 };
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2446 }, self.session.width);
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2447 print(row());
13823
e78e79f1b5f5 mod_admin_shell: Visual tweaks to the output of debug:cert_index()
Matthew Wild <mwild1@gmail.com>
parents: 13819
diff changeset
2448 print(("-"):rep(self.session.width or 80));
13819
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2449 for domain, certs in it.sorted_pairs(index) do
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2450 for cert_file, services in it.sorted_pairs(certs) do
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2451 for service in it.sorted_pairs(services) do
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2452 c = c + 1;
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2453 print(row({ domain, cert_file, service }));
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2454 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2455 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2456 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2457
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2458 print("");
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2459
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2460 return true, ("Showing %d certificates in %s"):format(c, path);
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2461 end
3ee95eb17045 mod_admin_shell: Add debug:cert_index() command
Matthew Wild <mwild1@gmail.com>
parents: 13796
diff changeset
2462
13828
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2463 def_env.role = new_section("Role and access management");
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2464
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2465 describe_command [[role:list(host) - List known roles]]
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2466 function def_env.role:list(host)
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2467 if not host then
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2468 return nil, "Specify which host to list roles for";
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2469 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2470 local role_list = {};
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2471 for _, role in it.sorted_pairs(um.get_all_roles(host)) do
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2472 table.insert(role_list, role);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2473 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2474 table.sort(role_list, function (a, b)
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2475 if a.priority ~= b.priority then
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2476 return (a.priority or 0) > (b.priority or 0);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2477 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2478 return a.name < b.name;
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2479 end);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2480 for _, role in ipairs(role_list) do
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2481 self.session.print(role.name);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2482 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2483 return true, ("Showing %d roles on %s"):format(#role_list, host);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2484 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2485
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2486 describe_command [[role:show(host, role_name) - Show information about a role]]
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2487 function def_env.role:show(host, role_name)
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2488 if not host or not role_name then
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2489 return nil, "Specify the host and role to show";
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2490 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2491
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2492 local print = self.session.print;
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2493 local role = um.get_role_by_name(role_name, host);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2494
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2495 if not role then
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2496 return nil, ("Unable to find role %s on host %s"):format(role_name, host);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2497 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2498
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2499 local inherits = {};
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2500 for _, inherited_role in ipairs(role.inherits or {}) do
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2501 table.insert(inherits, inherited_role.name);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2502 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2503
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2504 local permissions = {};
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2505 for permission, is_allowed in role:policies() do
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2506 permissions[permission] = is_allowed and "allowed" or "denied";
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2507 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2508
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2509 print("Name: ", role.name);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2510 print("Inherits:", table.concat(inherits, ", "));
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2511 print("Policies:");
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2512 local c = 0;
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2513 for permission, policy in it.sorted_pairs(permissions) do
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2514 c = c + 1;
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2515 print(" ["..(policy == "allowed" and "+" or " ").."] " .. permission);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2516 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2517 print("");
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2518 return true, ("Showing role %s with %d policies"):format(role.name, c);
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2519 end
a071b20ccc0f mod_admin_shell: Add role:list() and role:show() commands
Matthew Wild <mwild1@gmail.com>
parents: 13823
diff changeset
2520
13349
d5d4e386c6fb mod_admin_shell: Refactor help to data structures for extensibility
Matthew Wild <mwild1@gmail.com>
parents: 13338
diff changeset
2521 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
2522
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2523 local short_units = {
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2524 seconds = "s",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2525 bytes = "B",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2526 };
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2527
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2528 local stats_methods = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2529
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2530 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
2531 local creation_timestamp, sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2532 local buckets = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2533 local prev_bucket_count = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2534 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
2535 if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2536 creation_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2537 elseif suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2538 sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2539 elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2540 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
2541 elseif extra_labels then
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2542 local bucket_threshold = extra_labels["le"]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2543 local bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2544 if cumulative then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2545 bucket_count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2546 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2547 bucket_count = value - prev_bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2548 prev_bucket_count = value
10887
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10878
diff changeset
2549 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2550 if bucket_threshold == "+Inf" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2551 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
2552 elseif bucket_threshold ~= nil then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2553 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
2554 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
2555 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2556 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2557
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2558 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
2559 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
2560 return false
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2561 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
2562
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2563 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
2564 if graph_width < 8 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2565 wscale = 8
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2566 elseif graph_width < 16 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2567 wscale = 4
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2568 elseif graph_width < 32 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2569 wscale = 2
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2570 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2571 local eighth_chars = " ▁▂▃▄▅▆▇█";
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2572
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2573 local max_bin_samples = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2574 for _, bucket in ipairs(buckets) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2575 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
2576 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
2577 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2578 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2579
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2580 print("");
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2581 print(prefix)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2582 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
2583 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
2584 local row_chars = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2585 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
2586 for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2587 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
2588 if char_eighths < min_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2589 min_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2590 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2591 if char_eighths > max_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2592 max_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2593 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2594 if char_eighths == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2595 row_chars[i] = ("-"):rep(wscale);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2596 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2597 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
2598 row_chars[i] = char:rep(wscale);
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 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2601 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
2602 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2603
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2604 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
2605 local row = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2606 for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2607 local threshold = buckets[i].threshold
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2608 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
2609 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2610 t_insert(row, " " .. metric_family.unit)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2611 print(t_concat(row, "/"))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2612
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2613 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
2614 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2615
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2616 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
2617 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
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
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2620 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
2621 -- cf = cumulative frequency
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2622 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
2623 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2624
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2625 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
2626 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
2627 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
2628 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
2629 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
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
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2632 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
2633 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
2634 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2635 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2636 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
2637 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2638
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2639 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
2640 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
2641 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
2642 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
2643 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
2644 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2645
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2646 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
2647 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
2648 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2649 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2650 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
2651 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2652
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2653 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
2654 local created_timestamp, current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2655 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
2656 if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2657 created_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2658 elseif suffix == "_total" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2659 current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2660 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2661 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2662 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
2663 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
2664 local unit = base_unit .. "/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2665 local factor = 1
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2666 if base_unit == "s" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2667 -- be smart!
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2668 unit = "%"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2669 factor = 100
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2670 elseif base_unit == "" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2671 unit = "events/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2672 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2673 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
2674 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2675 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2676
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2677 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
2678 local current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2679 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
2680 current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2681 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2682 if current_value then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2683 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
2684 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
2685 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2686 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2687
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2688 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
2689 local sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2690 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
2691 if suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2692 sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2693 elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2694 count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2695 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2696 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2697 if sum and count then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2698 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
2699 if count == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2700 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
2701 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2702 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
2703 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2704 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2705 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2706
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2707 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
2708 local labelkeys = metric_family.label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2709 if #labelkeys > 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2710 print(family_name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2711 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
2712 local labels = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2713 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
2714 local v = labelset[i]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2715 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
2716 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2717 local prefix = " "..t_concat(labels, " ")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2718 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
2719 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2720 else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2721 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
2722 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
2723 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2724 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2725 end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2726
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2727 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
2728 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
2729 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
2730 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
2731 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
2732 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2733 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
2734 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
2735 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2736 print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2737 else
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2738 local metric_family = stat_info[2]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2739 if metric_family.type_ == "counter" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2740 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
2741 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
2742 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
2743 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
2744 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
2745 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
2746 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2747 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2748 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
2749 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2750
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2751 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
2752 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
2753 -- 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
2754 -- 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
2755 -- 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
2756 -- the next sample and so on.
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2757 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
2758 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2759
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2760 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
2761 -- 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
2762 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
2763 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
2764 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
2765 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
2766 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
2767 end
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2768 local collect = statsman.collect
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2769 if collect then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2770 -- force collection if in manual mode
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2771 collect()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2772 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
2773 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
2774 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
2775 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
2776 table.insert(displayed_stats, {
11523
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2777 family_name,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2778 metric_family,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2779 output = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11504
diff changeset
2780 })
10856
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2781 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2782 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2783 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
2784 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2785
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2786 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
2787 type = "object";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2788 properties = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2789 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
2790 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
2791
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2792 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
2793 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
2794 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
2795 args = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2796 type = "array";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2797 items = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2798 type = "object";
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2799 properties = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2800 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
2801 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
2802 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2803 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2804 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2805 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2806
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2807 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
2808 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2809
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2810 -- 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
2811 -- 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
2812 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
2813
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2814 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
2815 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
2816 local command = event.item;
13603
6e5124f72e9a mod_admin_shell: Fix reporting origin module for commands
Kim Alvefur <zash@zash.se>
parents: 13598
diff changeset
2817 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
2818 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
2819 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
2820 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2821 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2822
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2823 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
2824
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2825 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
2826 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
2827 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
2828 return;
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 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
2831 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
2832 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
2833 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
2834 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
2835 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
2836 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
2837 break;
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 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2840 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
2841 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
2842 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2843 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2844 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
2845 [false] = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2846 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
2847 handler = function (...)
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2848 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
2849 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
2850 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
2851 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2852 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
2853 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
2854 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2855 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
2856 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
2857 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
2858 end
13354
83f3076965f6 mod_admin_shell: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents: 13352
diff changeset
2859 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
2860 end;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2861 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2862 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2863 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
2864 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2865 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
2866 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
2867 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2868 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
2869 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2870
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2871 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
2872 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
2873 section_t = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2874 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
2875 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2876
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2877 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
2878 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
2879 else
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2880 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
2881 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2882
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2883 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
2884 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
2885 section_mt = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2886 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
2887 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2888 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
2889 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
2890 section_help = {
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2891 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
2892 commands = {};
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2893 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2894 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
2895 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2896
13734
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2897 if command.flags then
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2898 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
2899 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
2900 end
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2901 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
2902 command.flags.strict = true;
c133635d0bc6 mod_admin_shell: Improved error handling for shell-invoked commands
Matthew Wild <mwild1@gmail.com>
parents: 13732
diff changeset
2903 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
2904 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
2905
13350
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2906 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
2907 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
2908 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
2909 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
2910 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
2911 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
2912 };
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2913
13605
74a8006ee7f6 mod_admin_shell: Remove redundant 'mod_' prefix from debug message
Kim Alvefur <zash@zash.se>
parents: 13603
diff changeset
2914 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
2915 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2916
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2917 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
2918 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
2919
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2920 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
2921 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
2922 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2923 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2924
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2925 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
2926 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
2927 return;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2928 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2929
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2930 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
2931 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
2932 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
2933 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2934
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2935 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
2936 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
2937 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
2938 -- 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
2939 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
2940 -- 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
2941 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
2942 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
2943 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
2944 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
2945 break;
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2946 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2947 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2948 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
2949 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
2950 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2951 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2952 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2953 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2954 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
2955 end
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2956
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2957 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
2958
0573401b0f9f mod_admin_shell: Support for 'shell-command' items (global and per-host)
Matthew Wild <mwild1@gmail.com>
parents: 13349
diff changeset
2959 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
2960 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
2961 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
2962
12464
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2963 function module.unload()
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2964 stanza_watchers.cleanup();
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12399
diff changeset
2965 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
2966
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2967
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2968 -------------
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2969
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2970 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
2971 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
2972 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
2973 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
2974 ____ \ / _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2975 | _ \ _ __ ___ ___ _-_ __| |_ _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2976 | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2977 | __/| | | (_) \__ \ |_| | (_| | |_| |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2978 |_| |_| \___/|___/\___/ \__,_|\__, |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2979 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
2980
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2981 ]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2982 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2983 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
2984 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
2985 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
2986 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
2987 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2988 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
2989 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
2990 end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2991 end