moduleapi: New API for modules to set a status
authorMatthew Wild <mwild1@gmail.com>
Tue, 19 Mar 2019 09:04:40 +0000
changeset 9870 09cc8c856e5e
parent 9869 37278b420c74
child 9871 984f27e4b8a3
moduleapi: New API for modules to set a status
core/moduleapi.lua
--- a/core/moduleapi.lua	Sun Mar 17 21:25:33 2019 +0100
+++ b/core/moduleapi.lua	Tue Mar 19 09:04:40 2019 +0000
@@ -17,6 +17,8 @@
 local cache = require "util.cache";
 local errutil = require "util.error";
 local promise = require "util.promise";
+local time_now = require "util.time".now;
+local format = require "util.format".format;
 
 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
 local error, setmetatable, type = error, setmetatable, type;
@@ -513,4 +515,33 @@
 	return self:measure_object_event(prosody.events.wrappers, event_name, stat_name);
 end
 
+local status_priorities = { error = 3, warn = 2, info = 1, core = 0 };
+
+function api:set_status(status_type, status_message, override)
+	local priority = status_priorities[status_type];
+	if not priority then
+		self:log("error", "set_status: Invalid status type '%s', assuming 'info'");
+		status_type, priority = "info", status_priorities.info;
+	end
+	local current_priority = status_priorities[self.status_type] or 0;
+	-- By default an 'error' status can only be overwritten by another 'error' status
+	if (current_priority >= status_priorities.error and priority < current_priority and override ~= true)
+	or (override == false and current_priority > priority) then
+		self:log("debug", "Ignoring status");
+		return;
+	end
+	self.status_type, self.status_message, self.status_time = status_type, status_message, time_now();
+	self:log("debug", "New status: %s", status_type);
+	self:fire_event("module-status/updated", { name = self.name });
+end
+
+function api:log_status(level, msg, ...)
+	self:set_status(level, format(msg, ...));
+	return self:log(level, msg, ...);
+end
+
+function api:get_status()
+	return self.status_type, self.status_message, self.status_time;
+end
+
 return api;