Mercurial > prosody-hg
comparison plugins/mod_admin_telnet.lua @ 5776:bd0ff8ae98a8
Remove all trailing whitespace
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Fri, 09 Aug 2013 17:48:21 +0200 |
| parents | 7722372aa087 |
| children | ac0879a8190a |
comparison
equal
deleted
inserted
replaced
| 5775:a6c2b8933507 | 5776:bd0ff8ae98a8 |
|---|---|
| 1 -- Prosody IM | 1 -- Prosody IM |
| 2 -- Copyright (C) 2008-2010 Matthew Wild | 2 -- Copyright (C) 2008-2010 Matthew Wild |
| 3 -- Copyright (C) 2008-2010 Waqas Hussain | 3 -- Copyright (C) 2008-2010 Waqas Hussain |
| 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:set_global(); | 9 module:set_global(); |
| 58 w("| "..table.concat(t, "\t").."\n"); | 58 w("| "..table.concat(t, "\t").."\n"); |
| 59 end; | 59 end; |
| 60 disconnect = function () conn:close(); end; | 60 disconnect = function () conn:close(); end; |
| 61 }; | 61 }; |
| 62 session.env = setmetatable({}, default_env_mt); | 62 session.env = setmetatable({}, default_env_mt); |
| 63 | 63 |
| 64 -- Load up environment with helper objects | 64 -- Load up environment with helper objects |
| 65 for name, t in pairs(def_env) do | 65 for name, t in pairs(def_env) do |
| 66 if type(t) == "table" then | 66 if type(t) == "table" then |
| 67 session.env[name] = setmetatable({ session = session }, { __index = t }); | 67 session.env[name] = setmetatable({ session = session }, { __index = t }); |
| 68 end | 68 end |
| 69 end | 69 end |
| 70 | 70 |
| 71 return session; | 71 return session; |
| 72 end | 72 end |
| 73 | 73 |
| 74 function console:process_line(session, line) | 74 function console:process_line(session, line) |
| 75 local useglobalenv; | 75 local useglobalenv; |
| 76 | 76 |
| 77 if line:match("^>") then | 77 if line:match("^>") then |
| 78 line = line:gsub("^>", ""); | 78 line = line:gsub("^>", ""); |
| 79 useglobalenv = true; | 79 useglobalenv = true; |
| 80 elseif line == "\004" then | 80 elseif line == "\004" then |
| 81 commands["bye"](session, line); | 81 commands["bye"](session, line); |
| 85 if commands[command] then | 85 if commands[command] then |
| 86 commands[command](session, line); | 86 commands[command](session, line); |
| 87 return; | 87 return; |
| 88 end | 88 end |
| 89 end | 89 end |
| 90 | 90 |
| 91 session.env._ = line; | 91 session.env._ = line; |
| 92 | 92 |
| 93 local chunkname = "=console"; | 93 local chunkname = "=console"; |
| 94 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil | 94 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil |
| 95 local chunk, err = envload("return "..line, chunkname, env); | 95 local chunk, err = envload("return "..line, chunkname, env); |
| 96 if not chunk then | 96 if not chunk then |
| 97 chunk, err = envload(line, chunkname, env); | 97 chunk, err = envload(line, chunkname, env); |
| 101 err = err:gsub("'<eof>'", "the end of the line"); | 101 err = err:gsub("'<eof>'", "the end of the line"); |
| 102 session.print("Sorry, I couldn't understand that... "..err); | 102 session.print("Sorry, I couldn't understand that... "..err); |
| 103 return; | 103 return; |
| 104 end | 104 end |
| 105 end | 105 end |
| 106 | 106 |
| 107 local ranok, taskok, message = pcall(chunk); | 107 local ranok, taskok, message = pcall(chunk); |
| 108 | 108 |
| 109 if not (ranok or message or useglobalenv) and commands[line:lower()] then | 109 if not (ranok or message or useglobalenv) and commands[line:lower()] then |
| 110 commands[line:lower()](session, line); | 110 commands[line:lower()](session, line); |
| 111 return; | 111 return; |
| 112 end | 112 end |
| 113 | 113 |
| 114 if not ranok then | 114 if not ranok then |
| 115 session.print("Fatal error while running command, it did not complete"); | 115 session.print("Fatal error while running command, it did not complete"); |
| 116 session.print("Error: "..taskok); | 116 session.print("Error: "..taskok); |
| 117 return; | 117 return; |
| 118 end | 118 end |
| 119 | 119 |
| 120 if not message then | 120 if not message then |
| 121 session.print("Result: "..tostring(taskok)); | 121 session.print("Result: "..tostring(taskok)); |
| 122 return; | 122 return; |
| 123 elseif (not taskok) and message then | 123 elseif (not taskok) and message then |
| 124 session.print("Command completed with a problem"); | 124 session.print("Command completed with a problem"); |
| 125 session.print("Message: "..tostring(message)); | 125 session.print("Message: "..tostring(message)); |
| 126 return; | 126 return; |
| 127 end | 127 end |
| 128 | 128 |
| 129 session.print("OK: "..tostring(message)); | 129 session.print("OK: "..tostring(message)); |
| 130 end | 130 end |
| 131 | 131 |
| 132 local sessions = {}; | 132 local sessions = {}; |
| 133 | 133 |
| 342 end | 342 end |
| 343 end | 343 end |
| 344 | 344 |
| 345 function def_env.module:load(name, hosts, config) | 345 function def_env.module:load(name, hosts, config) |
| 346 local mm = require "modulemanager"; | 346 local mm = require "modulemanager"; |
| 347 | 347 |
| 348 hosts = get_hosts_set(hosts); | 348 hosts = get_hosts_set(hosts); |
| 349 | 349 |
| 350 -- Load the module for each host | 350 -- Load the module for each host |
| 351 local ok, err, count, mod = true, nil, 0, nil; | 351 local ok, err, count, mod = true, nil, 0, nil; |
| 352 for host in hosts do | 352 for host in hosts do |
| 353 if (not mm.is_loaded(host, name)) then | 353 if (not mm.is_loaded(host, name)) then |
| 354 mod, err = mm.load(host, name, config); | 354 mod, err = mm.load(host, name, config); |
| 365 count = count + 1; | 365 count = count + 1; |
| 366 self.session.print("Loaded for "..mod.module.host); | 366 self.session.print("Loaded for "..mod.module.host); |
| 367 end | 367 end |
| 368 end | 368 end |
| 369 end | 369 end |
| 370 | 370 |
| 371 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); | 371 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); |
| 372 end | 372 end |
| 373 | 373 |
| 374 function def_env.module:unload(name, hosts) | 374 function def_env.module:unload(name, hosts) |
| 375 local mm = require "modulemanager"; | 375 local mm = require "modulemanager"; |
| 376 | 376 |
| 377 hosts = get_hosts_set(hosts, name); | 377 hosts = get_hosts_set(hosts, name); |
| 378 | 378 |
| 379 -- Unload the module for each host | 379 -- Unload the module for each host |
| 380 local ok, err, count = true, nil, 0; | 380 local ok, err, count = true, nil, 0; |
| 381 for host in hosts do | 381 for host in hosts do |
| 382 if mm.is_loaded(host, name) then | 382 if mm.is_loaded(host, name) then |
| 383 ok, err = mm.unload(host, name); | 383 ok, err = mm.unload(host, name); |
| 431 hosts = { hosts }; | 431 hosts = { hosts }; |
| 432 end | 432 end |
| 433 if type(hosts) ~= "table" then | 433 if type(hosts) ~= "table" then |
| 434 return false, "Please supply a host or a list of hosts you would like to see"; | 434 return false, "Please supply a host or a list of hosts you would like to see"; |
| 435 end | 435 end |
| 436 | 436 |
| 437 local print = self.session.print; | 437 local print = self.session.print; |
| 438 for _, host in ipairs(hosts) do | 438 for _, host in ipairs(hosts) do |
| 439 print((host == "*" and "Global" or host)..":"); | 439 print((host == "*" and "Global" or host)..":"); |
| 440 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort(); | 440 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort(); |
| 441 if #modules == 0 then | 441 if #modules == 0 then |
| 518 function def_env.c2s:count(match_jid) | 518 function def_env.c2s:count(match_jid) |
| 519 local count = 0; | 519 local count = 0; |
| 520 show_c2s(function (jid, session) | 520 show_c2s(function (jid, session) |
| 521 if (not match_jid) or jid:match(match_jid) then | 521 if (not match_jid) or jid:match(match_jid) then |
| 522 count = count + 1; | 522 count = count + 1; |
| 523 end | 523 end |
| 524 end); | 524 end); |
| 525 return true, "Total: "..count.." clients"; | 525 return true, "Total: "..count.." clients"; |
| 526 end | 526 end |
| 527 | 527 |
| 528 function def_env.c2s:show(match_jid) | 528 function def_env.c2s:show(match_jid) |
| 538 local status, priority = "unavailable", tostring(session.priority or "-"); | 538 local status, priority = "unavailable", tostring(session.priority or "-"); |
| 539 if session.presence then | 539 if session.presence then |
| 540 status = session.presence:get_child_text("show") or "available"; | 540 status = session.presence:get_child_text("show") or "available"; |
| 541 end | 541 end |
| 542 print(session_flags(session, { " "..jid.." - "..status.."("..priority..")" })); | 542 print(session_flags(session, { " "..jid.." - "..status.."("..priority..")" })); |
| 543 end | 543 end |
| 544 end); | 544 end); |
| 545 return true, "Total: "..count.." clients"; | 545 return true, "Total: "..count.." clients"; |
| 546 end | 546 end |
| 547 | 547 |
| 548 function def_env.c2s:show_insecure(match_jid) | 548 function def_env.c2s:show_insecure(match_jid) |
| 549 local print, count = self.session.print, 0; | 549 local print, count = self.session.print, 0; |
| 550 show_c2s(function (jid, session) | 550 show_c2s(function (jid, session) |
| 551 if ((not match_jid) or jid:match(match_jid)) and not session.secure then | 551 if ((not match_jid) or jid:match(match_jid)) and not session.secure then |
| 552 count = count + 1; | 552 count = count + 1; |
| 553 print(jid); | 553 print(jid); |
| 554 end | 554 end |
| 555 end); | 555 end); |
| 556 return true, "Total: "..count.." insecure client connections"; | 556 return true, "Total: "..count.." insecure client connections"; |
| 557 end | 557 end |
| 558 | 558 |
| 559 function def_env.c2s:show_secure(match_jid) | 559 function def_env.c2s:show_secure(match_jid) |
| 560 local print, count = self.session.print, 0; | 560 local print, count = self.session.print, 0; |
| 561 show_c2s(function (jid, session) | 561 show_c2s(function (jid, session) |
| 562 if ((not match_jid) or jid:match(match_jid)) and session.secure then | 562 if ((not match_jid) or jid:match(match_jid)) and session.secure then |
| 563 count = count + 1; | 563 count = count + 1; |
| 564 print(jid); | 564 print(jid); |
| 565 end | 565 end |
| 566 end); | 566 end); |
| 567 return true, "Total: "..count.." secure client connections"; | 567 return true, "Total: "..count.." secure client connections"; |
| 568 end | 568 end |
| 569 | 569 |
| 570 function def_env.c2s:close(match_jid) | 570 function def_env.c2s:close(match_jid) |
| 580 | 580 |
| 581 | 581 |
| 582 def_env.s2s = {}; | 582 def_env.s2s = {}; |
| 583 function def_env.s2s:show(match_jid) | 583 function def_env.s2s:show(match_jid) |
| 584 local print = self.session.print; | 584 local print = self.session.print; |
| 585 | 585 |
| 586 local count_in, count_out = 0,0; | 586 local count_in, count_out = 0,0; |
| 587 local s2s_list = { }; | 587 local s2s_list = { }; |
| 588 | 588 |
| 589 local s2s_sessions = module:shared"/*/s2s/sessions"; | 589 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 590 for _, session in pairs(s2s_sessions) do | 590 for _, session in pairs(s2s_sessions) do |
| 591 local remotehost, localhost, direction; | 591 local remotehost, localhost, direction; |
| 592 if session.direction == "outgoing" then | 592 if session.direction == "outgoing" then |
| 593 direction = "->"; | 593 direction = "->"; |
| 722 end | 722 end |
| 723 end | 723 end |
| 724 local domain_certs = array.collect(values(cert_set)); | 724 local domain_certs = array.collect(values(cert_set)); |
| 725 -- Phew. We now have a array of unique certificates presented by domain. | 725 -- Phew. We now have a array of unique certificates presented by domain. |
| 726 local n_certs = #domain_certs; | 726 local n_certs = #domain_certs; |
| 727 | 727 |
| 728 if n_certs == 0 then | 728 if n_certs == 0 then |
| 729 return "No certificates found for "..domain; | 729 return "No certificates found for "..domain; |
| 730 end | 730 end |
| 731 | 731 |
| 732 local function _capitalize_and_colon(byte) | 732 local function _capitalize_and_colon(byte) |
| 733 return string.upper(byte)..":"; | 733 return string.upper(byte)..":"; |
| 734 end | 734 end |
| 735 local function pretty_fingerprint(hash) | 735 local function pretty_fingerprint(hash) |
| 736 return hash:gsub("..", _capitalize_and_colon):sub(1, -2); | 736 return hash:gsub("..", _capitalize_and_colon):sub(1, -2); |
| 737 end | 737 end |
| 738 | 738 |
| 739 for cert_info in values(domain_certs) do | 739 for cert_info in values(domain_certs) do |
| 740 local certs = cert_info.certs; | 740 local certs = cert_info.certs; |
| 741 local cert = certs[1]; | 741 local cert = certs[1]; |
| 742 print("---") | 742 print("---") |
| 743 print("Fingerprint (SHA1): "..pretty_fingerprint(cert:digest("sha1"))); | 743 print("Fingerprint (SHA1): "..pretty_fingerprint(cert:digest("sha1"))); |
| 775 end | 775 end |
| 776 | 776 |
| 777 function def_env.s2s:close(from, to) | 777 function def_env.s2s:close(from, to) |
| 778 local print, count = self.session.print, 0; | 778 local print, count = self.session.print, 0; |
| 779 local s2s_sessions = module:shared"/*/s2s/sessions"; | 779 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 780 | 780 |
| 781 local match_id; | 781 local match_id; |
| 782 if from and not to then | 782 if from and not to then |
| 783 match_id, from = from; | 783 match_id, from = from; |
| 784 elseif not to then | 784 elseif not to then |
| 785 return false, "Syntax: s2s:close('from', 'to') - Closes all s2s sessions from 'from' to 'to'"; | 785 return false, "Syntax: s2s:close('from', 'to') - Closes all s2s sessions from 'from' to 'to'"; |
| 786 elseif from == to then | 786 elseif from == to then |
| 787 return false, "Both from and to are the same... you can't do that :)"; | 787 return false, "Both from and to are the same... you can't do that :)"; |
| 788 end | 788 end |
| 789 | 789 |
| 790 for _, session in pairs(s2s_sessions) do | 790 for _, session in pairs(s2s_sessions) do |
| 791 local id = session.type..tostring(session):match("[a-f0-9]+$"); | 791 local id = session.type..tostring(session):match("[a-f0-9]+$"); |
| 792 if (match_id and match_id == id) | 792 if (match_id and match_id == id) |
| 793 or (session.from_host == from and session.to_host == to) then | 793 or (session.from_host == from and session.to_host == to) then |
| 794 print(("Closing connection from %s to %s [%s]"):format(session.from_host, session.to_host, id)); | 794 print(("Closing connection from %s to %s [%s]"):format(session.from_host, session.to_host, id)); |
| 1029 | 1029 |
| 1030 function printbanner(session) | 1030 function printbanner(session) |
| 1031 local option = module:get_option("console_banner"); | 1031 local option = module:get_option("console_banner"); |
| 1032 if option == nil or option == "full" or option == "graphic" then | 1032 if option == nil or option == "full" or option == "graphic" then |
| 1033 session.print [[ | 1033 session.print [[ |
| 1034 ____ \ / _ | 1034 ____ \ / _ |
| 1035 | _ \ _ __ ___ ___ _-_ __| |_ _ | 1035 | _ \ _ __ ___ ___ _-_ __| |_ _ |
| 1036 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | | 1036 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | |
| 1037 | __/| | | (_) \__ \ |_| | (_| | |_| | | 1037 | __/| | | (_) \__ \ |_| | (_| | |_| | |
| 1038 |_| |_| \___/|___/\___/ \__,_|\__, | | 1038 |_| |_| \___/|___/\___/ \__,_|\__, | |
| 1039 A study in simplicity |___/ | 1039 A study in simplicity |___/ |
| 1040 | 1040 |
| 1041 ]] | 1041 ]] |
| 1042 end | 1042 end |
| 1043 if option == nil or option == "short" or option == "full" then | 1043 if option == nil or option == "short" or option == "full" then |
| 1044 session.print("Welcome to the Prosody administration console. For a list of commands, type: help"); | 1044 session.print("Welcome to the Prosody administration console. For a list of commands, type: help"); |
