File

mod_graceful_shutdown/mod_graceful_shutdown.lua @ 4445:e13eb0f851c8

mod_smacks: Explicitly request ack when leaving CSI-inactive mode There may be a lot of unacked stanzas in the queue, might as well...
author Kim Alvefur <zash@zash.se>
date Tue, 16 Feb 2021 22:49:44 +0100
parent 2170:4652a112a4ba
child 4892:8dbaa5e753f3
line wrap: on
line source

-- luacheck: ignore 122/prosody 113/prosody

local timer = require "util.timer";
local portman = require "core.portmanager";
local server = require "net.server";

module:set_global();
local orig_shutdown = prosody.shutdown;

local pause = module:get_option_number("shutdown_pause", 1);

function module.unload()
	prosody.shutdown = orig_shutdown;
end

prosody.shutdown = coroutine.wrap(function (reason, code)
	prosody.shutdown_reason = reason;
	prosody.shutdown_code = code;
	timer.add_task(pause, prosody.shutdown);
	coroutine.yield(true, "shutdown initiated");
	-- Close c2s ports, stop accepting new connections
	portman.deactivate("c2s");
	-- Close all c2s sessions
	for _, sess in pairs(prosody.full_sessions) do
		sess:close{ condition = "system-shutdown", text = reason }
	end
	-- Wait for notifications to be sent
	coroutine.yield(pause);
	-- Event for everything else to shut down
	prosody.events.fire_event("server-stopping", {
		reason = reason;
		code = code;
	});
	-- And wait
	coroutine.yield(pause);
	-- And stop main event loop
	server.setquitting(true);
	-- And wait for death
	coroutine.yield(pause * 3);
	-- you came back? die zombie!
	os.exit(1);
end);