Software / code / prosody
Comparison
prosodyctl @ 5584:1d841117117c
prosodyctl: Add 'check' command, which currently checks the config file for some common mistakes
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 17 May 2013 09:01:11 +0100 |
| parent | 5554:e91db0aac408 |
| child | 5585:3e097acf82de |
comparison
equal
deleted
inserted
replaced
| 5583:78dbece77ce8 | 5584:1d841117117c |
|---|---|
| 774 end | 774 end |
| 775 end | 775 end |
| 776 show_usage("cert config|request|generate|key", "Helpers for generating X.509 certificates and keys.") | 776 show_usage("cert config|request|generate|key", "Helpers for generating X.509 certificates and keys.") |
| 777 end | 777 end |
| 778 | 778 |
| 779 function commands.check(arg) | |
| 780 local what = table.remove(arg, 1); | |
| 781 local array, set = require "util.array", require "util.set"; | |
| 782 local it = require "util.iterators"; | |
| 783 local ok = true; | |
| 784 if not what or what == "config" then | |
| 785 print("Checking config..."); | |
| 786 local known_global_options = set.new({ | |
| 787 "pidfile", "log", "plugin_paths", "prosody_user", "prosody_group", "daemonize", | |
| 788 "umask", "prosodyctl_timeout", "use_ipv6", "use_libevent", "network_settings" | |
| 789 }); | |
| 790 local config = config.getconfig(); | |
| 791 -- Check that we have any global options (caused by putting a host at the top) | |
| 792 if it.count(it.filter("log", pairs(config["*"]))) == 0 then | |
| 793 ok = false; | |
| 794 print(""); | |
| 795 print(" No global options defined. Perhaps you have put a host definition at the top") | |
| 796 print(" of the config file? They should be at the bottom, see http://prosody.im/doc/configure#overview"); | |
| 797 end | |
| 798 -- Check for global options under hosts | |
| 799 local global_options = set.new(it.to_array(it.keys(config["*"]))); | |
| 800 for host, options in it.filter("*", pairs(config)) do | |
| 801 local host_options = set.new(it.to_array(it.keys(options))); | |
| 802 local misplaced_options = set.intersection(host_options, known_global_options); | |
| 803 for name in pairs(options) do | |
| 804 if name:match("^interfaces?") | |
| 805 or name:match("_ports?$") or name:match("_interfaces?$") | |
| 806 or name:match("_ssl$") then | |
| 807 misplaced_options:add(name); | |
| 808 end | |
| 809 end | |
| 810 if not misplaced_options:empty() then | |
| 811 ok = false; | |
| 812 print(""); | |
| 813 local n = it.count(misplaced_options); | |
| 814 print(" You have "..n.." option"..(n>1 and "s " or " ").."set under "..host.." that should be"); | |
| 815 print(" in the global section of the config file, above any VirtualHost or Component definitions,") | |
| 816 print(" see http://prosody.im/doc/configure#overview for more information.") | |
| 817 print(""); | |
| 818 print(" You need to move the following option"..(n>1 and "s" or "")..": "..table.concat(it.to_array(misplaced_options), ", ")); | |
| 819 end | |
| 820 end | |
| 821 print("Done."); | |
| 822 end | |
| 823 if not ok then | |
| 824 print("Problems found, see above."); | |
| 825 else | |
| 826 print("All checks passed, congratulations!"); | |
| 827 end | |
| 828 return ok and 0 or 2; | |
| 829 end | |
| 830 | |
| 779 --------------------- | 831 --------------------- |
| 780 | 832 |
| 781 if command and command:match("^mod_") then -- Is a command in a module | 833 if command and command:match("^mod_") then -- Is a command in a module |
| 782 local module_name = command:match("^mod_(.+)"); | 834 local module_name = command:match("^mod_(.+)"); |
| 783 local ret, err = modulemanager.load("*", module_name); | 835 local ret, err = modulemanager.load("*", module_name); |