# HG changeset patch # User Matthew Wild # Date 1378153221 -3600 # Node ID 412f62d05a23e35a287b00d3d518019d9c1aa739 # Parent a464261deba86ff62b62ce84fce3eb75c0cdf6db mod_reload_modules: Add support for loading/unloading of modules, as well as simply reloading diff -r a464261deba8 -r 412f62d05a23 mod_reload_modules/mod_reload_modules.lua --- a/mod_reload_modules/mod_reload_modules.lua Thu Aug 29 12:20:20 2013 +0100 +++ b/mod_reload_modules/mod_reload_modules.lua Mon Sep 02 21:20:21 2013 +0100 @@ -1,22 +1,32 @@ +local array, it, set = require "util.array", require "util.iterators", require "util.set"; local mm = require "core.modulemanager"; -local function reload_module(name) - local ok, err = mm.reload(module.host, name); - if ok then - module:log("debug", "Reloaded %s", name); - else - module:log("error", "Failed to reload %s: %s", name, err); - end -end - function reload_all() - local modules = module:get_option_array("reload_modules"); + local modules = module:get_option_set("reload_modules", {}); if not modules then module:log("warn", "No modules listed in the config to reload - set reload_modules to a list"); return; end - for _, module in ipairs(modules) do - reload_module(module); + local configured_modules = module:get_option_inherited_set("modules_enabled", {}); + local loaded_modules = set.new(array.collect(it.keys(prosody.hosts[module.host].modules))); + local need_to_load = set.intersection(configured_modules - loaded_modules, modules); + local need_to_unload = set.intersection(loaded_modules - configured_modules, modules); + + for module_name in need_to_load do + module:log("debug", "Loading %s", module_name); + mm.load(module.host, module_name); + end + + for module_name in need_to_unload do + module:log("debug", "Unloading %s", module_name); + mm.unload(module.host, module_name); + end + + modules:exclude(need_to_load+need_to_unload) + + for module_name in set.intersection(modules,configured_modules) do + module:log("debug", "Reloading %s", module_name); + mm.reload(module_name); end end