Diff

mod_adhoc_cmd_modules/mod_adhoc_cmd_modules.lua @ 205:a6361a1fda5e

mod_adhoc_cmd_modules: Add "Reload module" command
author Florian Zeitz <florob@babelmonkeys.de>
date Fri, 09 Jul 2010 22:29:26 +0200
parent 203:4927b9737bb7
child 206:d3498f115fcd
line wrap: on
line diff
--- a/mod_adhoc_cmd_modules/mod_adhoc_cmd_modules.lua	Sat Jul 10 01:35:05 2010 +0500
+++ b/mod_adhoc_cmd_modules/mod_adhoc_cmd_modules.lua	Fri Jul 09 22:29:26 2010 +0200
@@ -12,25 +12,55 @@
 require "util.iterators";
 local dataforms_new = require "util.dataforms".new;
 local array = require "util.array";
+local modulemanager = require "modulemanager";
 local adhoc_new = module:require "adhoc".new;
 
 function list_modules_handler(self, data, state)
-	local list_modules_result = dataforms_new {
+	local result = dataforms_new {
 		title = "List of loaded modules";
 
 		{ name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/modules#list" };
 		{ name = "modules", type = "text-multi", label = "The following modules are loaded:" };
 	};
 
-	local modules = array.collect(keys(hosts[data.to].modules)):sort()
-	local modules_str = nil;
-	for _, name in ipairs(modules) do
-		modules_str = ((modules_str and modules_str .. "\n") or "") .. name;
+	local modules = array.collect(keys(hosts[data.to].modules)):sort():concat("\n");
+
+	return { status = "completed", result = { layout = result; data = { modules = modules } } };
+end
+
+-- TODO: Allow reloading multiple modules (depends on list-multi
+function reload_modules_handler(self, data, state)
+	local modules = {};
+	local layout = dataforms_new {
+		title = "Reload module";
+		instructions = "Select the module to be reloaded";
+
+		{ name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/modules#reload" };
+		{ name = "module", type = "list-single", value = modules, label = "Module to be reloaded:"};
+	};
+	if state then
+		if data.action == "cancel" then
+			return { status = "canceled" };
+		end
+		fields = layout:data(data.form);
+		local ok, err = modulemanager.reload(data.to, fields.module);
+		if ok then
+			return { status = "completed", info = 'Module "'..fields.module..'" successfully reloaded on host "'..data.to..'".' };
+		else
+			return { status = "completed", error = 'Failed to reload module "'..fields.module..'" on host "'..data.to..
+			'". Error was: "'..tostring(err)..'"' };
+		end
+	else
+		local modules2 = array.collect(keys(hosts[data.to].modules)):sort();
+		for i, val in ipairs(modules2) do
+			modules[i] = val;
+		end
+		return { status = "executing", form = layout }, "executing";
 	end
-
-	return { status = "completed", result = { layout = list_modules_result; data = { modules = modules_str } } };
 end
 
 local list_modules_desc = adhoc_new("List loaded modules", "http://prosody.im/protocol/modules#list", list_modules_handler, "admin");
+local reload_modules_desc = adhoc_new("Reload module", "http://prosody.im/protocol/modules#reload", reload_modules_handler, "admin");
 
 module:add_item("adhoc", list_modules_desc);
+module:add_item("adhoc", reload_modules_desc);