Mercurial > prosody-hg
comparison plugins/mod_admin_telnet.lua @ 6054:7a5ddbaf758d
Merge 0.9->0.10
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 02 Apr 2014 17:41:38 +0100 |
| parents | ac0879a8190a |
| children | dab7ad6fa23c |
comparison
equal
deleted
inserted
replaced
| 6053:2f93a04564b2 | 6054:7a5ddbaf758d |
|---|---|
| 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(); |
| 15 | 15 |
| 16 local _G = _G; | 16 local _G = _G; |
| 17 | 17 |
| 18 local prosody = _G.prosody; | 18 local prosody = _G.prosody; |
| 19 local hosts = prosody.hosts; | 19 local hosts = prosody.hosts; |
| 20 local incoming_s2s = prosody.incoming_s2s; | |
| 21 | 20 |
| 22 local console_listener = { default_port = 5582; default_mode = "*a"; interface = "127.0.0.1" }; | 21 local console_listener = { default_port = 5582; default_mode = "*a"; interface = "127.0.0.1" }; |
| 23 | 22 |
| 24 local iterators = require "util.iterators"; | 23 local iterators = require "util.iterators"; |
| 25 local keys, values = iterators.keys, iterators.values; | 24 local keys, values = iterators.keys, iterators.values; |
| 58 w("| "..table.concat(t, "\t").."\n"); | 57 w("| "..table.concat(t, "\t").."\n"); |
| 59 end; | 58 end; |
| 60 disconnect = function () conn:close(); end; | 59 disconnect = function () conn:close(); end; |
| 61 }; | 60 }; |
| 62 session.env = setmetatable({}, default_env_mt); | 61 session.env = setmetatable({}, default_env_mt); |
| 63 | 62 |
| 64 -- Load up environment with helper objects | 63 -- Load up environment with helper objects |
| 65 for name, t in pairs(def_env) do | 64 for name, t in pairs(def_env) do |
| 66 if type(t) == "table" then | 65 if type(t) == "table" then |
| 67 session.env[name] = setmetatable({ session = session }, { __index = t }); | 66 session.env[name] = setmetatable({ session = session }, { __index = t }); |
| 68 end | 67 end |
| 69 end | 68 end |
| 70 | 69 |
| 71 return session; | 70 return session; |
| 72 end | 71 end |
| 73 | 72 |
| 74 function console:process_line(session, line) | 73 function console:process_line(session, line) |
| 75 local useglobalenv; | 74 local useglobalenv; |
| 76 | 75 |
| 77 if line:match("^>") then | 76 if line:match("^>") then |
| 78 line = line:gsub("^>", ""); | 77 line = line:gsub("^>", ""); |
| 79 useglobalenv = true; | 78 useglobalenv = true; |
| 80 elseif line == "\004" then | 79 elseif line == "\004" then |
| 81 commands["bye"](session, line); | 80 commands["bye"](session, line); |
| 85 if commands[command] then | 84 if commands[command] then |
| 86 commands[command](session, line); | 85 commands[command](session, line); |
| 87 return; | 86 return; |
| 88 end | 87 end |
| 89 end | 88 end |
| 90 | 89 |
| 91 session.env._ = line; | 90 session.env._ = line; |
| 92 | 91 |
| 93 local chunkname = "=console"; | 92 local chunkname = "=console"; |
| 94 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil | 93 local env = (useglobalenv and redirect_output(_G, session)) or session.env or nil |
| 95 local chunk, err = envload("return "..line, chunkname, env); | 94 local chunk, err = envload("return "..line, chunkname, env); |
| 96 if not chunk then | 95 if not chunk then |
| 97 chunk, err = envload(line, chunkname, env); | 96 chunk, err = envload(line, chunkname, env); |
| 101 err = err:gsub("'<eof>'", "the end of the line"); | 100 err = err:gsub("'<eof>'", "the end of the line"); |
| 102 session.print("Sorry, I couldn't understand that... "..err); | 101 session.print("Sorry, I couldn't understand that... "..err); |
| 103 return; | 102 return; |
| 104 end | 103 end |
| 105 end | 104 end |
| 106 | 105 |
| 107 local ranok, taskok, message = pcall(chunk); | 106 local ranok, taskok, message = pcall(chunk); |
| 108 | 107 |
| 109 if not (ranok or message or useglobalenv) and commands[line:lower()] then | 108 if not (ranok or message or useglobalenv) and commands[line:lower()] then |
| 110 commands[line:lower()](session, line); | 109 commands[line:lower()](session, line); |
| 111 return; | 110 return; |
| 112 end | 111 end |
| 113 | 112 |
| 114 if not ranok then | 113 if not ranok then |
| 115 session.print("Fatal error while running command, it did not complete"); | 114 session.print("Fatal error while running command, it did not complete"); |
| 116 session.print("Error: "..taskok); | 115 session.print("Error: "..taskok); |
| 117 return; | 116 return; |
| 118 end | 117 end |
| 119 | 118 |
| 120 if not message then | 119 if not message then |
| 121 session.print("Result: "..tostring(taskok)); | 120 session.print("Result: "..tostring(taskok)); |
| 122 return; | 121 return; |
| 123 elseif (not taskok) and message then | 122 elseif (not taskok) and message then |
| 124 session.print("Command completed with a problem"); | 123 session.print("Command completed with a problem"); |
| 125 session.print("Message: "..tostring(message)); | 124 session.print("Message: "..tostring(message)); |
| 126 return; | 125 return; |
| 127 end | 126 end |
| 128 | 127 |
| 129 session.print("OK: "..tostring(message)); | 128 session.print("OK: "..tostring(message)); |
| 130 end | 129 end |
| 131 | 130 |
| 132 local sessions = {}; | 131 local sessions = {}; |
| 133 | 132 |
| 342 end | 341 end |
| 343 end | 342 end |
| 344 | 343 |
| 345 function def_env.module:load(name, hosts, config) | 344 function def_env.module:load(name, hosts, config) |
| 346 local mm = require "modulemanager"; | 345 local mm = require "modulemanager"; |
| 347 | 346 |
| 348 hosts = get_hosts_set(hosts); | 347 hosts = get_hosts_set(hosts); |
| 349 | 348 |
| 350 -- Load the module for each host | 349 -- Load the module for each host |
| 351 local ok, err, count, mod = true, nil, 0, nil; | 350 local ok, err, count, mod = true, nil, 0, nil; |
| 352 for host in hosts do | 351 for host in hosts do |
| 353 if (not mm.is_loaded(host, name)) then | 352 if (not mm.is_loaded(host, name)) then |
| 354 mod, err = mm.load(host, name, config); | 353 mod, err = mm.load(host, name, config); |
| 365 count = count + 1; | 364 count = count + 1; |
| 366 self.session.print("Loaded for "..mod.module.host); | 365 self.session.print("Loaded for "..mod.module.host); |
| 367 end | 366 end |
| 368 end | 367 end |
| 369 end | 368 end |
| 370 | 369 |
| 371 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); | 370 return ok, (ok and "Module loaded onto "..count.." host"..(count ~= 1 and "s" or "")) or ("Last error: "..tostring(err)); |
| 372 end | 371 end |
| 373 | 372 |
| 374 function def_env.module:unload(name, hosts) | 373 function def_env.module:unload(name, hosts) |
| 375 local mm = require "modulemanager"; | 374 local mm = require "modulemanager"; |
| 376 | 375 |
| 377 hosts = get_hosts_set(hosts, name); | 376 hosts = get_hosts_set(hosts, name); |
| 378 | 377 |
| 379 -- Unload the module for each host | 378 -- Unload the module for each host |
| 380 local ok, err, count = true, nil, 0; | 379 local ok, err, count = true, nil, 0; |
| 381 for host in hosts do | 380 for host in hosts do |
| 382 if mm.is_loaded(host, name) then | 381 if mm.is_loaded(host, name) then |
| 383 ok, err = mm.unload(host, name); | 382 ok, err = mm.unload(host, name); |
| 431 hosts = { hosts }; | 430 hosts = { hosts }; |
| 432 end | 431 end |
| 433 if type(hosts) ~= "table" then | 432 if type(hosts) ~= "table" then |
| 434 return false, "Please supply a host or a list of hosts you would like to see"; | 433 return false, "Please supply a host or a list of hosts you would like to see"; |
| 435 end | 434 end |
| 436 | 435 |
| 437 local print = self.session.print; | 436 local print = self.session.print; |
| 438 for _, host in ipairs(hosts) do | 437 for _, host in ipairs(hosts) do |
| 439 print((host == "*" and "Global" or host)..":"); | 438 print((host == "*" and "Global" or host)..":"); |
| 440 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort(); | 439 local modules = array.collect(keys(modulemanager.get_modules(host) or {})):sort(); |
| 441 if #modules == 0 then | 440 if #modules == 0 then |
| 481 end | 480 end |
| 482 | 481 |
| 483 function def_env.hosts:add(name) | 482 function def_env.hosts:add(name) |
| 484 end | 483 end |
| 485 | 484 |
| 485 local function session_flags(session, line) | |
| 486 line = line or {}; | |
| 487 if session.cert_identity_status == "valid" then | |
| 488 line[#line+1] = "(secure)"; | |
| 489 elseif session.secure then | |
| 490 line[#line+1] = "(encrypted)"; | |
| 491 end | |
| 492 if session.compressed then | |
| 493 line[#line+1] = "(compressed)"; | |
| 494 end | |
| 495 if session.smacks then | |
| 496 line[#line+1] = "(sm)"; | |
| 497 end | |
| 498 if session.ip and session.ip:match(":") then | |
| 499 line[#line+1] = "(IPv6)"; | |
| 500 end | |
| 501 return table.concat(line, " "); | |
| 502 end | |
| 503 | |
| 486 def_env.c2s = {}; | 504 def_env.c2s = {}; |
| 487 | 505 |
| 488 local function show_c2s(callback) | 506 local function show_c2s(callback) |
| 489 for hostname, host in pairs(hosts) do | 507 for hostname, host in pairs(hosts) do |
| 490 for username, user in pairs(host.sessions or {}) do | 508 for username, user in pairs(host.sessions or {}) do |
| 499 function def_env.c2s:count(match_jid) | 517 function def_env.c2s:count(match_jid) |
| 500 local count = 0; | 518 local count = 0; |
| 501 show_c2s(function (jid, session) | 519 show_c2s(function (jid, session) |
| 502 if (not match_jid) or jid:match(match_jid) then | 520 if (not match_jid) or jid:match(match_jid) then |
| 503 count = count + 1; | 521 count = count + 1; |
| 504 end | 522 end |
| 505 end); | 523 end); |
| 506 return true, "Total: "..count.." clients"; | 524 return true, "Total: "..count.." clients"; |
| 507 end | 525 end |
| 508 | 526 |
| 509 function def_env.c2s:show(match_jid) | 527 function def_env.c2s:show(match_jid) |
| 516 end | 534 end |
| 517 if (not match_jid) or jid:match(match_jid) then | 535 if (not match_jid) or jid:match(match_jid) then |
| 518 count = count + 1; | 536 count = count + 1; |
| 519 local status, priority = "unavailable", tostring(session.priority or "-"); | 537 local status, priority = "unavailable", tostring(session.priority or "-"); |
| 520 if session.presence then | 538 if session.presence then |
| 521 status = session.presence:child_with_name("show"); | 539 status = session.presence:get_child_text("show") or "available"; |
| 522 if status then | 540 end |
| 523 status = status:get_text() or "[invalid!]"; | 541 print(session_flags(session, { " "..jid.." - "..status.."("..priority..")" })); |
| 524 else | 542 end |
| 525 status = "available"; | |
| 526 end | |
| 527 end | |
| 528 print(" "..jid.." - "..status.."("..priority..")"); | |
| 529 end | |
| 530 end); | 543 end); |
| 531 return true, "Total: "..count.." clients"; | 544 return true, "Total: "..count.." clients"; |
| 532 end | 545 end |
| 533 | 546 |
| 534 function def_env.c2s:show_insecure(match_jid) | 547 function def_env.c2s:show_insecure(match_jid) |
| 535 local print, count = self.session.print, 0; | 548 local print, count = self.session.print, 0; |
| 536 show_c2s(function (jid, session) | 549 show_c2s(function (jid, session) |
| 537 if ((not match_jid) or jid:match(match_jid)) and not session.secure then | 550 if ((not match_jid) or jid:match(match_jid)) and not session.secure then |
| 538 count = count + 1; | 551 count = count + 1; |
| 539 print(jid); | 552 print(jid); |
| 540 end | 553 end |
| 541 end); | 554 end); |
| 542 return true, "Total: "..count.." insecure client connections"; | 555 return true, "Total: "..count.." insecure client connections"; |
| 543 end | 556 end |
| 544 | 557 |
| 545 function def_env.c2s:show_secure(match_jid) | 558 function def_env.c2s:show_secure(match_jid) |
| 546 local print, count = self.session.print, 0; | 559 local print, count = self.session.print, 0; |
| 547 show_c2s(function (jid, session) | 560 show_c2s(function (jid, session) |
| 548 if ((not match_jid) or jid:match(match_jid)) and session.secure then | 561 if ((not match_jid) or jid:match(match_jid)) and session.secure then |
| 549 count = count + 1; | 562 count = count + 1; |
| 550 print(jid); | 563 print(jid); |
| 551 end | 564 end |
| 552 end); | 565 end); |
| 553 return true, "Total: "..count.." secure client connections"; | 566 return true, "Total: "..count.." secure client connections"; |
| 554 end | 567 end |
| 555 | 568 |
| 556 function def_env.c2s:close(match_jid) | 569 function def_env.c2s:close(match_jid) |
| 562 end | 575 end |
| 563 end); | 576 end); |
| 564 return true, "Total: "..count.." sessions closed"; | 577 return true, "Total: "..count.." sessions closed"; |
| 565 end | 578 end |
| 566 | 579 |
| 567 local function session_flags(session, line) | |
| 568 if session.cert_identity_status == "valid" then | |
| 569 line[#line+1] = "(secure)"; | |
| 570 elseif session.secure then | |
| 571 line[#line+1] = "(encrypted)"; | |
| 572 end | |
| 573 if session.compressed then | |
| 574 line[#line+1] = "(compressed)"; | |
| 575 end | |
| 576 if session.smacks then | |
| 577 line[#line+1] = "(sm)"; | |
| 578 end | |
| 579 if session.conn and session.conn:ip():match(":") then | |
| 580 line[#line+1] = "(IPv6)"; | |
| 581 end | |
| 582 return table.concat(line, " "); | |
| 583 end | |
| 584 | 580 |
| 585 def_env.s2s = {}; | 581 def_env.s2s = {}; |
| 586 function def_env.s2s:show(match_jid) | 582 function def_env.s2s:show(match_jid) |
| 587 local _print = self.session.print; | |
| 588 local print = self.session.print; | 583 local print = self.session.print; |
| 589 | 584 |
| 590 local count_in, count_out = 0,0; | 585 local count_in, count_out = 0,0; |
| 591 | 586 local s2s_list = { }; |
| 592 for host, host_session in pairs(hosts) do | 587 |
| 593 print = function (...) _print(host); _print(...); print = _print; end | 588 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 594 for remotehost, session in pairs(host_session.s2sout) do | 589 for _, session in pairs(s2s_sessions) do |
| 595 if (not match_jid) or remotehost:match(match_jid) or host:match(match_jid) then | 590 local remotehost, localhost, direction; |
| 596 count_out = count_out + 1; | 591 if session.direction == "outgoing" then |
| 597 print(session_flags(session, {" ", host, "->", remotehost})); | 592 direction = "->"; |
| 598 if session.sendq then | 593 count_out = count_out + 1; |
| 599 print(" There are "..#session.sendq.." queued outgoing stanzas for this connection"); | 594 remotehost, localhost = session.to_host or "?", session.from_host or "?"; |
| 595 else | |
| 596 direction = "<-"; | |
| 597 count_in = count_in + 1; | |
| 598 remotehost, localhost = session.from_host or "?", session.to_host or "?"; | |
| 599 end | |
| 600 local sess_lines = { l = localhost, r = remotehost, | |
| 601 session_flags(session, { "", direction, remotehost or "?", | |
| 602 "["..session.type..tostring(session):match("[a-f0-9]*$").."]" })}; | |
| 603 | |
| 604 if (not match_jid) or remotehost:match(match_jid) or localhost:match(match_jid) then | |
| 605 table.insert(s2s_list, sess_lines); | |
| 606 local print = function (s) table.insert(sess_lines, " "..s); end | |
| 607 if session.sendq then | |
| 608 print("There are "..#session.sendq.." queued outgoing stanzas for this connection"); | |
| 609 end | |
| 610 if session.type == "s2sout_unauthed" then | |
| 611 if session.connecting then | |
| 612 print("Connection not yet established"); | |
| 613 if not session.srv_hosts then | |
| 614 if not session.conn then | |
| 615 print("We do not yet have a DNS answer for this host's SRV records"); | |
| 616 else | |
| 617 print("This host has no SRV records, using A record instead"); | |
| 618 end | |
| 619 elseif session.srv_choice then | |
| 620 print("We are on SRV record "..session.srv_choice.." of "..#session.srv_hosts); | |
| 621 local srv_choice = session.srv_hosts[session.srv_choice]; | |
| 622 print("Using "..(srv_choice.target or ".")..":"..(srv_choice.port or 5269)); | |
| 623 end | |
| 624 elseif session.notopen then | |
| 625 print("The <stream> has not yet been opened"); | |
| 626 elseif not session.dialback_key then | |
| 627 print("Dialback has not been initiated yet"); | |
| 628 elseif session.dialback_key then | |
| 629 print("Dialback has been requested, but no result received"); | |
| 600 end | 630 end |
| 601 if session.type == "s2sout_unauthed" then | 631 end |
| 602 if session.connecting then | 632 if session.type == "s2sin_unauthed" then |
| 603 print(" Connection not yet established"); | 633 print("Connection not yet authenticated"); |
| 604 if not session.srv_hosts then | 634 elseif session.type == "s2sin" then |
| 605 if not session.conn then | 635 for name in pairs(session.hosts) do |
| 606 print(" We do not yet have a DNS answer for this host's SRV records"); | 636 if name ~= session.from_host then |
| 607 else | 637 print("also hosts "..tostring(name)); |
| 608 print(" This host has no SRV records, using A record instead"); | |
| 609 end | |
| 610 elseif session.srv_choice then | |
| 611 print(" We are on SRV record "..session.srv_choice.." of "..#session.srv_hosts); | |
| 612 local srv_choice = session.srv_hosts[session.srv_choice]; | |
| 613 print(" Using "..(srv_choice.target or ".")..":"..(srv_choice.port or 5269)); | |
| 614 end | |
| 615 elseif session.notopen then | |
| 616 print(" The <stream> has not yet been opened"); | |
| 617 elseif not session.dialback_key then | |
| 618 print(" Dialback has not been initiated yet"); | |
| 619 elseif session.dialback_key then | |
| 620 print(" Dialback has been requested, but no result received"); | |
| 621 end | 638 end |
| 622 end | 639 end |
| 623 end | 640 end |
| 624 end | 641 end |
| 625 local subhost_filter = function (h) | 642 end |
| 626 return (match_jid and h:match(match_jid)); | 643 |
| 627 end | 644 -- Sort by local host, then remote host |
| 628 for session in pairs(incoming_s2s) do | 645 table.sort(s2s_list, function(a,b) |
| 629 if session.to_host == host and ((not match_jid) or host:match(match_jid) | 646 if a.l == b.l then return a.r < b.r; end |
| 630 or (session.from_host and session.from_host:match(match_jid)) | 647 return a.l < b.l; |
| 631 -- Pft! is what I say to list comprehensions | 648 end); |
| 632 or (session.hosts and #array.collect(keys(session.hosts)):filter(subhost_filter)>0)) then | 649 local lasthost; |
| 633 count_in = count_in + 1; | 650 for _, sess_lines in ipairs(s2s_list) do |
| 634 print(session_flags(session, {" ", host, "<-", session.from_host or "(unknown)"})); | 651 if sess_lines.l ~= lasthost then print(sess_lines.l); lasthost=sess_lines.l end |
| 635 if session.type == "s2sin_unauthed" then | 652 for _, line in ipairs(sess_lines) do print(line); end |
| 636 print(" Connection not yet authenticated"); | 653 end |
| 637 end | |
| 638 for name in pairs(session.hosts) do | |
| 639 if name ~= session.from_host then | |
| 640 print(" also hosts "..tostring(name)); | |
| 641 end | |
| 642 end | |
| 643 end | |
| 644 end | |
| 645 | |
| 646 print = _print; | |
| 647 end | |
| 648 | |
| 649 for session in pairs(incoming_s2s) do | |
| 650 if not session.to_host and ((not match_jid) or session.from_host and session.from_host:match(match_jid)) then | |
| 651 count_in = count_in + 1; | |
| 652 print("Other incoming s2s connections"); | |
| 653 print(" (unknown) <- "..(session.from_host or "(unknown)")); | |
| 654 end | |
| 655 end | |
| 656 | |
| 657 return true, "Total: "..count_out.." outgoing, "..count_in.." incoming connections"; | 654 return true, "Total: "..count_out.." outgoing, "..count_in.." incoming connections"; |
| 658 end | 655 end |
| 659 | 656 |
| 660 local function print_subject(print, subject) | 657 local function print_subject(print, subject) |
| 661 for _, entry in ipairs(subject) do | 658 for _, entry in ipairs(subject) do |
| 683 end | 680 end |
| 684 | 681 |
| 685 function def_env.s2s:showcert(domain) | 682 function def_env.s2s:showcert(domain) |
| 686 local ser = require "util.serialization".serialize; | 683 local ser = require "util.serialization".serialize; |
| 687 local print = self.session.print; | 684 local print = self.session.print; |
| 688 local domain_sessions = set.new(array.collect(keys(incoming_s2s))) | 685 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 689 /function(session) return session.from_host == domain and session or nil; end; | 686 local domain_sessions = set.new(array.collect(values(s2s_sessions))) |
| 690 for local_host in values(prosody.hosts) do | 687 /function(session) return (session.to_host == domain or session.from_host == domain) and session or nil; end; |
| 691 local s2sout = local_host.s2sout; | |
| 692 if s2sout and s2sout[domain] then | |
| 693 domain_sessions:add(s2sout[domain]); | |
| 694 end | |
| 695 end | |
| 696 local cert_set = {}; | 688 local cert_set = {}; |
| 697 for session in domain_sessions do | 689 for session in domain_sessions do |
| 698 local conn = session.conn; | 690 local conn = session.conn; |
| 699 conn = conn and conn:socket(); | 691 conn = conn and conn:socket(); |
| 700 if not conn.getpeerchain then | 692 if not conn.getpeerchain then |
| 729 end | 721 end |
| 730 end | 722 end |
| 731 local domain_certs = array.collect(values(cert_set)); | 723 local domain_certs = array.collect(values(cert_set)); |
| 732 -- Phew. We now have a array of unique certificates presented by domain. | 724 -- Phew. We now have a array of unique certificates presented by domain. |
| 733 local n_certs = #domain_certs; | 725 local n_certs = #domain_certs; |
| 734 | 726 |
| 735 if n_certs == 0 then | 727 if n_certs == 0 then |
| 736 return "No certificates found for "..domain; | 728 return "No certificates found for "..domain; |
| 737 end | 729 end |
| 738 | 730 |
| 739 local function _capitalize_and_colon(byte) | 731 local function _capitalize_and_colon(byte) |
| 740 return string.upper(byte)..":"; | 732 return string.upper(byte)..":"; |
| 741 end | 733 end |
| 742 local function pretty_fingerprint(hash) | 734 local function pretty_fingerprint(hash) |
| 743 return hash:gsub("..", _capitalize_and_colon):sub(1, -2); | 735 return hash:gsub("..", _capitalize_and_colon):sub(1, -2); |
| 744 end | 736 end |
| 745 | 737 |
| 746 for cert_info in values(domain_certs) do | 738 for cert_info in values(domain_certs) do |
| 747 local certs = cert_info.certs; | 739 local certs = cert_info.certs; |
| 748 local cert = certs[1]; | 740 local cert = certs[1]; |
| 749 print("---") | 741 print("---") |
| 750 print("Fingerprint (SHA1): "..pretty_fingerprint(cert:digest("sha1"))); | 742 print("Fingerprint (SHA1): "..pretty_fingerprint(cert:digest("sha1"))); |
| 781 .." presented by "..domain.."."); | 773 .." presented by "..domain.."."); |
| 782 end | 774 end |
| 783 | 775 |
| 784 function def_env.s2s:close(from, to) | 776 function def_env.s2s:close(from, to) |
| 785 local print, count = self.session.print, 0; | 777 local print, count = self.session.print, 0; |
| 786 | 778 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 787 if not (from and to) then | 779 |
| 780 local match_id; | |
| 781 if from and not to then | |
| 782 match_id, from = from; | |
| 783 elseif not to then | |
| 788 return false, "Syntax: s2s:close('from', 'to') - Closes all s2s sessions from 'from' to 'to'"; | 784 return false, "Syntax: s2s:close('from', 'to') - Closes all s2s sessions from 'from' to 'to'"; |
| 789 elseif from == to then | 785 elseif from == to then |
| 790 return false, "Both from and to are the same... you can't do that :)"; | 786 return false, "Both from and to are the same... you can't do that :)"; |
| 791 end | 787 end |
| 792 | 788 |
| 793 if hosts[from] and not hosts[to] then | 789 for _, session in pairs(s2s_sessions) do |
| 794 -- Is an outgoing connection | 790 local id = session.type..tostring(session):match("[a-f0-9]+$"); |
| 795 local session = hosts[from].s2sout[to]; | 791 if (match_id and match_id == id) |
| 796 if not session then | 792 or (session.from_host == from and session.to_host == to) then |
| 797 print("No outgoing connection from "..from.." to "..to) | 793 print(("Closing connection from %s to %s [%s]"):format(session.from_host, session.to_host, id)); |
| 798 else | |
| 799 (session.close or s2smanager.destroy_session)(session); | 794 (session.close or s2smanager.destroy_session)(session); |
| 800 count = count + 1; | 795 count = count + 1 ; |
| 801 print("Closed outgoing session from "..from.." to "..to); | 796 end |
| 802 end | 797 end |
| 803 elseif hosts[to] and not hosts[from] then | |
| 804 -- Is an incoming connection | |
| 805 for session in pairs(incoming_s2s) do | |
| 806 if session.to_host == to and session.from_host == from then | |
| 807 (session.close or s2smanager.destroy_session)(session); | |
| 808 count = count + 1; | |
| 809 end | |
| 810 end | |
| 811 | |
| 812 if count == 0 then | |
| 813 print("No incoming connections from "..from.." to "..to); | |
| 814 else | |
| 815 print("Closed "..count.." incoming session"..((count == 1 and "") or "s").." from "..from.." to "..to); | |
| 816 end | |
| 817 elseif hosts[to] and hosts[from] then | |
| 818 return false, "Both of the hostnames you specified are local, there are no s2s sessions to close"; | |
| 819 else | |
| 820 return false, "Neither of the hostnames you specified are being used on this server"; | |
| 821 end | |
| 822 | |
| 823 return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s"); | 798 return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s"); |
| 824 end | 799 end |
| 825 | 800 |
| 826 function def_env.s2s:closeall(host) | 801 function def_env.s2s:closeall(host) |
| 827 local count = 0; | 802 local count = 0; |
| 828 | 803 local s2s_sessions = module:shared"/*/s2s/sessions"; |
| 829 if not host or type(host) ~= "string" then return false, "wrong syntax: please use s2s:closeall('hostname.tld')"; end | 804 for _,session in pairs(s2s_sessions) do |
| 830 if hosts[host] then | 805 if not host or session.from_host == host or session.to_host == host then |
| 831 for session in pairs(incoming_s2s) do | 806 session:close(); |
| 832 if session.to_host == host then | |
| 833 (session.close or s2smanager.destroy_session)(session); | |
| 834 count = count + 1; | 807 count = count + 1; |
| 835 end | 808 end |
| 836 end | 809 end |
| 837 for _, session in pairs(hosts[host].s2sout) do | |
| 838 (session.close or s2smanager.destroy_session)(session); | |
| 839 count = count + 1; | |
| 840 end | |
| 841 else | |
| 842 for session in pairs(incoming_s2s) do | |
| 843 if session.from_host == host then | |
| 844 (session.close or s2smanager.destroy_session)(session); | |
| 845 count = count + 1; | |
| 846 end | |
| 847 end | |
| 848 for _, h in pairs(hosts) do | |
| 849 if h.s2sout[host] then | |
| 850 (h.s2sout[host].close or s2smanager.destroy_session)(h.s2sout[host]); | |
| 851 count = count + 1; | |
| 852 end | |
| 853 end | |
| 854 end | |
| 855 | |
| 856 if count == 0 then return false, "No sessions to close."; | 810 if count == 0 then return false, "No sessions to close."; |
| 857 else return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s"); end | 811 else return true, "Closed "..count.." s2s session"..((count == 1 and "") or "s"); end |
| 858 end | 812 end |
| 859 | 813 |
| 860 def_env.host = {}; def_env.hosts = def_env.host; | 814 def_env.host = {}; def_env.hosts = def_env.host; |
| 1074 | 1028 |
| 1075 function printbanner(session) | 1029 function printbanner(session) |
| 1076 local option = module:get_option("console_banner"); | 1030 local option = module:get_option("console_banner"); |
| 1077 if option == nil or option == "full" or option == "graphic" then | 1031 if option == nil or option == "full" or option == "graphic" then |
| 1078 session.print [[ | 1032 session.print [[ |
| 1079 ____ \ / _ | 1033 ____ \ / _ |
| 1080 | _ \ _ __ ___ ___ _-_ __| |_ _ | 1034 | _ \ _ __ ___ ___ _-_ __| |_ _ |
| 1081 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | | 1035 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | |
| 1082 | __/| | | (_) \__ \ |_| | (_| | |_| | | 1036 | __/| | | (_) \__ \ |_| | (_| | |_| | |
| 1083 |_| |_| \___/|___/\___/ \__,_|\__, | | 1037 |_| |_| \___/|___/\___/ \__,_|\__, | |
| 1084 A study in simplicity |___/ | 1038 A study in simplicity |___/ |
| 1085 | 1039 |
| 1086 ]] | 1040 ]] |
| 1087 end | 1041 end |
| 1088 if option == nil or option == "short" or option == "full" then | 1042 if option == nil or option == "short" or option == "full" then |
| 1089 session.print("Welcome to the Prosody administration console. For a list of commands, type: help"); | 1043 session.print("Welcome to the Prosody administration console. For a list of commands, type: help"); |
