Comparison

prosodyctl @ 5585:3e097acf82de

prosodyctl: Add 'prosodyctl check dns' to make an attempt at verifying the server's DNS records
author Matthew Wild <mwild1@gmail.com>
date Fri, 17 May 2013 13:35:12 +0100
parent 5584:1d841117117c
child 5589:8745193e651e
comparison
equal deleted inserted replaced
5584:1d841117117c 5585:3e097acf82de
816 print(" see http://prosody.im/doc/configure#overview for more information.") 816 print(" see http://prosody.im/doc/configure#overview for more information.")
817 print(""); 817 print("");
818 print(" You need to move the following option"..(n>1 and "s" or "")..": "..table.concat(it.to_array(misplaced_options), ", ")); 818 print(" You need to move the following option"..(n>1 and "s" or "")..": "..table.concat(it.to_array(misplaced_options), ", "));
819 end 819 end
820 end 820 end
821 print("Done."); 821 print("Done.\n");
822 end
823 if not what or what == "dns" then
824 local dns = require "net.dns";
825 local c2s_ports = set.new(config.get("*", "c2s_ports") or {5222});
826 local s2s_ports = set.new(config.get("*", "s2s_ports") or {5269});
827
828 local c2s_srv_required, s2s_srv_required;
829 if not c2s_ports:contains(5222) then
830 c2s_srv_required = true;
831 end
832 if not s2s_ports:contains(5269) then
833 s2s_srv_required = true;
834 end
835
836 local problem_hosts = set.new();
837
838 local external_addresses = set.new();
839
840 local fqdn = socket.dns.tohostname(socket.dns.gethostname());
841 if fqdn then
842 local res = dns.lookup(fqdn, "A");
843 if res then
844 for _, record in ipairs(res) do
845 external_addresses:add(record.a);
846 end
847 end
848 local res = dns.lookup(fqdn, "AAAA");
849 if res then
850 for _, record in ipairs(res) do
851 external_addresses:add(record.aaaa);
852 end
853 end
854 end
855
856 if external_addresses:empty() then
857 print("");
858 print(" Failed to determine the external addresses of this server. Checks may be inaccurate.");
859 c2s_srv_required, s2s_srv_required = true, true;
860 end
861
862 local v6_supported = not not socket.tcp6;
863
864 for host, host_options in it.filter("*", pairs(config.getconfig())) do
865 local all_targets_ok, some_targets_ok = true, false;
866
867 local is_component = not not host_options.component_module;
868 print("Checking DNS for "..(is_component and "component" or "host").." "..host.."...");
869 local target_hosts = set.new();
870 if not is_component then
871 local res = dns.lookup("_xmpp-client._tcp."..host..".", "SRV");
872 if res then
873 for _, record in ipairs(res) do
874 target_hosts:add(record.srv.target);
875 if not c2s_ports:contains(record.srv.port) then
876 print(" SRV target "..record.srv.target.." contains unknown client port: "..record.srv.port);
877 end
878 end
879 else
880 if c2s_srv_required then
881 print(" No _xmpp-client SRV record found for "..host..", but it looks like you need one.");
882 else
883 target_hosts:add(host);
884 end
885 end
886 end
887 local res = dns.lookup("_xmpp-server._tcp."..host..".", "SRV");
888 if res then
889 for _, record in ipairs(res) do
890 target_hosts:add(record.srv.target);
891 if not s2s_ports:contains(record.srv.port) then
892 print(" SRV target "..record.srv.target.." contains unknown server port: "..record.srv.port);
893 end
894 end
895 else
896 if s2s_srv_required then
897 print(" No _xmpp-server SRV record found for "..host..", but it looks like you need one.");
898 else
899 target_hosts:add(host);
900 end
901 end
902 if target_hosts:empty() then
903 target_hosts:add(host);
904 end
905
906 if target_hosts:contains("localhost") then
907 print(" Target 'localhost' cannot be accessed from other servers");
908 target_hosts:remove("localhost");
909 end
910
911 for host in target_hosts do
912 local host_ok_v4, host_ok_v6;
913 local res = dns.lookup(host, "A");
914 if res then
915 for _, record in ipairs(res) do
916 if external_addresses:contains(record.a) then
917 some_targets_ok = true;
918 host_ok_v4 = true;
919 else
920 print(" "..host.." A record points to unknown address "..record.a);
921 all_targets_ok = false;
922 end
923 end
924 end
925 local res = dns.lookup(host, "AAAA");
926 if res then
927 for _, record in ipairs(res) do
928 if external_addresses:contains(record.aaaa) then
929 some_targets_ok = true;
930 host_ok_v6 = true;
931 else
932 print(" "..host.." AAAA record points to unknown address "..record.aaaa);
933 all_targets_ok = false;
934 end
935 end
936 end
937
938 if not host_ok_v4 then
939 print(" Host "..host.." does not seem to resolve to this server for IPv4");
940 end
941 if not host_ok_v6 and v6_supported then
942 print(" Host "..host.." does not seem to resolve to this server for IPv6");
943 elseif host_ok_v6 and not v6_supported then
944 print(" Host "..host.." has AAAA records, but your version of LuaSocket does not support IPv6.");
945 print(" Please see http://prosody.im/doc/ipv6 for more information.");
946 end
947 end
948 if not all_targets_ok then
949 print(" "..(some_targets_ok and "Only some" or "No").." targets for "..host.." appear to resolve to this server.");
950 if is_component then
951 print(" DNS records are necessary if you want users on other servers to access this component.");
952 end
953 print("");
954 problem_hosts:add(host);
955 end
956 end
957 if not problem_hosts:empty() then
958 print("");
959 print("For more information about DNS configuration please see http://prosody.im/doc/dns");
960 print("");
961 ok = false;
962 end
822 end 963 end
823 if not ok then 964 if not ok then
824 print("Problems found, see above."); 965 print("Problems found, see above.");
825 else 966 else
826 print("All checks passed, congratulations!"); 967 print("All checks passed, congratulations!");