view mod_auto_activate_hosts/mod_auto_activate_hosts.lua @ 4876:0f5f2d4475b9

mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
author Matthew Wild <mwild1@gmail.com>
date Tue, 18 Jan 2022 17:01:18 +0000
parents 8b7bca07f5c0
children
line wrap: on
line source

module:set_global();

local hostmanager = require"core.hostmanager";

local array = require "util.array";
local set = require "util.set";
local it = require "util.iterators";
local config = require "core.configmanager";

local function host_not_global(host)
	return host ~= "*";
end

local function host_is_enabled(host)
	return config.get(host, "enabled") ~= false;
end

function handle_reload()
	local new_config = config.getconfig();
	local active_hosts = set.new(array.collect(it.keys(prosody.hosts)):filter(host_not_global));
	local enabled_hosts = set.new(array.collect(it.keys(new_config)):filter(host_is_enabled):filter(host_not_global));
	local need_to_activate = enabled_hosts - active_hosts;
	local need_to_deactivate = active_hosts - enabled_hosts;

	module:log("debug", "Config reloaded... %d hosts need activating, and %d hosts need deactivating", it.count(need_to_activate), it.count(need_to_deactivate));
	module:log("debug", "There are %d enabled and %d active hosts", it.count(enabled_hosts), it.count(active_hosts));
	for host in need_to_deactivate do
		hostmanager.deactivate(host);
	end

	-- If the lazy loader is loaded, hosts will get activated when they are needed
	if not(getmetatable(prosody.hosts) and getmetatable(prosody.hosts).lazy_loader) then
		for host in need_to_activate do
			hostmanager.activate(host);
		end
	end
end

module:hook_global("config-reloaded", handle_reload);