core/modulemanager.lua
author Waqas Hussain <waqas20@gmail.com>
Tue, 13 Oct 2009 14:58:45 +0500
changeset 1946 0eb3835ef9bf
parent 1933 3884a0aac4d7
child 1960 1e674dae31ae
permissions -rw-r--r--
modulemanager: Changed api:get_host_items to include items from the global host in its result.
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
760
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
     2
-- Copyright (C) 2008-2009 Matthew Wild
90ce865eebd8 Update copyright notices for 2009
Matthew Wild <mwild1@gmail.com>
parents: 759
diff changeset
     3
-- Copyright (C) 2008-2009 Waqas Hussain
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 467
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
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
     9
local plugin_dir = CFG_PLUGINDIR or "./plugins/";
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
    10
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
    11
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
    12
local log = logger.init("modulemanager");
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 540
diff changeset
    13
local eventmanager = require "core.eventmanager";
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    14
local config = require "core.configmanager";
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
    15
local multitable_new = require "util.multitable".new;
698
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
    16
local register_actions = require "core.actions".register;
1174
f7b6d5839092 modulemanager: require util.stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1173
diff changeset
    17
local st = require "util.stanza";
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
    18
local pluginloader = require "util.pluginloader";
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
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
local hosts = hosts;
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
    21
local prosody = prosody;
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
    22
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
local loadfile, pcall = loadfile, pcall;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
local setmetatable, setfenv, getfenv = setmetatable, setfenv, getfenv;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
local pairs, ipairs = pairs, ipairs;
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
    26
local t_insert, t_concat = table.insert, table.concat;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
local type = type;
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    28
local next = next;
674
4f506c627b49 modulemanager: module.unload now gets called when modules are being unloaded
Waqas Hussain <waqas20@gmail.com>
parents: 670
diff changeset
    29
local rawget = rawget;
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
    30
local error = error;
1105
965a55db3732 modulemanager: No need for print()
Matthew Wild <mwild1@gmail.com>
parents: 1094
diff changeset
    31
local tostring = tostring;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
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
    33
local autoload_modules = {"presence", "message", "iq"};
e19cb945c25b modulemanager: Small code improvement, move autoloaded modules list to the top of the file
Matthew Wild <mwild1@gmail.com>
parents: 1504
diff changeset
    34
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
    35
-- We need this to let modules access the real global namespace
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
local _G = _G;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
module "modulemanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
1389
846df07536eb modulemanager: Expose api table to allow others to extend the module API
Matthew Wild <mwild1@gmail.com>
parents: 1386
diff changeset
    40
api = {};
846df07536eb modulemanager: Expose api table to allow others to extend the module API
Matthew Wild <mwild1@gmail.com>
parents: 1386
diff changeset
    41
local api = api; -- Module API container
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
    42
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
    43
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
    44
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
    45
local stanza_handlers = multitable_new();
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
local handler_info = {};
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
    47
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
local modulehelpers = setmetatable({}, { __index = _G });
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    50
local handler_table = multitable_new();
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
    51
local hooked = multitable_new();
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
    52
local hooks = multitable_new();
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
    53
local event_hooks = multitable_new();
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
    54
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    55
local NULL = {};
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    56
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    57
-- Load modules when a host is activated
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    58
function load_modules_for_host(host)
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    59
	if config.get(host, "core", "load_global_modules") ~= false then
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    60
		-- Load modules from global section
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    61
		local modules_enabled = config.get("*", "core", "modules_enabled");
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    62
		local modules_disabled = config.get(host, "core", "modules_disabled");
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    63
		local disabled_set = {};
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    64
		if modules_enabled then
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    65
			if modules_disabled then
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    66
				for _, module in ipairs(modules_disabled) do
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    67
					disabled_set[module] = true;
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    68
				end
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
    69
			end
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
    70
			for _, module in ipairs(autoload_modules) do
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    71
				if not disabled_set[module] then
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    72
					load(host, module);
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    73
				end
1309
a544e68a0989 modulemanager: Load mod_message, mod_iq and mod_presence implicitly
Waqas Hussain <waqas20@gmail.com>
parents: 1259
diff changeset
    74
			end
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    75
			for _, module in ipairs(modules_enabled) do
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    76
				if not disabled_set[module] and not is_loaded(host, module) then
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    77
					load(host, module);
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    78
				end
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
    79
			end
30b8ad9f7b70 Fix for not loading global modules when host-specific modules are specified in config
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
    80
		end
30b8ad9f7b70 Fix for not loading global modules when host-specific modules are specified in config
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
    81
	end
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    82
	
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
    83
	-- Load modules from just this host
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    84
	local modules_enabled = config.get(host, "core", "modules_enabled");
1504
9d8c35e98ca2 configmanager, modulemanager: Allow components to have modules specified in the config (but don't load the global set of modules for them)
Matthew Wild <mwild1@gmail.com>
parents: 1447
diff changeset
    85
	if modules_enabled and modules_enabled ~= config.get("*", "core", "modules_enabled") then
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    86
		for _, module in pairs(modules_enabled) do
672
7db1044d2fab Remove warning of already-loaded modules at startup
Matthew Wild <mwild1@gmail.com>
parents: 670
diff changeset
    87
			if not is_loaded(host, module) then
7db1044d2fab Remove warning of already-loaded modules at startup
Matthew Wild <mwild1@gmail.com>
parents: 670
diff changeset
    88
				load(host, module);
7db1044d2fab Remove warning of already-loaded modules at startup
Matthew Wild <mwild1@gmail.com>
parents: 670
diff changeset
    89
			end
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    90
		end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    91
	end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    92
end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    93
eventmanager.add_event_hook("host-activated", load_modules_for_host);
1852
f9b58f37bc14 modulemanager: Load modules for components, too
Matthew Wild <mwild1@gmail.com>
parents: 1730
diff changeset
    94
eventmanager.add_event_hook("component-activated", load_modules_for_host);
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    95
--
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
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
    97
function load(host, module_name, config)
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
    98
	if not (host and module_name) then
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
    99
		return nil, "insufficient-parameters";
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   100
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
	
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
   102
	if not modulemap[host] then
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
   103
		modulemap[host] = {};
1904
0aa55a5dafde modulemanager: Add host.modules to contain a table of modules for a host
Matthew Wild <mwild1@gmail.com>
parents: 1852
diff changeset
   104
		hosts[host].modules = modulemap[host];
769
9e76018c62fa Fix for never checking if the first module for a host is already loaded (affects global modules)
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
   105
	end
9e76018c62fa Fix for never checking if the first module for a host is already loaded (affects global modules)
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
   106
	
9e76018c62fa Fix for never checking if the first module for a host is already loaded (affects global modules)
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
   107
	if modulemap[host][module_name] then
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
   108
		log("warn", "%s is already loaded for %s, so not loading again", module_name, host);
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
   109
		return nil, "module-already-loaded";
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   110
	elseif modulemap["*"][module_name] then
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   111
		return nil, "global-module-already-loaded";
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
   112
	end
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
   113
	
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   114
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
   115
	local mod, err = pluginloader.load_code(module_name);
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   116
	if not mod then
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   117
		log("error", "Unable to load module '%s': %s", module_name or "nil", err or "nil");
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   118
		return nil, err;
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   119
	end
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   120
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
   121
	local _log = logger.init(host..":"..module_name);
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
   122
	local api_instance = setmetatable({ name = module_name, host = host, config = config,  _log = _log, log = function (self, ...) return _log(...); end }, { __index = api });
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
   123
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
   124
	local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   125
	
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   126
	setfenv(mod, pluginenv);
778
0d94b4903cc7 modulemanager initializes hosts[host] if it isn't already initialized when loading a module.
Waqas Hussain <waqas20@gmail.com>
parents: 769
diff changeset
   127
	if not hosts[host] then hosts[host] = { type = "component", host = host, connected = false, s2sout = {} }; end
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
   128
	
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   129
	local success, ret = pcall(mod);
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   130
	if not success then
1330
baad431dabc5 modulemanager: Use module_name in log entry to fix 'error initialising module "nil"' error
Matthew Wild <mwild1@gmail.com>
parents: 1328
diff changeset
   131
		log("error", "Error initialising module '%s': %s", module_name or "nil", ret or "nil");
391
79bd7a3e906c Typo prevented modulemanager.load() from returning the error if load failed.
Matthew Wild <mwild1@gmail.com>
parents: 385
diff changeset
   132
		return nil, ret;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
	end
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
   134
	
1378
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   135
	if module_has_method(pluginenv, "load") then
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   136
		local ok, err = call_module_method(pluginenv, "load");
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   137
		if (not ok) and err then
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   138
			log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err);
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   139
		end
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   140
	end
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   141
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   142
	-- Use modified host, if the module set one
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   143
	modulemap[api_instance.host][module_name] = pluginenv;
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
   144
	
1069
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   145
	if api_instance.host == "*" and host ~= "*" then
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   146
		api_instance:set_global();
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   147
	end
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   148
		
229
01bd24ea488d We now fail if modules fail to load at startup.
Waqas Hussain <waqas20@gmail.com>
parents: 218
diff changeset
   149
	return true;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   152
function 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
   153
	return modulemap[host] and modulemap[host][name];
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   154
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   155
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   156
function is_loaded(host, name)
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   157
	return modulemap[host] and modulemap[host][name] and true;
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   158
end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   159
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   160
function unload(host, name, ...)
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   161
	local mod = get_module(host, name); 
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   162
	if not mod then return nil, "module-not-loaded"; end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   163
	
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   164
	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
   165
		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
   166
		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
   167
			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
   168
		end
674
4f506c627b49 modulemanager: module.unload now gets called when modules are being unloaded
Waqas Hussain <waqas20@gmail.com>
parents: 670
diff changeset
   169
	end
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   170
	modulemap[host][name] = nil;
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   171
	local params = handler_table:get(host, name); -- , {module.host, origin_type, tag, xmlns}
708
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   172
	for _, param in pairs(params or NULL) do
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   173
		local handlers = stanza_handlers:get(param[1], param[2], param[3], param[4]);
708
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   174
		if handlers then
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   175
			handler_info[handlers[1]] = nil;
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   176
			stanza_handlers:remove(param[1], param[2], param[3], param[4]);
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   177
		end
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   178
	end
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   179
	event_hooks:remove(host, name);
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
   180
	-- unhook event handlers hooked by module:hook
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
   181
	for event, handlers in pairs(hooks:get(host, name) or NULL) do
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
   182
		for handler in pairs(handlers or NULL) do
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
   183
			(hosts[host] or prosody).events.remove_handler(event, handler);
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
   184
		end
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
   185
	end
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
   186
	hooks:remove(host, name);
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   187
	return true;
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   188
end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   189
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   190
function reload(host, name, ...)
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   191
	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
   192
	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
   193
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
   194
	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
   195
	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
   196
		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
   197
		return nil, err;
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   198
	end
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   199
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   200
	local saved;
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   201
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   202
	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
   203
		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
   204
		if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   205
			saved = ret;
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   206
		else
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   207
			log("warn", "Error saving module '%s:%s' state: %s", host, module, ret);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   208
			if not config.get(host, "core", "force_module_reload") then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   209
				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
   210
				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
   211
			else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   212
				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
   213
			end
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   214
		end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   215
	end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   216
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   217
	unload(host, name, ...);
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   218
	local ok, err = load(host, name, ...);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   219
	if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   220
		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
   221
		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
   222
			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
   223
			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
   224
				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
   225
			end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   226
		end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   227
		return true;
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   228
	end
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   229
	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
   230
end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   231
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   232
function handle_stanza(host, origin, stanza)
1730
f4170bc82969 modulemanager: Fixed: Internally generated stanzas could be missing namespaces, which causes tracebacks in logging (e.g., auto-generated offline presence)
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   233
	local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns or "jabber:client", origin.type;
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   234
	if name == "iq" and xmlns == "jabber:client" then
608
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   235
		if stanza.attr.type == "get" or stanza.attr.type == "set" then
929
b4f2ca7f6f00 Fixed: modulemanager: IQs with extended elements in the default namespace could cause backtraces (related to issue #74)
Waqas Hussain <waqas20@gmail.com>
parents: 896
diff changeset
   236
			xmlns = stanza.tags[1].attr.xmlns or "jabber:client";
608
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   237
			log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns);
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   238
		else
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   239
			log("debug", "Discarding %s from %s of type: %s", name, origin_type, stanza.attr.type);
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   240
			return true;
3758af511ce8 Don't try processing stanzas not of type get or set in module manager
Waqas Hussain <waqas20@gmail.com>
parents: 592
diff changeset
   241
		end
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   242
	end
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   243
	local handlers = stanza_handlers:get(host, origin_type, name, xmlns);
876
fad020cead52 Allow global modules to hook stanza handlers
Waqas Hussain <waqas20@gmail.com>
parents: 778
diff changeset
   244
	if not handlers then handlers = stanza_handlers:get("*", origin_type, name, xmlns); end
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   245
	if handlers then
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   246
		log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name);
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   247
		(handlers[1])(origin, stanza);
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   248
		return true;
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   249
	else
1167
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   250
		if stanza.attr.xmlns == "jabber:client" then
1933
3884a0aac4d7 modulemanager: Bump log level of unhandled non-default-namespace elements, and log their full XML
Matthew Wild <mwild1@gmail.com>
parents: 1908
diff changeset
   251
			log("debug", "Unhandled %s stanza: %s; xmlns=%s", origin.type, stanza.name, xmlns); -- we didn't handle it
1167
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   252
			if stanza.attr.type ~= "error" and stanza.attr.type ~= "result" then
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   253
				origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   254
			end
1447
cc20d6dfa32d modulemanager: Don't close stream on stream:error with unsupported-stanza-type (fixes #102)
Waqas Hussain <waqas20@gmail.com>
parents: 1394
diff changeset
   255
		elseif not((name == "features" or name == "error") and xmlns == "http://etherx.jabber.org/streams") then -- FIXME remove check once we handle S2S features
1933
3884a0aac4d7 modulemanager: Bump log level of unhandled non-default-namespace elements, and log their full XML
Matthew Wild <mwild1@gmail.com>
parents: 1908
diff changeset
   256
			log("warn", "Unhandled %s stream element: %s; xmlns=%s: %s", origin.type, stanza.name, xmlns, tostring(stanza)); -- we didn't handle it
1167
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   257
			origin:close("unsupported-stanza-type");
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   258
		end
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   259
	end
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   260
end
39
89877d61ac51 Add support for arbitrary events and event hooks
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
   261
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   262
function module_has_method(module, method)
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   263
	return type(module.module[method]) == "function";
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   264
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   265
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
   266
function call_module_method(module, method, ...)
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   267
	if module_has_method(module, method) then	
748
172c43d735e9 modulemanager: Really fix call_module_method to work properly
Matthew Wild <mwild1@gmail.com>
parents: 747
diff changeset
   268
		local f = module.module[method];
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   269
		return pcall(f, ...);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   270
	else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   271
		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
   272
	end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   273
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   274
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
   275
----- API functions exposed to modules -----------
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
   276
-- Must all be in api.* 
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
   277
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
   278
-- Returns the name of the current module
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
   279
function api:get_name()
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
   280
	return self.name;
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
   281
end
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
   282
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
   283
-- Returns the host that the current module is serving
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
   284
function api:get_host()
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
   285
	return self.host;
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
   286
end
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
   287
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
   288
function api:get_host_type()
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
   289
	return hosts[self.host].type;
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
   290
end
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
   291
746
7027de4c039d modulemanager: Add module:set_global() as a cleaner way for a module to declare itself 'global'
Matthew Wild <mwild1@gmail.com>
parents: 745
diff changeset
   292
function api:set_global()
7027de4c039d modulemanager: Add module:set_global() as a cleaner way for a module to declare itself 'global'
Matthew Wild <mwild1@gmail.com>
parents: 745
diff changeset
   293
	self.host = "*";
1069
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   294
	-- Update the logger
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   295
	local _log = logger.init("mod_"..self.name);
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   296
	self.log = function (self, ...) return _log(...); end;
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   297
	self._log = _log;
746
7027de4c039d modulemanager: Add module:set_global() as a cleaner way for a module to declare itself 'global'
Matthew Wild <mwild1@gmail.com>
parents: 745
diff changeset
   298
end
7027de4c039d modulemanager: Add module:set_global() as a cleaner way for a module to declare itself 'global'
Matthew Wild <mwild1@gmail.com>
parents: 745
diff changeset
   299
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   300
local function _add_handler(module, origin_type, tag, xmlns, handler)
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   301
	local handlers = stanza_handlers:get(module.host, origin_type, tag, xmlns);
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   302
	local msg = (tag == "iq") and "namespace" or "payload namespace";
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   303
	if not handlers then
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   304
		stanza_handlers:add(module.host, origin_type, tag, xmlns, handler);
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   305
		handler_info[handler] = module;
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   306
		handler_table:add(module.host, module.name, {module.host, origin_type, tag, xmlns});
733
b1aedec00661 modulemanager: Comment out logging of modules hooking stanzas, too noisy
Matthew Wild <mwild1@gmail.com>
parents: 713
diff changeset
   307
		--module:log("debug", "I now handle tag '%s' [%s] with %s '%s'", tag, origin_type, msg, xmlns);
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   308
	else
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   309
		module:log("warn", "I wanted to handle tag '%s' [%s] with %s '%s' but mod_%s already handles that", tag, origin_type, msg, xmlns, handler_info[handlers[1]].module.name);
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   310
	end
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   311
end
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
   312
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   313
function api:add_handler(origin_type, tag, xmlns, handler)
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   314
	if not (origin_type and tag and xmlns and handler) then return false; end
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
   315
	if type(origin_type) == "table" then
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
   316
		for _, origin_type in ipairs(origin_type) do
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   317
			_add_handler(self, origin_type, tag, xmlns, handler);
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
   318
		end
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   319
	else
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   320
		_add_handler(self, origin_type, tag, xmlns, handler);
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
   321
	end
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   322
end
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   323
function api:add_iq_handler(origin_type, xmlns, handler)
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   324
	self:add_handler(origin_type, "iq", xmlns, handler);
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
   325
end
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
   326
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
   327
function api:add_feature(xmlns)
1697
f1783e621a36 modulemanager: Module API functions add_item and add_feature updated to use the add_item API
Waqas Hussain <waqas20@gmail.com>
parents: 1695
diff changeset
   328
	self:add_item("feature", xmlns);
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
   329
end
1695
9786e650393b modulemanager: Changed the add_identity module API to accept an optional name parameter (the 'name' attribute for the <identity/> element)
Waqas Hussain <waqas20@gmail.com>
parents: 1694
diff changeset
   330
function api:add_identity(category, type, name)
1697
f1783e621a36 modulemanager: Module API functions add_item and add_feature updated to use the add_item API
Waqas Hussain <waqas20@gmail.com>
parents: 1695
diff changeset
   331
	self:add_item("identity", {category = category, type = type, name = name});
1334
6846c5cc9ce2 modulemanager: Added function add_identity(category, type) to the modules API
Waqas Hussain <waqas20@gmail.com>
parents: 1330
diff changeset
   332
end
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
   333
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   334
local event_hook = function(host, mod_name, event_name, ...)
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   335
	if type((...)) == "table" and (...).host and (...).host ~= host then return; end
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   336
	for handler in pairs(event_hooks:get(host, mod_name, event_name) or NULL) do
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   337
		handler(...);
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   338
	end
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   339
end;
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   340
function api:add_event_hook(name, handler)
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   341
	if not hooked:get(self.host, self.name, name) then
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   342
		eventmanager.add_event_hook(name, function(...) event_hook(self.host, self.name, name, ...); end);
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   343
		hooked:set(self.host, self.name, name, true);
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   344
	end
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   345
	event_hooks:set(self.host, self.name, name, handler, true);
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   346
end
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
   347
1183
565e16ee0c74 modulemanager: Add module:fire_event() to module API
Matthew Wild <mwild1@gmail.com>
parents: 1174
diff changeset
   348
function api:fire_event(...)
1253
60156584c442 modulemanager: Stopped using core.eventmanager in module:fire_event
Waqas Hussain <waqas20@gmail.com>
parents: 1250
diff changeset
   349
	return (hosts[self.host] or prosody).events.fire_event(...);
1183
565e16ee0c74 modulemanager: Add module:fire_event() to module API
Matthew Wild <mwild1@gmail.com>
parents: 1174
diff changeset
   350
end
565e16ee0c74 modulemanager: Add module:fire_event() to module API
Matthew Wild <mwild1@gmail.com>
parents: 1174
diff changeset
   351
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   352
function api:hook(event, handler, priority)
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
   353
	hooks:set(self.host, self.name, event, handler, true);
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   354
	(hosts[self.host] or prosody).events.add_handler(event, handler, priority);
1231
6f251813f1e5 modulemanager: Added hook(event, handler) to the plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1183
diff changeset
   355
end
6f251813f1e5 modulemanager: Added hook(event, handler) to the plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1183
diff changeset
   356
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   357
function api:hook_stanza(xmlns, name, handler, priority)
1318
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   358
	if not handler and type(name) == "function" then
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   359
		-- If only 2 options then they specified no xmlns
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   360
		xmlns, name, handler, priority = nil, xmlns, name, handler;
1321
0698d0d39b35 modulemanager: Don't require xmlns to be non-nil
Matthew Wild <mwild1@gmail.com>
parents: 1320
diff changeset
   361
	elseif not (handler and name) then
1320
9c736b993e07 modulemanager: module:log() -> self:log() fix
Matthew Wild <mwild1@gmail.com>
parents: 1319
diff changeset
   362
		self:log("warn", "Error: Insufficient parameters to module:hook_stanza()");
1318
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   363
		return;
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   364
	end
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   365
	return api.hook(self, "stanza/"..(xmlns and (xmlns..":") or "")..name, function (data) return handler(data.origin, data.stanza, data); end, priority);
1318
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   366
end
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   367
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   368
function api:require(lib)
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   369
	local f, n = pluginloader.load_code(self.name, lib..".lib.lua");
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   370
	if not f then
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   371
		f, n = pluginloader.load_code(lib, lib..".lib.lua");
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   372
	end
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   373
	if not f then error("Failed to load plugin library '"..lib.."', error: "..n); end -- FIXME better error message
1393
576143941a76 modulemanager: Enabled access to the module API from plugin libraries
Waqas Hussain <waqas20@gmail.com>
parents: 1392
diff changeset
   374
	setfenv(f, setmetatable({ module = self }, { __index = _G }));
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   375
	return f();
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   376
end
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   377
1586
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   378
function api:get_option(name, default_value)
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   379
	return config.get(self.host, self.name, name) or config.get(self.host, "core", name) or default_value;
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   380
end
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   381
1694
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   382
local t_remove = _G.table.remove;
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   383
local module_items = multitable_new();
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   384
function api:add_item(key, value)
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   385
	self.items = self.items or {};
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   386
	self.items[key] = self.items[key] or {};
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   387
	t_insert(self.items[key], value);
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   388
	self:fire_event("item-added/"..key, {source = self, item = value});
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   389
end
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   390
function api:remove_item(key, value)
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   391
	local t = self.items and self.items[key] or NULL;
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   392
	for i = #t,1,-1 do
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   393
		if t[i] == value then
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   394
			t_remove(self.items[key], i);
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   395
			self:fire_event("item-removed/"..key, {source = self, item = value});
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   396
			return value;
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   397
		end
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   398
	end
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   399
end
0b7888c0995d Added: functions add_item and remove_item to add and remove items to the module API
Waqas Hussain <waqas20@gmail.com>
parents: 1586
diff changeset
   400
1698
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   401
function api:get_host_items(key)
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   402
	local result = {};
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   403
	for mod_name, module in pairs(modulemap[self.host]) do
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   404
		module = module.module;
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   405
		if module.items then
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   406
			for _, item in ipairs(module.items[key] or NULL) do
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   407
				t_insert(result, item);
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   408
			end
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   409
		end
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   410
	end
1946
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   411
	for mod_name, module in pairs(modulemap["*"]) do
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   412
		module = module.module;
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   413
		if module.items then
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   414
			for _, item in ipairs(module.items[key] or NULL) do
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   415
				t_insert(result, item);
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   416
			end
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   417
		end
0eb3835ef9bf modulemanager: Changed api:get_host_items to include items from the global host in its result.
Waqas Hussain <waqas20@gmail.com>
parents: 1933
diff changeset
   418
	end
1698
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   419
	return result;
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   420
end
af89f646200f modulemanager: Added module API function to get all items for a given host based on a key
Waqas Hussain <waqas20@gmail.com>
parents: 1697
diff changeset
   421
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
   422
--------------------------------------------------------------------
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
   423
698
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   424
local actions = {};
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   425
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   426
function actions.load(params)
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   427
	--return true, "Module loaded ("..params.module.." on "..params.host..")";
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   428
	return load(params.host, params.module);
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   429
end
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   430
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   431
function actions.unload(params)
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   432
	return unload(params.host, params.module);
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   433
end
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   434
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   435
register_actions("/modules", actions);
d8a678e40a0a Add core.actions for managing server 'actions'; and make modulemanager register actions 'load' and 'unload'
Matthew Wild <mwild1@gmail.com>
parents: 695
diff changeset
   436
39
89877d61ac51 Add support for arbitrary events and event hooks
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
   437
return _M;