commit 03d7f71550b4f368350eb1bcde33491f400b124e Author: Felix Stupp Date: Tue Aug 29 13:57:21 2017 +0200 First commit diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e3cc75c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.quickSuggestions": { + "other": false, + "comments": false, + "strings": false + } +} \ No newline at end of file diff --git a/apps/access.cfg b/apps/access.cfg new file mode 100644 index 0000000..4eb7c3f --- /dev/null +++ b/apps/access.cfg @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/apps/components.cfg b/apps/components.cfg new file mode 100644 index 0000000..cfa83f7 --- /dev/null +++ b/apps/components.cfg @@ -0,0 +1,5 @@ +{ + ["zocke.min.filesystemapps"] = { + + } +} \ No newline at end of file diff --git a/apps/installed.cfg b/apps/installed.cfg new file mode 100644 index 0000000..a6686b6 --- /dev/null +++ b/apps/installed.cfg @@ -0,0 +1,35 @@ +{ + ["zocke.min.filesystem"]={ + ["commonName"]="Zocker's Mindows Filesystem", + ["description"]="Handles multiple filesystems, supports mounting and adds properties and access control to common filesystems.", + ["version"]="0.0.0.1", + ["enabledState"]=1, + ["installDate"]=0, + ["apis"]={ + ["fs.lua"]={ + ["commonName"]="File System API", + ["description"]="Handles access to the filesystem for system and applications.", + ["handles"]={".api","common.filesystem"}, + ["requirements"]={"common.kernel","common.bios","*common.filesystem"}, + }, + }, + ["apps"]={ + ["explorer.lua"]={ + ["commonName"]="File System Explorer", + ["description"]="Allows viewing and editing file systems accessable to the system.", + ["command"]="explorer", + ["requirements"]={"common.filesystem","common.graphics","common.input"}, + }, + ["fsedit.lua"]={ + ["commonName"]="File System Editor", + ["description"]="", + ["command"]="fsedit", + ["requirements"]={".api","common.graphics","common.input"}, + ["missingDisables"]=true, + }, + }, + ["signals"]={ + ["component_added"]=".api", + }, + }, +} \ No newline at end of file diff --git a/apps/zocke.min.filesystem/explorer.lua b/apps/zocke.min.filesystem/explorer.lua new file mode 100644 index 0000000..e69de29 diff --git a/apps/zocke.min.filesystem/fs.lua b/apps/zocke.min.filesystem/fs.lua new file mode 100644 index 0000000..e69de29 diff --git a/apps/zocke.min.filesystem/fsedit.lua b/apps/zocke.min.filesystem/fsedit.lua new file mode 100644 index 0000000..e69de29 diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..c290fef --- /dev/null +++ b/init.lua @@ -0,0 +1,98 @@ +-- system extension +function table.copy(tab) + local ret = {} + for k,v in pairs(tab) do + if type(v) == "table" then + ret[k] = table.copy(v) + else + ret[k] = v + end + end + return ret +end +function string.split(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t={} + local i=1 + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + t[i] = str + i = i + 1 + end + return t +end +-- both following functions read and write on system drive +local function readFile(filename) + -- read file and create table +end +local function writeFile(filename,tab) + -- write table to file +end +local function loadFile() + +local driverControl = {} +local signalControl = {} + +for dev,evs in pairs(readFile("/apps/drivers.cfg")) do + for ev,pos in pairs(evs) do + driverControl[ev] = {dev,pos} + end +end +local defaultPackageRunning = { + enabled = false + neededFor = {} +} +for name,info in pairs(packList) do + info.running = table.copy(defaultPackageRunning) +end + +local apiSet = {} + +local shortcuts = {["fs"]="filesystem"} + +-- internal runtime api +local running = {} +local runtime = {} +local metaAccess = function(hid,rights) + return (type(hid) == "table" and setmetatable({},{__index=function(t,k) + return metaAccess(hid[k],rights) + end})) or (type(hid) == "function" and function(...) + return hid(table.copy(rights),...) + end) or hid +end +function runtime.add(scriptFunction,dataTable,...) + local env = setmetatable({},{__index=function(t,k) + return metaAccess(apiSet[shortcuts[k] or k]) + end}) + local cor,err = coroutine.create(scriptFunction,env) + if not cor then + return nil,err + end + local ok,err = coroutine.resume(cor,...) + if not ok then + return nil,err + end + local pid = table.maxn(running) + 1 + running[pid] = dataTable or {} + running[pid].thread = cor + return pid +end +function runtime.status(pid) + return coroutine.status(running[pid].thread) +end + +-- initialization sequence + +print("Load packages ...") +for name,info in pairs(packList) do + if info.enabledState > 0 then + local ok,err = package.enable(name) + print(" "..name..((not ok and " could not be enabled: "..err) or " enabled")) + end +end + +while true do + local eD = {computer.pullSignal()} + +end \ No newline at end of file diff --git a/system/devices.cfg b/system/devices.cfg new file mode 100644 index 0000000..e69de29 diff --git a/system/drivers.cfg b/system/drivers.cfg new file mode 100644 index 0000000..bd00ae8 --- /dev/null +++ b/system/drivers.cfg @@ -0,0 +1,30 @@ +{ + ["screen"]={ + ["screen_resized"]=1, + ["touch"]=1, + ["drag"]=1, + ["drop"]=1, + ["scroll"]=1, + ["walk"]=1, + }, + ["keyboard"]={ + ["key_down"]=1, + ["key_up"]=1, + ["clipboard"]=1, + }, + ["redstone"]={ + ["redstone_changed"]=1, + }, + ["motion_sensor"]={ + ["motion"]=1, + }, + ["modem"]={ + ["modem_message"]=1, + }, + ["robot"]={ + ["inventory_changed"]=0, + }, + ["abstract_bus"]={ + ["bus_message"]=0, + }, +} \ No newline at end of file diff --git a/system/runtime/access.lua b/system/runtime/access.lua new file mode 100644 index 0000000..99b69f0 --- /dev/null +++ b/system/runtime/access.lua @@ -0,0 +1,160 @@ +local acc = {} +-- 0: for guest only asking, for else free +-- without asking : 1: user | 2: admin | 3:system +-- options : 4: with argument | 8: single asking +local perms = { -- "permName" , "permName#argument" + changePermissions = 3+4+8, + + useMainComponent = 1+4, + useSystemComponent = 2+4, + bindComponent = 2+4, + releaseComponent = 3+4+8, + bindComponentType = 3+4, + releaseComponentType = 3+4+8, + + changeFilesystem = 3+4, + releaseDefaultFilesystem = 2+4+8, + releaseMainFilesystem = 3+4+8, + + createWindows = 1, + changeToWindow = 2, + + useNetwork = 0, + bindDefaultPort = 2+4, + bindMainPort = 3+4, + releasePort = 3+4+8, + + changePackages = 3+4+8, +} +local appPerms = {} -- "packageName" -> "permName" , "packageName#permName#argument" +local cfg = readFile("/apps/access.cfg") + +local function splitPerm(name) + if type(name) ~= "string" or name:len() < 1 then + return false + end + local s = string.split(name,"#") + if not s[1] then return false end + if perms[s[1]] then + return true,nil,s[1],s[2] + end + if s[2] and appPerms[s[1]] and appPerms[s[1]][s[2]] then + return true,s[1],s[2],s[3] + end + return false +end + +local function getLevel(perm) + local b,p,r,a = splitPerm(perm) + if not b then + return false,"Permission does not exist" + end + if p then + return appPerms[p][r] % 4 + else + return perms[perm] % 4 + end +end +local function hasArgument(perm) + local b,p,r,a = splitPerm(perm) + if not b then + return false,"Permission does not exist" + end + if p then + return appPerms[p][r] % 4 + else + return perms[perm] % 4 + end + return bit32.extract(perms[p],2) == 1 +end +local function isSingleAsk(perm) + if not perms[perm] then + return false,"Permission does not exist" + end + return bit32.extract(perms[perm],3) == 1 +end + +function acc.giveAccessTo(pack,perm) + if not perms[perm] then + return false,"Permission does not exist" + end + if not package.isEnabled(pack) then + return false,"Package is not enabled" + end + if not cfg[pack] then + cfg[pack] = {} + end + cfg[pack][perm] = true + return true +end +function acc.askAccessTo(pack,perm) + if not perms[perm] then + return false,"Permission does not exist" + end + if not package.isEnabled(pack) then + return false,"Package is not enabled" + end + if not cfg[pack] then + cfg[pack] = {} + end + +end +function acc.hasAccessTo(pack,perm) + if not perms[perm] then + return false,"Permission does not exist" + end + if not package.isEnabled(pack) then + return false,"Package is not enabled" + end + if not cfg[pack] then + cfg[pack] = {} + end + local ok = cfg[pack][perm] ~= nil + if ok and +end +function acc.canHaveAccessTo(pack,perm) + if not perms[perm] then + return false,"Permission does not exist" + end + if not package.isEnabled(pack) then + return false,"Package is not enabled" + end + if not cfg[pack] then + cfg[pack] = {} + end +end +function acc.removeAccessTo(pack,perm) + if not perms[perm] then + return false,"Permission does not exist" + end + if not package.isEnabled(pack) then + return false,"Package is not enabled" + end + if not cfg[pack] then + cfg[pack] = {} + end + cfg[pack][perm] = false + return true +end +function acc.save() + writeFile("/apps/access.cfg",cfg) +end + +function acc.init() + for +end +function acc.runtime() -- also second init + local l = {} + for k,v in pairs(cfg) do + if not package.isInstalled(k) then + l[k] = true + end + end + for k,v in pairs(l) do + cfg[k] = nil + end + acc.save() + +end + +return acc \ No newline at end of file diff --git a/system/runtime/components.lua b/system/runtime/components.lua new file mode 100644 index 0000000..bc4dbf2 --- /dev/null +++ b/system/runtime/components.lua @@ -0,0 +1,30 @@ +local com = {} +local devices = {} + +function com.isAvailable(pid,devName) + +end +function com.invoke(pid,devName,...) + +end +function com.proxy(devName) + +end + +function com.init() + for k,v in components.list() do + devices[v] = {["type"] = components.type(v)} -- components type + end +end +function com.runtime() + while true do + local eD = {coroutine.yield()} + if eD[1] == "component_added" then -- component added + devices[eD[2]] = {["type"] = eD[3]} + elseif eD[1] == "component_removed" then -- component removed + + end + end +end + +return com \ No newline at end of file diff --git a/system/runtime/filesystem.lua b/system/runtime/filesystem.lua new file mode 100644 index 0000000..e69de29 diff --git a/system/runtime/graphics.lua b/system/runtime/graphics.lua new file mode 100644 index 0000000..e69de29 diff --git a/system/runtime/network.lua b/system/runtime/network.lua new file mode 100644 index 0000000..e69de29 diff --git a/system/runtime/package.lua b/system/runtime/package.lua new file mode 100644 index 0000000..1f50792 --- /dev/null +++ b/system/runtime/package.lua @@ -0,0 +1,105 @@ +local package = {} +local packList = readFile("/apps/installed.cfg") +local packageLoading = {} + +function package.setEntry(name,info) + packList[name] = info + info.running = {} + info.running.enabled = false +end +local function packageEnableFor(info,forName) + info.running.enabled = true + if forName then + info.running.neededFor[forName] = true + end +end +function package.enableFor(name,forName) + local info = packList[name] + if not info then + return false,"Package is not installed" + end + if packageLoading[name] then + return true + end + if info.running.enabled then + return packageEnabledFor(info,forName) + end + if info.enabledState < 0 then + return false,"Package is disabled" + end + if not info.requirements then + return packageEnabledFor(info,forName) + end + packageLoading[name] = true + for _,v in pairs(info.requirements) do + if not package.enable(v,name) then + return false,"Requirements are missing" + end + end + return packageEnabledFor(info,forName) +end +function package.isInstalled(name) + return packList[name] ~= nil +end +function package.enable(name) + return package.enableFor(name,nil) +end +function package.isEnabled(name) + local info = packList[name] + if not info then + return false,"Package is not installed" + end + return info.running.enabled +end +function package.disable(name) do + local info = packList[name] + if not info then + return false,"Package is not installed" + end + if packageLoading[name] then + return true + end + packageLoading[name] = true + for k,v in pairs(info.running.neededBy) + package.disable(name) + end + if info.requirements then + for k,v in pairs(info.requirements) do + package.disableUnneded(v) + end + end + for k,v in pairs(info.running.neededFor) do + package.disable(k) + end + info.running.neededFor = {} + info.running.enabled = false + return true +end +function package.disableUnneeded(name) + local info = packList[name] + if not info then + return false,"Package is not installed" + end + if info.running.disabled then + return true + end + if info.enabledState > 0 then + return false,"Package should be activated" + end + local needed = false + for k,v in pairs(info.running.neededFor) + if v then + return false,"Package is needed" + end + end + return package.disable(name) +end +function package.save() + local sav = table.copy(packList) + for name,info in pairs(sav) + info.running = nil + end + writeFile("/apps/installed.cfg",sav) +end + +return package \ No newline at end of file