diff --git a/MTFS/OpenOS/usr/bin/exportfs.lua b/MTFS/OpenOS/usr/bin/exportfs.lua new file mode 100644 index 0000000..97d00f6 --- /dev/null +++ b/MTFS/OpenOS/usr/bin/exportfs.lua @@ -0,0 +1,17 @@ +local fsproxy = require "fsproxy" +local rpc = require "rpc" +local fs = require "filesystem" + +local tA = {...} +if #tA < 1 then + print("Usage: exportfs [directory] ...") + return +end + +for k,v in pairs(tA) do + local px = fsproxy.new(v) + for l,m in pairs(px) do + rpc.register("fs_"..v.."_"..l,m) + end + print(v) +end diff --git a/MTFS/OpenOS/usr/bin/importfs.lua b/MTFS/OpenOS/usr/bin/importfs.lua new file mode 100644 index 0000000..57d3987 --- /dev/null +++ b/MTFS/OpenOS/usr/bin/importfs.lua @@ -0,0 +1,25 @@ +local fs = require "filesystem" +local rpc = require "rpc" +local tA = {...} +local rpath, lpath = tA[1], tA[2], tA[3] + +if #tA < 2 then + print("Usage: importfs ") + return +end + +local function parsePath(path) + return path:match("(.+):(.+)") +end + +local host, saddr = parsePath(rpath) +local px = rpc.proxy(host,"fs_"..saddr.."_") +local mc = 0 +for k,v in pairs(px) do + mc = mc + 1 +end +if mc < 1 then + error("no such remote filesystem: "..addr) +end +px.address = rpath +fs.mount(px, lpath) diff --git a/MTFS/OpenOS/usr/lib/fsproxy.lua b/MTFS/OpenOS/usr/lib/fsproxy.lua new file mode 100644 index 0000000..d343b0b --- /dev/null +++ b/MTFS/OpenOS/usr/lib/fsproxy.lua @@ -0,0 +1,100 @@ +local fs = require "filesystem" +local fsproxy = {} +local fsfunc = {} + +local function sanitisePath(path) + local pt = {} + for s in path:gmatch("([^/]+)") do + if s == ".." then + pt[#pt] = nil + elseif s == "." then + else + pt[#pt+1] = s + end + end + return table.concat(pt,"/") +end + + +function fsproxy.new(path,wp) -- string boolean -- table -- Returns a proxy object for a given path that acts like a filesystem. + local cpath = fs.canonical(path).."/" + if not fs.exists(path) or not fs.isDirectory(path) then + error("invalid directory") + end + local originalProxy = fs.get(path) + local proxy = {} + for k,v in pairs(originalProxy) do + if type(v) ~= "table" then + proxy[k] = v + end + end + local handles = {} + function proxy.isReadOnly() + return originalProxy.isReadOnly() + end + function proxy.getLabel() + return originalProxy.getLabel() + end + function proxy.spaceUsed() + return originalProxy.spaceUsed() + end + function proxy.spaceTotal() + return originalProxy.spaceTotal() + end + function proxy.exists(path) + return fs.exists(cpath..sanitisePath(path)) + end + function proxy.isDirectory(path) + return fs.isDirectory(cpath..sanitisePath(path)) + end + function proxy.makeDirectory(path) + if wp then return false, "read-only filesystem" end + return fs.makeDirectory(cpath..sanitisePath(path)) + end + function proxy.rename(from, to) + if wp then return false, "read-only filesystem" end + return fs.rename(cpath..sanitisePath(from),cpath..sanitisePath(to)) + end + function proxy.list(path) + local rt = {} + local iter, err = fs.list(cpath..sanitisePath(path)) + if not iter then return nil, err end + for name in iter do + rt[#rt+1] = name + end + return rt + end + function proxy.lastModified(path) + return fs.lastModified(cpath..sanitisePath(path)) + end + function proxy.remove(path) + if wp then return false, "read-only filesystem" end + return fs.remove(cpath..sanitisePath(path)) + end + function proxy.size(path) + return fs.size(cpath..sanitisePath(path)) + end + + function proxy.open(path,mode) + if wp and mode:find("[wa]") then return false, "read-only filesystem" end + local h, e = fs.open(cpath..sanitisePath(path),mode) + if not h then return h, e end + handles[#handles+1] = h + return #handles + end + function proxy.seek(handle, whence, offset) + return handles[handle]:seek(whence,offset) + end + function proxy.write(handle, data) + return handles[handle]:write(data) + end + function proxy.read(handle, count) + return handles[handle]:read(count) + end + function proxy.close(handle) + return handles[handle]:close() + end + return proxy +end + +return fsproxy