From 3a922ad2f4d58155fd3f933e6a58bd1f34e99474 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Wed, 10 May 2017 06:11:25 -0400 Subject: [PATCH] networking improvements --- apps/mirrorClient.lua | 73 +++++++++++++++++++-------------------- apps/mirrorHost.lua | 10 ++++++ apps/password.lua | 12 ++++--- apps/telnet.lua | 14 ++++---- apps/trust.lua | 1 - sys/apis/socket.lua | 13 +++++++ sys/apis/terminal.lua | 9 ++--- sys/apis/util.lua | 8 +++++ sys/extensions/os.lua | 4 +-- sys/services/transort.lua | 10 ++++++ 10 files changed, 97 insertions(+), 57 deletions(-) diff --git a/apps/mirrorClient.lua b/apps/mirrorClient.lua index 9e8aa43..a1597b1 100644 --- a/apps/mirrorClient.lua +++ b/apps/mirrorClient.lua @@ -19,23 +19,6 @@ if not remoteId then error('Syntax: mirrorClient ') end -print('connecting...') -local socket - -for i = 1,3 do - socket = Socket.connect(remoteId, 5901) - if socket then - break - end - os.sleep(3) -end - -if not socket then - error('Unable to connect to ' .. remoteId .. ' on port 5901') -end - -print('connected') - local function wrapTerm(socket) local methods = { 'blit', 'clear', 'clearLine', 'setCursorPos', 'write', 'setTextColor', 'setTextColour', 'setBackgroundColor', @@ -59,26 +42,42 @@ local function wrapTerm(socket) end end -wrapTerm(socket) - -os.queueEvent('term_resize') - while true do - local e = process:pullEvent('mirror_flush') - if e == 'terminate' then - break - end - if not socket.connected then - break - end - if socket.queue then - socket:write(socket.queue) - socket.queue = nil - end -end + print('connecting...') + local socket -for k,v in pairs(socket.oldTerm) do - socket.term[k] = v -end + while true do + socket = Socket.connect(remoteId, 5901) + if socket then + break + end + os.sleep(3) + end -socket:close() + print('connected') + + wrapTerm(socket) + + os.queueEvent('term_resize') + + while true do + local e = process:pullEvent('mirror_flush') + if e == 'terminate' then + break + end + if not socket.connected then + break + end + if socket.queue then + socket:write(socket.queue) + socket.queue = nil + end + end + + for k,v in pairs(socket.oldTerm) do + socket.term[k] = v + end + + socket:close() + +end diff --git a/apps/mirrorHost.lua b/apps/mirrorHost.lua index ea5802a..3454609 100644 --- a/apps/mirrorHost.lua +++ b/apps/mirrorHost.lua @@ -32,6 +32,16 @@ while true do end end) + process:newThread('pinger', function() + while true do + os.sleep(3) + if not socket.connected then + break + end + socket:ping() + end + end) + while true do process:pullEvent('modem_message') if updateThread:isDead() then diff --git a/apps/password.lua b/apps/password.lua index c6d1baf..9a4d309 100644 --- a/apps/password.lua +++ b/apps/password.lua @@ -1,6 +1,7 @@ require = requireInjector(getfenv(1)) local Config = require('config') local SHA1 = require('sha1') +local Terminal = require('terminal') local config = { enable = false, @@ -10,9 +11,10 @@ local config = { Config.load('os', config) -print('Enter new password') -local password = read() +local password = Terminal.readPassword('Enter new password: ') -config.password = SHA1.sha1(password) - -Config.update('os', config) +if password then + config.password = SHA1.sha1(password) + Config.update('os', config) + print('Password updated') +end diff --git a/apps/telnet.lua b/apps/telnet.lua index 39ef850..4d8e395 100644 --- a/apps/telnet.lua +++ b/apps/telnet.lua @@ -52,8 +52,12 @@ end) ct.clear() ct.setCursorPos(1, 1) +local filter = Util.invert({ + 'char', 'paste', 'key', 'key_up', 'mouse_scroll', 'mouse_click', 'mouse_drag', +}) + while true do - local e = { process:pullEvent(nil, true) } + local e = { process:pullEvent() } local event = e[1] if not socket.connected then @@ -64,13 +68,7 @@ while true do break end - if event == 'char' or - event == 'paste' or - event == 'key' or - event == 'key_up' or - event == 'mouse_scroll' or - event == 'mouse_click' or - event == 'mouse_drag' then + if filter[event] then if not socket:write({ type = 'shellRemote', event = e }) then socket:close() diff --git a/apps/trust.lua b/apps/trust.lua index f474724..2db0310 100644 --- a/apps/trust.lua +++ b/apps/trust.lua @@ -22,7 +22,6 @@ if not remoteId then error('Syntax: trust ') end -print('Password') local password = Terminal.readPassword('Enter password: ') if not password then diff --git a/sys/apis/socket.lua b/sys/apis/socket.lua index 6a9671e..77a79a9 100644 --- a/sys/apis/socket.lua +++ b/sys/apis/socket.lua @@ -71,6 +71,19 @@ function socketClass:write(data) return true end +function socketClass:ping() + if not self.connected then + Logger.log('socket', 'ping: No connection') + return false + end + transport.write(self, { + type = 'PING', + seq = self.wseq, + data = data, + }) + return true +end + function socketClass:close() if self.connected then Logger.log('socket', 'closing socket ' .. self.sport) diff --git a/sys/apis/terminal.lua b/sys/apis/terminal.lua index 234b559..27d7b55 100644 --- a/sys/apis/terminal.lua +++ b/sys/apis/terminal.lua @@ -154,10 +154,11 @@ function Terminal.readPassword(prompt) if prompt then term.write(prompt) end - local fn = term.write - term.write = function() end - local s = read(prompt) - term.write = fn + local fn = term.current().write + term.current().write = function() end + local s + pcall(function() s = read(prompt) end) + term.current().write = fn if s == '' then return diff --git a/sys/apis/util.lua b/sys/apis/util.lua index 7ba934d..d04be0f 100644 --- a/sys/apis/util.lua +++ b/sys/apis/util.lua @@ -103,6 +103,14 @@ function Util.keys(t) return keys end +function Util.invert(t) + local nt = { } + for k,v in pairs(t) do + nt[v] = k + end + return nt +end + function Util.merge(obj, args) if args then for k,v in pairs(args) do diff --git a/sys/extensions/os.lua b/sys/extensions/os.lua index 2a076bf..289f88a 100644 --- a/sys/extensions/os.lua +++ b/sys/extensions/os.lua @@ -110,9 +110,9 @@ function os.getVersion() local version if _CC_VERSION then - version = tonumber(_CC_VERSION) + version = tonumber(_CC_VERSION:gmatch('[%d]+%.?[%d][%d]', '%1')()) end - if _HOST then + if not version and _HOST then version = tonumber(_HOST:gmatch('[%d]+%.?[%d][%d]', '%1')()) end diff --git a/sys/services/transort.lua b/sys/services/transort.lua index 53bff02..2a1bf5e 100644 --- a/sys/services/transort.lua +++ b/sys/services/transort.lua @@ -5,6 +5,8 @@ * write acknowledgements * background read buffering ]]-- +require = requireInjector(getfenv(1)) +local Logger = require('logger') multishell.setTitle(multishell.getCurrent(), 'Net transport') @@ -51,6 +53,7 @@ while true do if e == 'timer' then local socket = transport.timers[timerId] if socket and socket.connected then + Logger.log('transport', 'timeout - closing socket ' .. socket.sport) socket:close() transport.timers[timerId] = nil end @@ -73,8 +76,15 @@ while true do socket.timers[msg.seq] = nil transport.timers[timerId] = nil + elseif msg.type == 'PING' then + socket.transmit(socket.dport, socket.dhost, { + type = 'ACK', + seq = msg.seq, + }) + elseif msg.type == 'DATA' and msg.data then if msg.seq ~= socket.rseq then + Logger.log('transport', 'seq error - closing socket ' .. socket.sport) socket:close() else socket.rseq = socket.rseq + 1