mod_debug_traceback/mod_debug_traceback.lua
author Kim Alvefur <zash@zash.se>
Mon, 16 May 2022 19:47:09 +0200
changeset 4945 e7b9bc629ecc
parent 4226 02292b892fce
child 5854 0358fcf14cd6
permissions -rw-r--r--
mod_rest: Add special handling to catch MAM results from remote hosts Makes MAM queries to remote hosts works. As the comment says, MAM results from users' local archives or local MUCs are returned via origin.send() which is provided in the event and thus already worked. Results from remote hosts go via normal stanza routing and events, which need this extra handling to catch. This pattern of iq-set, message+, iq-result is generally limited to MAM. Closest similar thing might be MUC join, but to really handle that you would need the webhook callback mechanism.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
module:set_global();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local traceback = require "util.debug".traceback;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local pposix = require "util.pposix";
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local os_date = os.date;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
local render_filename = require "util.interpolation".new("%b{}", function (s) return s; end, {
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
	yyyymmdd = function (t)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
		return os_date("%Y%m%d", t);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
	end;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	hhmmss = function (t)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
		return os_date("%H%M%S", t);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	end;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
});
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
local count = 0;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
local function get_filename(filename_template)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
	filename_template = filename_template;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
	return render_filename(filename_template, {
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
		paths = prosody.paths;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		pid = pposix.getpid();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
		count = count;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		time = os.time();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
	});
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
local default_filename_template = "{paths.data}/traceback-{pid}-{count}.log";
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
local filename_template = module:get_option_string("debug_traceback_filename", default_filename_template);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
local signal_name = module:get_option_string("debug_traceback_signal", "SIGUSR1");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
function dump_traceback()
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	module:log("info", "Received %s, writing traceback", signal_name);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	local tb = traceback();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	module:fire_event("debug_traceback/triggered", { traceback = tb });
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	local f, err = io.open(get_filename(filename_template), "a+");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	if not f then
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
		module:log("error", "Unable to write traceback: %s", err);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		return;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
	end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	f:write("-- Traceback generated at ", os.date("%b %d %H:%M:%S"), " --\n");
4221
983565f42063 mod_debug_traceback: Fix to use the cached traceback
Matthew Wild <mwild1@gmail.com>
parents: 4218
diff changeset
    43
	f:write(tb, "\n");
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	f:write("-- End of traceback --\n");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	f:close();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
	count = count + 1;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
local mod_posix = module:depends("posix");
4226
02292b892fce mod_debug_traceback: Fix global lookup warning on 0.11.x
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
    50
if rawget(mod_posix, "features") and mod_posix.features.signal_events then
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	module:hook("signal/"..signal_name, dump_traceback);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
else
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	require"util.signal".signal(signal_name, dump_traceback);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
end