core/modulemanager.lua
author Waqas Hussain <waqas20@gmail.com>
Mon, 19 Apr 2010 18:29:10 +0500
changeset 2977 686f9a5a7f5e
parent 2951 294c359a05f5
child 3165 4ffb5469c1f6
permissions -rw-r--r--
modulemanager: Log proper tracebacks on errors during module load/unload.
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
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;
1174
f7b6d5839092 modulemanager: require util.stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1173
diff changeset
    16
local st = require "util.stanza";
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
    17
local pluginloader = require "util.pluginloader";
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
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
    19
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
    20
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
    21
2977
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    22
local loadfile, pcall, xpcall = loadfile, pcall, xpcall;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
local setmetatable, setfenv, getfenv = setmetatable, setfenv, getfenv;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
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
    25
local t_insert, t_concat = table.insert, table.concat;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
local type = type;
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    27
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
    28
local rawget = rawget;
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
    29
local error = error;
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
    30
local tostring, tonumber = tostring, tonumber;
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
    31
2977
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    32
local debug_traceback = debug.traceback;
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    33
local unpack, select = unpack, select;
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    34
pcall = function(f, ...)
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    35
	local n = select("#", ...);
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    36
	local params = {...};
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    37
	return xpcall(function() f(unpack(params, 1, n)) end, function(e) return tostring(e).."\n"..debug_traceback(); end);
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    38
end
686f9a5a7f5e modulemanager: Log proper tracebacks on errors during module load/unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2951
diff changeset
    39
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
    40
local array, set = require "util.array", require "util.set";
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
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
    42
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
    43
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
    44
-- We need this to let modules access the real global namespace
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
local _G = _G;
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
module "modulemanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
1389
846df07536eb modulemanager: Expose api table to allow others to extend the module API
Matthew Wild <mwild1@gmail.com>
parents: 1386
diff changeset
    49
api = {};
846df07536eb modulemanager: Expose api table to allow others to extend the module API
Matthew Wild <mwild1@gmail.com>
parents: 1386
diff changeset
    50
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
    51
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
    52
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
    53
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
    54
local stanza_handlers = multitable_new();
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
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
    56
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
local modulehelpers = setmetatable({}, { __index = _G });
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    59
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
    60
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
    61
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
    62
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
    63
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    64
local NULL = {};
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
    65
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    66
-- Load modules when a host is activated
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    67
function load_modules_for_host(host)
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
    68
	local disabled_set = {};
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
    69
	local modules_disabled = config.get(host, "core", "modules_disabled");
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
    70
	if modules_disabled then
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
    71
		for _, module in ipairs(modules_disabled) do
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
    72
			disabled_set[module] = true;
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
    73
		end
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
    74
	end
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
    75
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
    76
	-- Load auto-loaded modules for this host
1988
a6e7fe0fc3dd modulemanager: Fixed: Stanza modules were being auto-loaded for components (regression in hg:1e674dae31ae).
Waqas Hussain <waqas20@gmail.com>
parents: 1987
diff changeset
    77
	if hosts[host].type == "local" then
a6e7fe0fc3dd modulemanager: Fixed: Stanza modules were being auto-loaded for components (regression in hg:1e674dae31ae).
Waqas Hussain <waqas20@gmail.com>
parents: 1987
diff changeset
    78
		for _, module in ipairs(autoload_modules) do
a6e7fe0fc3dd modulemanager: Fixed: Stanza modules were being auto-loaded for components (regression in hg:1e674dae31ae).
Waqas Hussain <waqas20@gmail.com>
parents: 1987
diff changeset
    79
			if not disabled_set[module] then
a6e7fe0fc3dd modulemanager: Fixed: Stanza modules were being auto-loaded for components (regression in hg:1e674dae31ae).
Waqas Hussain <waqas20@gmail.com>
parents: 1987
diff changeset
    80
				load(host, module);
a6e7fe0fc3dd modulemanager: Fixed: Stanza modules were being auto-loaded for components (regression in hg:1e674dae31ae).
Waqas Hussain <waqas20@gmail.com>
parents: 1987
diff changeset
    81
			end
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
    82
		end
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
    83
	end
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
    84
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
    85
	-- Load modules from global section
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
    86
	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
    87
		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
    88
		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
    89
			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
    90
				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
    91
					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
    92
				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
    93
			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
    94
		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
    95
	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
    96
	
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
    97
	-- Load modules from just this host
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
    98
	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
    99
	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
   100
		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
   101
			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
   102
				load(host, module);
7db1044d2fab Remove warning of already-loaded modules at startup
Matthew Wild <mwild1@gmail.com>
parents: 670
diff changeset
   103
			end
573
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
   104
		end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
   105
	end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
   106
end
f6555ebf84ec Move module loading to modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 569
diff changeset
   107
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
   108
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
   109
--
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   110
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
   111
function load(host, module_name, config)
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   112
	if not (host and module_name) then
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   113
		return nil, "insufficient-parameters";
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   114
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   115
	
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
   116
	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
   117
		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
   118
	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
   119
	
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
   120
	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
   121
		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
   122
		return nil, "module-already-loaded";
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   123
	elseif modulemap["*"][module_name] then
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   124
		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
   125
	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
   126
	
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   127
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
   128
	local mod, err = pluginloader.load_code(module_name);
584
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   129
	if not mod then
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   130
		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
   131
		return nil, err;
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   132
	end
eb0cea29c8d7 Temporary hack for global modules
Matthew Wild <mwild1@gmail.com>
parents: 579
diff changeset
   133
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
	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
   135
	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
   136
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
   137
	local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
2584
5091548a3805 modulemanager: Make the plugin environment available directly (module.environment within plugins).
Waqas Hussain <waqas20@gmail.com>
parents: 2479
diff changeset
   138
	api_instance.environment = pluginenv;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   139
	
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   140
	setfenv(mod, pluginenv);
1993
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   141
	if not hosts[host] then
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   142
		local create_component = _G.require "core.componentmanager".create_component;
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   143
		hosts[host] = create_component(host);
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   144
		hosts[host].connected = false;
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   145
		log("debug", "Created new component: %s", host);
09621f8d0366 modulemanager: Use componentmanager to create new components.
Waqas Hussain <waqas20@gmail.com>
parents: 1988
diff changeset
   146
	end
1987
94ecd3e7be87 modulemanager: Fixed traceback on loading modules on unknown hosts.
Waqas Hussain <waqas20@gmail.com>
parents: 1986
diff changeset
   147
	hosts[host].modules = modulemap[host];
1994
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   148
	modulemap[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
   149
	
1994
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   150
	local success, err = pcall(mod);
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   151
	if success then
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   152
		if module_has_method(pluginenv, "load") then
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   153
			success, err = call_module_method(pluginenv, "load");
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   154
			if not success then
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   155
				log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil");
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   156
			end
1378
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   157
		end
d09ecc8ee1ef modulemanager: Call 'load' method when loading a module
Matthew Wild <mwild1@gmail.com>
parents: 1361
diff changeset
   158
1994
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   159
		-- Use modified host, if the module set one
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   160
		if api_instance.host == "*" and host ~= "*" then
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   161
			modulemap[host][module_name] = nil;
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   162
			modulemap["*"][module_name] = pluginenv;
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   163
			api_instance:set_global();
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   164
		end
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   165
	else
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   166
		log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil");
1069
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   167
	end
1994
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   168
	if success then
2659
ba6dd11f7259 modulemanager: Fix traceback on unloading global modules (thanks KSid)
Matthew Wild <mwild1@gmail.com>
parents: 2585
diff changeset
   169
		(hosts[api_instance.host] or prosody).events.fire_event("module-loaded", { module = module_name, host = host });
1994
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   170
		return true;
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   171
	else -- load failed, unloading
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   172
		unload(api_instance.host, module_name);
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   173
		return nil, err;
9cc9b096c8f5 modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
Waqas Hussain <waqas20@gmail.com>
parents: 1993
diff changeset
   174
	end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   175
end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   176
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   177
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
   178
	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
   179
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   180
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   181
function is_loaded(host, name)
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   182
	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
   183
end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   184
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   185
function unload(host, name, ...)
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2270
diff changeset
   186
	local mod = get_module(host, name);
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   187
	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
   188
	
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   189
	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
   190
		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
   191
		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
   192
			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
   193
		end
674
4f506c627b49 modulemanager: module.unload now gets called when modules are being unloaded
Waqas Hussain <waqas20@gmail.com>
parents: 670
diff changeset
   194
	end
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   195
	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
   196
	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
   197
		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
   198
		if handlers then
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   199
			handler_info[handlers[1]] = nil;
b72d408f5f15 modulemanager: Fixed error on unloading modules with no handlers
Waqas Hussain <waqas20@gmail.com>
parents: 686
diff changeset
   200
			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
   201
		end
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   202
	end
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   203
	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
   204
	-- 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
   205
	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
   206
		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
   207
			(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
   208
		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
   209
	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
   210
	hooks:remove(host, name);
2828
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   211
	if mod.module.items then -- remove items
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   212
		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
   213
			for i = #t,1,-1 do
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   214
				local value = t[i];
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   215
				t[i] = nil;
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   216
				hosts[host].events.fire_event("item-removed/"..key, {source = self, item = value});
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   217
			end
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   218
		end
fbddc3ed0d09 modulemanager: Fire item-removed events on module unload.
Waqas Hussain <waqas20@gmail.com>
parents: 2072
diff changeset
   219
	end
1986
d4ba9d94eb74 modulemanager: Slightly rearranged code for more robust unloading of modules.
Waqas Hussain <waqas20@gmail.com>
parents: 1960
diff changeset
   220
	modulemap[host][name] = nil;
2659
ba6dd11f7259 modulemanager: Fix traceback on unloading global modules (thanks KSid)
Matthew Wild <mwild1@gmail.com>
parents: 2585
diff changeset
   221
	(hosts[host] or prosody).events.fire_event("module-unloaded", { module = name, host = host });
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   222
	return true;
439
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   223
end
6608ad3a72f3 is_loaded() and incomplete unload() for modules
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
   224
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   225
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
   226
	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
   227
	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
   228
1360
857034905016 modulemanager: Changed to use util.pluginloader
Waqas Hussain <waqas20@gmail.com>
parents: 1346
diff changeset
   229
	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
   230
	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
   231
		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
   232
		return nil, err;
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   233
	end
2afd6d9e21cd modulemanager: Check for syntax errors before reloading a module
Waqas Hussain <waqas20@gmail.com>
parents: 710
diff changeset
   234
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   235
	local saved;
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   236
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   237
	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
   238
		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
   239
		if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   240
			saved = ret;
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   241
		else
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   242
			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
   243
			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
   244
				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
   245
				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
   246
			else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   247
				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
   248
			end
710
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   249
		end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   250
	end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   251
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   252
	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
   253
	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
   254
	if ok then
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   255
		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
   256
		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
   257
			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
   258
			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
   259
				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
   260
			end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   261
		end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   262
		return true;
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   263
	end
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   264
	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
   265
end
56f6c115bc69 modulemanager: Added reload support, with callbacks for saving and restoring state
Waqas Hussain <waqas20@gmail.com>
parents: 709
diff changeset
   266
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   267
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
   268
	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
   269
	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
   270
		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
   271
			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
   272
			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
   273
		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
   274
			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
   275
			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
   276
		end
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   277
	end
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   278
	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
   279
	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
   280
	if handlers then
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   281
		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
   282
		(handlers[1])(origin, stanza);
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   283
		return true;
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   284
	else
2949
ef19faa7d106 stanza_router, s2smanager, modulemanager: Fix for handling of the default namespace on stanzas, causing sometimes jabber:client to be sent over s2s, and accepted
Matthew Wild <mwild1@gmail.com>
parents: 2923
diff changeset
   285
		if stanza.attr.xmlns == nil 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
   286
			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
   287
			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
   288
				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
   289
			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
   290
		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
   291
			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
   292
			origin:close("unsupported-stanza-type");
5620ea24be94 stanza_router: Removed global function core_handle_stanza
Waqas Hussain <waqas20@gmail.com>
parents: 1105
diff changeset
   293
		end
578
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   294
	end
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
diff changeset
   295
end
39
89877d61ac51 Add support for arbitrary events and event hooks
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
   296
745
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   297
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
   298
	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
   299
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   300
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
   301
function call_module_method(module, method, ...)
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2270
diff changeset
   302
	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
   303
		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
   304
		return pcall(f, ...);
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   305
	else
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   306
		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
   307
	end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   308
end
5a343599cd3e core.modulemanager: Some refactoring to make upcoming changes a little easier
Matthew Wild <mwild1@gmail.com>
parents: 733
diff changeset
   309
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
   310
----- API functions exposed to modules -----------
2278
8c10f13c0c20 modulemanager, net.dns: Remove trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2270
diff changeset
   311
-- Must all be in api.*
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
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
   313
-- 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
   314
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
   315
	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
   316
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
   317
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
-- 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
   319
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
   320
	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
   321
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
   322
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
   323
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
   324
	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
   325
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
   326
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
   327
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
   328
	self.host = "*";
1069
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   329
	-- Update the logger
034e345c0f8d modulemanager: Update logger when a module becomes global
Matthew Wild <mwild1@gmail.com>
parents: 929
diff changeset
   330
	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
   331
	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
   332
	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
   333
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
   334
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   335
local function _add_handler(module, origin_type, tag, xmlns, handler)
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   336
	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
   337
	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
   338
	if not handlers then
591
980ded4c60ef Removed unused variables
Waqas Hussain <waqas20@gmail.com>
parents: 590
diff changeset
   339
		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
   340
		handler_info[handler] = module;
670
d5cf10b7fc44 Modulemanager: Basic modules can now be unloaded correctly
Waqas Hussain <waqas20@gmail.com>
parents: 637
diff changeset
   341
		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
   342
		--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
   343
	else
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   344
		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
   345
	end
5879264e28e2 Changed module manager to use multitable (initial commit)
Waqas Hussain <waqas20@gmail.com>
parents: 573
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
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   348
function api:add_handler(origin_type, tag, xmlns, handler)
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   349
	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
   350
	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
   351
		for _, origin_type in ipairs(origin_type) do
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   352
			_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
   353
		end
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   354
	else
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   355
		_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
   356
	end
590
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   357
end
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   358
function api:add_iq_handler(origin_type, xmlns, handler)
54afe37cccbf Combined and merged similar code
Waqas Hussain <waqas20@gmail.com>
parents: 589
diff changeset
   359
	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
   360
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
   361
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
   362
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
   363
	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
   364
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
   365
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
   366
	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
   367
end
540
ec03f6968fa8 Added function add_feature to modules API (for adding disco features)
Waqas Hussain <waqas20@gmail.com>
parents: 519
diff changeset
   368
686
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   369
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
   370
	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
   371
	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
   372
		handler(...);
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   373
	end
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   374
end;
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   375
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
   376
	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
   377
		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
   378
		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
   379
	end
13ed38531f69 modulemanager: Per-host event hooks for plugins - solves issue 41
Waqas Hussain <waqas20@gmail.com>
parents: 675
diff changeset
   380
	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
   381
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
   382
1183
565e16ee0c74 modulemanager: Add module:fire_event() to module API
Matthew Wild <mwild1@gmail.com>
parents: 1174
diff changeset
   383
function api:fire_event(...)
1253
60156584c442 modulemanager: Stopped using core.eventmanager in module:fire_event
Waqas Hussain <waqas20@gmail.com>
parents: 1250
diff changeset
   384
	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
   385
end
565e16ee0c74 modulemanager: Add module:fire_event() to module API
Matthew Wild <mwild1@gmail.com>
parents: 1174
diff changeset
   386
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   387
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
   388
	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
   389
	(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
   390
end
6f251813f1e5 modulemanager: Added hook(event, handler) to the plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1183
diff changeset
   391
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   392
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
   393
	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
   394
		-- 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
   395
		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
   396
	elseif not (handler and name) then
1320
9c736b993e07 modulemanager: module:log() -> self:log() fix
Matthew Wild <mwild1@gmail.com>
parents: 1319
diff changeset
   397
		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
   398
		return;
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   399
	end
1319
812c028a877d modulemanager: Allow setting priority of stanza handlers
Matthew Wild <mwild1@gmail.com>
parents: 1318
diff changeset
   400
	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
   401
end
66f76c332a75 modulemanager: Add module:hook([xmlns, ] name, handler) which uses new stanza events
Matthew Wild <mwild1@gmail.com>
parents: 1309
diff changeset
   402
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   403
function api:require(lib)
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   404
	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
   405
	if not f then
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   406
		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
   407
	end
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   408
	if not f then error("Failed to load plugin library '"..lib.."', error: "..n); end -- FIXME better error message
2585
a9e99897b2e8 modulemanager: Load plugin libraries in the same environment as the plugins.
Waqas Hussain <waqas20@gmail.com>
parents: 2584
diff changeset
   409
	setfenv(f, self.environment);
1392
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   410
	return f();
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   411
end
9935ddfd8ccf modulemanager: Added simple module:require implementation
Waqas Hussain <waqas20@gmail.com>
parents: 1361
diff changeset
   412
1586
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   413
function api:get_option(name, default_value)
2072
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   414
	local value = config.get(self.host, self.name, name);
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   415
	if value == nil then
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   416
		value = config.get(self.host, "core", name);
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   417
		if value == nil then
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   418
			value = default_value;
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   419
		end
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   420
	end
464a5392bc80 modulemanager: api:get_option(): Handle correctly option values of boolean false, don't assume value unset
Matthew Wild <mwild1@gmail.com>
parents: 1994
diff changeset
   421
	return value;
1586
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   422
end
5c627d5d5e37 modulemanager: Added get_option(name, default_value) to plugin API
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
   423
2349
e0d9f4000d6b modulemanager: Fixed a global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2278
diff changeset
   424
function api:get_option_string(name, default_value)
e0d9f4000d6b modulemanager: Fixed a global access.
Waqas Hussain <waqas20@gmail.com>
parents: 2278
diff changeset
   425
	local value = self:get_option(name, default_value);
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
   426
	if type(value) == "table" then
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
   427
		if #value > 1 then
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
   428
			self:log("error", "Config option '%s' does not take a list, using just the first item", name);
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
   429
		end
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
   430
		value = value[1];
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
   431
	end
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
   432
	if value == nil then
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
   433
		return nil;
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
   434
	end
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
   435
	return tostring(value);
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
   436
end
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
   437
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
   438
function api:get_option_number(name, ...)
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
   439
	local value = self:get_option(name, ...);
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
   440
	if type(value) == "table" then
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
   441
		if #value > 1 then
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
   442
			self:log("error", "Config option '%s' does not take a list, using just the first item", name);
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
   443
		end
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
   444
		value = value[1];
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
   445
	end
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
   446
	local ret = tonumber(value);
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
   447
	if value ~= nil and ret == nil then
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
   448
		self:log("error", "Config option '%s' not understood, expecting a number", name);
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
   449
	end
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
   450
	return ret;
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
   451
end
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
   452
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
   453
function api:get_option_boolean(name, ...)
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
   454
	local value = self:get_option(name, ...);
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
   455
	if type(value) == "table" then
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
   456
		if #value > 1 then
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
   457
			self:log("error", "Config option '%s' does not take a list, using just the first item", name);
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
   458
		end
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
   459
		value = value[1];
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
   460
	end
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
   461
	if value == nil then
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
   462
		return nil;
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
   463
	end
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
   464
	local ret = value == true or value == "true" or value == 1 or nil;
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
   465
	if ret == nil then
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
   466
		ret = (value == false or value == "false" or value == 0);
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
   467
		if ret then
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
   468
			ret = false;
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
   469
		else
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
   470
			ret = nil;
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
   471
		end
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
   472
	end
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
   473
	if ret == nil then
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
   474
		self:log("error", "Config option '%s' not understood, expecting true/false", name);
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
   475
	end
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
   476
	return ret;
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
   477
end
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
   478
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
   479
function api:get_option_array(name, ...)
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
   480
	local value = self:get_option(name, ...);
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
   481
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
   482
	if value == nil then
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
   483
		return nil;
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
   484
	end
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
   485
	
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
   486
	if type(value) ~= "table" then
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
   487
		return array{ value }; -- Assume any non-list is a single-item list
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
   488
	end
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
   489
	
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
   490
	return array():append(value); -- Clone
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
   491
end
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
   492
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
   493
function api:get_option_set(name, ...)
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
   494
	local value = self:get_option_array(name, ...);
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
   495
	
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
   496
	if value == nil then
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
   497
		return nil;
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
   498
	end
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
   499
	
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
   500
	return set.new(value);
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
   501
end
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
   502
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
   503
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
   504
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
   505
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
   506
	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
   507
	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
   508
	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
   509
	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
   510
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
   511
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
   512
	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
   513
	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
   514
		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
   515
			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
   516
			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
   517
			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
   518
		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
   519
	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
   520
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
   521
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
   522
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
   523
	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
   524
	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
   525
		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
   526
		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
   527
			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
   528
				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
   529
			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
   530
		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
   531
	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
   532
	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
   533
		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
   534
		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
   535
			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
   536
				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
   537
			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
   538
		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
   539
	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
   540
	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
   541
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
   542
39
89877d61ac51 Add support for arbitrary events and event hooks
Matthew Wild <mwild1@gmail.com>
parents: 38
diff changeset
   543
return _M;