view mod_audit_status/mod_audit_status.lua @ 5853:97c9b76867ca

mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
author Kim Alvefur <zash@zash.se>
date Sun, 03 Mar 2024 11:23:40 +0100
parents bd0abf821cef
children
line wrap: on
line source

module:depends("audit");

local st = require "util.stanza";

-- Suppress warnings about module:audit()
-- luacheck: ignore 143/module

local heartbeat_interval = module:get_option_number("audit_status_heartbeat_interval", 60);

local store = module:open_store(nil, "keyval+");

-- This is global, to make it available to other modules
crashed = false; --luacheck: ignore 131/crashed

module:hook_global("server-started", function ()
	local recorded_status = store:get();
	if recorded_status and recorded_status.status == "started" then
		module:audit(nil, "server-crashed", { timestamp = recorded_status.heartbeat });
		crashed = true;
	end
	module:audit(nil, "server-started");
	store:set_key(nil, "status", "started");
end);

module:hook_global("server-stopped", function ()
	module:audit(nil, "server-stopped", {
		custom = {
			prosody.shutdown_reason and st.stanza("note"):text(prosody.shutdown_reason);
		};
	});
	store:set_key(nil, "status", "stopped");
end);

if heartbeat_interval then
	local async = require "util.async";
	local heartbeat_writer = async.runner(function (timestamp)
		store:set_key(nil, "heartbeat", timestamp);
	end);

	module:add_timer(0, function ()
		heartbeat_writer:run(os.time());
		return heartbeat_interval;
	end);
end