Mercurial > prosody-hg
annotate plugins/mod_admin_telnet.lua @ 13652:a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Comment from Matthew:
This fixes a potential issue where the Prosody process gets blocked on sockets
waiting for them to close. Unlike non-TLS sockets, closing a TLS socket sends
layer 7 data, and this can cause problems for sockets which are in the process
of being cleaned up.
This depends on LuaSec changes which are not yet upstream.
From Martijn's original email:
So first my analysis of luasec. in ssl.c the socket is put into blocking
mode right before calling SSL_shutdown() inside meth_destroy(). My best
guess to why this is is because meth_destroy is linked to the __close
and __gc methods, which can't exactly be called multiple times and
luasec does want to make sure that a tls session is shutdown as clean
as possible.
I can't say I disagree with this reasoning and don't want to change this
behaviour. My solution to this without changing the current behaviour is
to introduce a shutdown() method. I am aware that this overlaps in a
conflicting way with tcp's shutdown method, but it stays close to the
OpenSSL name. This method calls SSL_shutdown() in the current
(non)blocking mode of the underlying socket and returns a boolean
whether or not the shutdown is completed (matching SSL_shutdown()'s 0
or 1 return values), and returns the familiar ssl_ioerror() strings on
error with a false for completion. This error can then be used to
determine if we have wantread/wantwrite to finalize things. Once
meth_shutdown() has been called once a shutdown flag will be set, which
indicates to meth_destroy() that the SSL_shutdown() has been handled
by the application and it shouldn't be needed to set the socket to
blocking mode. I've left the SSL_shutdown() call in the
LSEC_STATE_CONNECTED to prevent TOCTOU if the application reaches a
timeout for the shutdown code, which might allow SSL_shutdown() to
clean up anyway at the last possible moment.
Another thing I've changed to luasec is the call to socket_setblocking()
right before calling close(2) in socket_destroy() in usocket.c.
According to the latest POSIX[0]:
Note that the requirement for close() on a socket to block for up to
the current linger interval is not conditional on the O_NONBLOCK
setting.
Which I read to mean that removing O_NONBLOCK on the socket before close
doesn't impact the behaviour and only causes noise in system call
tracers. I didn't touch the windows bits of this, since I don't do
windows.
For the prosody side of things I've made the TLS shutdown bits resemble
interface:onwritable(), and put it under a combined guard of self._tls
and self.conn.shutdown. The self._tls bit is there to prevent getting
stuck on this condition, and self.conn.shutdown is there to prevent the
code being called by instances where the patched luasec isn't deployed.
The destroy() method can be called from various places and is read by
me as the "we give up" error path. To accommodate for these unexpected
entrypoints I've added a single call to self.conn:shutdown() to prevent
the socket being put into blocking mode. I have no expectations that
there is any other use here. Same as previous, the self.conn.shutdown
check is there to make sure it's not called on unpatched luasec
deployments and self._tls is there to make sure we don't call shutdown()
on tcp sockets.
I wouldn't recommend logging of the conn:shutdown() error inside
close(), since a lot of clients simply close the connection before
SSL_shutdown() is done.
| author | Martijn van Duren <martijn@openbsd.org> |
|---|---|
| date | Thu, 06 Feb 2025 15:04:38 +0000 |
| parents | 74b9e05af71e |
| children |
| rev | line source |
|---|---|
|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1506
diff
changeset
|
1 -- Prosody IM |
|
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2870
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
|
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2870
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5770
diff
changeset
|
4 -- |
| 758 | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
7 -- |
|
9404
f40b0cd41a87
mod_admin_telnet: Remove or rename various unused arguments and variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
9403
diff
changeset
|
8 -- luacheck: ignore 212/self |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
461
diff
changeset
|
9 |
|
4623
403b56b78018
mod_posix, mod_bosh, mod_admin_telnet: Use module:set_global()
Kim Alvefur <zash@zash.se>
parents:
4582
diff
changeset
|
10 module:set_global(); |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
11 module:depends("admin_shell"); |
| 736 | 12 |
|
4989
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
13 local console_listener = { default_port = 5582; default_mode = "*a"; interface = "127.0.0.1" }; |
| 736 | 14 |
|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
10859
diff
changeset
|
15 local async = require "prosody.util.async"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
10859
diff
changeset
|
16 local st = require "prosody.util.stanza"; |
|
1315
bfcd3f0a49df
mod_console: Much improved module load/unload/reload commands
Matthew Wild <mwild1@gmail.com>
parents:
1241
diff
changeset
|
17 |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
18 local def_env = module:shared("admin_shell/env"); |
| 736 | 19 local default_env_mt = { __index = def_env }; |
| 20 | |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
21 local function printbanner(session) |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
22 local option = module:get_option_string("console_banner", "full"); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
23 if option == "full" or option == "graphic" then |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
24 session.print [[ |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
25 ____ \ / _ |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
26 | _ \ _ __ ___ ___ _-_ __| |_ _ |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
27 | |_) | '__/ _ \/ __|/ _ \ / _` | | | | |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
28 | __/| | | (_) \__ \ |_| | (_| | |_| | |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
29 |_| |_| \___/|___/\___/ \__,_|\__, | |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
30 A study in simplicity |___/ |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
31 |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
32 ]] |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
33 end |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
34 if option == "short" or option == "full" then |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
35 session.print("Welcome to the Prosody administration console. For a list of commands, type: help"); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
36 session.print("You may find more help on using this console in our online documentation at "); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
37 session.print("https://prosody.im/doc/console\n"); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
38 end |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
39 if option ~= "short" and option ~= "full" and option ~= "graphic" then |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
40 session.print(option); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
41 end |
|
1342
947d94e3619f
mod_console: Redirect print() to console session when executing commands in global environment
Matthew Wild <mwild1@gmail.com>
parents:
1341
diff
changeset
|
42 end |
|
947d94e3619f
mod_console: Redirect print() to console session when executing commands in global environment
Matthew Wild <mwild1@gmail.com>
parents:
1341
diff
changeset
|
43 |
| 736 | 44 console = {}; |
| 45 | |
|
9735
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
46 local runner_callbacks = {}; |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
47 |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
48 function runner_callbacks:ready() |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
49 self.data.conn:resume(); |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
50 end |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
51 |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
52 function runner_callbacks:waiting() |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
53 self.data.conn:pause(); |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
54 end |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
55 |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
56 function runner_callbacks:error(err) |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
57 module:log("error", "Traceback[telnet]: %s", err); |
|
10068
73a8192058f9
mod_admin_telnet: Move error handling to thread callback (fixes #1391)
Kim Alvefur <zash@zash.se>
parents:
10067
diff
changeset
|
58 |
|
73a8192058f9
mod_admin_telnet: Move error handling to thread callback (fixes #1391)
Kim Alvefur <zash@zash.se>
parents:
10067
diff
changeset
|
59 self.data.print("Fatal error while running command, it did not complete"); |
|
73a8192058f9
mod_admin_telnet: Move error handling to thread callback (fixes #1391)
Kim Alvefur <zash@zash.se>
parents:
10067
diff
changeset
|
60 self.data.print("Error: "..tostring(err)); |
|
9735
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
61 end |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
62 |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
63 |
| 736 | 64 function console:new_session(conn) |
|
2145
daeb6ebf304c
mod_console: Update for new net.server API
Matthew Wild <mwild1@gmail.com>
parents:
2087
diff
changeset
|
65 local w = function(s) conn:write(s:gsub("\n", "\r\n")); end; |
| 736 | 66 local session = { conn = conn; |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
67 send = function (t) |
|
10859
8de0057b4279
mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents:
10857
diff
changeset
|
68 if st.is_stanza(t) and (t.name == "repl-result" or t.name == "repl-output") then |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
69 t = "| "..t:get_text().."\n"; |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
70 end |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
71 w(tostring(t)); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
72 end; |
|
3404
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
73 print = function (...) |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
74 local t = {}; |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
75 for i=1,select("#", ...) do |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
76 t[i] = tostring(select(i, ...)); |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
77 end |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
78 w("| "..table.concat(t, "\t").."\n"); |
|
33c81ee280e3
mod_console: Added support for multiple arguments to print().
Waqas Hussain <waqas20@gmail.com>
parents:
3044
diff
changeset
|
79 end; |
|
10796
89d810a23ee0
mod_admin_telnet: Reuse existing pretty printing setup
Kim Alvefur <zash@zash.se>
parents:
10795
diff
changeset
|
80 serialize = tostring; |
|
2253
a3537266a916
mod_console: Update for new server API, fixes traceback when closing console sessions
Matthew Wild <mwild1@gmail.com>
parents:
2145
diff
changeset
|
81 disconnect = function () conn:close(); end; |
| 736 | 82 }; |
| 83 session.env = setmetatable({}, default_env_mt); | |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5770
diff
changeset
|
84 |
|
9735
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
85 session.thread = async.runner(function (line) |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
86 console:process_line(session, line); |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
87 session.send(string.char(0)); |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
88 end, runner_callbacks, session); |
|
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
89 |
| 736 | 90 -- Load up environment with helper objects |
| 91 for name, t in pairs(def_env) do | |
| 92 if type(t) == "table" then | |
| 93 session.env[name] = setmetatable({ session = session }, { __index = t }); | |
| 94 end | |
| 95 end | |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5770
diff
changeset
|
96 |
|
10796
89d810a23ee0
mod_admin_telnet: Reuse existing pretty printing setup
Kim Alvefur <zash@zash.se>
parents:
10795
diff
changeset
|
97 session.env.output:configure(); |
|
89d810a23ee0
mod_admin_telnet: Reuse existing pretty printing setup
Kim Alvefur <zash@zash.se>
parents:
10795
diff
changeset
|
98 |
| 736 | 99 return session; |
| 100 end | |
| 101 | |
|
5186
ad898e50b8f3
mod_admin_telnet: Refactor so that command processing is performed in a separate function (usable from other modules)
Matthew Wild <mwild1@gmail.com>
parents:
5168
diff
changeset
|
102 function console:process_line(session, line) |
|
10857
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
103 line = line:gsub("\r?\n$", ""); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
104 if line == "bye" or line == "quit" or line == "exit" or line:byte() == 4 then |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
105 session.print("See you!"); |
|
826023c3322b
mod_admin_telnet: Become a front for mod_admin_shell
Matthew Wild <mwild1@gmail.com>
parents:
10845
diff
changeset
|
106 session:disconnect(); |
|
10067
598befab492e
mod_admin_telnet: Check for simple commands before executing in sandbox
Kim Alvefur <zash@zash.se>
parents:
10044
diff
changeset
|
107 return; |
|
598befab492e
mod_admin_telnet: Check for simple commands before executing in sandbox
Kim Alvefur <zash@zash.se>
parents:
10044
diff
changeset
|
108 end |
|
10859
8de0057b4279
mod_admin_shell, mod_admin_telnet, util.prosodyctl.shell: Separate output from final result
Matthew Wild <mwild1@gmail.com>
parents:
10857
diff
changeset
|
109 return module:fire_event("admin/repl-input", { origin = session, stanza = st.stanza("repl-input"):text(line) }); |
|
5186
ad898e50b8f3
mod_admin_telnet: Refactor so that command processing is performed in a separate function (usable from other modules)
Matthew Wild <mwild1@gmail.com>
parents:
5168
diff
changeset
|
110 end |
|
ad898e50b8f3
mod_admin_telnet: Refactor so that command processing is performed in a separate function (usable from other modules)
Matthew Wild <mwild1@gmail.com>
parents:
5168
diff
changeset
|
111 |
| 736 | 112 local sessions = {}; |
| 113 | |
|
10845
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
114 function module.save() |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
115 return { sessions = sessions } |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
116 end |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
117 |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
118 function module.restore(data) |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
119 if data.sessions then |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
120 for conn in pairs(data.sessions) do |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
121 conn:setlistener(console_listener); |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
122 local session = console:new_session(conn); |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
123 sessions[conn] = session; |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
124 end |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
125 end |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
126 end |
|
785fa0112411
mod_admin_telnet: Update existing sessions on reload
Kim Alvefur <zash@zash.se>
parents:
10798
diff
changeset
|
127 |
|
3009
06f7d8054065
mod_console: Make use of the new onconnect callback to initialise session and send banner
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
128 function console_listener.onconnect(conn) |
|
06f7d8054065
mod_console: Make use of the new onconnect callback to initialise session and send banner
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
129 -- Handle new connection |
|
06f7d8054065
mod_console: Make use of the new onconnect callback to initialise session and send banner
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
130 local session = console:new_session(conn); |
|
06f7d8054065
mod_console: Make use of the new onconnect callback to initialise session and send banner
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
131 sessions[conn] = session; |
|
06f7d8054065
mod_console: Make use of the new onconnect callback to initialise session and send banner
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
132 printbanner(session); |
|
669
9255abbb3068
mod_console: replace all \n with \r\n in the output, and send \0 as a marker character after every response
Waqas Hussain <waqas20@gmail.com>
parents:
615
diff
changeset
|
133 session.send(string.char(0)); |
| 736 | 134 end |
| 135 | |
|
2145
daeb6ebf304c
mod_console: Update for new net.server API
Matthew Wild <mwild1@gmail.com>
parents:
2087
diff
changeset
|
136 function console_listener.onincoming(conn, data) |
| 736 | 137 local session = sessions[conn]; |
|
1317
f6e56a555c37
mod_console: Allow running code in the global environment by prefixing with '>'
Matthew Wild <mwild1@gmail.com>
parents:
1316
diff
changeset
|
138 |
|
4989
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
139 local partial = session.partial_data; |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
140 if partial then |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
141 data = partial..data; |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
142 end |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
143 |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
144 for line in data:gmatch("[^\n]*[\n\004]") do |
|
5278
f79be67e5666
mod_admin_telnet: Stop processing lines when session is closed
Kim Alvefur <zash@zash.se>
parents:
5270
diff
changeset
|
145 if session.closed then return end |
|
9735
2d8ca54ecbc6
mod_admin_telnet: Enable async processing using util.async
Kim Alvefur <zash@zash.se>
parents:
9734
diff
changeset
|
146 session.thread:run(line); |
|
4989
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
147 end |
|
573123ff2ab0
mod_admin_telnet: Always handle commands terminated by line feeds - ensures consistency even when packets are joined or split on the network
Matthew Wild <mwild1@gmail.com>
parents:
4979
diff
changeset
|
148 session.partial_data = data:match("[^\n]+$"); |
| 736 | 149 end |
| 150 | |
|
6169
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
151 function console_listener.onreadtimeout(conn) |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
152 local session = sessions[conn]; |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
153 if session then |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
154 session.send("\0"); |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
155 return true; |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
156 end |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
157 end |
|
cb15eac75b50
mod_admin_telnet: Send NUL byte as keepalive on read timeouts
Kim Alvefur <zash@zash.se>
parents:
6067
diff
changeset
|
158 |
|
9404
f40b0cd41a87
mod_admin_telnet: Remove or rename various unused arguments and variables [luacheck]
Kim Alvefur <zash@zash.se>
parents:
9403
diff
changeset
|
159 function console_listener.ondisconnect(conn, err) -- luacheck: ignore 212/err |
|
2054
a43aea9b0bd1
mod_console: Added proper cleanup for disconnected console sessions.
Waqas Hussain <waqas20@gmail.com>
parents:
2010
diff
changeset
|
160 local session = sessions[conn]; |
|
a43aea9b0bd1
mod_console: Added proper cleanup for disconnected console sessions.
Waqas Hussain <waqas20@gmail.com>
parents:
2010
diff
changeset
|
161 if session then |
|
a43aea9b0bd1
mod_console: Added proper cleanup for disconnected console sessions.
Waqas Hussain <waqas20@gmail.com>
parents:
2010
diff
changeset
|
162 session.disconnect(); |
|
a43aea9b0bd1
mod_console: Added proper cleanup for disconnected console sessions.
Waqas Hussain <waqas20@gmail.com>
parents:
2010
diff
changeset
|
163 sessions[conn] = nil; |
|
a43aea9b0bd1
mod_console: Added proper cleanup for disconnected console sessions.
Waqas Hussain <waqas20@gmail.com>
parents:
2010
diff
changeset
|
164 end |
| 736 | 165 end |
| 166 | |
|
6380
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6311
diff
changeset
|
167 function console_listener.ondetach(conn) |
|
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6311
diff
changeset
|
168 sessions[conn] = nil; |
|
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6311
diff
changeset
|
169 end |
|
4220ffb87b22
net.http, net.http.server, mod_c2s, mod_s2s, mod_component, mod_admin_telnet, mod_net_multiplex: Add ondetach to release connection from 'sessions' table (or equivalent)
Matthew Wild <mwild1@gmail.com>
parents:
6311
diff
changeset
|
170 |
|
5120
bcabea740c00
mod_{admin_telnet,c2s,component,http,net_multiplex,s2s}: Use module:provides() instead of module:add_item().
Waqas Hussain <waqas20@gmail.com>
parents:
5030
diff
changeset
|
171 module:provides("net", { |
|
4674
f44726a910a0
mod_admin_telnet: Add initial port:list() and port:close() commands
Matthew Wild <mwild1@gmail.com>
parents:
4647
diff
changeset
|
172 name = "console"; |
|
4550
1c41e4a846a2
mod_admin_telnet: Port to portmanager
Matthew Wild <mwild1@gmail.com>
parents:
4540
diff
changeset
|
173 listener = console_listener; |
|
1c41e4a846a2
mod_admin_telnet: Port to portmanager
Matthew Wild <mwild1@gmail.com>
parents:
4540
diff
changeset
|
174 default_port = 5582; |
|
4571
32d532b95dc7
mod_admin_telnet: make service private.
Marco Cirillo <maranda@lightwitch.org>
parents:
4550
diff
changeset
|
175 private = true; |
|
4550
1c41e4a846a2
mod_admin_telnet: Port to portmanager
Matthew Wild <mwild1@gmail.com>
parents:
4540
diff
changeset
|
176 }); |
