Comparison

prosodyctl @ 6158:08e9c9d0beb3

prosodyctl: Only perform checks on enabled hosts
author Kim Alvefur <zash@zash.se>
date Fri, 02 May 2014 08:11:11 +0200
parent 6062:6cc6b4d407df
child 6159:4ee14b7ef2cc
comparison
equal deleted inserted replaced
6156:6b1aee6536e8 6158:08e9c9d0beb3
795 end 795 end
796 local what = table.remove(arg, 1); 796 local what = table.remove(arg, 1);
797 local array, set = require "util.array", require "util.set"; 797 local array, set = require "util.array", require "util.set";
798 local it = require "util.iterators"; 798 local it = require "util.iterators";
799 local ok = true; 799 local ok = true;
800 local function disabled_hosts(host, conf) return host ~= "*" and conf.enabled ~= false; end
801 local function enabled_hosts() return it.filter(disabled_hosts, pairs(config.getconfig())); end
800 if not what or what == "config" then 802 if not what or what == "config" then
801 print("Checking config..."); 803 print("Checking config...");
802 local known_global_options = set.new({ 804 local known_global_options = set.new({
803 "pidfile", "log", "plugin_paths", "prosody_user", "prosody_group", "daemonize", 805 "pidfile", "log", "plugin_paths", "prosody_user", "prosody_group", "daemonize",
804 "umask", "prosodyctl_timeout", "use_ipv6", "use_libevent", "network_settings" 806 "umask", "prosodyctl_timeout", "use_ipv6", "use_libevent", "network_settings"
811 print(" No global options defined. Perhaps you have put a host definition at the top") 813 print(" No global options defined. Perhaps you have put a host definition at the top")
812 print(" of the config file? They should be at the bottom, see http://prosody.im/doc/configure#overview"); 814 print(" of the config file? They should be at the bottom, see http://prosody.im/doc/configure#overview");
813 end 815 end
814 -- Check for global options under hosts 816 -- Check for global options under hosts
815 local global_options = set.new(it.to_array(it.keys(config["*"]))); 817 local global_options = set.new(it.to_array(it.keys(config["*"])));
816 for host, options in it.filter("*", pairs(config)) do 818 for host, options in enabled_hosts() do
817 local host_options = set.new(it.to_array(it.keys(options))); 819 local host_options = set.new(it.to_array(it.keys(options)));
818 local misplaced_options = set.intersection(host_options, known_global_options); 820 local misplaced_options = set.intersection(host_options, known_global_options);
819 for name in pairs(options) do 821 for name in pairs(options) do
820 if name:match("^interfaces?") 822 if name:match("^interfaces?")
821 or name:match("_ports?$") or name:match("_interfaces?$") 823 or name:match("_ports?$") or name:match("_interfaces?$")
896 c2s_srv_required, s2s_srv_required = true, true; 898 c2s_srv_required, s2s_srv_required = true, true;
897 end 899 end
898 900
899 local v6_supported = not not socket.tcp6; 901 local v6_supported = not not socket.tcp6;
900 902
901 for host, host_options in it.filter("*", pairs(config.getconfig())) do 903 for host, host_options in enabled_hosts() do
902 local all_targets_ok, some_targets_ok = true, false; 904 local all_targets_ok, some_targets_ok = true, false;
903 905
904 local is_component = not not host_options.component_module; 906 local is_component = not not host_options.component_module;
905 print("Checking DNS for "..(is_component and "component" or "host").." "..host.."..."); 907 print("Checking DNS for "..(is_component and "component" or "host").." "..host.."...");
906 local target_hosts = set.new(); 908 local target_hosts = set.new();
1045 if what == "certs" then cert_ok = false end 1047 if what == "certs" then cert_ok = false end
1046 elseif not load_cert then 1048 elseif not load_cert then
1047 print("This version of LuaSec (" .. ssl._VERSION .. ") does not support certificate checking"); 1049 print("This version of LuaSec (" .. ssl._VERSION .. ") does not support certificate checking");
1048 cert_ok = false 1050 cert_ok = false
1049 else 1051 else
1050 for host in pairs(hosts) do 1052 for host in enabled_hosts() do
1051 if host ~= "*" then -- Should check global certs too. 1053 print("Checking certificate for "..host);
1052 print("Checking certificate for "..host); 1054 -- First, let's find out what certificate this host uses.
1053 -- First, let's find out what certificate this host uses. 1055 local ssl_config = config.rawget(host, "ssl");
1054 local ssl_config = config.rawget(host, "ssl"); 1056 if not ssl_config then
1055 if not ssl_config then 1057 local base_host = host:match("%.(.*)");
1056 local base_host = host:match("%.(.*)"); 1058 ssl_config = config.get(base_host, "ssl");
1057 ssl_config = config.get(base_host, "ssl"); 1059 end
1058 end 1060 if not ssl_config then
1059 if not ssl_config then 1061 print(" No 'ssl' option defined for "..host)
1060 print(" No 'ssl' option defined for "..host) 1062 cert_ok = false
1061 cert_ok = false 1063 elseif not ssl_config.certificate then
1062 elseif not ssl_config.certificate then 1064 print(" No 'certificate' set in ssl option for "..host)
1063 print(" No 'certificate' set in ssl option for "..host) 1065 cert_ok = false
1064 cert_ok = false 1066 elseif not ssl_config.key then
1065 elseif not ssl_config.key then 1067 print(" No 'key' set in ssl option for "..host)
1066 print(" No 'key' set in ssl option for "..host) 1068 cert_ok = false
1069 else
1070 local key, err = io.open(ssl_config.key); -- Permissions check only
1071 if not key then
1072 print(" Could not open "..ssl_config.key..": "..err);
1067 cert_ok = false 1073 cert_ok = false
1068 else 1074 else
1069 local key, err = io.open(ssl_config.key); -- Permissions check only 1075 key:close();
1070 if not key then 1076 end
1071 print(" Could not open "..ssl_config.key..": "..err); 1077 local cert_fh, err = io.open(ssl_config.certificate); -- Load the file.
1078 if not cert_fh then
1079 print(" Could not open "..ssl_config.certificate..": "..err);
1080 cert_ok = false
1081 else
1082 print(" Certificate: "..ssl_config.certificate)
1083 local cert = load_cert(cert_fh:read"*a"); cert_fh = cert_fh:close();
1084 if not cert:validat(os.time()) then
1085 print(" Certificate has expired.")
1072 cert_ok = false 1086 cert_ok = false
1073 else
1074 key:close();
1075 end 1087 end
1076 local cert_fh, err = io.open(ssl_config.certificate); -- Load the file. 1088 if config.get(host, "component_module") == nil
1077 if not cert_fh then 1089 and not x509_verify_identity(host, "_xmpp-client", cert) then
1078 print(" Could not open "..ssl_config.certificate..": "..err); 1090 print(" Not vaild for client connections to "..host..".")
1079 cert_ok = false 1091 cert_ok = false
1080 else 1092 end
1081 print(" Certificate: "..ssl_config.certificate) 1093 if (not (config.get(name, "anonymous_login")
1082 local cert = load_cert(cert_fh:read"*a"); cert_fh = cert_fh:close(); 1094 or config.get(name, "authentication") == "anonymous"))
1083 if not cert:validat(os.time()) then
1084 print(" Certificate has expired.")
1085 cert_ok = false
1086 end
1087 if config.get(host, "component_module") == nil
1088 and not x509_verify_identity(host, "_xmpp-client", cert) then 1095 and not x509_verify_identity(host, "_xmpp-client", cert) then
1089 print(" Not vaild for client connections to "..host..".") 1096 print(" Not vaild for server-to-server connections to "..host..".")
1090 cert_ok = false 1097 cert_ok = false
1091 end
1092 if (not (config.get(name, "anonymous_login")
1093 or config.get(name, "authentication") == "anonymous"))
1094 and not x509_verify_identity(host, "_xmpp-client", cert) then
1095 print(" Not vaild for server-to-server connections to "..host..".")
1096 cert_ok = false
1097 end
1098 end 1098 end
1099 end 1099 end
1100 end 1100 end
1101 end 1101 end
1102 if cert_ok == false then 1102 if cert_ok == false then