Software /
code /
prosody
Comparison
plugins/mod_admin_telnet.lua @ 4684:dc70c4ffb66d
Merge timber->trunk - thanks everyone!
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 24 Apr 2012 21:59:20 +0100 |
parent | 4517:2e274e088ddc |
parent | 4674:f44726a910a0 |
child | 4779:9f2639b3d9b1 |
comparison
equal
deleted
inserted
replaced
4529:12621337471f | 4684:dc70c4ffb66d |
---|---|
4 -- | 4 -- |
5 -- This project is MIT/X11 licensed. Please see the | 5 -- This project is MIT/X11 licensed. Please see the |
6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
7 -- | 7 -- |
8 | 8 |
9 module.host = "*"; | 9 module:set_global(); |
10 | 10 |
11 local _G = _G; | 11 local _G = _G; |
12 | 12 |
13 local prosody = _G.prosody; | 13 local prosody = _G.prosody; |
14 local hosts = prosody.hosts; | 14 local hosts = prosody.hosts; |
15 local connlisteners_register = require "net.connlisteners".register; | 15 |
16 | 16 local console_listener = { default_port = 5582; default_mode = "*l"; interface = "127.0.0.1" }; |
17 local console_listener = { default_port = 5582; default_mode = "*l"; default_interface = "127.0.0.1" }; | 17 |
18 | 18 local iterators = require "util.iterators"; |
19 require "util.iterators"; | 19 local keys, values = iterators.keys, iterators.values; |
20 local jid_bare = require "util.jid".bare; | 20 local jid_bare = require "util.jid".bare; |
21 local set, array = require "util.set", require "util.array"; | 21 local set, array = require "util.set", require "util.array"; |
22 local cert_verify_identity = require "util.x509".verify_identity; | 22 local cert_verify_identity = require "util.x509".verify_identity; |
23 | 23 |
24 local commands = {}; | 24 local commands = module:shared("commands") |
25 local def_env = {}; | 25 local def_env = module:shared("env"); |
26 local default_env_mt = { __index = def_env }; | 26 local default_env_mt = { __index = def_env }; |
27 | |
28 prosody.console = { commands = commands, env = def_env }; | |
29 | 27 |
30 local function redirect_output(_G, session) | 28 local function redirect_output(_G, session) |
31 local env = setmetatable({ print = session.print }, { __index = function (t, k) return rawget(_G, k); end }); | 29 local env = setmetatable({ print = session.print }, { __index = function (t, k) return rawget(_G, k); end }); |
32 env.dofile = function(name) | 30 env.dofile = function(name) |
33 local f, err = loadfile(name); | 31 local f, err = loadfile(name); |
146 if session then | 144 if session then |
147 session.disconnect(); | 145 session.disconnect(); |
148 sessions[conn] = nil; | 146 sessions[conn] = nil; |
149 end | 147 end |
150 end | 148 end |
151 | |
152 connlisteners_register('console', console_listener); | |
153 | 149 |
154 -- Console commands -- | 150 -- Console commands -- |
155 -- These are simple commands, not valid standalone in Lua | 151 -- These are simple commands, not valid standalone in Lua |
156 | 152 |
157 function commands.bye(session) | 153 function commands.bye(session) |
279 end | 275 end |
280 elseif type(hosts) == "string" then | 276 elseif type(hosts) == "string" then |
281 return set.new { hosts }; | 277 return set.new { hosts }; |
282 elseif hosts == nil then | 278 elseif hosts == nil then |
283 local mm = require "modulemanager"; | 279 local mm = require "modulemanager"; |
284 return set.new(array.collect(keys(prosody.hosts))) | 280 local hosts_set = set.new(array.collect(keys(prosody.hosts))) |
285 / function (host) return prosody.hosts[host].type == "local" or module and mm.is_loaded(host, module); end; | 281 / function (host) return prosody.hosts[host].type == "local" or module and mm.is_loaded(host, module); end; |
282 if module and mm.get_module("*", module) then | |
283 hosts_set:add("*"); | |
284 end | |
285 return hosts_set; | |
286 end | 286 end |
287 end | 287 end |
288 | 288 |
289 function def_env.module:load(name, hosts, config) | 289 function def_env.module:load(name, hosts, config) |
290 local mm = require "modulemanager"; | 290 local mm = require "modulemanager"; |
291 | 291 |
292 hosts = get_hosts_set(hosts); | 292 hosts = get_hosts_set(hosts); |
293 | 293 |
294 -- Load the module for each host | 294 -- Load the module for each host |
295 local ok, err, count = true, nil, 0; | 295 local ok, err, count, mod = true, nil, 0, nil; |
296 for host in hosts do | 296 for host in hosts do |
297 if (not mm.is_loaded(host, name)) then | 297 if (not mm.is_loaded(host, name)) then |
298 ok, err = mm.load(host, name, config); | 298 mod, err = mm.load(host, name, config); |
299 if not ok then | 299 if not mod then |
300 ok = false; | 300 ok = false; |
301 if err == "global-module-already-loaded" then | |
302 if count > 0 then | |
303 ok, err, count = true, nil, 1; | |
304 end | |
305 break; | |
306 end | |
301 self.session.print(err or "Unknown error loading module"); | 307 self.session.print(err or "Unknown error loading module"); |
302 else | 308 else |
303 count = count + 1; | 309 count = count + 1; |
304 self.session.print("Loaded for "..host); | 310 self.session.print("Loaded for "..mod.module.host); |
305 end | 311 end |
306 end | 312 end |
307 end | 313 end |
308 | 314 |
309 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); | 315 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); |
332 end | 338 end |
333 | 339 |
334 function def_env.module:reload(name, hosts) | 340 function def_env.module:reload(name, hosts) |
335 local mm = require "modulemanager"; | 341 local mm = require "modulemanager"; |
336 | 342 |
337 hosts = get_hosts_set(hosts, name); | 343 hosts = array.collect(get_hosts_set(hosts, name)):sort(function (a, b) |
338 | 344 if a == "*" then return true |
345 elseif b == "*" then return false | |
346 else return a < b; end | |
347 end); | |
348 | |
339 -- Reload the module for each host | 349 -- Reload the module for each host |
340 local ok, err, count = true, nil, 0; | 350 local ok, err, count = true, nil, 0; |
341 for host in hosts do | 351 for _, host in ipairs(hosts) do |
342 if mm.is_loaded(host, name) then | 352 if mm.is_loaded(host, name) then |
343 ok, err = mm.reload(host, name); | 353 ok, err = mm.reload(host, name); |
344 if not ok then | 354 if not ok then |
345 ok = false; | 355 ok = false; |
346 self.session.print(err or "Unknown error reloading module"); | 356 self.session.print(err or "Unknown error reloading module"); |
357 end | 367 end |
358 | 368 |
359 function def_env.module:list(hosts) | 369 function def_env.module:list(hosts) |
360 if hosts == nil then | 370 if hosts == nil then |
361 hosts = array.collect(keys(prosody.hosts)); | 371 hosts = array.collect(keys(prosody.hosts)); |
372 table.insert(hosts, 1, "*"); | |
362 end | 373 end |
363 if type(hosts) == "string" then | 374 if type(hosts) == "string" then |
364 hosts = { hosts }; | 375 hosts = { hosts }; |
365 end | 376 end |
366 if type(hosts) ~= "table" then | 377 if type(hosts) ~= "table" then |
367 return false, "Please supply a host or a list of hosts you would like to see"; | 378 return false, "Please supply a host or a list of hosts you would like to see"; |
368 end | 379 end |
369 | 380 |
370 local print = self.session.print; | 381 local print = self.session.print; |
371 for _, host in ipairs(hosts) do | 382 for _, host in ipairs(hosts) do |
372 print(host..":"); | 383 print((host == "*" and "Global" or host)..":"); |
373 local modules = array.collect(keys(prosody.hosts[host] and prosody.hosts[host].modules or {})):sort(); | 384 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort(); |
374 if #modules == 0 then | 385 if #modules == 0 then |
375 if prosody.hosts[host] then | 386 if prosody.hosts[host] then |
376 print(" No modules loaded"); | 387 print(" No modules loaded"); |
377 else | 388 else |
378 print(" Host not found"); | 389 print(" Host not found"); |
764 print(host); | 775 print(host); |
765 end | 776 end |
766 return true, i.." hosts"; | 777 return true, i.." hosts"; |
767 end | 778 end |
768 | 779 |
780 def_env.port = {}; | |
781 | |
782 function def_env.port:list() | |
783 local print = self.session.print; | |
784 local services = portmanager.get_active_services().data; | |
785 local ordered_services, n_ports = {}, 0; | |
786 for service, interfaces in pairs(services) do | |
787 table.insert(ordered_services, service); | |
788 end | |
789 table.sort(ordered_services); | |
790 for _, service in ipairs(ordered_services) do | |
791 local ports_list = {}; | |
792 for interface, ports in pairs(services[service]) do | |
793 for port in pairs(ports) do | |
794 table.insert(ports_list, "["..interface.."]:"..port); | |
795 end | |
796 end | |
797 n_ports = n_ports + #ports_list; | |
798 print(service..": "..table.concat(ports_list, ", ")); | |
799 end | |
800 return true, #ordered_services.." services listening on "..n_ports.." ports"; | |
801 end | |
802 | |
803 function def_env.port:close(close_port, close_interface) | |
804 close_port = assert(tonumber(close_port), "Invalid port number"); | |
805 local n_closed = 0; | |
806 local services = portmanager.get_active_services().data; | |
807 for service, interfaces in pairs(services) do | |
808 for interface, ports in pairs(interfaces) do | |
809 if not close_interface or close_interface == interface then | |
810 if ports[close_port] then | |
811 self.session.print("Closing ["..interface.."]:"..close_port.."..."); | |
812 local ok, err = portmanager.close(interface, close_port) | |
813 if not ok then | |
814 self.session.print("Failed to close "..interface.." "..port..": "..err); | |
815 else | |
816 n_closed = n_closed + 1; | |
817 end | |
818 end | |
819 end | |
820 end | |
821 end | |
822 return true, "Closed "..n_closed.." ports"; | |
823 end | |
824 | |
769 ------------- | 825 ------------- |
770 | 826 |
771 function printbanner(session) | 827 function printbanner(session) |
772 local option = config.get("*", "core", "console_banner"); | 828 local option = config.get("*", "core", "console_banner"); |
773 if option == nil or option == "full" or option == "graphic" then | 829 if option == nil or option == "full" or option == "graphic" then |
794 pcall(option, session); | 850 pcall(option, session); |
795 end | 851 end |
796 end | 852 end |
797 end | 853 end |
798 | 854 |
799 prosody.net_activate_ports("console", "console", {5582}, "tcp"); | 855 module:add_item("net-provider", { |
856 name = "console"; | |
857 listener = console_listener; | |
858 default_port = 5582; | |
859 private = true; | |
860 }); |