plugins/mod_admin_shell.lua
author Kim Alvefur <zash@zash.se>
Sat, 08 Apr 2023 11:28:55 +0200
changeset 13066 da51c36ed1e7
parent 13065 7e0bb5154f3b
child 13075 b5a419ac0f84
permissions -rw-r--r--
mod_admin_shell: Add config:set([host,] key, value) because why not We had config:get() but not this. > <MattJ> Yeah, why did we never implement that? Handy if you want to quickly try out settings without reloading the whole config.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10860
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
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    13
local hostmanager = require "prosody.core.hostmanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    14
local modulemanager = require "prosody.core.modulemanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    15
local s2smanager = require "prosody.core.s2smanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    16
local portmanager = require "prosody.core.portmanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    17
local helpers = require "prosody.util.helpers";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    18
local server = require "prosody.net.server";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    19
local st = require "prosody.util.stanza";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
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
    22
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
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
    24
12593
39ae08180c81 compat: Remove handling of Lua 5.1 location of 'unpack' function
Kim Alvefur <zash@zash.se>
parents: 12555
diff changeset
    25
local unpack = table.unpack;
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    26
local iterators = require "prosody.util.iterators";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
local keys, values = iterators.keys, iterators.values;
13017
430333198e4c mod_admin_shell: Allow matching on host or bare JID in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12997
diff changeset
    28
local jid_bare, jid_split, jid_join, jid_resource, jid_compare = import("prosody.util.jid", "bare", "prepped_split", "join", "resource", "compare");
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    29
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: 12931
diff changeset
    30
local cert_verify_identity = require "prosody.util.x509".verify_identity;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    31
local envload = require "prosody.util.envload".envload;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    32
local envloadfile = require "prosody.util.envload".envloadfile;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    33
local has_pposix, pposix = pcall(require, "prosody.util.pposix");
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    34
local async = require "prosody.util.async";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    35
local serialization = require "prosody.util.serialization";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
local serialize_config = serialization.new ({ fatal = false, unquoted = true});
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    37
local time = require "prosody.util.time";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    38
local promise = require "prosody.util.promise";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    39
local logger = require "prosody.util.logger";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
    41
local t_insert = table.insert;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
    42
local t_concat = table.concat;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
    43
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    44
local format_number = require "prosody.util.human.units".format;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
    45
local format_table = require "prosody.util.human.io".table;
10891
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
    46
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
    47
local function capitalize(s)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
    48
	if not s then return end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
    49
	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: 11854
diff changeset
    50
end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
    51
11935
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    52
local function pre(prefix, str, alt)
12509
604bb5b8362d mod_admin_shell: Tighten up type checks to fix #1754 (thanks clouded)
Kim Alvefur <zash@zash.se>
parents: 12308
diff changeset
    53
	if type(str) ~= "string" or str == "" then return alt or ""; end
11935
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    54
	return prefix .. str;
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    55
end
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    56
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    57
local function suf(str, suffix, alt)
12509
604bb5b8362d mod_admin_shell: Tighten up type checks to fix #1754 (thanks clouded)
Kim Alvefur <zash@zash.se>
parents: 12308
diff changeset
    58
	if type(str) ~= "string" or str == "" then return alt or ""; end
11935
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    59
	return str .. suffix;
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    60
end
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
    61
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
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
    63
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
    64
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
    65
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
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
    67
	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
    68
	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
    69
		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
    70
		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
    71
		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
    72
	end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
	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
    74
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
console = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
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
    79
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
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
    81
	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
    82
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
	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
    84
	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
    85
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
12401
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12308
diff changeset
    87
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: 12308
diff changeset
    88
	return session.send(st.stanza("repl-output", attr):text(tostring(line)));
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
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
    92
	local session = {
11954
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    93
		send = function (t)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    94
			return send_repl_output(admin_session, t);
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    95
		end;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    96
		print = function (...)
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    97
			local t = {};
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    98
			for i=1,select("#", ...) do
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
    99
				t[i] = tostring(select(i, ...));
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   100
			end
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   101
			return send_repl_output(admin_session, table.concat(t, "\t"));
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   102
		end;
12401
ddf02f2a3354 mod_admin_shell: Add session.write() method to write data to client with no \n
Matthew Wild <mwild1@gmail.com>
parents: 12308
diff changeset
   103
		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: 12308
diff changeset
   104
			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: 12308
diff changeset
   105
		end;
11954
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   106
		serialize = tostring;
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   107
		disconnect = function () admin_session:close(); end;
12402
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12401
diff changeset
   108
		is_connected = function ()
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12401
diff changeset
   109
			return not not admin_session.conn;
478fff93ac37 mod_admin_shell: Add session.is_connected() method
Matthew Wild <mwild1@gmail.com>
parents: 12401
diff changeset
   110
		end
11954
d2a9e95fd27b mod_admin_shell: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 11953
diff changeset
   111
	};
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   112
	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
   113
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   114
	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
   115
		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
   116
	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
   117
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   118
	-- 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
   119
	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
   120
		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
   121
			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
   122
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   123
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   124
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
	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
   126
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   127
	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
   128
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
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
   131
	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
   132
	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
   133
		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
   134
		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
   135
	end
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
   136
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
   137
	local default_width = 132; -- The common default of 80 is a bit too narrow for e.g. s2s:show(), 132 was another common width for hardware terminals
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
   138
	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: 12510
diff changeset
   139
	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: 12510
diff changeset
   140
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
	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
   142
	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
   143
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   144
	local result = st.stanza("repl-result");
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   145
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
	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
   147
		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
   148
		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
   149
	else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
		local command = line:match("^%w+") or line:match("%p");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
		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
   152
			commands[command](session, line);
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   153
			event.origin.send(result);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
			return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
		end
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
	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
   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
	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
   161
		commands[line:lower()](session, line);
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   162
		event.origin.send(result);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
		return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   165
11740
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11611
diff changeset
   166
	if useglobalenv and not session.globalenv then
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11611
diff changeset
   167
		session.globalenv = redirect_output(_G, session);
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11611
diff changeset
   168
	end
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11611
diff changeset
   169
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   170
	local chunkname = "=console";
11740
ddb87df3de30 mod_admin_shell: Keep unrestricted environment for session lifetime
Kim Alvefur <zash@zash.se>
parents: 11611
diff changeset
   171
	local env = (useglobalenv and session.globalenv) or session.env or nil
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   172
	-- luacheck: ignore 311/err
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   173
	local chunk, err = envload("return "..line, chunkname, env);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   174
	if not chunk then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   175
		chunk, err = envload(line, chunkname, env);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   176
		if not chunk then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   177
			err = err:gsub("^%[string .-%]:%d+: ", "");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   178
			err = err:gsub("^:%d+: ", "");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   179
			err = err:gsub("'<eof>'", "the end of the line");
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   180
			result.attr.type = "error";
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   181
			result:text("Sorry, I couldn't understand that... "..err);
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   182
			event.origin.send(result);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
			return;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   184
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   185
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   186
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   187
	local taskok, message = chunk();
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   188
11953
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11950
diff changeset
   189
	if promise.is_promise(taskok) then
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11950
diff changeset
   190
		taskok, message = async.wait_for(taskok);
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11950
diff changeset
   191
	end
ae4bc56f18e0 mod_admin_shell: Wait for promises
Kim Alvefur <zash@zash.se>
parents: 11950
diff changeset
   192
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   193
	if not message then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   194
		if type(taskok) ~= "string" and useglobalenv then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   195
			taskok = session.serialize(taskok);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   196
		end
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   197
		result:text("Result: "..tostring(taskok));
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   198
	elseif (not taskok) and message then
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   199
		result.attr.type = "error";
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   200
		result:text("Error: "..tostring(message));
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   201
	else
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   202
		result:text("OK: "..tostring(message));
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   203
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   204
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   205
	event.origin.send(result);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   206
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   207
10863
8de0057b4279 mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents: 10860
diff changeset
   208
module:hook("admin/repl-input", function (event)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   209
	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
   210
	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
   211
		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
   212
	end
12891
68df46926c26 mod_admin_socket: Return error on unhandled input to prevent apparent freeze
Kim Alvefur <zash@zash.se>
parents: 12792
diff changeset
   213
	return true;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   214
end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   215
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   216
-- 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
   217
-- 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
   218
12228
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   219
local available_columns; --forward declaration so it is reachable from the help
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   220
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   221
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
   222
	local print = 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
   223
	local section = data:match("^help (%w+)");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
	if not section then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   225
		print [[Commands are divided into multiple sections. For help on a particular section, ]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   226
		print [[type: help SECTION (for example, 'help c2s'). Sections are: ]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   227
		print [[]]
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
   228
		local row = format_table({ { title = "Section", width = 7 }, { title = "Description", width = "100%" } }, session.width)
12308
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   229
		print(row())
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   230
		print(row { "c2s"; "Commands to manage local client-to-server sessions" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   231
		print(row { "s2s"; "Commands to manage sessions between this server and others" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   232
		print(row { "http"; "Commands to inspect HTTP services" }) -- XXX plural but there is only one so far
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   233
		print(row { "module"; "Commands to load/reload/unload modules/plugins" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   234
		print(row { "host"; "Commands to activate, deactivate and list virtual hosts" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   235
		print(row { "user"; "Commands to create and delete users, and change their passwords" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   236
		print(row { "roles"; "Show information about user roles" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   237
		print(row { "muc"; "Commands to create, list and manage chat rooms" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   238
		print(row { "stats"; "Commands to show internal statistics" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   239
		print(row { "server"; "Uptime, version, shutting down, etc." })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   240
		print(row { "port"; "Commands to manage ports the server is listening on" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   241
		print(row { "dns"; "Commands to manage and inspect the internal DNS resolver" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   242
		print(row { "xmpp"; "Commands for sending XMPP stanzas" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   243
		print(row { "debug"; "Commands for debugging the server" })
12540
a8cb1d7a98db mod_admin_shell: Document the 'watch' section in the built-in help
Kim Alvefur <zash@zash.se>
parents: 12533
diff changeset
   244
		print(row { "watch"; "Commands for watching live logs from the server" })
12308
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   245
		print(row { "config"; "Reloading the configuration, etc." })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   246
		print(row { "columns"; "Information about customizing session listings" })
8210c2a52e9c mod_admin_shell: Use a table to show help sections
Kim Alvefur <zash@zash.se>
parents: 12297
diff changeset
   247
		print(row { "console"; "Help regarding the console itself" })
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   248
	elseif section == "c2s" then
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   249
		print [[c2s:show(jid, columns) - Show all client sessions with the specified JID (or all if no JID given)]]
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   250
		print [[c2s:show_tls(jid) - Show TLS cipher info for encrypted sessions]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   251
		print [[c2s:count() - Count sessions without listing them]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   252
		print [[c2s:close(jid) - Close all sessions for the specified JID]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   253
		print [[c2s:closeall() - Close all active c2s connections ]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   254
	elseif section == "s2s" then
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   255
		print [[s2s:show(domain, columns) - Show all s2s connections for the given domain (or all if no domain given)]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   256
		print [[s2s:show_tls(domain) - Show TLS cipher info for encrypted sessions]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
		print [[s2s:close(from, to) - Close a connection from one domain to another]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   258
		print [[s2s:closeall(host) - Close all the incoming/outgoing s2s sessions to specified host]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   259
	elseif section == "http" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   260
		print [[http:list(hosts) - Show HTTP endpoints]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   261
	elseif section == "module" then
11605
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   262
		print [[module:info(module, host) - Show information about a loaded module]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   263
		print [[module:load(module, host) - Load the specified module on the specified host (or all hosts if none given)]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
		print [[module:reload(module, host) - The same, but unloads and loads the module (saving state if the module supports it)]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   265
		print [[module:unload(module, host) - The same, but just unloads the module from memory]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   266
		print [[module:list(host) - List the modules loaded on the specified host]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   267
	elseif section == "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
   268
		print [[host:activate(hostname) - Activates the specified host]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   269
		print [[host:deactivate(hostname) - Disconnects all clients on this host and deactivates]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   270
		print [[host:list() - List the currently-activated hosts]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   271
	elseif section == "user" then
12674
4a00c8811ea8 mod_admin_shell: Update help for user:create to reflect singular role argument
Kim Alvefur <zash@zash.se>
parents: 12672
diff changeset
   272
		print [[user:create(jid, password, role) - Create the specified user account]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   273
		print [[user:password(jid, password) - Set the password for the specified user account]]
12641
2200f0c6b3f1 mod_admin_shell: Switch names for user role management commands
Kim Alvefur <zash@zash.se>
parents: 12509
diff changeset
   274
		print [[user:roles(jid, host) - Show current roles for an user]]
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   275
		print [[user:setrole(jid, host, role) - Set primary role of a user (see 'help roles')]]
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   276
		print [[user:addrole(jid, host, role) - Add a secondary role to a user]]
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   277
		print [[user:delrole(jid, host, role) - Remove a secondary role from a user]]
12912
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
   278
		print [[user:disable(jid) - Disable the specified user account, preventing login]]
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
   279
		print [[user:enable(jid) - Enable the specified user account, restoring login access]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   280
		print [[user:delete(jid) - Permanently remove the specified user account]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   281
		print [[user:list(hostname, pattern) - List users on the specified host, optionally filtering with a pattern]]
12212
3edf1a38fb15 mod_admin_shell: Add help section about roles
Kim Alvefur <zash@zash.se>
parents: 12130
diff changeset
   282
	elseif section == "roles" then
3edf1a38fb15 mod_admin_shell: Add help section about roles
Kim Alvefur <zash@zash.se>
parents: 12130
diff changeset
   283
		print [[Roles may grant access or restrict users from certain operations]]
3edf1a38fb15 mod_admin_shell: Add help section about roles
Kim Alvefur <zash@zash.se>
parents: 12130
diff changeset
   284
		print [[Built-in roles are:]]
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   285
		print [[  prosody:user     - Normal user (default)]]
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   286
		print [[  prosody:admin    - Host administrator]]
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   287
		print [[  prosody:operator - Server administrator]]
12212
3edf1a38fb15 mod_admin_shell: Add help section about roles
Kim Alvefur <zash@zash.se>
parents: 12130
diff changeset
   288
		print [[]]
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
   289
		print [[Roles can be assigned using the user management commands (see 'help user').]]
11369
5eb817cdd5cd mod_admin_shell: Add help section with (top level) MUC commands
Kim Alvefur <zash@zash.se>
parents: 11368
diff changeset
   290
	elseif section == "muc" then
5eb817cdd5cd mod_admin_shell: Add help section with (top level) MUC commands
Kim Alvefur <zash@zash.se>
parents: 11368
diff changeset
   291
		-- TODO `muc:room():foo()` commands
5eb817cdd5cd mod_admin_shell: Add help section with (top level) MUC commands
Kim Alvefur <zash@zash.se>
parents: 11368
diff changeset
   292
		print [[muc:create(roomjid, { config }) - Create the specified MUC room with the given config]]
5eb817cdd5cd mod_admin_shell: Add help section with (top level) MUC commands
Kim Alvefur <zash@zash.se>
parents: 11368
diff changeset
   293
		print [[muc:list(host) - List rooms on the specified MUC component]]
12295
ec16fb706247 mod_admin_shell: Fix description of muc:room() (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 12285
diff changeset
   294
		print [[muc:room(roomjid) - Reference the specified MUC room to access MUC API methods]]
12869
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
   295
		print [[muc:occupants(roomjid, filter) - List room occupants, optionally filtered on substring or role]]
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
   296
		print [[muc:affiliations(roomjid, filter) - List affiliated members of the room, optionally filtered on substring or affiliation]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   297
	elseif section == "server" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   298
		print [[server:version() - Show the server's version number]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   299
		print [[server:uptime() - Show how long the server has been running]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   300
		print [[server:memory() - Show details about the server's memory usage]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   301
		print [[server:shutdown(reason) - Shut down the server, with an optional reason to be broadcast to all connections]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   302
	elseif section == "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
   303
		print [[port:list() - Lists all network ports prosody currently listens on]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   304
		print [[port:close(port, interface) - Close a port]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   305
	elseif section == "dns" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   306
		print [[dns:lookup(name, type, class) - Do a DNS lookup]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   307
		print [[dns:addnameserver(nameserver) - Add a nameserver to the list]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   308
		print [[dns:setnameserver(nameserver) - Replace the list of name servers with the supplied one]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   309
		print [[dns:purge() - Clear the 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
   310
		print [[dns:cache() - Show cached records]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   311
	elseif section == "xmpp" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   312
		print [[xmpp:ping(localhost, remotehost) -- Sends a ping to a remote XMPP server and reports the response]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   313
	elseif section == "config" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   314
		print [[config:reload() - Reload the server configuration. Modules may need to be reloaded for changes to take effect.]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   315
		print [[config:get([host,] option) - Show the value of a config option.]]
13066
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13065
diff changeset
   316
		print [[config:set([host,] option, value) - Update the value of a config option without writing to the config file.]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   317
	elseif section == "stats" then -- luacheck: ignore 542
12229
e9f34a04067e mod_admin_shell: Add help section about stats
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
   318
		print [[stats:show(pattern) - Show internal statistics, optionally filtering by name with a pattern]]
e9f34a04067e mod_admin_shell: Add help section about stats
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
   319
		print [[stats:show():cfgraph() - Show a cumulative frequency graph]]
e9f34a04067e mod_admin_shell: Add help section about stats
Kim Alvefur <zash@zash.se>
parents: 12228
diff changeset
   320
		print [[stats:show():histogram() - Show a histogram of selected metric]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   321
	elseif section == "debug" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   322
		print [[debug:logevents(host) - Enable logging of fired events 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
   323
		print [[debug:events(host, event) - Show registered event handlers]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   324
		print [[debug:timers() - Show information about scheduled timers]]
12540
a8cb1d7a98db mod_admin_shell: Document the 'watch' section in the built-in help
Kim Alvefur <zash@zash.se>
parents: 12533
diff changeset
   325
	elseif section == "watch" then
a8cb1d7a98db mod_admin_shell: Document the 'watch' section in the built-in help
Kim Alvefur <zash@zash.se>
parents: 12533
diff changeset
   326
		print [[watch:log() - Follow debug logs]]
a8cb1d7a98db mod_admin_shell: Document the 'watch' section in the built-in help
Kim Alvefur <zash@zash.se>
parents: 12533
diff changeset
   327
		print [[watch:stanzas(target, filter) - Watch live stanzas matching the specified target and filter]]
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   328
	elseif section == "console" then
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   329
		print [[Hey! Welcome to Prosody's admin console.]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   330
		print [[First thing, if you're ever wondering how to get out, simply type 'quit'.]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   331
		print [[Secondly, note that we don't support the full telnet protocol yet (it's coming)]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   332
		print [[so you may have trouble using the arrow keys, etc. depending on your system.]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   333
		print [[]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   334
		print [[For now we offer a couple of handy shortcuts:]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   335
		print [[!! - Repeat the last command]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   336
		print [[!old!new! - repeat the last command, but with 'old' replaced by 'new']]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   337
		print [[]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   338
		print [[For those well-versed in Prosody's internals, or taking instruction from those who are,]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   339
		print [[you can prefix a command with > to escape the console sandbox, and access everything in]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   340
		print [[the running server. Great fun, but be careful not to break anything :)]]
12228
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   341
	elseif section == "columns" then
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   342
		print [[The columns shown by c2s:show() and s2s:show() can be customizied via the]]
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   343
		print [['columns' argument as described here.]]
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   344
		print [[]]
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   345
		print [[Columns can be specified either as "id jid ipv" or as {"id", "jid", "ipv"}.]]
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   346
		print [[Available columns are:]]
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   347
		local meta_columns = {
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   348
			{ title = "ID"; width = 5 };
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   349
			{ title = "Column Title"; width = 12 };
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   350
			{ title = "Description"; width = 12 };
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   351
		};
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   352
		-- auto-adjust widths
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   353
		for column, spec in pairs(available_columns) do
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   354
			meta_columns[1].width = math.max(meta_columns[1].width or 0, #column);
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   355
			meta_columns[2].width = math.max(meta_columns[2].width or 0, #(spec.title or ""));
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   356
			meta_columns[3].width = math.max(meta_columns[3].width or 0, #(spec.description or ""));
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   357
		end
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
   358
		local row = format_table(meta_columns, session.width)
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   359
		print(row());
12228
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   360
		for column, spec in iterators.sorted_pairs(available_columns) do
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   361
			print(row({ column, spec.title, spec.description }));
12228
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   362
		end
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   363
		print [[]]
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   364
		print [[Most fields on the internal session structures can also be used as columns]]
12262
99560987ea19 mod_admin_shell: Fix typo in comment [codespell]
Kim Alvefur <zash@zash.se>
parents: 12233
diff changeset
   365
		-- Also, you can pass a table column specification directly, with mapper callback and all
10860
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 environment --
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   370
-- 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
   371
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   372
--luacheck: ignore 212/self
11895
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   373
local serialize_defaults = module:get_option("console_prettyprint_settings",
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   374
	{ fatal = false; unquoted = true; maxdepth = 2; table_iterator = "pairs" })
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   375
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   376
def_env.output = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   377
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
   378
	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
   379
		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
   380
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   381
	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
   382
		-- 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
   383
		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
   384
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   385
	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
   386
		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
   387
			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
   388
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   389
	end
11895
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   390
	if opts.table_iterator == "pairs" then
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   391
		opts.table_iterator = pairs;
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   392
	elseif type(opts.table_iterator) ~= "function" then
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   393
		opts.table_iterator = nil; -- rawpairs is the default
6a241e66eec5 mod_admin_shell: Respect metatables in output serialization
Kim Alvefur <zash@zash.se>
parents: 11893
diff changeset
   394
	end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   395
	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
   396
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   397
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   398
def_env.server = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   399
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   400
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
   401
	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
   402
	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
   403
	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
   404
	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
   405
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   406
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   407
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
   408
	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
   409
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   410
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   411
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
   412
	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
   413
	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
   414
	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
   415
	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
   416
	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
   417
	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
   418
	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
   419
	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
   420
	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
   421
		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
   422
		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
   423
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   424
11835
94cd363116a3 mod_admin_shell: Allow passing an exit code to server:shutdown()
Kim Alvefur <zash@zash.se>
parents: 11740
diff changeset
   425
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: 11740
diff changeset
   426
	prosody.shutdown(reason, code);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   427
	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
   428
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   429
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   430
local function human(kb)
10891
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
   431
	return format_number(kb*1024, "B", "b");
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   432
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   433
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   434
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
   435
	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
   436
		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
   437
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   438
	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
   439
	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
   440
	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
   441
	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
   442
	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
   443
	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
   444
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   445
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   446
def_env.module = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   447
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   448
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
   449
	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
   450
		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
   451
			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
   452
		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
   453
			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
   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
	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
   456
		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
   457
	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
   458
		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
   459
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   460
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   461
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   462
-- 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
   463
-- 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
   464
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
   465
	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
   466
	/ 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
   467
			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
   468
				-- 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
   469
				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
   470
					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
   471
				else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   472
					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
   473
				end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   474
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   475
			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
   476
				-- 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
   477
				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
   478
					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
   479
				else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   480
					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
   481
				end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   482
			end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   483
			-- 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
   484
			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
   485
		end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   486
	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
   487
		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
   488
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   489
	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
   490
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   491
11605
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   492
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: 11527
diff changeset
   493
	if not name then
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   494
		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: 11527
diff changeset
   495
	end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   496
	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: 11527
diff changeset
   497
	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: 11527
diff changeset
   498
	if hosts:empty() then
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   499
		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: 11527
diff changeset
   500
	end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   501
11936
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
   502
	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: 11935
diff changeset
   503
12544
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   504
	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: 12542
diff changeset
   505
		if not t then
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   506
			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: 12542
diff changeset
   507
		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: 12542
diff changeset
   508
			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: 12542
diff changeset
   509
		else
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   510
			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: 12542
diff changeset
   511
		end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   512
	end
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   513
11610
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   514
	local friendly_descriptions = {
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   515
		["adhoc-provider"] = "Ad-hoc commands",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   516
		["auth-provider"] = "Authentication provider",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   517
		["http-provider"] = "HTTP services",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   518
		["net-provider"] = "Network service",
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   519
		["storage-provider"] = "Storage driver",
11935
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
   520
		["measure"] = "Legacy metrics",
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
   521
		["metric"] = "Metrics",
11995
bef2a59b00d1 mod_admin_shell: List periodic tasks in module:info
Kim Alvefur <zash@zash.se>
parents: 11958
diff changeset
   522
		["task"] = "Periodic task",
11610
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   523
	};
11611
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   524
	local item_formatters = {
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   525
		["feature"] = tostring,
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   526
		["identity"] = function(ident) return ident.type .. "/" .. ident.category; end,
11936
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
   527
		["adhoc-provider"] = item_name,
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
   528
		["auth-provider"] = item_name,
92925f1320e7 mod_admin_shell: Factor out simple function in module:info for reuse
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
   529
		["storage-provider"] = item_name,
11947
cf47834d3698 mod_admin_shell: Fix showing default HTTP path in module:info
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
   530
		["http-provider"] = function(item, mod) return mod:http_url(item.name, item.default_path); end,
12542
0f56587bb37f mod_admin_shell: Drop unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 12541
diff changeset
   531
		["net-provider"] = function(item)
12541
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   532
			local service_name = item.name;
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   533
			local ports_list = {};
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   534
			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: 12540
diff changeset
   535
				table.insert(ports_list, "["..interface.."]:"..port);
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   536
			end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   537
			if not ports_list[1] then
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   538
				return service_name..": not listening on any ports";
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   539
			end
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   540
			return service_name..": "..table.concat(ports_list, ", ");
74418f8096b0 mod_admin_shell: Show bound ports in module:info
Kim Alvefur <zash@zash.se>
parents: 12540
diff changeset
   541
		end,
11935
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
   542
		["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: 11934
diff changeset
   543
		["metric"] = function(item)
c65d5da8e99a mod_admin_shell: List collected metrics in module:info
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
   544
			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: 11934
diff changeset
   545
		end,
12544
0684506c99d3 mod_admin_shell: Include last (mod_cron) task run time in module:info()
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
   546
		["task"] = function (item) return string.format("%s (%s, %s)", item.name or item.id, item.when, task_timefmt(item.last)); end
11611
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   547
	};
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   548
11605
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   549
	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: 11527
diff changeset
   550
		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: 11527
diff changeset
   551
		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: 11527
diff changeset
   552
			print("in global context");
11608
7466bf65d7c8 mod_admin_shell: module:info: Use existing host string representation
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
   553
		else
7466bf65d7c8 mod_admin_shell: module:info: Use existing host string representation
Kim Alvefur <zash@zash.se>
parents: 11607
diff changeset
   554
			print("on " .. tostring(prosody.hosts[mod.module.host]));
11605
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   555
		end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   556
		print("  path: " .. (mod.module.path or "n/a"));
11606
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
   557
		if mod.module.status_message then
78ec0741c2bc mod_admin_shell: module:info: Show module status
Kim Alvefur <zash@zash.se>
parents: 11605
diff changeset
   558
			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: 11605
diff changeset
   559
		end
11609
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
   560
		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: 11608
diff changeset
   561
			print("  provides:");
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
   562
			for kind, items in pairs(mod.module.items) do
11610
0b65d43f4da4 mod_admin_shell: module:info: Show friendlier name for known 'items'
Kim Alvefur <zash@zash.se>
parents: 11609
diff changeset
   563
				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: 11609
diff changeset
   564
				print(string.format("  - %s (%d item%s)", label, #items, #items > 1 and "s" or ""));
11611
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   565
				local formatter = item_formatters[kind];
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   566
				if formatter then
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   567
					for _, item in ipairs(items) do
11854
bfa85965106e mod_admin_shell: Show HTTP base-URLs in module:info()
Kim Alvefur <zash@zash.se>
parents: 11835
diff changeset
   568
						print("    - " .. formatter(item, mod.module));
11611
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   569
					end
03eb4c0dca27 mod_admin_shell: module:info: List 'items' that can be formatted easily
Kim Alvefur <zash@zash.se>
parents: 11610
diff changeset
   570
				end
11609
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
   571
			end
225ef07f2bee mod_admin_shell: module:info: List provided 'items'
Kim Alvefur <zash@zash.se>
parents: 11608
diff changeset
   572
		end
11607
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
   573
		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: 11606
diff changeset
   574
			print("  dependencies:");
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
   575
			for dep in pairs(mod.module.dependencies) do
12931
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12926
diff changeset
   576
				-- 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: 12926
diff changeset
   577
				-- 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: 12926
diff changeset
   578
				-- current host.
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12926
diff changeset
   579
				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: 12926
diff changeset
   580
					print("  - mod_" .. dep);
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12926
diff changeset
   581
				end
11607
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
   582
			end
4e24408a3f57 mod_admin_shell: module:info: List dependencies
Kim Alvefur <zash@zash.se>
parents: 11606
diff changeset
   583
		end
12926
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12912
diff changeset
   584
		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: 12912
diff changeset
   585
			print("  reverse dependencies:");
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12912
diff changeset
   586
			for dep in pairs(mod.module.reverse_dependencies) do
12931
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12926
diff changeset
   587
				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: 12926
diff changeset
   588
					print("  - mod_" .. dep);
918dfbb330fd mod_admin_shell: Limit module dependency listings to loaded on current host
Kim Alvefur <zash@zash.se>
parents: 12926
diff changeset
   589
				end
12926
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12912
diff changeset
   590
			end
aaf055d6fe7a mod_admin_shell: Show reverse dependencies in module:info()
Kim Alvefur <zash@zash.se>
parents: 12912
diff changeset
   591
		end
11605
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   592
	end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   593
	return true;
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   594
end
9483728f890f mod_admin_shell: Add basic command that shows more info about loaded modules
Kim Alvefur <zash@zash.se>
parents: 11527
diff changeset
   595
12607
05ca75309fa0 mod_admin_shell: Remove obsolete module:load() argument from 0.8 time
Kim Alvefur <zash@zash.se>
parents: 12593
diff changeset
   596
function def_env.module:load(name, hosts)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   597
	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
   598
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   599
	-- 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
   600
	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
   601
	for host in 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
   602
		if (not modulemanager.is_loaded(host, name)) then
12607
05ca75309fa0 mod_admin_shell: Remove obsolete module:load() argument from 0.8 time
Kim Alvefur <zash@zash.se>
parents: 12593
diff changeset
   603
			mod, err = modulemanager.load(host, name);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   604
			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
   605
				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
   606
				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
   607
					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
   608
						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
   609
					end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   610
					break;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   611
				end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   612
				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
   613
			else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   614
				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
   615
				self.session.print("Loaded for "..mod.module.host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   616
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   617
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   618
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   619
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   620
	return ok, (ok and "Module loaded onto "..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
   621
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   622
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   623
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
   624
	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
   625
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   626
	-- 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
   627
	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
   628
	for host in 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
   629
		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
   630
			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
   631
			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
   632
				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
   633
				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
   634
			else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   635
				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
   636
				self.session.print("Unloaded 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
   637
			end
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
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   640
	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
   641
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   642
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 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
   644
	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
   645
	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
   646
	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
   647
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   648
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   649
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
   650
	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
   651
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   652
	-- 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
   653
	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
   654
	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
   655
		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
   656
			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
   657
			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
   658
				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
   659
				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
   660
			else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   661
				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
   662
				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
   663
					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
   664
				end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   665
				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
   666
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   667
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   668
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   669
	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
   670
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   671
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   672
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
   673
	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
   674
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   675
	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
   676
	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
   677
		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
   678
		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
   679
		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
   680
			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
   681
				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
   682
			else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   683
				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
   684
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   685
		else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   686
			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
   687
				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
   688
				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
   689
				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
   690
					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
   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
				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
   693
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   694
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   695
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   696
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   697
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   698
def_env.config = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   699
function def_env.config:load(filename, format)
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
   700
	local config_load = require "prosody.core.configmanager".load;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   701
	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
   702
	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
   703
		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
   704
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   705
	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
   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
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   708
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
   709
	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
   710
		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
   711
	end
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
   712
	local config_get = require "prosody.core.configmanager".get
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   713
	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
   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
13066
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13065
diff changeset
   716
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: 13065
diff changeset
   717
	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: 13065
diff changeset
   718
		host, key, value = "*", host, key;
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13065
diff changeset
   719
	end
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13065
diff changeset
   720
	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: 13065
diff changeset
   721
end
da51c36ed1e7 mod_admin_shell: Add config:set([host,] key, value) because why not
Kim Alvefur <zash@zash.se>
parents: 13065
diff changeset
   722
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   723
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
   724
	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
   725
	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
   726
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   727
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   728
def_env.c2s = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   729
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   730
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
   731
	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
   732
		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
   733
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   734
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   735
	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
   736
	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
   737
	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
   738
	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
   739
	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
   740
	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
   741
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   742
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   743
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
   744
	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
   745
	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
   746
	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
   747
	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
   748
	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
   749
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   750
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   751
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: 11854
diff changeset
   752
	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: 11854
diff changeset
   753
		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: 11854
diff changeset
   754
		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: 11854
diff changeset
   755
	end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   756
	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: 11854
diff changeset
   757
end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   758
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   759
local function show_c2s(callback)
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   760
	get_c2s():sort(_sort_by_jid):map(function (session)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   761
		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
   762
	end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   763
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   764
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   765
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
   766
	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
   767
	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
   768
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   769
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   770
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: 11854
diff changeset
   771
	if session.direction == "outgoing" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   772
		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: 11854
diff changeset
   773
	elseif session.direction == "incoming" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   774
		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: 11854
diff changeset
   775
	end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   776
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   777
12228
2b348d65cd69 mod_admin_shell: Add help section about customizing table columns
Kim Alvefur <zash@zash.se>
parents: 12213
diff changeset
   778
available_columns = {
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   779
	jid = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   780
		title = "JID";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   781
		description = "Full JID of user session";
13041
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13040
diff changeset
   782
		width = "3p";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   783
		key = "full_jid";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   784
		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: 11854
diff changeset
   785
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   786
	host = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   787
		title = "Host";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   788
		description = "Local hostname";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   789
		key = "host";
13041
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13040
diff changeset
   790
		width = "1p";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   791
		mapper = function(host, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   792
			return host or get_s2s_hosts(session) or "?";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   793
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   794
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   795
	remote = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   796
		title = "Remote";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   797
		description = "Remote hostname";
13041
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13040
diff changeset
   798
		width = "1p";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   799
		mapper = function(_, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   800
			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: 11854
diff changeset
   801
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   802
	};
12027
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
   803
	port = {
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
   804
		title = "Port";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   805
		description = "Server port used";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   806
		width = #string.format("%d", 0xffff); -- max 16 bit unsigned integer
12027
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
   807
		align = "right";
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
   808
		key = "conn";
12791
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12641
diff changeset
   809
		mapper = function(conn)
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12641
diff changeset
   810
			if conn then
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12641
diff changeset
   811
				return conn:serverport();
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12641
diff changeset
   812
			end
3735ad8d6f8e mod_admin_shell: Ensure connection exists to get port from (fixes #1777)
Kim Alvefur <zash@zash.se>
parents: 12641
diff changeset
   813
		end;
12027
5a3781a12285 mod_admin_shell: Add port as a c2s/s2s:show column definition
Kim Alvefur <zash@zash.se>
parents: 12023
diff changeset
   814
	};
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   815
	dir = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   816
		title = "Dir";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   817
		description = "Direction of server-to-server connection";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   818
		width = #"<->";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   819
		key = "direction";
11892
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
   820
		mapper = function(dir, session)
050c515fe9aa mod_admin_shell: Indicate bi-directional s2s connections
Kim Alvefur <zash@zash.se>
parents: 11891
diff changeset
   821
			if session.incoming and session.outgoing then return "<->"; end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   822
			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: 11854
diff changeset
   823
			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: 11854
diff changeset
   824
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   825
	};
13040
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   826
	id = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   827
		title = "Session ID";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   828
		description = "Internal session ID used in logging";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   829
		-- 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: 13039
diff changeset
   830
		width = math.max(#"c2s", #"s2sin", #"s2sout") + #(tostring({}):match("%x+$")) + 2;
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   831
		key = "id";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   832
	};
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   833
	type = {
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   834
		title = "Type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   835
		description = "Session type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   836
		width = math.max(#"c2s_unauthed", #"s2sout_unauthed");
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   837
		key = "type";
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   838
	};
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   839
	method = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   840
		title = "Method";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   841
		description = "Connection method";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   842
		width = math.max(#"BOSH", #"WebSocket", #"TCP");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   843
		mapper = function(_, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   844
			if session.bosh_version then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   845
				return "BOSH";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   846
			elseif session.websocket_request then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   847
				return "WebSocket";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   848
			else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   849
				return "TCP";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   850
			end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   851
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   852
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   853
	ipv = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   854
		title = "IPv";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   855
		description = "Internet Protocol version (4 or 6)";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   856
		width = #"IPvX";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   857
		key = "ip";
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   858
		mapper = function(ip) if ip then return ip:find(":") and "IPv6" or "IPv4"; end end;
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   859
	};
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   860
	ip = {
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   861
		title = "IP address";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   862
		description = "IP address the session connected from";
13047
d4f7118d1531 mod_admin_shell: Make IP column thinner if IPv6 is disabled
Kim Alvefur <zash@zash.se>
parents: 13046
diff changeset
   863
		width = module:get_option_boolean("use_ipv6", true) and #"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" or #"198.051.100.255";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   864
		key = "ip";
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   865
	};
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   866
	status = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   867
		title = "Status";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   868
		description = "Presence status";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   869
		width = math.max(#"online", #"chat");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   870
		key = "presence";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   871
		mapper = function(p)
11950
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
   872
			if not p then return ""; end
c0a01e5f5656 mod_admin_shell: Reduce width of 'Status' column
Kim Alvefur <zash@zash.se>
parents: 11949
diff changeset
   873
			return p:get_child_text("show") or "online";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   874
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   875
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   876
	secure = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   877
		title = "Security";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   878
		description = "TLS version or security status";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   879
		key = "conn";
13045
61b00bd20074 mod_admin_shell: Fix attempt to compare number with string
Kim Alvefur <zash@zash.se>
parents: 13041
diff changeset
   880
		width = math.max(#"secure", #"TLSvX.Y");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   881
		mapper = function(conn, session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   882
			if not session.secure then return "insecure"; end
11909
bbfa707a4756 mod_admin_shell: Handle absence of connection in security column (thanks arcseconds)
Kim Alvefur <zash@zash.se>
parents: 11896
diff changeset
   883
			if not conn or not conn:ssl() then return "secure" end
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12468
diff changeset
   884
			local tls_info = conn.ssl_info and conn:ssl_info();
11949
142b9c4010fe mod_admin_shell: Reduce width of 'Security' column (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 11947
diff changeset
   885
			return tls_info and tls_info.protocol or "secure";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   886
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   887
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   888
	encryption = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   889
		title = "Encryption";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   890
		description = "Encryption algorithm used (TLS cipher suite)";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   891
		-- openssl ciphers 'ALL:COMPLEMENTOFALL' | tr : \\n | awk 'BEGIN {n=1} length() > n {n=length()} END {print(n)}'
13040
1612c7f7dd55 mod_admin_shell: More dynamic widths calculations
Kim Alvefur <zash@zash.se>
parents: 13039
diff changeset
   892
		width = #"ECDHE-ECDSA-CHACHA20-POLY1305";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   893
		key = "conn";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   894
		mapper = function(conn)
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12468
diff changeset
   895
			local info = conn and conn.ssl_info and conn:ssl_info();
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   896
			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: 11854
diff changeset
   897
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   898
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   899
	cert = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   900
		title = "Certificate";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   901
		description = "Validation status of certificate";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   902
		key = "cert_identity_status";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   903
		width = math.max(#"Expired", #"Self-signed", #"Untrusted", #"Mismatched", #"Unknown");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   904
		mapper = function(cert_status, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   905
			if cert_status then return capitalize(cert_status); end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   906
			if session.cert_chain_status == "Invalid" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   907
				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: 11854
diff changeset
   908
				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: 11854
diff changeset
   909
					return "Expired";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   910
				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: 11854
diff changeset
   911
					return "Self-signed";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   912
				end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   913
				return "Untrusted";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   914
			elseif session.cert_identity_status == "invalid" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   915
				return "Mismatched";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   916
			end
12297
145cb8305c67 mod_admin_shell: Squeeze some characters out of the Certificate column
Kim Alvefur <zash@zash.se>
parents: 12295
diff changeset
   917
			return "Unknown";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   918
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   919
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   920
	sni = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   921
		title = "SNI";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   922
		description = "Hostname requested in TLS";
13041
635ed9a362ee mod_admin_shell: Dynamically size JIDs and hosts
Kim Alvefur <zash@zash.se>
parents: 13040
diff changeset
   923
		width = "1p"; -- same as host, remote etc
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   924
		mapper = function(_, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   925
			if not session.conn then return end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   926
			local sock = session.conn:socket();
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   927
			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: 11854
diff changeset
   928
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   929
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   930
	alpn = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   931
		title = "ALPN";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   932
		description = "Protocol requested in TLS";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   933
		width = math.max(#"http/1.1", #"xmpp-client", #"xmpp-server");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   934
		mapper = function(_, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   935
			if not session.conn then return end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   936
			local sock = session.conn:socket();
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   937
			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: 11854
diff changeset
   938
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   939
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   940
	smacks = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   941
		title = "SM";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   942
		description = "Stream Management (XEP-0198) status";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   943
		key = "smacks";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   944
		-- FIXME shorter synonym for hibernating
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   945
		width = math.max(#"yes", #"no", #"hibernating");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   946
		mapper = function(smacks_xmlns, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   947
			if not smacks_xmlns then return "no"; end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   948
			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: 11854
diff changeset
   949
			return "yes";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   950
		end;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   951
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   952
	smacks_queue = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   953
		title = "SM Queue";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   954
		description = "Length of Stream Management stanza queue";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   955
		key = "outgoing_stanza_queue";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   956
		width = 8;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   957
		align = "right";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   958
		mapper = function (queue)
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12027
diff changeset
   959
			return queue and tostring(queue:count_unacked());
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   960
		end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   961
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   962
	csi = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   963
		title = "CSI State";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   964
		description = "Client State Indication (XEP-0352)";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   965
		key = "state";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   966
		-- TODO include counter
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   967
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   968
	s2s_sasl = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   969
		title = "SASL";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   970
		description = "Server authentication status";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   971
		key = "external_auth";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   972
		width = 10;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   973
		mapper = capitalize
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   974
	};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   975
	dialback = {
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   976
		title = "Dialback";
12233
30ea791ce817 mod_admin_shell: Add descriptions of each column to 'help columns'
Kim Alvefur <zash@zash.se>
parents: 12232
diff changeset
   977
		description = "Legacy server verification";
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   978
		key = "dialback_key";
13039
93c1590b5951 mod_admin_shell: Calculate widths of columns from example values
Kim Alvefur <zash@zash.se>
parents: 13038
diff changeset
   979
		width = math.max(#"Not used", #"Not initiated", #"Initiated", #"Completed");
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   980
		mapper = function (dialback_key, session)
11896
e712133b4de1 util.human.io: Pass nil to cell mapper to signal missing value
Kim Alvefur <zash@zash.se>
parents: 11895
diff changeset
   981
			if not dialback_key then
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   982
				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: 11854
diff changeset
   983
					return "Not used";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   984
				end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   985
				return "Not initiated";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   986
			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: 11854
diff changeset
   987
				return "Initiated";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   988
			else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   989
				return "Completed";
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   990
			end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   991
		end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
   992
	};
12664
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
   993
	role = {
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
   994
		title = "Role";
13038
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13017
diff changeset
   995
		description = "Session role with 'prosody:' prefix removed";
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13017
diff changeset
   996
		width = #"admin";
12664
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
   997
		key = "role";
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
   998
		mapper = function(role)
13038
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13017
diff changeset
   999
			local name = role and role.name;
1387888a5596 mod_admin_shell: Strip 'prosody:' prefix to allow narrower Role column
Kim Alvefur <zash@zash.se>
parents: 13017
diff changeset
  1000
			return name and name:match"^prosody:(%w+)" or name;
12664
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
  1001
		end;
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
  1002
	}
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1003
};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1004
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1005
local function get_colspec(colspec, default)
11891
b043e1bb8e8e mod_admin_shell: Allow passing columns as a string for convenience
Kim Alvefur <zash@zash.se>
parents: 11890
diff changeset
  1006
	if type(colspec) == "string" then colspec = array(colspec:gmatch("%S+")); end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1007
	local columns = {};
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1008
	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: 11854
diff changeset
  1009
		if type(col) == "string" then
13046
0f05804e974d mod_admin_shell: Make default column width 1 part
Kim Alvefur <zash@zash.se>
parents: 13045
diff changeset
  1010
			columns[i] = available_columns[col] or { title = capitalize(col); width = "1p"; key = col };
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1011
		elseif type(col) ~= "table" then
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1012
			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: 11854
diff changeset
  1013
		else
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1014
			columns[i] = col;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1015
		end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1016
	end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1017
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1018
	return columns;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1019
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1020
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1021
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: 11854
diff changeset
  1022
	local print = self.session.print;
12664
e8f57970ced5 mod_admin_shell: Show session role in c2s:show
Kim Alvefur <zash@zash.se>
parents: 12642
diff changeset
  1023
	local columns = get_colspec(colspec, { "id"; "jid"; "role"; "ipv"; "status"; "secure"; "smacks"; "csi" });
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
  1024
	local row = format_table(columns, self.session.width);
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1025
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1026
	local function match(session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1027
		local jid = get_jid(session)
13057
8128c4f1b08b mod_admin_shell: Allow "*" as substitute for 'nil' for easier CLI usage
Kim Alvefur <zash@zash.se>
parents: 13047
diff changeset
  1028
		return (not match_jid) or match_jid == "*" or jid_compare(jid, match_jid);
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1029
	end
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1030
11890
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1031
	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: 11889
diff changeset
  1032
	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: 11889
diff changeset
  1033
		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: 11889
diff changeset
  1034
			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: 11889
diff changeset
  1035
			break
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1036
		end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1037
	end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1038
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1039
	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: 11889
diff changeset
  1040
	local currenthost = nil;
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1041
11921
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1042
	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: 11909
diff changeset
  1043
	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: 11909
diff changeset
  1044
	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: 11909
diff changeset
  1045
	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: 11909
diff changeset
  1046
	for _, session in ipairs(c2s_sessions) do
11890
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1047
		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: 11889
diff changeset
  1048
			currenthost = session.host;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1049
			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: 11889
diff changeset
  1050
			print(row());
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1051
		end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1052
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1053
		print(row(session));
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1054
	end
11921
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1055
	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: 11909
diff changeset
  1056
		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: 11909
diff changeset
  1057
	end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1058
	return true, ("%d c2s sessions shown"):format(total_count);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1059
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1060
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1061
function def_env.c2s:show_tls(match_jid)
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1062
	return self:show(match_jid, { "jid"; "id"; "secure"; "encryption" });
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1063
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1064
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1065
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
  1066
	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
  1067
		return {
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1068
			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
  1069
			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
  1070
		};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1071
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1072
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1073
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1074
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
  1075
	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
  1076
	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
  1077
		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
  1078
			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
  1079
			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
  1080
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1081
	end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1082
	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
  1083
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1084
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1085
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
  1086
	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
  1087
	--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
  1088
	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
  1089
		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
  1090
		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
  1091
	end);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1092
	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
  1093
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1094
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1095
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1096
def_env.s2s = {};
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1097
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: 11854
diff changeset
  1098
	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: 11854
diff changeset
  1099
	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: 11854
diff changeset
  1100
	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: 11854
diff changeset
  1101
	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: 11854
diff changeset
  1102
end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1103
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1104
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: 11854
diff changeset
  1105
	local print = self.session.print;
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1106
	local columns = get_colspec(colspec, { "id"; "host"; "dir"; "remote"; "ipv"; "secure"; "s2s_sasl"; "dialback" });
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
  1107
	local row = format_table(columns, self.session.width);
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1108
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1109
	local function match(session)
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1110
		local host, remote = get_s2s_hosts(session);
13065
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1111
		if not match_jid or match_jid == "*" then
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1112
			return true;
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1113
		elseif host == match_jid or remote == match_jid then
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1114
			return true;
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1115
		elseif match_jid:sub(1, 2) == "*." then
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1116
			-- (host) == *.(host) or sub(.host) == *(.host)
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1117
			if host == match_jid:sub(3) or host:sub(-#match_jid + 1) == match_jid:sub(2) then
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1118
				return true
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1119
			elseif remote == match_jid:sub(3) or remote:sub(-#match_jid + 1) == match_jid:sub(2) then
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1120
				return true
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1121
			end
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1122
		end
7e0bb5154f3b mod_admin_shell: Allow wildcard matches like s2s:show("*.example.com")
Kim Alvefur <zash@zash.se>
parents: 13057
diff changeset
  1123
		return false;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1124
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1125
11890
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1126
	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: 11889
diff changeset
  1127
	local currenthost = nil;
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1128
	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: 11889
diff changeset
  1129
		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: 11889
diff changeset
  1130
			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: 11889
diff changeset
  1131
			break
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1132
		end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1133
	end
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1134
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1135
	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: 11889
diff changeset
  1136
11921
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1137
	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: 11909
diff changeset
  1138
	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: 11909
diff changeset
  1139
	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: 11909
diff changeset
  1140
	local shown_count = #s2s_sessions;
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1141
11890
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1142
	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: 11889
diff changeset
  1143
		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: 11889
diff changeset
  1144
			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: 11889
diff changeset
  1145
			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: 11889
diff changeset
  1146
			print(row());
b0b258e092da mod_admin_shell: Optionally group session listings by host when not included as column
Kim Alvefur <zash@zash.se>
parents: 11889
diff changeset
  1147
		end
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1148
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1149
		print(row(session));
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1150
	end
11921
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1151
	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: 11909
diff changeset
  1152
		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: 11909
diff changeset
  1153
	end
d27b74b25105 mod_admin_shell: Return counts of shown vs total from new table views
Kim Alvefur <zash@zash.se>
parents: 11909
diff changeset
  1154
	return true, ("%d s2s connections shown"):format(total_count);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1155
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1156
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1157
function def_env.s2s:show_tls(match_jid)
11889
197642f9972f mod_admin_shell: New table based implementation of c2s and s2s:show()
Kim Alvefur <zash@zash.se>
parents: 11854
diff changeset
  1158
	return self:show(match_jid, { "id"; "host"; "dir"; "remote"; "secure"; "encryption"; "cert" });
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1159
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1160
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1161
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
  1162
	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
  1163
		print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1164
			("    %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
  1165
				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
  1166
				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
  1167
			)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1168
		);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1169
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1170
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1171
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1172
-- 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
  1173
-- 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
  1174
-- 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
  1175
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
  1176
	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
  1177
		print(
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1178
			("    %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
  1179
				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
  1180
				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
  1181
			)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1182
		);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1183
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1184
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1185
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1186
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
  1187
	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
  1188
	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
  1189
	local domain_sessions = set.new(array.collect(values(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
  1190
		/function(session) return (session.to_host == domain or session.from_host == domain) and session or nil; end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1191
	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
  1192
	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
  1193
		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
  1194
		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
  1195
		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
  1196
			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
  1197
				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
  1198
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1199
		else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1200
			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
  1201
			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
  1202
				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
  1203
				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
  1204
				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
  1205
					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
  1206
					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
  1207
						{
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1208
						  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
  1209
						  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
  1210
						  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
  1211
						};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1212
						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
  1213
						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
  1214
						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
  1215
					};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1216
				else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1217
					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
  1218
						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
  1219
						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
  1220
						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
  1221
					});
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1222
				end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1223
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1224
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1225
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1226
	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
  1227
	-- 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
  1228
	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
  1229
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1230
	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
  1231
		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
  1232
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1233
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1234
	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
  1235
		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
  1236
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1237
	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
  1238
		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
  1239
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1240
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1241
	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
  1242
		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
  1243
		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
  1244
		print("---")
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1245
		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
  1246
		print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1247
		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
  1248
		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
  1249
		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
  1250
			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
  1251
				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
  1252
			else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1253
				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
  1254
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1255
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1256
		print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1257
		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
  1258
		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
  1259
		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
  1260
			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
  1261
		else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1262
			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
  1263
			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
  1264
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1265
		print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1266
		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
  1267
		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
  1268
		print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1269
		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
  1270
		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
  1271
		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
  1272
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1273
	print("---");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1274
	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
  1275
		..(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
  1276
		.." 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
  1277
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1278
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1279
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
  1280
	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
  1281
	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
  1282
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1283
	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
  1284
	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
  1285
		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
  1286
	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
  1287
		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
  1288
	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
  1289
		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
  1290
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1291
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1292
	for _, session in pairs(s2s_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
  1293
		local id = session.id or (session.type..tostring(session):match("[a-f0-9]+$"));
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1294
		if (match_id and match_id == id)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1295
		or (session.from_host == from and session.to_host == 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
  1296
			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
  1297
			(session.close or s2smanager.destroy_session)(session, 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
  1298
			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
  1299
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1300
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1301
	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
  1302
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1303
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1304
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
  1305
	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
  1306
	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
  1307
	for _,session in pairs(s2s_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
  1308
		if not host or session.from_host == host or session.to_host == 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
  1309
			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
  1310
			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
  1311
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1312
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1313
	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
  1314
	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
  1315
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1316
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1317
def_env.host = {}; def_env.hosts = def_env.host;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1318
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1319
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
  1320
	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
  1321
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1322
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
  1323
	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
  1324
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1325
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1326
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
  1327
	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
  1328
	local i = 0;
12680
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1329
	local host_type;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1330
	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
  1331
		i = i + 1;
12680
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1332
		host_type = host_session.type;
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1333
		if host_type == "local" then
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1334
			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
  1335
		else
12680
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1336
			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: 12679
diff changeset
  1337
			if host_type ~= "component" then
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1338
				host_type = host_type .. " component";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1339
			end
12680
3ab3ef9584e3 mod_admin_shell: Rename variable to avoid confusion with global function
Kim Alvefur <zash@zash.se>
parents: 12679
diff changeset
  1340
			print(("%s (%s)"):format(host, host_type));
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1341
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1342
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1343
	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
  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
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1346
def_env.port = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1347
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1348
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
  1349
	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
  1350
	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
  1351
	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
  1352
	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
  1353
		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
  1354
		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
  1355
		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
  1356
			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
  1357
				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
  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
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1360
		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
  1361
		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
  1362
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1363
	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
  1364
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1365
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1366
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
  1367
	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
  1368
	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
  1369
	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
  1370
	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
  1371
		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
  1372
			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
  1373
				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
  1374
					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
  1375
					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
  1376
					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
  1377
						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
  1378
					else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1379
						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
  1380
					end
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
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1383
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1384
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1385
	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
  1386
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1387
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1388
def_env.muc = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1389
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1390
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
  1391
	__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
  1392
	__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
  1393
		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
  1394
	end;
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1395
};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1396
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1397
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
  1398
	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
  1399
	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
  1400
		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
  1401
	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
  1402
		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
  1403
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1404
	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
  1405
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1406
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1407
local function get_muc(room_jid)
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1408
	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: 12870
diff changeset
  1409
	if not room_name then
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1410
		return room_name, host;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1411
	end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1412
	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: 12870
diff changeset
  1413
	if not room_obj then
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1414
		return nil, "No such room: "..room_jid;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1415
	end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1416
	return room_obj;
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1417
end
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1418
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1419
local muc_util = module:require"muc/util";
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1420
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1421
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
  1422
	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
  1423
	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
  1424
		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
  1425
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1426
	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
  1427
	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
  1428
	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
  1429
	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
  1430
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1431
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1432
function def_env.muc:room(room_jid)
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1433
	local room_obj, err = get_muc(room_jid);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1434
	if not room_obj then
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1435
		return room_obj, err;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1436
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1437
	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
  1438
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1439
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1440
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
  1441
	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
  1442
	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
  1443
		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
  1444
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1445
	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
  1446
	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
  1447
	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
  1448
		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
  1449
		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
  1450
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1451
	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
  1452
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1453
12869
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1454
function def_env.muc:occupants(room_jid, filter)
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1455
	local room_obj, err = get_muc(room_jid);
12869
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1456
	if not room_obj then
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1457
		return room_obj, err;
12869
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1458
	end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1459
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1460
	local print = self.session.print;
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1461
	local row = format_table({
12873
70ee82579076 mod_admin_shell: Make Role and Affiliation columns the same width for aesthetics
Kim Alvefur <zash@zash.se>
parents: 12872
diff changeset
  1462
		{ title = "Role"; width = 12; key = "role" }; -- longest role name
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1463
		{ title = "JID"; width = "75%"; key = "bare_jid" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1464
		{ 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: 12871
diff changeset
  1465
	}, self.session.width);
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1466
	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: 12873
diff changeset
  1467
	local total = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1468
	if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1469
		occupants:filter(function(occupant)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1470
			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: 12873
diff changeset
  1471
		end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1472
	end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1473
	local displayed = #occupants;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1474
	occupants:sort(function(a, b)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1475
		if a.role ~= b.role then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1476
			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: 12873
diff changeset
  1477
		else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1478
			return a.bare_jid < b.bare_jid;
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1479
		end
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1480
	end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1481
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1482
	if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1483
		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: 12873
diff changeset
  1484
	end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1485
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1486
	print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1487
	for _, occupant in ipairs(occupants) do
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1488
		print(row(occupant));
12869
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1489
	end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1490
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1491
	if total == displayed then
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1492
		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: 12793
diff changeset
  1493
	else
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1494
		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: 12793
diff changeset
  1495
	end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1496
end
e6324117f124 mod_admin_shell: Add muc:occupants(room) command to list occupants
Kim Alvefur <zash@zash.se>
parents: 12793
diff changeset
  1497
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1498
function def_env.muc:affiliations(room_jid, filter)
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1499
	local room_obj, err = get_muc(room_jid);
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1500
	if not room_obj then
12871
2defb0fc2be9 mod_admin_shell: Factor out room retrieval into common function
Kim Alvefur <zash@zash.se>
parents: 12870
diff changeset
  1501
		return room_obj, err;
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1502
	end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1503
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1504
	local print = self.session.print;
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1505
	local row = format_table({
12873
70ee82579076 mod_admin_shell: Make Role and Affiliation columns the same width for aesthetics
Kim Alvefur <zash@zash.se>
parents: 12872
diff changeset
  1506
		{ title = "Affiliation"; width = 12 }; -- longest affiliation name
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1507
		{ title = "JID"; width = "75%" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1508
		{ title = "Nickname"; width = "25%"; key = "reserved_nickname" };
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1509
	}, self.session.width);
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1510
	local affiliated = array();
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1511
	for affiliated_jid, affiliation, affiliation_data in room_obj:each_affiliation() do
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1512
		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: 12873
diff changeset
  1513
	end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1514
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1515
	local total = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1516
	if filter then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1517
		affiliated:filter(function(affiliation)
12875
885323e2a1ce mod_admin_shell: Match substring in muc:affiliations() like muc:occupants()
Kim Alvefur <zash@zash.se>
parents: 12874
diff changeset
  1518
			return filter == affiliation[1] or affiliation[2]:find(filter, 1, true);
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1519
		end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1520
	end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1521
	local displayed = #affiliated;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1522
	local aff_ranking = muc_util.valid_affiliations;
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1523
	affiliated:sort(function(a, b)
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1524
		if a[1] ~= b[1] then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1525
			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: 12873
diff changeset
  1526
		else
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1527
			return a[2] < b[2];
12872
d5cb86b84d12 mod_admin_shell: Use tables to present MUC users
Kim Alvefur <zash@zash.se>
parents: 12871
diff changeset
  1528
		end
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1529
	end);
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1530
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1531
	if displayed == 0 then
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1532
		return true, ("%d out of %d affiliations%s listed"):format(displayed, total, total ~= 1 and "s" or "")
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1533
	end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1534
12874
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1535
	print(row());
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1536
	for _, affiliation in ipairs(affiliated) do
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1537
		print(row(affiliation));
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1538
	end
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1539
56397f3b58c1 mod_admin_shell: Sort MUC users by relation and JID
Kim Alvefur <zash@zash.se>
parents: 12873
diff changeset
  1540
12870
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1541
	if total == displayed then
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1542
		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: 12869
diff changeset
  1543
	else
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1544
		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: 12869
diff changeset
  1545
	end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1546
end
54aea2622459 mod_admin_shell: Add muc:affiliations(room) command to list memberships
Kim Alvefur <zash@zash.se>
parents: 12869
diff changeset
  1547
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  1548
local um = require"prosody.core.usermanager";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1549
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1550
def_env.user = {};
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1551
function def_env.user:create(jid, password, role)
10860
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 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
  1553
	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
  1554
		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
  1555
	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
  1556
		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
  1557
	end
12676
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1558
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1559
	if role then
12995
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1560
		local ok, err = um.create_user(username, nil, host);
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1561
		if not ok then
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1562
			return nil, "Could not create user: "..err;
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1563
		end
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1564
12676
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1565
		local role_ok, rerr = um.set_user_role(jid, host, role);
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1566
		if not role_ok then
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1567
			return nil, "Could not set role: " .. tostring(rerr);
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1568
		end
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1569
12995
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1570
		if password then
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1571
			local ok, err = um.set_password(username, password, host, nil);
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1572
			if not ok then
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1573
				return nil, "Could not set password for user: "..err;
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1574
			end
12996
651813914151 mod_admin_shell: Enable user after creation with role
Kim Alvefur <zash@zash.se>
parents: 12995
diff changeset
  1575
651813914151 mod_admin_shell: Enable user after creation with role
Kim Alvefur <zash@zash.se>
parents: 12995
diff changeset
  1576
			local ok, err = um.enable_user(username, host);
12997
623fbb5f9b05 core.usermanager: Correct formatting of not implemented error
Kim Alvefur <zash@zash.se>
parents: 12996
diff changeset
  1577
			if not ok and err ~= "method not implemented" then
12996
651813914151 mod_admin_shell: Enable user after creation with role
Kim Alvefur <zash@zash.se>
parents: 12995
diff changeset
  1578
				return nil, "Could not enable user: "..err;
651813914151 mod_admin_shell: Enable user after creation with role
Kim Alvefur <zash@zash.se>
parents: 12995
diff changeset
  1579
			end
12995
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1580
		end
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1581
	else
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1582
		local ok, err = um.create_user(username, password, host);
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1583
		if not ok then
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1584
			return nil, "Could not create user: "..err;
6d7e3d5463d8 mod_admin_shell: Simplify user creation when no role given
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
  1585
		end
12676
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1586
	end
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1587
c8f59ce7d3cf mod_admin_shell: Ensure account has role before it is usable
Kim Alvefur <zash@zash.se>
parents: 12674
diff changeset
  1588
	return true, "User created";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1589
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1590
12912
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1591
function def_env.user:disable(jid)
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1592
	local username, host = jid_split(jid);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1593
	if not prosody.hosts[host] then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1594
		return nil, "No such host: "..host;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1595
	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: 12892
diff changeset
  1596
		return nil, "No such user";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1597
	end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1598
	local ok, err = um.disable_user(username, host);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1599
	if ok then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1600
		return true, "User disabled";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1601
	else
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1602
		return nil, "Could not disable user: "..err;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1603
	end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1604
end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1605
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1606
function def_env.user:enable(jid)
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1607
	local username, host = jid_split(jid);
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1608
	if not prosody.hosts[host] then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1609
		return nil, "No such host: "..host;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1610
	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: 12892
diff changeset
  1611
		return nil, "No such user";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1612
	end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1613
	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: 12892
diff changeset
  1614
	if ok then
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1615
		return true, "User enabled";
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1616
	else
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1617
		return nil, "Could not enable user: "..err;
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1618
	end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1619
end
e96c3ea64996 mod_admin_shell: Add commands to disable and enable accounts
Kim Alvefur <zash@zash.se>
parents: 12892
diff changeset
  1620
10860
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.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
  1622
	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
  1623
	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
  1624
		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
  1625
	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
  1626
		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
  1627
	end
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 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
  1629
	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
  1630
		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
  1631
	else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1632
		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
  1633
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1634
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1635
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1636
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
  1637
	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
  1638
	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
  1639
		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
  1640
	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
  1641
		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
  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
	local ok, err = um.set_password(username, password, host, nil);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1644
	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
  1645
		return true, "User password changed";
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1646
	else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1647
		return nil, "Could not change password for 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
  1648
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1649
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1650
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1651
function def_env.user:role(jid, host)
12679
db8c795ca81a mod_admin_shell: Fix output from user:roles()
Kim Alvefur <zash@zash.se>
parents: 12676
diff changeset
  1652
	local print = self.session.print;
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1653
	local username, userhost = jid_split(jid);
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1654
	if host == nil then host = userhost; end
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1655
	if not prosody.hosts[host] then
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1656
		return nil, "No such host: "..host;
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1657
	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: 12212
diff changeset
  1658
		return nil, "No such user";
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1659
	end
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1660
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1661
	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: 12664
diff changeset
  1662
	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: 12664
diff changeset
  1663
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1664
	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: 12664
diff changeset
  1665
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1666
	local count = primary_role and 1 or 0;
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1667
	for role_name in pairs(secondary_roles or {}) do
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1668
		count = count + 1;
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1669
		print(role_name.." (secondary)");
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1670
	end
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1671
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1672
	return true, count == 1 and "1 role" or count.." roles";
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1673
end
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1674
def_env.user.roles = def_env.user.role;
12213
3fe2e5da05c3 mod_admin_shell: Add command to show current user roles
Kim Alvefur <zash@zash.se>
parents: 12212
diff changeset
  1675
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1676
-- user:setrole("someone@example.com", "example.com", "prosody:admin")
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1677
-- user:setrole("someone@example.com", "prosody:admin")
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1678
function def_env.user:setrole(jid, host, new_role)
12018
efbf288b529e mod_admin_shell: Support setting roles on hosts other than the users'
Kim Alvefur <zash@zash.se>
parents: 12017
diff changeset
  1679
	local username, userhost = jid_split(jid);
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1680
	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: 12664
diff changeset
  1681
	if not prosody.hosts[host] then
12017
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12016
diff changeset
  1682
		return nil, "No such host: "..host;
12022
c65789f5004e mod_admin_shell: Only check that local users exist locally
Kim Alvefur <zash@zash.se>
parents: 12018
diff changeset
  1683
	elseif prosody.hosts[userhost] and not um.user_exists(username, userhost) then
12017
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12016
diff changeset
  1684
		return nil, "No such user";
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12016
diff changeset
  1685
	end
12672
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1686
	return um.set_user_role(username, host, new_role);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1687
end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1688
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1689
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: 12664
diff changeset
  1690
	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: 12664
diff changeset
  1691
	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: 12664
diff changeset
  1692
	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: 12664
diff changeset
  1693
		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: 12664
diff changeset
  1694
	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: 12664
diff changeset
  1695
		return nil, "No such user";
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1696
	end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1697
	return um.add_user_secondary_role(username, host, new_role);
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1698
end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1699
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1700
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: 12664
diff changeset
  1701
	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: 12664
diff changeset
  1702
	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: 12664
diff changeset
  1703
	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: 12664
diff changeset
  1704
		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: 12664
diff changeset
  1705
	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: 12664
diff changeset
  1706
		return nil, "No such user";
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1707
	end
5d85de8b0723 mod_admin_shell: Update with new role management commands and help text
Matthew Wild <mwild1@gmail.com>
parents: 12664
diff changeset
  1708
	return um.remove_user_secondary_role(username, host, role_name);
12017
ae45f052b34b mod_admin_shell: Add command for updating roles user:roles(jid, roles)
Kim Alvefur <zash@zash.se>
parents: 12016
diff changeset
  1709
end
12016
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11995
diff changeset
  1710
71d799a8638f mod_admin_shell: Allow setting roles when creating user
Kim Alvefur <zash@zash.se>
parents: 11995
diff changeset
  1711
-- TODO switch to table view, include roles
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1712
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
  1713
	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
  1714
		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
  1715
	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
  1716
		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
  1717
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1718
	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
  1719
	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
  1720
	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
  1721
		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
  1722
			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
  1723
			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
  1724
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1725
		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
  1726
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1727
	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
  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
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1730
def_env.xmpp = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1731
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  1732
local new_id = require "prosody.util.id".medium;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1733
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
  1734
	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
  1735
	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
  1736
	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
  1737
		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
  1738
	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
  1739
		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
  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
	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
  1742
		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
  1743
	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
  1744
		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
  1745
	end
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 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
  1747
			: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
  1748
	local time_start = time.now();
12126
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1749
	local print = self.session.print;
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1750
	local function onchange(what)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1751
		return function(event)
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1752
			local s2s_session = event.session;
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1753
			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: 12060
diff changeset
  1754
				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: 12060
diff changeset
  1755
				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: 12060
diff changeset
  1756
				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: 12060
diff changeset
  1757
					time.now() - time_start));
12130
0d8e6646ce42 mod_admin_shell: Log creation of incoming s2s connections during ping
Kim Alvefur <zash@zash.se>
parents: 12126
diff changeset
  1758
			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: 12126
diff changeset
  1759
				print(("Session %s %s (%gs)"):format(s2s_session.id, what, time.now() - time_start));
12126
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1760
			end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1761
		end
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1762
	end
12285
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12262
diff changeset
  1763
	local onconnected = onchange("connected");
12126
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1764
	local onauthenticated = onchange("authenticated");
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1765
	local onestablished = onchange("established");
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1766
	local ondestroyed = onchange("destroyed");
12285
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12262
diff changeset
  1767
	module:hook("s2s-connected", onconnected, 1);
12126
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1768
	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: 12060
diff changeset
  1769
	module:hook("s2sout-established", onestablished, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1770
	module:hook("s2sin-established", onestablished, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1771
	module:hook("s2s-destroyed", ondestroyed, 1);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1772
	return module:context(localhost):send_iq(iq, nil, timeout):finally(function()
12285
9016071867d7 mod_admin_shell: Track connected events instead of created
Kim Alvefur <zash@zash.se>
parents: 12262
diff changeset
  1773
		module:unhook("s2s-connected", onconnected, 1);
12126
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1774
		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: 12060
diff changeset
  1775
		module:unhook("s2sout-established", onestablished);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1776
		module:unhook("s2sin-established", onestablished);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1777
		module:unhook("s2s-destroyed", ondestroyed);
50795249b7be mod_admin_shell: Print s2s related events while waiting for ping
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
  1778
	end):next(function(pong)
12555
3b7e97e0a8ef mod_admin_shell: Show session id ping reply came
Kim Alvefur <zash@zash.se>
parents: 12544
diff changeset
  1779
		return ("pong from %s on %s in %gs"):format(pong.stanza.attr.from, pong.origin.id, time.now() - time_start);
11957
848a522fd731 mod_admin_shell: Remove now redundant promise awaiting in xmpp:ping()
Kim Alvefur <zash@zash.se>
parents: 11954
diff changeset
  1780
	end);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1781
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1782
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1783
def_env.dns = {};
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  1784
local adns = require"prosody.net.adns";
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1785
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1786
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
  1787
	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
  1788
	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
  1789
		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
  1790
		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
  1791
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1792
	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
  1793
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1794
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1795
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
  1796
	local resolver = get_resolver(self.session);
11958
b963ac00c967 mod_admin_shell: Remove now redundant promise awaiting in dns:lookup()
Kim Alvefur <zash@zash.se>
parents: 11957
diff changeset
  1797
	return resolver:lookup_promise(name, typ, class)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1798
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1799
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1800
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
  1801
	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
  1802
	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
  1803
	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
  1804
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1805
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1806
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
  1807
	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
  1808
	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
  1809
	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
  1810
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1811
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1812
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
  1813
	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
  1814
	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
  1815
	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
  1816
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1817
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1818
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
  1819
	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
  1820
	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
  1821
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1822
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1823
def_env.http = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1824
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1825
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
  1826
	local print = self.session.print;
11365
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1827
	hosts = array.collect(set.new({ not hosts and "*" or nil }) + get_hosts_set(hosts)):sort(_sort_hosts);
11368
bb6b744f7f1a mod_admin_shell: Pretty-print HTTP endpoints in a human table
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
  1828
	local output = format_table({
bb6b744f7f1a mod_admin_shell: Pretty-print HTTP endpoints in a human table
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
  1829
			{ title = "Module", width = "20%" },
bb6b744f7f1a mod_admin_shell: Pretty-print HTTP endpoints in a human table
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
  1830
			{ title = "URL", width = "80%" },
12533
7dae6d29b71d prosodyctl shell: Communicate width of terminal to mod_admin_shell
Kim Alvefur <zash@zash.se>
parents: 12510
diff changeset
  1831
		}, self.session.width);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1832
11365
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1833
	for _, host in ipairs(hosts) do
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1834
		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
  1835
		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
  1836
			local http_host = module:context(host):get_option_string("http_host");
11365
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1837
			if host == "*" then
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1838
				print("Global HTTP endpoints available on all hosts:");
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1839
			else
dab1a6e46087 mod_admin_shell: List global HTTP endpoints by default
Kim Alvefur <zash@zash.se>
parents: 11046
diff changeset
  1840
				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: 11046
diff changeset
  1841
			end
11368
bb6b744f7f1a mod_admin_shell: Pretty-print HTTP endpoints in a human table
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
  1842
			print(output());
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1843
			for _, provider in ipairs(http_apps) do
11366
52d93fba2ee1 mod_admin_shell: List modules providing each HTTP endpoint
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
  1844
				local mod = provider._provided_by;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1845
				local url = module:context(host):http_url(provider.name, provider.default_path);
11366
52d93fba2ee1 mod_admin_shell: List modules providing each HTTP endpoint
Kim Alvefur <zash@zash.se>
parents: 11365
diff changeset
  1846
				mod = mod and "mod_"..mod or ""
11368
bb6b744f7f1a mod_admin_shell: Pretty-print HTTP endpoints in a human table
Kim Alvefur <zash@zash.se>
parents: 11367
diff changeset
  1847
				print(output{mod, url});
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1848
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1849
			print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1850
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1851
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1852
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1853
	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
  1854
	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
  1855
		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
  1856
	else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1857
		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
  1858
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1859
	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
  1860
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1861
12403
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1862
def_env.watch = {};
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1863
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1864
function def_env.watch:log()
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1865
	local writing = false;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1866
	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: 12402
diff changeset
  1867
		if writing then return; end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1868
		writing = true;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1869
		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: 12402
diff changeset
  1870
		writing = false;
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1871
	end);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1872
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1873
	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: 12402
diff changeset
  1874
		async.sleep(3);
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1875
	end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1876
	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: 12402
diff changeset
  1877
		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: 12402
diff changeset
  1878
	end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1879
end
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1880
12468
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1881
local stanza_watchers = module:require("mod_debug_stanzas/watcher");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1882
function def_env.watch:stanzas(target_spec, filter_spec)
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1883
	local function handler(event_type, stanza, session)
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1884
		if stanza then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1885
			if event_type == "sent" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1886
				self.session.print(("\n<!-- sent to %s -->"):format(session.id));
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1887
			elseif event_type == "received" then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1888
				self.session.print(("\n<!-- received from %s -->"):format(session.id));
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1889
			else
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1890
				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: 12403
diff changeset
  1891
			end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1892
			self.session.print(stanza);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1893
		elseif session then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1894
			self.session.print("\n<!-- session "..session.id.." "..event_type.." -->");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1895
		elseif event_type then
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1896
			self.session.print("\n<!-- "..event_type.." -->");
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1897
		end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1898
	end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1899
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1900
	stanza_watchers.add({
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1901
		target_spec = {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1902
			jid = target_spec;
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1903
		};
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1904
		filter_spec = filter_spec and {
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1905
			with_jid = filter_spec;
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1906
		};
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1907
	}, handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1908
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1909
	while self.session.is_connected() do
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1910
		async.sleep(3);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1911
	end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1912
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1913
	stanza_watchers.remove(handler);
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  1914
end
12403
d99772b739e0 mod_admin_shell: Add watch:log() command to tail logs in realtime
Matthew Wild <mwild1@gmail.com>
parents: 12402
diff changeset
  1915
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1916
def_env.debug = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1917
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1918
function def_env.debug:logevents(host)
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1919
	helpers.log_host_events(host);
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1920
	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
  1921
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1922
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1923
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
  1924
	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
  1925
	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
  1926
		if host == "http" then
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  1927
			events_obj = require "prosody.net.http.server"._events;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1928
		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
  1929
			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
  1930
		else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1931
			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
  1932
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1933
	else
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1934
		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
  1935
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1936
	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
  1937
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1938
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1939
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
  1940
	local print = self.session.print;
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  1941
	local add_task = require"prosody.util.timer".add_task;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1942
	local h, params = add_task.h, add_task.params;
10992
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1943
	local function normalize_time(t)
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1944
		return t;
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1945
	end
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1946
	local function format_time(t)
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1947
		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: 10990
diff changeset
  1948
	end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1949
	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
  1950
		print("-- util.timer");
10990
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1951
	elseif server.timer then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1952
		print("-- net.server.timer");
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1953
		h = server.timer.add_task.timers;
10992
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1954
		normalize_time = server.timer.to_absolute_time or normalize_time;
10990
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1955
	end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1956
	if h then
11482
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11369
diff changeset
  1957
		local timers = {};
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1958
		for i, id in ipairs(h.ids) do
10990
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1959
			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: 10933
diff changeset
  1960
			if not params then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1961
				local param = cb.param;
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1962
				if param then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1963
					cb = param.callback;
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1964
				else
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1965
					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: 10933
diff changeset
  1966
				end
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1967
			elseif params[id] then
d585deb8c882 mod_admin_shell: Fix debug:timers to handle net.server native timers
Kim Alvefur <zash@zash.se>
parents: 10933
diff changeset
  1968
				cb = params[id].callback or cb;
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1969
			end
11482
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11369
diff changeset
  1970
			table.insert(timers, { format_time(t), cb });
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11369
diff changeset
  1971
		end
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11369
diff changeset
  1972
		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: 11369
diff changeset
  1973
		for _, t in ipairs(timers) do
c0c4431ab27b mod_admin_shell: Sort timers by time in debug:timers()
Kim Alvefur <zash@zash.se>
parents: 11369
diff changeset
  1974
			print(t[1], t[2])
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1975
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1976
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1977
	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
  1978
		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
  1979
		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
  1980
			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
  1981
				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
  1982
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1983
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1984
		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
  1985
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1986
	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
  1987
		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
  1988
		if next_time then
10992
9dcbbb1d12c3 mod_admin_shell: Handle server_epoll using monotonic time internally
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
  1989
			return true, ("Next event at %s (in %.6fs)"):format(format_time(next_time), normalize_time(next_time) - time.now());
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1990
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1991
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1992
	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
  1993
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1994
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1995
-- COMPAT: debug:timers() was timer:info() for some time in trunk
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1996
def_env.timer = { info = 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
  1997
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1998
def_env.stats = {};
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  1999
10891
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2000
local short_units = {
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2001
	seconds = "s",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2002
	bytes = "B",
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2003
};
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2004
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2005
local stats_methods = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2006
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2007
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: 11508
diff changeset
  2008
	local creation_timestamp, sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2009
	local buckets = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2010
	local prev_bucket_count = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2011
	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: 11508
diff changeset
  2012
		if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2013
			creation_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2014
		elseif suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2015
			sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2016
		elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2017
			count = value
12230
7db81c9cbbbf mod_admin_shell: Fix traceback on rendering graph of stats without extra labels
Kim Alvefur <zash@zash.se>
parents: 12229
diff changeset
  2018
		elseif extra_labels then
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2019
			local bucket_threshold = extra_labels["le"]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2020
			local bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2021
			if cumulative then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2022
				bucket_count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2023
			else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2024
				bucket_count = value - prev_bucket_count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2025
				prev_bucket_count = value
10891
3debe04a6162 mod_admin_shell: Format stats with util.human.units
Kim Alvefur <zash@zash.se>
parents: 10882
diff changeset
  2026
			end
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2027
			if bucket_threshold == "+Inf" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2028
				t_insert(buckets, {threshold = 1/0, count = bucket_count})
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2029
			elseif bucket_threshold ~= nil then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2030
				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: 11508
diff changeset
  2031
			end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2032
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2033
	end
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2034
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2035
	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: 11508
diff changeset
  2036
		print("[no data or not a histogram]")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2037
		return false
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2038
	end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2039
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2040
	local graph_width, graph_height, wscale = #buckets, 10, 1;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2041
	if graph_width < 8 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2042
		wscale = 8
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2043
	elseif graph_width < 16 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2044
		wscale = 4
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2045
	elseif graph_width < 32 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2046
		wscale = 2
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2047
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2048
	local eighth_chars = "   ▁▂▃▄▅▆▇█";
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2049
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2050
	local max_bin_samples = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2051
	for _, bucket in ipairs(buckets) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2052
		if bucket.count > max_bin_samples then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2053
			max_bin_samples = bucket.count
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2054
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2055
	end
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2056
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2057
	print("");
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2058
	print(prefix)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2059
	print(("_"):rep(graph_width*wscale).." "..max_bin_samples);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2060
	for row = graph_height, 1, -1 do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2061
		local row_chars = {};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2062
		local min_eighths, max_eighths = 8, 0;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2063
		for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2064
			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: 11508
diff changeset
  2065
			if char_eighths < min_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2066
				min_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2067
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2068
			if char_eighths > max_eighths then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2069
				max_eighths = char_eighths;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2070
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2071
			if char_eighths == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2072
				row_chars[i] = ("-"):rep(wscale);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2073
			else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2074
				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: 11508
diff changeset
  2075
				row_chars[i] = char:rep(wscale);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2076
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2077
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2078
		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: 11508
diff changeset
  2079
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2080
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2081
	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: 11508
diff changeset
  2082
	local row = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2083
	for i = 1, #buckets do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2084
		local threshold = buckets[i].threshold
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2085
		t_insert(row, legend_pat:format(threshold))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2086
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2087
	t_insert(row, " " .. metric_family.unit)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2088
	print(t_concat(row, "/"))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2089
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2090
	return true
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2091
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2092
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2093
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: 11508
diff changeset
  2094
	return self:render_single_fancy_histogram_ex(print, prefix, metric_family, metric, false)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2095
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2096
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2097
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: 11508
diff changeset
  2098
	-- cf = cumulative frequency
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2099
	return self:render_single_fancy_histogram_ex(print, prefix, metric_family, metric, true)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2100
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2101
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2102
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
  2103
	for _, stat_info in ipairs(self) do
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2104
		local family_name, metric_family = unpack(stat_info, 1, 2)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2105
		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
  2106
			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
  2107
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2108
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2109
		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: 11508
diff changeset
  2110
			return self
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2111
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2112
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2113
	return self;
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
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2116
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
  2117
	for _, stat_info in ipairs(self) do
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2118
		local family_name, metric_family = unpack(stat_info, 1, 2)
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2119
		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
  2120
			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
  2121
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2122
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2123
		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: 11508
diff changeset
  2124
			return self
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2125
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2126
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2127
	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
  2128
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2129
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2130
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: 11508
diff changeset
  2131
	local created_timestamp, current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2132
	for suffix, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2133
		if suffix == "_created" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2134
			created_timestamp = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2135
		elseif suffix == "_total" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2136
			current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2137
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2138
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2139
	if current_value and created_timestamp then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2140
		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: 11508
diff changeset
  2141
		local unit = base_unit .. "/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2142
		local factor = 1
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2143
		if base_unit == "s" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2144
			-- be smart!
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2145
			unit = "%"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2146
			factor = 100
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2147
		elseif base_unit == "" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2148
			unit = "events/s"
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2149
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2150
		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: 11508
diff changeset
  2151
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2152
end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2153
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2154
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: 11508
diff changeset
  2155
	local current_value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2156
	for _, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2157
		current_value = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2158
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2159
	if current_value then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2160
		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: 11508
diff changeset
  2161
		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: 11508
diff changeset
  2162
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2163
end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2164
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2165
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: 11508
diff changeset
  2166
	local sum, count
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2167
	for suffix, _, value in metric:iter_samples() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2168
		if suffix == "_sum" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2169
			sum = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2170
		elseif suffix == "_count" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2171
			count = value
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2172
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2173
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2174
	if sum and count then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2175
		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: 11508
diff changeset
  2176
		if count == 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2177
			print(("%-50s %s"):format(prefix, "no obs."));
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2178
		else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2179
			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: 11508
diff changeset
  2180
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2181
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2182
end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2183
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2184
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: 11508
diff changeset
  2185
	local labelkeys = metric_family.label_keys
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2186
	if #labelkeys > 0 then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2187
		print(family_name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2188
		for labelset, metric in metric_family:iter_metrics() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2189
			local labels = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2190
			for i, k in ipairs(labelkeys) do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2191
				local v = labelset[i]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2192
				t_insert(labels, ("%s=%s"):format(k, v))
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2193
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2194
			local prefix = "  "..t_concat(labels, " ")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2195
			render_func(self, print, prefix, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2196
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2197
	else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2198
		for _, metric in metric_family:iter_metrics() do
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2199
			render_func(self, print, family_name, metric_family, metric)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2200
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2201
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2202
end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2203
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2204
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
  2205
	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
  2206
	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
  2207
		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
  2208
			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
  2209
			print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2210
			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
  2211
				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
  2212
			end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2213
			print("");
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2214
		else
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2215
			local metric_family = stat_info[2]
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2216
			if metric_family.type_ == "counter" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2217
				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: 11508
diff changeset
  2218
			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: 11508
diff changeset
  2219
				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: 11508
diff changeset
  2220
			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: 11508
diff changeset
  2221
				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: 11508
diff changeset
  2222
			end
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2223
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2224
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2225
	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
  2226
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2227
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2228
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
  2229
local function new_stats_context(self)
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2230
	-- 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: 11508
diff changeset
  2231
	-- 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: 11508
diff changeset
  2232
	-- 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: 11508
diff changeset
  2233
	-- the next sample and so on.
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2234
	return setmetatable({ session = self.session, stats = true, now = time.now() }, stats_mt);
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2235
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2236
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2237
function def_env.stats:show(name_filter)
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12931
diff changeset
  2238
	local statsman = require "prosody.core.statsmanager"
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2239
	local collect = statsman.collect
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2240
	if collect then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2241
		-- force collection if in manual mode
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2242
		collect()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2243
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2244
	local metric_registry = statsman.get_metric_registry();
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2245
	local displayed_stats = new_stats_context(self);
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2246
	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: 11508
diff changeset
  2247
		if not name_filter or family_name:match(name_filter) then
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2248
			table.insert(displayed_stats, {
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2249
				family_name,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2250
				metric_family,
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2251
				output = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11508
diff changeset
  2252
			})
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2253
		end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2254
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2255
	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
  2256
end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2257
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2258
12468
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  2259
function module.unload()
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  2260
	stanza_watchers.cleanup();
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  2261
end
f4c59af273a3 mod_admin_shell: Add watch:stanzas() command
Matthew Wild <mwild1@gmail.com>
parents: 12403
diff changeset
  2262
10860
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2263
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2264
-------------
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2265
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2266
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
  2267
	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
  2268
	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
  2269
		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
  2270
                   ____                \   /     _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2271
                    |  _ \ _ __ ___  ___  _-_   __| |_   _
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2272
                    | |_) | '__/ _ \/ __|/ _ \ / _` | | | |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2273
                    |  __/| | | (_) \__ \ |_| | (_| | |_| |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2274
                    |_|   |_|  \___/|___/\___/ \__,_|\__, |
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2275
                    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
  2276
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2277
]]
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2278
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2279
	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
  2280
	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
  2281
	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
  2282
	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
  2283
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2284
	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
  2285
		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
  2286
	end
c99711eda0d1 mod_admin_shell: New module that implements the console interface over an admin socket
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
  2287
end