--if os.getComputerID() == 7 then fs.delete "startup" return end local fsopen = fs.open local httpget = http.get local tableinsert = table.insert local parallelwaitforall = parallel.waitForAll local files = { ["startup"] = "https://pastebin.com/raw/0dwT19zh", ["potatoplex"] = "https://pastebin.com/raw/wYBZjQhN" } local function download(url, file) local h = httpget(url) local f = fsopen(file, "w") f.write(h.readAll()) f.close() h.close() end local function update() local fns = {} for file, url in pairs(files) do tableinsert(fns, function() download(url, file) end) end parallelwaitforall(unpack(fns)) if type(_G.tomatOS) == "table" then _G.tomatOS.updated = os.clock() end end if shell.getRunningProgram() ~= "startup" then print "Installing tomatOS." update() os.reboot() end _G.tomatOS = { update = update } local args = table.concat({...}, " ") if args:find "update" or args:find "install" then update() end local cloak_key = "@bios" local fn, err = load([[ local cloak_key, update = ... local redirects = { ["startup"] = ".34d8b323c357e992dac55bc78e3907e802836e42c76ae0569dec6696c9a9dcdc", [".settings"] = ".56dbf3c9c062bbf536be3a633488197be19624a6c6ea88b70b6bb62c42c903df" } local fsopen = fs.open local fsexist = fs.exists local fslist = fs.list local fsdelete = fs.delete local fsmove = fs.move local fscopy = fs.copy local fsfind = fs.find local fscombine = fs.combine local fsgetsize = fs.getSize local fsattributes local fsmakedir = fs.makeDir local stringdump = string.dump local settingsset = settings.set local settingssave = settings.save local settingsget = settings.get local debuggetinfo = debug.getinfo local debugsetupvalue = debug.setupvalue local debuggetupvalue = debug.getupvalue local debugsetlocal = debug.setlocal local debuggetlocal = debug.getlocal if not fsexist(redirects[".settings"]) then if fsexist ".settings" then fscopy(".settings", redirects[".settings"]) end settingsset("shell.allow_disk_startup", false) settingsset("shell.allow_startup", true) settingssave ".settings" end os.setComputerLabel = function(new) settingsset("computer.label", new) settingssave ".settings" end os.getComputerLabel = function() return settingsget("computer.label") end local function is_redirect_target(s) for target, destination in pairs(redirects) do if s == target then return true end end return false end local function is_redirect_destination(s) for target, destination in pairs(redirects) do if s == destination then return true end end return false end local function redirect(s) for target, destination in pairs(redirects) do if s == target then return destination end end return s end local function canonicalize(s) return fscombine(s, "") end fs.exists = function(file) return fsexist(redirect(file)) end fs.delete = function(file) return fsdelete(redirect(file)) end fs.move = function(file1, file2) return fsmove(redirect(file1), redirect(file2)) end fs.copy = function(file1, file2) return fscopy(redirect(file1), redirect(file2)) end fs.open = function(file, mode) file = canonicalize(file) if is_redirect_target(file) then if not fsexist(redirect(file)) then fsopen(redirect(file), "w").close() end file = redirect(file) end return fsopen(file, mode) end fs.getSize = function(file) return fsgetsize(redirect(file)) end if fsattributes then fs.attributes = function(file) return fsattributes(redirect(file)) end end fs.makeDir = function(file) return fsmakedir(redirect(file)) end local function filter_listing(real) local fake = {} for _, result in pairs(real) do if not is_redirect_target(result) then if not is_redirect_destination(result) then table.insert(fake, result) else for target, destination in pairs(redirects) do if destination == result then table.insert(fake, target) break end end end end end return fake end fs.list = function(location) if canonicalize(location) ~= "" then return fslist(location) end return filter_listing(fslist(location)) end fs.find = function(files) if canonicalize(files) ~= "" and fs.getDir(files) ~= "" then return fsfind(files) end return filter_listing(fsfind(files)) end local function check_cloaked(fn, e) if type(fn) ~= "function" then return end local i = debuggetinfo(fn, "S") if i.source == cloak_key then error(e or "Access denied", 3) end end function string.dump(fn) check_cloaked(fn, "Unable to dump given function") return stringdump(fn) end function debug.getinfo(where, filter) if type(filter) == "string" and not filter:match "S" then filter = filter .. "S" end if type(where) == "number" then where = where + 2 end local info = debuggetinfo(where, filter) if type(info) == "table" and info.source == cloak_key then error("Access denied", 2) end return info end function debug.getlocal(level, ix) check_cloaked(level) return debuggetlocal(level, ix) end function debug.setlocal(level, ix, val) check_cloaked(level) return debugsetlocal(level, ix, val) end function debug.getupvalue(fn, ix) check_cloaked(fn) return debuggetupvalue(fn, ix) end function debug.setupvalue(fn, ix, val) check_cloaked(fn) return debugsetlocal(fn, ix, val) end local function daemon() update() end local coro = coroutine.create(daemon) local filter local coroutineyield = coroutine.yield coroutine.yield = function(...) local args = {coroutineyield(...)} if coroutine.status(coro) == "suspended" and (filter == nil or filter == args[1]) then local ok, res = coroutine.resume(coro, unpack(args)) if not ok then tomatOS.error = res else filter = res end end return unpack(args) end settings.load ".settings" print "TomatOS loaded." shell.run("/rom/startup.lua") ]], cloak_key, "t", _ENV) if not fn then printError(err) update() else fn(cloak_key, update) end