-local module_load = require "core.modulemanager".load;
-local module_unload = require "core.modulemanager".unload;\r
-local jid_split = require "util.jid".split;\r
-local hosts = hosts;\r
-\r
-local components = {};\r
-\r
-module "componentmanager"\r
-\r
-function handle_stanza(origin, stanza)\r
- local node, host = jid_split(stanza.attr.to);\r
+local configmanager = require "core.configmanager";
+local eventmanager = require "core.eventmanager";
+local modulemanager = require "core.modulemanager";
+local core_route_stanza = core_route_stanza;
+local jid_split = require "util.jid".split;
+local st = require "util.stanza";
+local hosts = hosts;
+
+local pairs, type, tostring = pairs, type, tostring;
+
+local components = {};
+
+local disco_items = require "util.multitable".new();
+local NULL = {};
+require "core.discomanager".addDiscoItemsHandler("*host", function(reply, to, from, node)
+ if #node == 0 and hosts[to] then
+ for jid in pairs(disco_items:get(to) or NULL) do
+ reply:tag("item", {jid = jid}):up();
+ end
+ return true;
+ end
+end);
+
+require "core.eventmanager".add_event_hook("server-starting", function () core_route_stanza = _G.core_route_stanza; end);
+
+module "componentmanager"
+
+local function default_component_handler(origin, stanza)
+ log("warn", "Stanza being handled by default component, bouncing error");
+ if stanza.attr.type ~= "error" then
+ core_route_stanza(nil, st.error_reply(stanza, "wait", "service-unavailable", "Component unavailable"));
+ end
+end
+
+local components_loaded_once;
+function load_enabled_components(config)
+ local defined_hosts = config or configmanager.getconfig();
+
+ for host, host_config in pairs(defined_hosts) do
+ if host ~= "*" and ((host_config.core.enabled == nil or host_config.core.enabled) and type(host_config.core.component_module) == "string") then
+ hosts[host] = { type = "component", host = host, connected = false, s2sout = {} };
+ components[host] = default_component_handler;
+ local ok, err = modulemanager.load(host, host_config.core.component_module);
+ if not ok then
+ log("error", "Error loading %s component %s: %s", tostring(host_config.core.component_module), tostring(host), tostring(err));
+ else
+ log("debug", "Activated %s component: %s", host_config.core.component_module, host);
+ end
+ end
+ end
+end
+
+eventmanager.add_event_hook("server-starting", load_enabled_components);
+
+function handle_stanza(origin, stanza)
+ local node, host = jid_split(stanza.attr.to);