overhaul SPUDNET daemon

This commit is contained in:
osmarks 2020-08-23 21:27:13 +01:00
parent 706fcdb5c4
commit 6f082b20e3
2 changed files with 74 additions and 21 deletions

View File

@ -1,2 +1,2 @@
{"build":132,"description":"potatOS primary potatality","files":{"LICENSES":"f3549d84d66eb53dd4a421a4341d77d3d217c1b117d67e3be8f5211adcda0952","autorun.lua":"ee8d33d4cd579c96bad90f4a4c972634ba8fa3d2468c86495abcea4305449d65","bin/5rot26.lua":"91b66cd6d4b33081b25c456142dd7efcb894e819e842693c9e1e17ff48872ff5","bin/chronometer.lua":"db5363993a04382145aef7db2fbe262f0bf10697a589e1e2d2f9ce0f87430dd8","bin/kristminer.lua":"7e7f9fe2a6493d584ad6926cda915e02c1c3d800dc209680898ce930d0bb0e6f","bin/livegps.lua":"c3d17d495cda01aa1261e4c4fcd43439b29af422671972117ec34f68e32c5bba","bin/loading.lua":"c85f7aa1765170325155b921c1fceeb62643f552f12d41b529a22af3a67f5a97","bin/potatoflight.lua":"2fbb0b6f8d78728d8cb0ec64af1bc598bd00cb55f202378e7acdb86bba71efd1","bin/potatoplex.lua":"86c9e7597bbe23d7de7e7f1bfc976d0b94dcdf3af9e6c7c6c9b18b98596898c8","bin/relay.lua":"261ae6c220b83506e3326e8f2b091d246baae458ff0d2ee87512be2c4e35a75d","bin/tryhaskell.lua":"07810d85145da65a3e434154c79d5a9d72f2dcbe59c8d6829040fb925df878ec","potatobios.lua":"06ec570ee39792f41d536b7fce6abbc48e7151727867ae5c41a8bb87297db4ad","signing-key.tbl":"b32af5229c23af3bc03d538e42751b26044e404a7b1af064ed89894efe421607","startup":"bf06ef416de50aa610d491b1c10881609af02448560b4cfe369d6fd8baf98085","update-key.hex":"8d8afb7a45833bb7d68f929421ad60a211d4d73e0ee03b24dc0106ba1de2e1a0","xlib/00_cbor.lua":"464b075e4f094b8db42506bd4bdaad0db87699ea7fbf80e5b87739b4aa9279af","xlib/01_skynet.lua":"dd1642395dd73a1b85e0a152939ac844f583ef694c82093022fce0e7b2320dd3"},"timestamp":1596397193} {"build":142,"description":null,"files":{"LICENSES":"f3549d84d66eb53dd4a421a4341d77d3d217c1b117d67e3be8f5211adcda0952","autorun.lua":"d443a9c2b97a173e2b7d6b1e180207cad0d0e9ce91557fffab6082c69a9f5bc2","bin/5rot26.lua":"91b66cd6d4b33081b25c456142dd7efcb894e819e842693c9e1e17ff48872ff5","bin/chronometer.lua":"db5363993a04382145aef7db2fbe262f0bf10697a589e1e2d2f9ce0f87430dd8","bin/kristminer.lua":"7e7f9fe2a6493d584ad6926cda915e02c1c3d800dc209680898ce930d0bb0e6f","bin/livegps.lua":"c3d17d495cda01aa1261e4c4fcd43439b29af422671972117ec34f68e32c5bba","bin/loading.lua":"c85f7aa1765170325155b921c1fceeb62643f552f12d41b529a22af3a67f5a97","bin/potatoflight.lua":"2fbb0b6f8d78728d8cb0ec64af1bc598bd00cb55f202378e7acdb86bba71efd1","bin/potatoplex.lua":"86c9e7597bbe23d7de7e7f1bfc976d0b94dcdf3af9e6c7c6c9b18b98596898c8","bin/relay.lua":"261ae6c220b83506e3326e8f2b091d246baae458ff0d2ee87512be2c4e35a75d","bin/tryhaskell.lua":"07810d85145da65a3e434154c79d5a9d72f2dcbe59c8d6829040fb925df878ec","potatobios.lua":"9d32752f5bab07085dd574dc22d15141f4dfdf736820e7d70d11c4f836747397","signing-key.tbl":"b32af5229c23af3bc03d538e42751b26044e404a7b1af064ed89894efe421607","startup":"f68338a6240f5fbf9f9da160b5072536739be91b139999ec11322577d711c2af","xlib/00_cbor.lua":"464b075e4f094b8db42506bd4bdaad0db87699ea7fbf80e5b87739b4aa9279af","xlib/01_skynet.lua":"1d2902d89a61f6c5853157e8ee1b3f2ba2664b1b08af16ad21b41115d551b78f"},"timestamp":1598213842}
{"hash":"3c1bbd14c65ce5ca459e1d01c793a05bbb822a81fa6e970b9cd2ea5a9deefe10","sig":"07e6a84e25593885054181f9a0e68c3c5e30848839660280b19279c35b9f60f52b3875aefe815a54d637"} {"hash":"6db57494edaad2aba9241c9e8f8634b37ad8ebe36feebd6152f60c65590168b5"}

View File

@ -127,7 +127,7 @@ The `terminate` event being returned by coroutine.yield sometimes even when you
function _G.os.await_event(filter) function _G.os.await_event(filter)
while true do while true do
local ev = {coroutine.yield(filter)} local ev = {coroutine.yield(filter)}
if ev[1] ~= "terminate" or filter == nil or ev[1] == filter then if filter == nil or ev[1] == filter then
return unpack(ev) return unpack(ev)
end end
end end
@ -604,31 +604,83 @@ end
local function websocket_remote_debugging() local function websocket_remote_debugging()
if not http or not http.websocket then return "Websockets do not actually exist on this platform" end if not http or not http.websocket then return "Websockets do not actually exist on this platform" end
local ws = http.websocket "wss://osmarks.tk/wsthing/potatOS" local ws
if not ws then return end local function send_packet(msg)
--ws.send(safe_serialize(msg))
local function send(msg) ws.send(json.encode(msg))
ws.send(safe_serialize(msg))
end end
local function send(data)
send_packet { type = "send", channel = "client:potatOS", data = data }
end
local function connect()
if ws then ws.close() end
ws, err = http.websocket "wss://osmarks.tk/wsthing/v4"
ws.url = "wss://osmarks.tk/wsthing/v4"
if not ws then add_log("websocket failure %s", err) return false end
send_packet { type = "identify" }
send_packet { type = "set_channels", channels = { "client:potatOS" } }
add_log("websocket connected")
return true
end
local function try_connect_loop()
while not connect() do
sleep(0.5)
end
end
try_connect_loop()
local function recv() local function recv()
return ws.receive() while true do
local e, u, x = os.await_event "websocket_message"
if u == ws.url then return json.decode(x) end
end
end end
send { "connect", os.getComputerID() } local ping_timeout_timer = nil
process.thread(function()
while true do
local _, t = os.await_event "timer"
if t == ping_timeout_timer and ping_timeout_timer then
-- 15 seconds since last ping, we probably got disconnected
add_log "timed out, attempting reconnect"
try_connect_loop()
end
end
end, "ping-timeout")
while true do while true do
-- Receive and run code which is sent via SPUDNET -- Receive and run code which is sent via SPUDNET
local code = recv() -- Also handle SPUDNETv4 protocol, primarily pings
local packet = recv()
--add_log("test %s", textutils.serialise(packet))
if packet.type == "ping" then
send_packet { type = "pong", seq = packet.seq }
if ping_timeout_timer then os.cancelTimer(ping_timeout_timer) end
ping_timeout_timer = os.startTimer(15)
elseif packet.type == "error" then
add_log("SPUDNET error %s %s %s", packet["for"], packet.error, packet.detail)
elseif packet.type == "message" then
local code = packet.data
if type(code) == "string" then
_G.wsrecv = recv _G.wsrecv = recv
_G.wssend = send _G.wssend = send
add_log("SPUDNET command - %s", code) add_log("SPUDNET command - %s", code)
local f, error = load(code, "@<code>", "t", _G) local f, errr = load(code, "@<code>", "t", _G)
if f then -- run safely in background, send back response if f then -- run safely in background, send back response
process.thread(function() local resp = {pcall(f)} send(resp) end, "spudnetexecutor") process.thread(function() local resp = {pcall(f)} send(resp) end, "spudnetexecutor")
else else
send {false, error} send {false, errr}
end
end
end end
end end
end end
@ -833,7 +885,6 @@ local function install(force)
end end
local res = process_manifest(manifest, force) local res = process_manifest(manifest, force)
add_log("update complete", tostring(res) or "[some weirdness]")
if (res == 0 or res == false) and not force then if (res == 0 or res == false) and not force then
return false return false
end end
@ -854,6 +905,8 @@ local function install(force)
set("potatOS.uuid", gen_uuid()) set("potatOS.uuid", gen_uuid())
end end
add_log("update complete", tostring(res) or "[some weirdness]")
os.reboot() os.reboot()
end end