183 lines
4.7 KiB
Lua
183 lines
4.7 KiB
Lua
--[[
|
|
tests connection reverse telnet
|
|
commande à faire tourner sur le serveur
|
|
|
|
1ere console
|
|
pour une liaison directe:
|
|
socat TCP-LISTEN:23047,fork,reuseaddr STDIO
|
|
pour une console sur un port:
|
|
socat TCP-LISTEN:23047,reuseaddr,fork TCP-LISTEN:23000,reuseaddr,bind=127.0.0.1
|
|
|
|
2e console
|
|
telnet -r localhost 23000
|
|
]]
|
|
|
|
print("\n 0_tst3_socat.lua zf200229.2243 \n")
|
|
|
|
local node, table, tmr, uwrite, tostring =
|
|
node, table, tmr, uart.write, tostring
|
|
|
|
local function telnet_listener(socket)
|
|
local insert, remove, concat, heap, gc =
|
|
table.insert, table.remove, table.concat, node.heap, collectgarbage
|
|
local fifo1, fifo1l, fifo2, fifo2l = {}, 0, {}, 0
|
|
local s -- s is a copy of the TCP socket if and only if sending is in progress
|
|
local wdclr, cnt = tmr.wdclr, 0
|
|
local function debug(fmt, ...)
|
|
if (...) then fmt = fmt:format(...) end
|
|
uwrite(0, "\r\nDBG: ",fmt,"\r\n" )
|
|
cnt = cnt + 1
|
|
if cnt % 10 then wdclr() end
|
|
end
|
|
|
|
local function flushGarbage()
|
|
if heap() < 13440 then gc() end
|
|
end
|
|
|
|
local function sendLine()
|
|
if not s then return end
|
|
|
|
if fifo2l + fifo1l == 0 then -- both FIFOs empty, so clear down s
|
|
s = nil
|
|
return
|
|
end
|
|
flushGarbage()
|
|
if #fifo2 < 4 then -- Flush FIFO1 into FIFO2
|
|
insert(fifo2,concat(fifo1))
|
|
fifo2l, fifo1, fifo1l = fifo2l + fifo1l, {}, 0
|
|
end
|
|
local rec = remove(fifo2,1) .. (remove(fifo2,1) or '') ..
|
|
(remove(fifo2,1) or '') .. (remove(fifo2,1) or '')
|
|
fifo2l = fifo2l - #rec
|
|
flushGarbage()
|
|
s:send(rec)
|
|
end
|
|
|
|
local F1_SIZE = 256
|
|
|
|
local function queueLine(str)
|
|
while #str > 0 do -- this is because str might be longer than the packet size!
|
|
local k, l = F1_SIZE - fifo1l, #str
|
|
local chunk
|
|
if #fifo1 >= 32 or (k < l and k < 16) then
|
|
insert(fifo2, concat(fifo1))
|
|
fifo2l, fifo1, fifo1l, k = fifo2l + fifo1l, {}, 0, F1_SIZE
|
|
end
|
|
if l > k+16 then -- also tolerate a size overrun of 16 bytes to avoid a split
|
|
chunk, str = str:sub(1,k), str:sub(k+1)
|
|
else
|
|
chunk, str = str, ''
|
|
end
|
|
insert(fifo1, chunk)
|
|
fifo1l = fifo1l + #chunk
|
|
end
|
|
if not s and socket then
|
|
s = socket
|
|
sendLine()
|
|
else
|
|
flushGarbage()
|
|
end
|
|
end
|
|
|
|
local function receiveLine(s, line)
|
|
node.input(line)
|
|
end
|
|
|
|
local function disconnect(s)
|
|
--fifo1, fifo1l, fifo2, fifo2l, s = {}, 0, {}, 0, nil
|
|
fifo1, fifo1l, fifo2, fifo2l, s = nil, nil, nil, nil, nil
|
|
--insert, remove, concat, heap, gc = nil, nil, nil, nil, nil
|
|
--wdclr, cnt = nil, nil
|
|
node.output(nil)
|
|
print("disconnected...")
|
|
-- print("rt_retry:",rt_retry)
|
|
-- rt_retry=rt_retry-1
|
|
-- print("rt_retry:",rt_retry)
|
|
-- if rt_retry>=0 then
|
|
print("on ressaie en vitesse une fois ;-)")
|
|
rt_connect()
|
|
-- end
|
|
end
|
|
|
|
--zzz
|
|
local function zconnection(s)
|
|
print("Welcome on ne devrait jamais passer par là to NodeMCU world.")
|
|
end
|
|
|
|
socket:on("connection", zconnection)
|
|
socket:on("receive", receiveLine)
|
|
socket:on("disconnection", disconnect)
|
|
socket:on("sent", sendLine)
|
|
node.output(queueLine, 0)
|
|
end
|
|
|
|
--net.createServer(net.TCP, 180):listen(23, telnet_listener)
|
|
print("Revers telnet server running...\n")
|
|
|
|
|
|
|
|
|
|
|
|
function rt_connect()
|
|
if verbose then
|
|
gpio.write(zLED, gpio.HIGH)
|
|
print("trying connect to "..console_host..":"..console_port)
|
|
print(node.heap()) collectgarbage() print(node.heap())
|
|
end
|
|
srv_rt = nil srv_rt = net.createConnection(net.TCP, 0)
|
|
srv_rt:on("connection", function(sck)
|
|
if verbose then
|
|
print("connected on "..console_host..":"..console_port)
|
|
print(node.heap()) collectgarbage() print(node.heap())
|
|
end
|
|
telnet_listener(sck)
|
|
print("Welcome to NodeMCU world.")
|
|
end)
|
|
srv_rt:connect(console_port,console_host)
|
|
end
|
|
|
|
tmr_socat1=tmr.create()
|
|
tmr_socat1:alarm(5*1000, tmr.ALARM_AUTO , function()
|
|
rt_retry=1
|
|
if verbose then gpio.write(zLED, gpio.LOW) tmr.delay(10000) gpio.write(zLED, gpio.HIGH) end
|
|
|
|
if srv_rt~=nil then
|
|
if console_port == srv_rt:getpeer() then
|
|
--cela tourne...
|
|
if verbose then gpio.write(zLED, gpio.LOW) end
|
|
else
|
|
--on relance...
|
|
rt_connect()
|
|
end
|
|
else
|
|
--on relance...
|
|
rt_connect()
|
|
end
|
|
end)
|
|
|
|
rt_retry=3
|
|
rt_connect()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--[[
|
|
tmr_socat1:unregister()
|
|
for k,v in pairs(_G) do print(k,v) end
|
|
|
|
print(srv_rt:getpeer())
|
|
|
|
srv_rt:connect(console_port,console_host)
|
|
|
|
gpio.write(zLED, gpio.LOW) tmr.delay(10000) gpio.write(zLED, gpio.HIGH)
|
|
if console_port == srv_rt:getpeer() then
|
|
gpio.write(zLED, gpio.LOW)
|
|
else
|
|
gpio.write(zLED, gpio.HIGH)
|
|
end
|
|
|
|
|
|
]]
|