Compare commits

..

2 Commits

2 changed files with 37 additions and 19 deletions

View File

@ -5,7 +5,7 @@ local rpc = require "rpc"
local netutil = {} local netutil = {}
function netutil.importfs(host,rpath,lpath) -- string string string -- boolean -- Import filesystem *rpath* from *host* and attach it to *lpath*. function netutil.importfs(host,rpath,lpath) -- string string string -- boolean -- Import filesystem *rpath* from *host* and attach it to *lpath*.
local px = rpc.proxy(host,rpath.."_") local px = rpc.proxy(host,"fs_"..rpath.."_")
function px.getLabel() function px.getLabel()
return host..":"..rpath return host..":"..rpath
end end
@ -17,8 +17,8 @@ function netutil.exportfs(path) -- string -- boolean -- Export the directory *pa
local path = "/"..table.concat(fs.segments(path),"/") local path = "/"..table.concat(fs.segments(path),"/")
local px = require("unionfs").create(path) local px = require("unionfs").create(path)
for k,v in pairs(px) do for k,v in pairs(px) do
rpc.register(path.."_"..k,v) rpc.register("fs_"..path.."_"..k,v)
print(path.."_"..k) print("fs_"..path.."_"..k)
end end
return true return true
end end

View File

@ -5,19 +5,34 @@ local rpc = {}
_G.rpcf = {} _G.rpcf = {}
rpc.port = 111 rpc.port = 111
local function setacl(self, fname, host)
self[fname] = self[fname] or {}
self[fname][host] = true
end
rpc.allow = setmetatable({},{__call=setacl})
rpc.deny = setmetatable({},{__call=setacl})
local function isPermitted(host,fn)
if rpc.allow[fn] then
return rpc.allow[fn][host] or false
end
if rpc.deny[fn] and rpc.deny[fn][host] then
return false
end
return true
end
local function rpcexec(_, from, port, data) local function rpcexec(_, from, port, data)
os.spawn(function()
if port == rpc.port then if port == rpc.port then
local rpcrq = serial.unserialize(data) local rpcrq = serial.unserialize(data) or {}
local rpcn, rpcid = table.remove(rpcrq,1), table.remove(rpcrq,1) if rpcf[rpcrq[1]] and isPermitted(from,rpcrq[1]) then
if rpcf[rpcn] then minitel.send(from,port,serial.serialize({rpcrq[2],pcall(rpcf[rpcrq[1]],table.unpack(rpcrq,3))}))
local rt = {pcall(rpcf[rpcn],table.unpack(rpcrq))} elseif type(rpcrq[2]) == "string" then
if rt[1] == true then minitel.send(from,port,serial.serialize({rpcrq[2],false,"function unavailable"}))
table.remove(rt,1)
end
minitel.send(from,port,serial.serialize({rpcid,table.unpack(rt)}))
else
end end
end end
end,"rpc worker for "..tostring(from))
end end
function rpcf.list() function rpcf.list()
local rt = {} local rt = {}
@ -39,10 +54,13 @@ function rpc.call(hostname,fn,...) -- string string -- boolean -- Calls exported
local _, from, port, data = event.pull(30, "net_msg", hostname, rpc.port) local _, from, port, data = event.pull(30, "net_msg", hostname, rpc.port)
rt = serial.unserialize(tostring(data)) or {} rt = serial.unserialize(tostring(data)) or {}
until (type(rt) == "table" and rt[1] == rv) or computer.uptime() > st + 30 until (type(rt) == "table" and rt[1] == rv) or computer.uptime() > st + 30
if table.remove(rt,1) == rv then if rt[1] == rv then
return table.unpack(rt) if rt[2] then
return table.unpack(rt,3)
end end
return false error(rt[3])
end
error("timed out")
end end
function rpc.proxy(hostname,filter) -- string string -- table -- Returns a component.proxy()-like table from the functions on *hostname* with names matching *filter*. function rpc.proxy(hostname,filter) -- string string -- table -- Returns a component.proxy()-like table from the functions on *hostname* with names matching *filter*.
filter=(filter or "").."(.+)" filter=(filter or "").."(.+)"
@ -69,7 +87,7 @@ function rpc.register(name,fn) -- string function -- -- Registers a function to
if not rpcrunning then if not rpcrunning then
os.spawn(function() os.spawn(function()
while true do while true do
rpcexec(event.pull("net_msg")) pcall(rpcexec,event.pull("net_msg"))
end end
end,"rpc daemon") end,"rpc daemon")
end end