From f1f0c276bc41aa4290f06a7b308671d88ee54050 Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Fri, 28 Dec 2018 20:59:10 +0100
Subject: mod_admin_telnet: Make xmpp:ping command wait and report the reply

---
 plugins/mod_admin_telnet.lua | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/plugins/mod_admin_telnet.lua b/plugins/mod_admin_telnet.lua
index bb97a09b..ee6a4176 100644
--- a/plugins/mod_admin_telnet.lua
+++ b/plugins/mod_admin_telnet.lua
@@ -1086,13 +1086,28 @@ end
 def_env.xmpp = {};
 
 local st = require "util.stanza";
-function def_env.xmpp:ping(localhost, remotehost)
+local new_id = require "util.id".medium;
+function def_env.xmpp:ping(localhost, remotehost, timeout)
 	if not prosody.hosts[localhost] then
 		return nil, "No such host";
 	end
-	module:send(st.iq{ from=localhost, to=remotehost, type="get", id="ping" }
-			:tag("ping", {xmlns="urn:xmpp:ping"}), prosody.hosts[localhost]);
-	return true, "Sent ping";
+	local iq = st.iq{ from=localhost, to=remotehost, type="get", id=new_id()}
+			:tag("ping", {xmlns="urn:xmpp:ping"});
+	local ret, err;
+	local wait, done = async.waiter();
+	module:context(localhost):send_iq(iq, nil, timeout)
+		:next(function (ret_) ret = ret_; end,
+			function (err_) err = err_; end)
+		:finally(done);
+	wait();
+	if ret then
+		return true, "pong from " .. ret.stanza.attr.from;
+	elseif type(err) == "table" and st.is_stanza(err.stanza) then
+		local t, cond, text = err.stanza:get_error();
+		return false, text or cond or t;
+	else
+		return false, tostring(err);
+	end
 end
 
 def_env.dns = {};
-- 
cgit v1.2.3