mod_query_client_ver/mod_query_client_ver.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 2997 1f8220f0c8bf
permissions -rw-r--r--
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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1588
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Query and log client software
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local st = require"util.stanza";
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local uuid = require"util.uuid".generate;
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local xmlns_iq_version = "jabber:iq:version";
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local version_id = uuid();
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local xmlns_disco_info = "http://jabber.org/protocol/disco#info";
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local disco_id = uuid();
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
module:hook("presence/bare", function(event)
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
	local origin, stanza = event.origin, event.stanza;
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	if origin.type == "c2s" and not origin.presence and not stanza.attr.to then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		module:add_timer(1, function()
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
			if origin.type ~= "c2s" then return end
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
			origin.log("debug", "Sending version query");
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
			origin.send(st.iq({ id = version_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_iq_version));
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
		end);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	end
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
end, 1);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
module:hook("iq-result/host/"..version_id, function(event)
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
	local origin, stanza = event.origin, event.stanza;
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	local query = stanza:get_child("query", xmlns_iq_version);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	if query then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		local client = query:get_child_text("name");
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		if client then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
			local version = query:get_child_text("version");
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
			if version then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
				client = client .. " version " .. version;
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
			end
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
			origin.log("info", "Running %s", client);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		end
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	end
2657
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    35
	return true;
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    36
end);
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    37
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    38
module:hook("iq-error/host/"..version_id, function(event)
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    39
	local origin, stanza = event.origin, event.stanza;
1588
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	origin.send(st.iq({ id = disco_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_disco_info));
2656
20ebfa4ad7f4 mod_query_client_ver: Signal that events are handled even when no response is returned (see #876)
Kim Alvefur <zash@zash.se>
parents: 1588
diff changeset
    41
	return true;
1588
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
end);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
module:hook("iq-result/host/"..disco_id, function(event)
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
	local origin, stanza = event.origin, event.stanza;
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	local query = stanza:get_child("query", xmlns_disco_info);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
	if query then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
		local ident = query:get_child("identity");
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
		if ident and ident.attr.name then
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
			origin.log("info", "Running %s", ident.attr.name);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
		end
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	end
2656
20ebfa4ad7f4 mod_query_client_ver: Signal that events are handled even when no response is returned (see #876)
Kim Alvefur <zash@zash.se>
parents: 1588
diff changeset
    53
	return true;
1588
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
end);
b5f9f1111a8b mod_query_client_ver: Query and log client software
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
2657
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    56
module:hook("iq-error/host/"..disco_id, function()
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    57
	return true; -- Doesn't reply to disco#info? Weird, but ignore for now.
96eabf8591a6 mod_query_client_ver: Handle IQ errors (see #876)
Kim Alvefur <zash@zash.se>
parents: 2656
diff changeset
    58
end);
2994
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    59
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    60
module:add_item("adhoc",
2997
1f8220f0c8bf mod_query_client_ver: Use the module name as adhoc command node (mistakenly not changed after copying from mod_ping)
Kim Alvefur <zash@zash.se>
parents: 2996
diff changeset
    61
	module:require "adhoc".new("Query all currently connected clients", module.name,
2994
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    62
	function (self, data, state)
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    63
		for jid, session in pairs(prosody.full_sessions) do
2995
9d205ec1fa00 mod_query_client_ver: Fix check for sessions on the current host
Kim Alvefur <zash@zash.se>
parents: 2994
diff changeset
    64
			if session.host == module.host then
2994
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    65
				session.send(st.iq({ id = version_id, type = "get", from = module.host, to = session.full_jid }):query(xmlns_iq_version));
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    66
			end
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    67
		end
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    68
		return { info = "Ok, check your logs for results", status = "completed" }
2996
5fd9462117cd mod_query_client_ver: Restrict adhoc command to local admins
Kim Alvefur <zash@zash.se>
parents: 2995
diff changeset
    69
	end, "admin"));
2994
cb8d65b40fb4 mod_query_client_ver: Add a simple adhoc command that queries all currently connected clients
Kim Alvefur <zash@zash.se>
parents: 2657
diff changeset
    70