networking improvements

This commit is contained in:
kepler155c@gmail.com 2017-05-10 06:11:25 -04:00
parent f866d2bd58
commit 3a922ad2f4
10 changed files with 97 additions and 57 deletions

View File

@ -19,23 +19,6 @@ if not remoteId then
error('Syntax: mirrorClient <host ID>')
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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -22,7 +22,6 @@ if not remoteId then
error('Syntax: trust <host ID>')
end
print('Password')
local password = Terminal.readPassword('Enter password: ')
if not password then

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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