Software / code / prosody
Annotate
util/adminstream.lua @ 13839:8b1299eccce6
Merge 13.0->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 10 Apr 2025 00:23:22 +0200 |
| parent | 13794:471b676e64eb |
| rev | line source |
|---|---|
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
1 local st = require "prosody.util.stanza"; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
2 local new_xmpp_stream = require "prosody.util.xmppstream".new; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
3 local sessionlib = require "prosody.util.session"; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
4 local gettime = require "prosody.util.time".now; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
5 local runner = require "prosody.util.async".runner; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
6 local add_task = require "prosody.util.timer".add_task; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
7 local events = require "prosody.util.events"; |
|
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
8 local server = require "prosody.net.server"; |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local stream_close_timeout = 5; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12852
diff
changeset
|
12 local log = require "prosody.util.logger".init("adminstream"); |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams"; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local stream_callbacks = { default_ns = "xmpp:prosody.im/admin" }; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 function stream_callbacks.streamopened(session, attr) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 -- run _streamopened in async context |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 session.thread:run({ stream = "opened", attr = attr }); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 function stream_callbacks._streamopened(session, attr) --luacheck: ignore 212/attr |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 if session.type ~= "client" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 session:open_stream(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 session.notopen = nil; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 function stream_callbacks.streamclosed(session, attr) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 -- run _streamclosed in async context |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 session.thread:run({ stream = "closed", attr = attr }); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 function stream_callbacks._streamclosed(session) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 session.log("debug", "Received </stream:stream>"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 session:close(false); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 function stream_callbacks.error(session, error, data) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 if error == "no-stream" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 session.log("debug", "Invalid opening stream header (%s)", (data:gsub("^([^\1]+)\1", "{%1}"))); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 session:close("invalid-namespace"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 elseif error == "parse-error" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 session.log("debug", "Client XML parse error: %s", data); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 session:close("not-well-formed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 elseif error == "stream-error" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 local condition, text = "undefined-condition"; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 for child in data:childtags(nil, xmlns_xmpp_streams) do |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 if child.name ~= "text" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 condition = child.name; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 else |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 text = child:get_text(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 if condition ~= "undefined-condition" and text then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 break; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 text = condition .. (text and (" ("..text..")") or ""); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 session.log("info", "Session closed by remote with error: %s", text); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 session:close(nil, text); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 function stream_callbacks.handlestanza(session, stanza) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 session.thread:run(stanza); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 local runner_callbacks = {}; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 function runner_callbacks:error(err) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 self.data.log("error", "Traceback[c2s]: %s", err); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 local stream_xmlns_attr = {xmlns='urn:ietf:params:xml:ns:xmpp-streams'}; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 local function destroy_session(session, reason) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 if session.destroyed then return; end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 session.destroyed = true; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 session.log("debug", "Destroying session: %s", reason or "unknown reason"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 local function session_close(session, reason) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 local log = session.log or log; |
|
13794
471b676e64eb
util.adminstream: Fix traceback on double-close (fixes #1913)
Matthew Wild <mwild1@gmail.com>
parents:
13589
diff
changeset
|
85 local conn = session.conn; |
|
471b676e64eb
util.adminstream: Fix traceback on double-close (fixes #1913)
Matthew Wild <mwild1@gmail.com>
parents:
13589
diff
changeset
|
86 if conn then |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 if session.notopen then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 session:open_stream(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 if reason then -- nil == no err, initiated by us, false == initiated by client |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 local stream_error = st.stanza("stream:error"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 if type(reason) == "string" then -- assume stream error |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 stream_error:tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' }); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 elseif type(reason) == "table" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 if reason.condition then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 stream_error:tag(reason.condition, stream_xmlns_attr):up(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 if reason.text then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 stream_error:tag("text", stream_xmlns_attr):text(reason.text):up(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 if reason.extra then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 stream_error:add_child(reason.extra); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 elseif reason.name then -- a stanza |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 stream_error = reason; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 stream_error = tostring(stream_error); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 log("debug", "Disconnecting client, <stream:error> is: %s", stream_error); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 session.send(stream_error); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 session.send("</stream:stream>"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 function session.send() return false; end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 local reason_text = (reason and (reason.name or reason.text or reason.condition)) or reason; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 session.log("debug", "c2s stream for %s closed: %s", session.full_jid or session.ip or "<unknown>", reason_text or "session closed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 -- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 if reason_text == nil and not session.notopen and session.type == "c2s" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 -- Grace time to process data from authenticated cleanly-closed stream |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 add_task(stream_close_timeout, function () |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 if not session.destroyed then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 session.log("warn", "Failed to receive a stream close response, closing connection anyway..."); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 destroy_session(session); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 conn:close(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 end); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 else |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 destroy_session(session, reason_text); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 conn:close(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 else |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 local reason_text = (reason and (reason.name or reason.text or reason.condition)) or reason; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 destroy_session(session, reason_text); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 --- Public methods |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 |
|
10875
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
140 local function new_connection(socket_path, listeners) |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
141 local have_unix, unix = pcall(require, "socket.unix"); |
|
12392
5373724e08a5
mod_admin_socket: Compat for luasocket prior to unix datagram support
Kim Alvefur <zash@zash.se>
parents:
12094
diff
changeset
|
142 if have_unix and type(unix) == "function" then |
|
12393
6966026262f4
mod_admin_socket: Comment on LuaSocket UNIX compat code
Kim Alvefur <zash@zash.se>
parents:
12392
diff
changeset
|
143 -- COMPAT #1717 |
|
6966026262f4
mod_admin_socket: Comment on LuaSocket UNIX compat code
Kim Alvefur <zash@zash.se>
parents:
12392
diff
changeset
|
144 -- Before the introduction of datagram support, only the stream socket |
|
6966026262f4
mod_admin_socket: Comment on LuaSocket UNIX compat code
Kim Alvefur <zash@zash.se>
parents:
12392
diff
changeset
|
145 -- constructor was exported instead of a module table. Due to the lack of a |
|
6966026262f4
mod_admin_socket: Comment on LuaSocket UNIX compat code
Kim Alvefur <zash@zash.se>
parents:
12392
diff
changeset
|
146 -- proper release of LuaSocket, distros have settled on shipping either the |
|
6966026262f4
mod_admin_socket: Comment on LuaSocket UNIX compat code
Kim Alvefur <zash@zash.se>
parents:
12392
diff
changeset
|
147 -- last RC tag or some commit since then. |
|
12852
c35afa353f8f
mod_admin_socket: Fix typo in comments
Kim Alvefur <zash@zash.se>
parents:
12393
diff
changeset
|
148 -- Here we accommodate both variants. |
|
12392
5373724e08a5
mod_admin_socket: Compat for luasocket prior to unix datagram support
Kim Alvefur <zash@zash.se>
parents:
12094
diff
changeset
|
149 unix = { stream = unix }; |
|
5373724e08a5
mod_admin_socket: Compat for luasocket prior to unix datagram support
Kim Alvefur <zash@zash.se>
parents:
12094
diff
changeset
|
150 end |
|
10875
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
151 if type(unix) ~= "table" then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
152 have_unix = false; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
153 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
154 local conn, sock; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
155 |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
156 return { |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
157 connect = function () |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
158 if not have_unix then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
159 return nil, "no unix socket support"; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
160 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
161 if sock or conn then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
162 return nil, "already connected"; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
163 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
164 sock = unix.stream(); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
165 sock:settimeout(0); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
166 local ok, err = sock:connect(socket_path); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
167 if not ok then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
168 return nil, err; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
169 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
170 conn = server.wrapclient(sock, nil, nil, listeners, "*a"); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
171 return true; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
172 end; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
173 disconnect = function () |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
174 if conn then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
175 conn:close(); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
176 conn = nil; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
177 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
178 if sock then |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
179 sock:close(); |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
180 sock = nil; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
181 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
182 return true; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
183 end; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
184 }; |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
185 end |
|
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
186 |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 local function new_server(sessions, stanza_handler) |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
188 local s = { |
|
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
189 events = events.new(); |
|
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
190 listeners = {}; |
|
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
191 }; |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
193 function s.listeners.onconnect(conn) |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 log("debug", "New connection"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 local session = sessionlib.new("admin"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 sessionlib.set_id(session); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 sessionlib.set_logger(session); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 sessionlib.set_conn(session, conn); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 session.conntime = gettime(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 session.type = "admin"; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 local stream = new_xmpp_stream(session, stream_callbacks); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 session.stream = stream; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 session.notopen = true; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 session.thread = runner(function (stanza) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 if st.is_stanza(stanza) then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 stanza_handler(session, stanza); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 elseif stanza.stream == "opened" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 stream_callbacks._streamopened(session, stanza.attr); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 elseif stanza.stream == "closed" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 stream_callbacks._streamclosed(session, stanza.attr); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 end, runner_callbacks, session); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 function session.data(data) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 -- Parse the data, which will store stanzas in session.pending_stanzas |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 if data then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 local ok, err = stream:feed(data); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
221 if not ok then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
222 session.log("debug", "Received invalid XML (%s) %d bytes: %q", err, #data, data:sub(1, 300)); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
223 session:close("not-well-formed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
224 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
225 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 session.close = session_close; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
229 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
230 session.send = function (t) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
231 session.log("debug", "Sending[%s]: %s", session.type, t.top_tag and t:top_tag() or t:match("^[^>]*>?")); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
232 return session.rawsend(tostring(t)); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
233 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
234 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
235 function session.rawsend(t) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
236 local ret, err = conn:write(t); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
237 if not ret then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
238 session.log("debug", "Error writing to connection: %s", err); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
239 return false, err; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
240 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
241 return true; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
242 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
243 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
244 sessions[conn] = session; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
245 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
246 |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
247 function s.listeners.onincoming(conn, data) |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
248 local session = sessions[conn]; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
249 if session then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
250 session.data(data); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
251 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
252 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
253 |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
254 function s.listeners.ondisconnect(conn, err) |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
255 local session = sessions[conn]; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
256 if session then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
257 session.log("info", "Admin client disconnected: %s", err or "connection closed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
258 session.conn = nil; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
259 sessions[conn] = nil; |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
260 s.events.fire_event("disconnected", { session = session }); |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
261 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
262 end |
|
10900
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
263 |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
264 function s.listeners.onreadtimeout(conn) |
|
10940
18e4e446a76c
util.adminstream: Prevent closure on read timeout
Kim Alvefur <zash@zash.se>
parents:
10900
diff
changeset
|
265 return conn:send(" "); |
|
10900
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
266 end |
|
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
267 |
|
13589
b1b931d5fee8
util.adminstream: Expose session events (specifically "disconnected")
Matthew Wild <mwild1@gmail.com>
parents:
12975
diff
changeset
|
268 return s; |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
269 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
270 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
271 local function new_client() |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
272 local client = { |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
273 type = "client"; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
274 events = events.new(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
275 log = log; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
276 }; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
277 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
278 local listeners = {}; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
279 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
280 function listeners.onconnect(conn) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
281 log("debug", "Connected"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
282 client.conn = conn; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
283 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
284 local stream = new_xmpp_stream(client, stream_callbacks); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
285 client.stream = stream; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
286 client.notopen = true; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
287 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
288 client.thread = runner(function (stanza) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
289 if st.is_stanza(stanza) then |
|
10892
b9ff7178787c
util.adminstream: Fire event based on stanza name too for convenience
Matthew Wild <mwild1@gmail.com>
parents:
10876
diff
changeset
|
290 if not client.events.fire_event("received", stanza) and not stanza.attr.xmlns then |
|
b9ff7178787c
util.adminstream: Fire event based on stanza name too for convenience
Matthew Wild <mwild1@gmail.com>
parents:
10876
diff
changeset
|
291 client.events.fire_event("received/"..stanza.name, stanza); |
|
b9ff7178787c
util.adminstream: Fire event based on stanza name too for convenience
Matthew Wild <mwild1@gmail.com>
parents:
10876
diff
changeset
|
292 end |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
293 elseif stanza.stream == "opened" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
294 stream_callbacks._streamopened(client, stanza.attr); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
295 client.events.fire_event("connected"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
296 elseif stanza.stream == "closed" then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
297 client.events.fire_event("disconnected"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
298 stream_callbacks._streamclosed(client, stanza.attr); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
299 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
300 end, runner_callbacks, client); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
301 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
302 client.close = session_close; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
303 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
304 function client.send(t) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
305 client.log("debug", "Sending: %s", t.top_tag and t:top_tag() or t:match("^[^>]*>?")); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
306 return client.rawsend(tostring(t)); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
307 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
308 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
309 function client.rawsend(t) |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
310 local ret, err = conn:write(t); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
311 if not ret then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
312 client.log("debug", "Error writing to connection: %s", err); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
313 return false, err; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
314 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
315 return true; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
316 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
317 client.log("debug", "Opening stream..."); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
318 client:open_stream(); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
319 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
320 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
321 function listeners.onincoming(conn, data) --luacheck: ignore 212/conn |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
322 local ok, err = client.stream:feed(data); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
323 if not ok then |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
324 client.log("debug", "Received invalid XML (%s) %d bytes: %q", err, #data, data:sub(1, 300)); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
325 client:close("not-well-formed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
326 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
327 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
328 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
329 function listeners.ondisconnect(conn, err) --luacheck: ignore 212/conn |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
330 client.log("info", "Admin client disconnected: %s", err or "connection closed"); |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
331 client.conn = nil; |
|
12094
84fd6a79cda7
adminstream: fire disconnected event on lower layer disconnect
Jonas Schäfer <jonas@wielicki.name>
parents:
10940
diff
changeset
|
332 client.events.fire_event("disconnected"); |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
333 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
334 |
|
10900
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
335 function listeners.onreadtimeout(conn) |
|
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
336 conn:send(" "); |
|
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
337 end |
|
9e6d979dd603
util.adminstream: Set a read timeout handler
Kim Alvefur <zash@zash.se>
parents:
10892
diff
changeset
|
338 |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
339 client.listeners = listeners; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
340 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
341 return client; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
342 end |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
343 |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
344 return { |
|
10875
09674bbb833f
util.prosodyctl.shell, util.adminstream: Move connection logic into adminstream for easier reuse
Matthew Wild <mwild1@gmail.com>
parents:
10855
diff
changeset
|
345 connection = new_connection; |
|
10855
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
346 server = new_server; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
347 client = new_client; |
|
70ac7d23673d
mod_admin_socket, util.adminstream: New module to manage a local unix domain socket for admin functionality
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
348 }; |