core/modulemanager.lua
author Kim Alvefur <zash@zash.se>
Fri, 21 Sep 2018 21:19:44 +0200
changeset 9339 9e8d7d461c7d
parent 8919 e727747279a0
child 9565 acf74ad0b795
permissions -rw-r--r--
mod_http: Hook the host-less event if hooked from a global module
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1505
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2828
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2828
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 748
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 748
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 467
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 467
diff changeset
     8
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 400
diff changeset
     9
local logger = require "util.logger";
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
    10
local log = logger.init("modulemanager");
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    11
local config = require "core.configmanager";
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
    12
local pluginloader = require "util.pluginloader";
4896
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
    13
local set = require "util.set";
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
    14
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
    15
local new_multitable = require "util.multitable".new;
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
    16
local api = require "core.moduleapi"; -- Module API container
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
1247
4721e4124692 modulemanager: module:hook now allows global modules to hook events on the prosody.events object
Waqas Hussain <waqas20@gmail.com>
parents: 1231
diff changeset
    18
local prosody = prosody;
8720
9ddd0fbbe53a core: Use prosody.hosts instead of _G.hosts for consistency
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    19
local hosts = prosody.hosts;
747
40837f3422ab modulemanager: Add get_host_type() API method, and fix up call_module_method to work properly
Matthew Wild <mwild1@gmail.com>
parents: 746
diff changeset
    20
6663
30672cc3d8ee modulemanager: Remove unused import of pcall #luacheck
Matthew Wild <mwild1@gmail.com>
parents: 6425
diff changeset
    21
local xpcall = xpcall;
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
    22
local setmetatable, rawget = setmetatable, rawget;
5411
82b3ddba0ec7 modulemanager: add missing ipairs import.
Marco Cirillo <maranda@lightwitch.org>
parents: 5410
diff changeset
    23
local ipairs, pairs, type, tostring, t_insert = ipairs, pairs, type, tostring, table.insert;
2151
3bb7c1daa93f modulemanager: New module API methods for getting config options with type conversion, get_option_string, get_option_number, get_option_boolean, get_option_array, get_option_set
Matthew Wild <mwild1@gmail.com>
parents: 2072
diff changeset
    24
2977
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    25
local debug_traceback = debug.traceback;
7165
d0b64f1e4f5d loggingmanager,modulemanager,moduleapi: Localize unpack compatible with Lua 5.2+
Kim Alvefur <zash@zash.se>
parents: 6782
diff changeset
    26
local select = select;
7166
eadbf19d0de0 loggingmanager,modulemanager,moduleapi: Ignore warning about accessing _G.unpack [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7165
diff changeset
    27
local unpack = table.unpack or unpack; --luacheck: ignore 113
6663
30672cc3d8ee modulemanager: Remove unused import of pcall #luacheck
Matthew Wild <mwild1@gmail.com>
parents: 6425
diff changeset
    28
local pcall = function(f, ...)
2977
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    29
	local n = select("#", ...);
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    30
	local params = {...};
3588
1e570ed17147 modulemanager: Fixed: Locally defined pcall wasn't returning return values of the called function.
Waqas Hussain <waqas20@gmail.com>
parents: 3587
diff changeset
    31
	return xpcall(function() return f(unpack(params, 1, n)) end, function(e) return tostring(e).."\n"..debug_traceback(); end);
2977
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    32
end
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    33
6319
92d009af6eba mod_s2s_auth_certs: Split PKIX based certificate checking from mod_s2s into new plugin
Kim Alvefur <zash@zash.se>
parents: 6038
diff changeset
    34
local autoload_modules = {prosody.platform, "presence", "message", "iq", "offline", "c2s", "s2s", "s2s_auth_certs"};
6034
ee14da71d3fc modulemanager: Load mod_saslauth on components by default
Kim Alvefur <zash@zash.se>
parents: 5411
diff changeset
    35
local component_inheritable_modules = {"tls", "saslauth", "dialback", "iq", "s2s"};
1505
e19cb945c25b modulemanager: Small code improvement, move autoloaded modules list to the top of the file
Matthew Wild <mwild1@gmail.com>
parents: 1504
diff changeset
    36
467
66f145f5c932 Update Makefile to now pass config paths to prosody. Update prosody, modulemanager and connectionlisteners to obey these paths.
Matthew Wild <mwild1@gmail.com>
parents: 439
diff changeset
    37
-- We need this to let modules access the real global namespace
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
local _G = _G;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
    40
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7950
diff changeset
    41
-- luacheck: std none
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
7950
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7306
diff changeset
    43
local load_modules_for_host, load, unload, reload, get_module, get_items;
24170d74b00b core: Split some very long lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7306
diff changeset
    44
local get_modules, is_loaded, module_has_method, call_module_method;
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 400
diff changeset
    45
4535
d46e9ad4fe8a modulemanager: Cleanup some unused variables, imports, whitespace and add a comment.
Matthew Wild <mwild1@gmail.com>
parents: 4534
diff changeset
    46
-- [host] = { [module] = module_env }
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
    47
local modulemap = { ["*"] = {} };
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 400
diff changeset
    48
8919
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    49
-- Get the list of modules to be loaded on a host
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    50
local function get_modules_for_host(host)
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
    51
	local component = config.get(host, "component_module");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    52
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
    53
	local global_modules_enabled = config.get("*", "modules_enabled");
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
    54
	local global_modules_disabled = config.get("*", "modules_disabled");
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
    55
	local host_modules_enabled = config.get(host, "modules_enabled");
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
    56
	local host_modules_disabled = config.get(host, "modules_disabled");
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    57
3595
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    58
	if host_modules_enabled == global_modules_enabled then host_modules_enabled = nil; end
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    59
	if host_modules_disabled == global_modules_disabled then host_modules_disabled = nil; end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    60
3595
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    61
	local global_modules = set.new(autoload_modules) + set.new(global_modules_enabled) - set.new(global_modules_disabled);
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    62
	if component then
3596
bbeba9f2acf8 modulemanager: load_modules_for_host(): For components, the inherited modules are the intersection of the inheritable and global modules lists, not the difference.
Waqas Hussain <waqas20@gmail.com>
parents: 3595
diff changeset
    63
		global_modules = set.intersection(set.new(component_inheritable_modules), global_modules);
1960
1e674dae31ae modulemanager: Re-organise module loading to still work when no global modules_enabled is defined in the config (thanks hoelzro for accidentally discovering this one)
Matthew Wild <mwild1@gmail.com>
parents: 1946
diff changeset
    64
	end
4135
9dfb3c0101b5 modulemanager: Fix disabling a module on a single host
Paul Aurich <paul@darkrain42.org>
parents: 4002
diff changeset
    65
	local modules = (global_modules + set.new(host_modules_enabled)) - set.new(host_modules_disabled);
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    66
3758
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    67
	-- COMPAT w/ pre 0.8
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    68
	if modules:contains("console") then
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    69
		log("error", "The mod_console plugin has been renamed to mod_admin_telnet. Please update your config.");
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    70
		modules:remove("console");
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    71
		modules:add("admin_telnet");
41f174b61b6a modulemanager, mod_console: Rename mod_console -> mod_admin_telnet - add compatibility code to modulemanager for existing configs
Matthew Wild <mwild1@gmail.com>
parents: 3677
diff changeset
    72
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    73
8919
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    74
	return modules, component;
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    75
end
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    76
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    77
-- Load modules when a host is activated
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    78
function load_modules_for_host(host)
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    79
	local modules, component_module = get_modules_for_host(host);
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    80
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    81
	-- Ensure component module is loaded first
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    82
	if component_module then
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
    83
		load(host, component_module);
637
30b8ad9f7b70 Fix for not loading global modules when host-specific modules are specified in config
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
    84
	end
3595
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    85
	for module in modules do
ec1151d0c4a4 modulemanager: load_modules_for_host(): Inherit 'tls' and 'dialback' from global modules list for components, and load the component module. Also refactored to use util.set.
Waqas Hussain <waqas20@gmail.com>
parents: 3588
diff changeset
    86
		load(host, module);
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    87
	end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    88
end
4533
c6480d17be1e modulemanager: Drop unnecessary prosody_events local
Matthew Wild <mwild1@gmail.com>
parents: 4532
diff changeset
    89
prosody.events.add_handler("host-activated", load_modules_for_host);
4733
791388f90156 modulemanager: Clear modulemap when a host is deactivated (thanks xnyhps)
Matthew Wild <mwild1@gmail.com>
parents: 4728
diff changeset
    90
prosody.events.add_handler("host-deactivated", function (host)
791388f90156 modulemanager: Clear modulemap when a host is deactivated (thanks xnyhps)
Matthew Wild <mwild1@gmail.com>
parents: 4728
diff changeset
    91
	modulemap[host] = nil;
791388f90156 modulemanager: Clear modulemap when a host is deactivated (thanks xnyhps)
Matthew Wild <mwild1@gmail.com>
parents: 4728
diff changeset
    92
end);
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
    94
--- Private helpers ---
438
193f9dd64f17 Bumper commit for the new modulemanager API \o/ Updates all the modules, though some more changes may be in store.
Matthew Wild <mwild1@gmail.com>
parents: 400
diff changeset
    95
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
    96
local function do_unload_module(host, name)
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2270
diff changeset
    97
	local mod = get_module(host, name);
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
    98
	if not mod then return nil, "module-not-loaded"; end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
    99
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   100
	if module_has_method(mod, "unload") then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   101
		local ok, err = call_module_method(mod, "unload");
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   102
		if (not ok) and err then
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   103
			log("warn", "Non-fatal error unloading module '%s' on '%s': %s", name, host, err);
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   104
		end
674
4f506c627b49 modulemanager: module.unload now gets called when modules are being unloaded
Waqas Hussain <waqas20@gmail.com>
parents: 670
diff changeset
   105
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   106
4896
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
   107
	for object, event, handler in mod.module.event_handlers:iter(nil, nil, nil) do
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
   108
		object.remove_handler(event, handler);
1259
6bd11bca9725 modulemanager: Keep track of event handlers added by module:hook, and remove them on module unload
Waqas Hussain <waqas20@gmail.com>
parents: 1253
diff changeset
   109
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   110
2828
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   111
	if mod.module.items then -- remove items
4604
eef5e3a83792 modulemanager: Use appropriate events object for global modules when firing item-removed on unload
Matthew Wild <mwild1@gmail.com>
parents: 4565
diff changeset
   112
		local events = (host == "*" and prosody.events) or hosts[host].events;
2828
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   113
		for key,t in pairs(mod.module.items) do
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   114
			for i = #t,1,-1 do
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   115
				local value = t[i];
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   116
				t[i] = nil;
4604
eef5e3a83792 modulemanager: Use appropriate events object for global modules when firing item-removed on unload
Matthew Wild <mwild1@gmail.com>
parents: 4565
diff changeset
   117
				events.fire_event("item-removed/"..key, {source = mod.module, item = value});
2828
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   118
			end
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   119
		end
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   120
	end
4665
6be91ca54613 modulemanager: Set module.loaded = false on unload
Matthew Wild <mwild1@gmail.com>
parents: 4662
diff changeset
   121
	mod.module.loaded = false;
1986
d4ba9d94eb74 modulemanager: Slightly rearranged code for more robust unloading of modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1960
diff changeset
   122
	modulemap[host][name] = nil;
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   123
	return true;
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   124
end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   125
5192
3fc3a3072cc2 modulemanager: Set module.reloading when a module is reloading, and when loading make the saved state available in module.saved_state (if any)
Matthew Wild <mwild1@gmail.com>
parents: 5123
diff changeset
   126
local function do_load_module(host, module_name, state)
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   127
	if not (host and module_name) then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   128
		return nil, "insufficient-parameters";
4638
352cd61e2682 modulemanager: Allow loading a module onto "*" (part-fixes #228)
Matthew Wild <mwild1@gmail.com>
parents: 4606
diff changeset
   129
	elseif not hosts[host] and host ~= "*"then
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   130
		return nil, "unknown-host";
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   131
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   132
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   133
	if not modulemap[host] then
5123
7c5c86fa552e hostmanager, modulemanager: Ensure hosts[*].modules always exists.
Waqas Hussain <waqas20@gmail.com>
parents: 5021
diff changeset
   134
		modulemap[host] = hosts[host].modules;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   135
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   136
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   137
	if modulemap[host][module_name] then
7306
439d00063620 modulemanager: Silence log message about attempts to load already loaded modules for shared modules
Kim Alvefur <zash@zash.se>
parents: 7166
diff changeset
   138
		if not modulemap["*"][module_name] then
439d00063620 modulemanager: Silence log message about attempts to load already loaded modules for shared modules
Kim Alvefur <zash@zash.se>
parents: 7166
diff changeset
   139
			log("debug", "%s is already loaded for %s, so not loading again", module_name, host);
439d00063620 modulemanager: Silence log message about attempts to load already loaded modules for shared modules
Kim Alvefur <zash@zash.se>
parents: 7166
diff changeset
   140
		end
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   141
		return nil, "module-already-loaded";
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   142
	elseif modulemap["*"][module_name] then
4642
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   143
		local mod = modulemap["*"][module_name];
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   144
		if module_has_method(mod, "add_host") then
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   145
			local _log = logger.init(host..":"..module_name);
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   146
			local host_module_api = setmetatable({
4896
27cda15104f2 modulemanager, moduleapi: Turn module.event_handlers into a multitable and track object->event->handler associations correctly (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4893
diff changeset
   147
				host = host, event_handlers = new_multitable(), items = {};
6664
90e846e8a788 modulemanager: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6663
diff changeset
   148
				_log = _log, log = function (self, ...) return _log(...); end; --luacheck: ignore 212/self
4642
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   149
			},{
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   150
				__index = modulemap["*"][module_name].module;
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   151
			});
4728
7c81b04a4fed modulemanager: Set module.environment before calling add_host, otherwise the module will get the parent's environment (thanks xnyhps and Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4665
diff changeset
   152
			local host_module = setmetatable({ module = host_module_api }, { __index = mod });
7c81b04a4fed modulemanager: Set module.environment before calling add_host, otherwise the module will get the parent's environment (thanks xnyhps and Maranda)
Matthew Wild <mwild1@gmail.com>
parents: 4665
diff changeset
   153
			host_module_api.environment = host_module;
4776
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   154
			modulemap[host][module_name] = host_module;
4642
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   155
			local ok, result, module_err = call_module_method(mod, "add_host", host_module_api);
4776
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   156
			if not ok or result == false then
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   157
				modulemap[host][module_name] = nil;
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   158
				return nil, ok and module_err or result;
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   159
			end
4642
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   160
			return host_module;
c1602c07d14d modulemanager: Support for shared modules - function module.add_host(host_module) in a global module
Matthew Wild <mwild1@gmail.com>
parents: 4641
diff changeset
   161
		end
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   162
		return nil, "global-module-already-loaded";
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   163
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   164
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   165
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   166
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   167
	local _log = logger.init(host..":"..module_name);
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   168
	local api_instance = setmetatable({ name = module_name, host = host,
6664
90e846e8a788 modulemanager: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6663
diff changeset
   169
		_log = _log, log = function (self, ...) return _log(...); end, --luacheck: ignore 212/self
90e846e8a788 modulemanager: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6663
diff changeset
   170
		event_handlers = new_multitable(), reloading = not not state,
90e846e8a788 modulemanager: Add luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 6663
diff changeset
   171
		saved_state = state~=true and state or nil }
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   172
		, { __index = api });
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   173
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   174
	local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   175
	api_instance.environment = pluginenv;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5411
diff changeset
   176
5021
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   177
	local mod, err = pluginloader.load_code(module_name, nil, pluginenv);
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   178
	if not mod then
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   179
		log("error", "Unable to load module '%s': %s", module_name or "nil", err or "nil");
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   180
		return nil, err;
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   181
	end
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   182
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   183
	api_instance.path = err;
85b2689dbcfe Eliminate direct setfenv usage
Florian Zeitz <florob@babelmonkeys.de>
parents: 4896
diff changeset
   184
4776
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   185
	modulemap[host][module_name] = pluginenv;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   186
	local ok, err = pcall(mod);
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   187
	if ok then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   188
		-- Call module's "load"
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   189
		if module_has_method(pluginenv, "load") then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   190
			ok, err = call_module_method(pluginenv, "load");
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   191
			if not ok then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   192
				log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil");
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   193
			end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   194
		end
5192
3fc3a3072cc2 modulemanager: Set module.reloading when a module is reloading, and when loading make the saved state available in module.saved_state (if any)
Matthew Wild <mwild1@gmail.com>
parents: 5123
diff changeset
   195
		api_instance.reloading, api_instance.saved_state = nil, nil;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   196
4639
98a29138dec8 modulemanager: Use api_instance rather than pluginenv.module (same thing)
Matthew Wild <mwild1@gmail.com>
parents: 4638
diff changeset
   197
		if api_instance.host == "*" then
98a29138dec8 modulemanager: Use api_instance rather than pluginenv.module (same thing)
Matthew Wild <mwild1@gmail.com>
parents: 4638
diff changeset
   198
			if not api_instance.global then -- COMPAT w/pre-0.9
4801
83cedf648b46 modulemanager: Hide deprecation warning for modules loaded on '*' directly (e.g. prosodyctl mod_<command>) (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4776
diff changeset
   199
				if host ~= "*" then
83cedf648b46 modulemanager: Hide deprecation warning for modules loaded on '*' directly (e.g. prosodyctl mod_<command>) (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4776
diff changeset
   200
					log("warn", "mod_%s: Setting module.host = '*' deprecated, call module:set_global() instead", module_name);
83cedf648b46 modulemanager: Hide deprecation warning for modules loaded on '*' directly (e.g. prosodyctl mod_<command>) (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents: 4776
diff changeset
   201
				end
4606
17785dbd9d58 modulemanager: Some refactoring. Deprecate module.host = "*", modules should call module:set_global() (which has been around since forever)
Matthew Wild <mwild1@gmail.com>
parents: 4604
diff changeset
   202
				api_instance:set_global();
17785dbd9d58 modulemanager: Some refactoring. Deprecate module.host = "*", modules should call module:set_global() (which has been around since forever)
Matthew Wild <mwild1@gmail.com>
parents: 4604
diff changeset
   203
			end
4776
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   204
			modulemap[host][module_name] = nil;
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   205
			modulemap[api_instance.host][module_name] = pluginenv;
4643
9008fc396fb1 modulemanager: When a shared module becomes global, ensure it still gets loaded onto the original target host
Matthew Wild <mwild1@gmail.com>
parents: 4642
diff changeset
   206
			if host ~= api_instance.host and module_has_method(pluginenv, "add_host") then
9008fc396fb1 modulemanager: When a shared module becomes global, ensure it still gets loaded onto the original target host
Matthew Wild <mwild1@gmail.com>
parents: 4642
diff changeset
   207
				-- Now load the module again onto the host it was originally being loaded on
4662
105423f77d46 modulemanager: Report errors that happen when loading a shared module onto its original host
Matthew Wild <mwild1@gmail.com>
parents: 4652
diff changeset
   208
				ok, err = do_load_module(host, module_name);
4643
9008fc396fb1 modulemanager: When a shared module becomes global, ensure it still gets loaded onto the original target host
Matthew Wild <mwild1@gmail.com>
parents: 4642
diff changeset
   209
			end
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   210
		end
4606
17785dbd9d58 modulemanager: Some refactoring. Deprecate module.host = "*", modules should call module:set_global() (which has been around since forever)
Matthew Wild <mwild1@gmail.com>
parents: 4604
diff changeset
   211
	end
17785dbd9d58 modulemanager: Some refactoring. Deprecate module.host = "*", modules should call module:set_global() (which has been around since forever)
Matthew Wild <mwild1@gmail.com>
parents: 4604
diff changeset
   212
	if not ok then
4776
dbe9d75c0452 modulemanager: Fixes to handle circular dependencies in module:depends()
Matthew Wild <mwild1@gmail.com>
parents: 4746
diff changeset
   213
		modulemap[api_instance.host][module_name] = nil;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   214
		log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil");
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   215
	end
4537
d8d257c13562 modulemanager: load(): Return and use the correct module object
Matthew Wild <mwild1@gmail.com>
parents: 4535
diff changeset
   216
	return ok and pluginenv, err;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   217
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   218
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   219
local function do_reload_module(host, name)
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   220
	local mod = get_module(host, name);
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   221
	if not mod then return nil, "module-not-loaded"; end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   222
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
   223
	local _mod, err = pluginloader.load_code(name); -- checking for syntax errors
713
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   224
	if not _mod then
1386
9132f16666e4 modulemanager: Fix copy/paste error, should be name instead of module_name
Matthew Wild <mwild1@gmail.com>
parents: 1378
diff changeset
   225
		log("error", "Unable to load module '%s': %s", name or "nil", err or "nil");
713
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   226
		return nil, err;
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   227
	end
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   228
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   229
	local saved;
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   230
	if module_has_method(mod, "save") then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   231
		local ok, ret, err = call_module_method(mod, "save");
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   232
		if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   233
			saved = ret;
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   234
		else
4383
718445c040c4 modulemanager: Fix undefined global access in handling of module.save error handling.
Waqas Hussain <waqas20@gmail.com>
parents: 4381
diff changeset
   235
			log("warn", "Error saving module '%s:%s' state: %s", host, name, ret);
5377
898454038524 core.*: Complete removal of all traces of the "core" section and section-related code.
Kim Alvefur <zash@zash.se>
parents: 5192
diff changeset
   236
			if not config.get(host, "force_module_reload") then
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   237
				log("warn", "Aborting reload due to error, set force_module_reload to ignore this");
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   238
				return nil, "save-state-failed";
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   239
			else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   240
				log("warn", "Continuing with reload (using the force)");
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   241
			end
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   242
		end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   243
	end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   244
5192
3fc3a3072cc2 modulemanager: Set module.reloading when a module is reloading, and when loading make the saved state available in module.saved_state (if any)
Matthew Wild <mwild1@gmail.com>
parents: 5123
diff changeset
   245
	mod.module.reloading = true;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   246
	do_unload_module(host, name);
5192
3fc3a3072cc2 modulemanager: Set module.reloading when a module is reloading, and when loading make the saved state available in module.saved_state (if any)
Matthew Wild <mwild1@gmail.com>
parents: 5123
diff changeset
   247
	local ok, err = do_load_module(host, name, saved or true);
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   248
	if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   249
		mod = get_module(host, name);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   250
		if module_has_method(mod, "restore") then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   251
			local ok, err = call_module_method(mod, "restore", saved or {})
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   252
			if (not ok) and err then
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   253
				log("warn", "Error restoring module '%s' from '%s': %s", name, host, err);
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   254
			end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   255
		end
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   256
	end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   257
	return ok and mod, err;
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   258
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   259
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   260
--- Public API ---
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   261
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   262
-- Load a module and fire module-loaded event
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   263
function load(host, name)
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   264
	local mod, err = do_load_module(host, name);
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   265
	if mod then
4804
607414b26c8c modulemanager: Pass the module's final host (e.g. '*') to the module-loaded event
Matthew Wild <mwild1@gmail.com>
parents: 4801
diff changeset
   266
		(hosts[mod.module.host] or prosody).events.fire_event("module-loaded", { module = name, host = mod.module.host });
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   267
	end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   268
	return mod, err;
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   269
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   270
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   271
-- Unload a module and fire module-unloaded
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   272
function unload(host, name)
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   273
	local ok, err = do_unload_module(host, name);
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   274
	if ok then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   275
		(hosts[host] or prosody).events.fire_event("module-unloaded", { module = name, host = host });
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   276
	end
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   277
	return ok, err;
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   278
end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   279
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   280
function reload(host, name)
4853
4ca9328e37d5 modulemanager: Set module.reloading = true when firing module-reloaded event
Matthew Wild <mwild1@gmail.com>
parents: 4804
diff changeset
   281
	local mod, err = do_reload_module(host, name);
4ca9328e37d5 modulemanager: Set module.reloading = true when firing module-reloaded event
Matthew Wild <mwild1@gmail.com>
parents: 4804
diff changeset
   282
	if mod then
4ca9328e37d5 modulemanager: Set module.reloading = true when firing module-reloaded event
Matthew Wild <mwild1@gmail.com>
parents: 4804
diff changeset
   283
		modulemap[host][name].module.reloading = true;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   284
		(hosts[host] or prosody).events.fire_event("module-reloaded", { module = name, host = host });
4853
4ca9328e37d5 modulemanager: Set module.reloading = true when firing module-reloaded event
Matthew Wild <mwild1@gmail.com>
parents: 4804
diff changeset
   285
		mod.module.reloading = nil;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   286
	elseif not is_loaded(host, name) then
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   287
		(hosts[host] or prosody).events.fire_event("module-unloaded", { module = name, host = host });
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   288
	end
4853
4ca9328e37d5 modulemanager: Set module.reloading = true when firing module-reloaded event
Matthew Wild <mwild1@gmail.com>
parents: 4804
diff changeset
   289
	return mod, err;
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   290
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   291
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   292
function get_module(host, name)
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   293
	return modulemap[host] and modulemap[host][name];
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   294
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   295
5410
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   296
function get_items(key, host)
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   297
	local result = {};
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   298
	local modules = modulemap[host];
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   299
	if not key or not host or not modules then return nil; end
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   300
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   301
	for _, module in pairs(modules) do
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   302
		local mod = module.module;
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   303
		if mod.items and mod.items[key] then
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   304
			for _, value in ipairs(mod.items[key]) do
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   305
				t_insert(result, value);
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   306
			end
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   307
		end
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   308
	end
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   309
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   310
	return result;
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   311
end
bea93cfd6c54 modulemanager: add function to retrieve module items from a specific host entity.
Marco Cirillo <maranda@lightwitch.org>
parents: 5377
diff changeset
   312
4532
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   313
function get_modules(host)
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   314
	return modulemap[host];
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   315
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   316
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   317
function is_loaded(host, name)
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   318
	return modulemap[host] and modulemap[host][name] and true;
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   319
end
d8dbf569766c modulemanager: Some reorganisation. Only external change is (should be) that module-unloaded and module-loaded are no longer fired when reloading a module, the new event module-reloaded is fired instead.
Matthew Wild <mwild1@gmail.com>
parents: 4531
diff changeset
   320
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   321
function module_has_method(module, method)
4641
2b3ee52fba32 modulemanager: Make module_has_method and module_call_method use rawget()
Matthew Wild <mwild1@gmail.com>
parents: 4640
diff changeset
   322
	return type(rawget(module.module, method)) == "function";
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   323
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   324
747
40837f3422ab modulemanager: Add get_host_type() API method, and fix up call_module_method to work properly
Matthew Wild <mwild1@gmail.com>
parents: 746
diff changeset
   325
function call_module_method(module, method, ...)
4641
2b3ee52fba32 modulemanager: Make module_has_method and module_call_method use rawget()
Matthew Wild <mwild1@gmail.com>
parents: 4640
diff changeset
   326
	local f = rawget(module.module, method);
2b3ee52fba32 modulemanager: Make module_has_method and module_call_method use rawget()
Matthew Wild <mwild1@gmail.com>
parents: 4640
diff changeset
   327
	if type(f) == "function" then
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   328
		return pcall(f, ...);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   329
	else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   330
		return false, "no-such-method";
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   331
	end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   332
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   333
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   334
return {
8919
e727747279a0 modulemanager: Expose function to get the list of modules that should be loaded on a host
Matthew Wild <mwild1@gmail.com>
parents: 8720
diff changeset
   335
	get_modules_for_host = get_modules_for_host;
6782
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   336
	load_modules_for_host = load_modules_for_host;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   337
	load = load;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   338
	unload = unload;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   339
	reload = reload;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   340
	get_module = get_module;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   341
	get_items = get_items;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   342
	get_modules = get_modules;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   343
	is_loaded = is_loaded;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   344
	module_has_method = module_has_method;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   345
	call_module_method = call_module_method;
6236668da30a core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents: 6664
diff changeset
   346
};