Comparison

plugins/mod_admin_shell.lua @ 12229:30ea791ce817

mod_admin_shell: Add descriptions of each column to 'help columns' Since some of the titles are quite dense
author Kim Alvefur <zash@zash.se>
date Sun, 30 Jan 2022 12:49:43 +0100
parent 12228:f60f9cd9d26c
child 12258:99560987ea19
comparison
equal deleted inserted replaced
12228:f60f9cd9d26c 12229:30ea791ce817
319 print [[The columns shown by c2s:show() and s2s:show() can be customizied via the]] 319 print [[The columns shown by c2s:show() and s2s:show() can be customizied via the]]
320 print [['columns' argument as described here.]] 320 print [['columns' argument as described here.]]
321 print [[]] 321 print [[]]
322 print [[Columns can be specified either as "id jid ipv" or as {"id", "jid", "ipv"}.]] 322 print [[Columns can be specified either as "id jid ipv" or as {"id", "jid", "ipv"}.]]
323 print [[Available columns are:]] 323 print [[Available columns are:]]
324 local meta_columns = {
325 { title = "ID"; width = 5 };
326 { title = "Column Title"; width = 12 };
327 { title = "Description"; width = 12 };
328 };
329 -- auto-adjust widths
330 for column, spec in pairs(available_columns) do
331 meta_columns[1].width = math.max(meta_columns[1].width or 0, #column);
332 meta_columns[2].width = math.max(meta_columns[2].width or 0, #(spec.title or ""));
333 meta_columns[3].width = math.max(meta_columns[3].width or 0, #(spec.description or ""));
334 end
335 local row = format_table(meta_columns, 120)
336 print(row());
324 for column, spec in iterators.sorted_pairs(available_columns) do 337 for column, spec in iterators.sorted_pairs(available_columns) do
325 print("- "..column..": "..(spec.title or capitalize(column))); 338 print(row({ column, spec.title, spec.description }));
326 -- TODO descriptions
327 end 339 end
328 print [[]] 340 print [[]]
329 print [[Most fields on the internal session structures can also be used as columns]] 341 print [[Most fields on the internal session structures can also be used as columns]]
330 -- Also, you can pass a table column specification directly, with mapper callabck and all 342 -- Also, you can pass a table column specification directly, with mapper callabck and all
331 end 343 end
701 end 713 end
702 714
703 available_columns = { 715 available_columns = {
704 jid = { 716 jid = {
705 title = "JID"; 717 title = "JID";
718 description = "Full JID of user session";
706 width = 32; 719 width = 32;
707 key = "full_jid"; 720 key = "full_jid";
708 mapper = function(full_jid, session) return full_jid or get_jid(session) end; 721 mapper = function(full_jid, session) return full_jid or get_jid(session) end;
709 }; 722 };
710 host = { 723 host = {
711 title = "Host"; 724 title = "Host";
725 description = "Local hostname";
712 key = "host"; 726 key = "host";
713 width = 22; 727 width = 22;
714 mapper = function(host, session) 728 mapper = function(host, session)
715 return host or get_s2s_hosts(session) or "?"; 729 return host or get_s2s_hosts(session) or "?";
716 end; 730 end;
717 }; 731 };
718 remote = { 732 remote = {
719 title = "Remote"; 733 title = "Remote";
734 description = "Remote hostname";
720 width = 22; 735 width = 22;
721 mapper = function(_, session) 736 mapper = function(_, session)
722 return select(2, get_s2s_hosts(session)); 737 return select(2, get_s2s_hosts(session));
723 end; 738 end;
724 }; 739 };
725 port = { 740 port = {
726 title = "Port"; 741 title = "Port";
742 description = "Server port used";
727 width = 5; 743 width = 5;
728 align = "right"; 744 align = "right";
729 key = "conn"; 745 key = "conn";
730 mapper = function(conn) return conn:serverport(); end; 746 mapper = function(conn) return conn:serverport(); end;
731 }; 747 };
732 dir = { 748 dir = {
733 title = "Dir"; 749 title = "Dir";
750 description = "Direction of server-to-server connection";
734 width = 3; 751 width = 3;
735 key = "direction"; 752 key = "direction";
736 mapper = function(dir, session) 753 mapper = function(dir, session)
737 if session.incoming and session.outgoing then return "<->"; end 754 if session.incoming and session.outgoing then return "<->"; end
738 if dir == "outgoing" then return "-->"; end 755 if dir == "outgoing" then return "-->"; end
739 if dir == "incoming" then return "<--"; end 756 if dir == "incoming" then return "<--"; end
740 end; 757 end;
741 }; 758 };
742 id = { title = "Session ID"; width = 20; key = "id" }; 759 id = { title = "Session ID"; description = "Internal session ID used in logging"; width = 20; key = "id" };
743 type = { title = "Type"; width = #"c2s_unauthed"; key = "type" }; 760 type = { title = "Type"; description = "Session type"; width = #"c2s_unauthed"; key = "type" };
744 method = { 761 method = {
745 title = "Method"; 762 title = "Method";
763 description = "Connection method";
746 width = 10; 764 width = 10;
747 mapper = function(_, session) 765 mapper = function(_, session)
748 if session.bosh_version then 766 if session.bosh_version then
749 return "BOSH"; 767 return "BOSH";
750 elseif session.websocket_request then 768 elseif session.websocket_request then
754 end 772 end
755 end; 773 end;
756 }; 774 };
757 ipv = { 775 ipv = {
758 title = "IPv"; 776 title = "IPv";
777 description = "Internet Protocol version (4 or 6)";
759 width = 4; 778 width = 4;
760 key = "ip"; 779 key = "ip";
761 mapper = function(ip) if ip then return ip:find(":") and "IPv6" or "IPv4"; end end; 780 mapper = function(ip) if ip then return ip:find(":") and "IPv6" or "IPv4"; end end;
762 }; 781 };
763 ip = { title = "IP address"; width = 40; key = "ip" }; 782 ip = { title = "IP address"; description = "IP address the session connected from"; width = 40; key = "ip" };
764 status = { 783 status = {
765 title = "Status"; 784 title = "Status";
785 description = "Presence status";
766 width = 6; 786 width = 6;
767 key = "presence"; 787 key = "presence";
768 mapper = function(p) 788 mapper = function(p)
769 if not p then return ""; end 789 if not p then return ""; end
770 return p:get_child_text("show") or "online"; 790 return p:get_child_text("show") or "online";
771 end; 791 end;
772 }; 792 };
773 secure = { 793 secure = {
774 title = "Security"; 794 title = "Security";
795 description = "TLS version or security status";
775 key = "conn"; 796 key = "conn";
776 width = 8; 797 width = 8;
777 mapper = function(conn, session) 798 mapper = function(conn, session)
778 if not session.secure then return "insecure"; end 799 if not session.secure then return "insecure"; end
779 if not conn or not conn:ssl() then return "secure" end 800 if not conn or not conn:ssl() then return "secure" end
783 return tls_info and tls_info.protocol or "secure"; 804 return tls_info and tls_info.protocol or "secure";
784 end; 805 end;
785 }; 806 };
786 encryption = { 807 encryption = {
787 title = "Encryption"; 808 title = "Encryption";
809 description = "Encryption algorithm used (TLS cipher suite)";
788 width = 30; 810 width = 30;
789 key = "conn"; 811 key = "conn";
790 mapper = function(conn) 812 mapper = function(conn)
791 local sock = conn:socket(); 813 local sock = conn:socket();
792 local info = sock and sock.info and sock:info(); 814 local info = sock and sock.info and sock:info();
793 if info then return info.cipher end 815 if info then return info.cipher end
794 end; 816 end;
795 }; 817 };
796 cert = { 818 cert = {
797 title = "Certificate"; 819 title = "Certificate";
820 description = "Validation status of certificate";
798 key = "cert_identity_status"; 821 key = "cert_identity_status";
799 width = 13; 822 width = 13;
800 mapper = function(cert_status, session) 823 mapper = function(cert_status, session)
801 if cert_status then return capitalize(cert_status); end 824 if cert_status then return capitalize(cert_status); end
802 if session.cert_chain_status == "Invalid" then 825 if session.cert_chain_status == "Invalid" then
813 return "Not validated"; 836 return "Not validated";
814 end; 837 end;
815 }; 838 };
816 sni = { 839 sni = {
817 title = "SNI"; 840 title = "SNI";
841 description = "Hostname requested in TLS";
818 width = 22; 842 width = 22;
819 mapper = function(_, session) 843 mapper = function(_, session)
820 if not session.conn then return end 844 if not session.conn then return end
821 local sock = session.conn:socket(); 845 local sock = session.conn:socket();
822 return sock and sock.getsniname and sock:getsniname() or ""; 846 return sock and sock.getsniname and sock:getsniname() or "";
823 end; 847 end;
824 }; 848 };
825 alpn = { 849 alpn = {
826 title = "ALPN"; 850 title = "ALPN";
851 description = "Protocol requested in TLS";
827 width = 11; 852 width = 11;
828 mapper = function(_, session) 853 mapper = function(_, session)
829 if not session.conn then return end 854 if not session.conn then return end
830 local sock = session.conn:socket(); 855 local sock = session.conn:socket();
831 return sock and sock.getalpn and sock:getalpn() or ""; 856 return sock and sock.getalpn and sock:getalpn() or "";
832 end; 857 end;
833 }; 858 };
834 smacks = { 859 smacks = {
835 title = "SM"; 860 title = "SM";
861 description = "Stream Management (XEP-0198) status";
836 key = "smacks"; 862 key = "smacks";
837 width = 11; 863 width = 11;
838 mapper = function(smacks_xmlns, session) 864 mapper = function(smacks_xmlns, session)
839 if not smacks_xmlns then return "no"; end 865 if not smacks_xmlns then return "no"; end
840 if session.hibernating then return "hibernating"; end 866 if session.hibernating then return "hibernating"; end
841 return "yes"; 867 return "yes";
842 end; 868 end;
843 }; 869 };
844 smacks_queue = { 870 smacks_queue = {
845 title = "SM Queue"; 871 title = "SM Queue";
872 description = "Length of Stream Management stanza queue";
846 key = "outgoing_stanza_queue"; 873 key = "outgoing_stanza_queue";
847 width = 8; 874 width = 8;
848 align = "right"; 875 align = "right";
849 mapper = function (queue) 876 mapper = function (queue)
850 return queue and tostring(queue:count_unacked()); 877 return queue and tostring(queue:count_unacked());
851 end 878 end
852 }; 879 };
853 csi = { 880 csi = {
854 title = "CSI State"; 881 title = "CSI State";
882 description = "Client State Indication (XEP-0352)";
855 key = "state"; 883 key = "state";
856 -- TODO include counter 884 -- TODO include counter
857 }; 885 };
858 s2s_sasl = { 886 s2s_sasl = {
859 title = "SASL"; 887 title = "SASL";
888 description = "Server authentication status";
860 key = "external_auth"; 889 key = "external_auth";
861 width = 10; 890 width = 10;
862 mapper = capitalize 891 mapper = capitalize
863 }; 892 };
864 dialback = { 893 dialback = {
865 title = "Dialback"; 894 title = "Dialback";
895 description = "Legacy server verification";
866 key = "dialback_key"; 896 key = "dialback_key";
867 width = 13; 897 width = 13;
868 mapper = function (dialback_key, session) 898 mapper = function (dialback_key, session)
869 if not dialback_key then 899 if not dialback_key then
870 if session.type == "s2sin" or session.type == "s2sout" then 900 if session.type == "s2sin" or session.type == "s2sout" then