236 lines
5.6 KiB
Lua
236 lines
5.6 KiB
Lua
|
|
|
|
if not pocket or not term.isColor() then
|
|
print("sPhone is only for Advanced Pocket Computers!")
|
|
return
|
|
end
|
|
|
|
local old = os.pullEvent
|
|
os.pullEvent = os.pullEventRaw
|
|
|
|
local license = [[
|
|
The MIT License (MIT)
|
|
Copyright (c) 2016 BeaconNet
|
|
|
|
Read full license here:
|
|
https://raw.github.com/BeaconNet/sPhone/master/LICENSE]]
|
|
|
|
local files = {
|
|
["src/init.lua"] = "/.sPhone/init",
|
|
["src/sPhone.lua"] = "/.sPhone/sPhone",
|
|
|
|
["install"] = "/.sPhone/update",
|
|
|
|
["LICENSE"] = "/.sPhone/LICENSE",
|
|
|
|
["src/apis/sha256.lua"] = "/.sPhone/apis/sha256",
|
|
["src/apis/visum.lua"] = "/.sPhone/apis/visum",
|
|
["src/apis/base64.lua"] = "/.sPhone/apis/base64",
|
|
["src/apis/config.lua"] = "/.sPhone/apis/config",
|
|
["src/apis/task.lua"] = "/.sPhone/apis/task",
|
|
["src/apis/temp.lua"] = "/.sPhone/apis/temp",
|
|
["src/apis/aes.lua"] = "/.sPhone/apis/aes",
|
|
["src/apis/bigfont.lua"] = "/.sPhone/apis/bigfont",
|
|
|
|
["src/bin/wget.lua"] = "/bin/wget",
|
|
["src/bin/halt.lua"] = "/bin/halt",
|
|
["src/bin/echo.lua"] = "/bin/echo",
|
|
|
|
["src/sdk/build.lua"] = "/bin/build",
|
|
|
|
["src/system/vfs.lua"] = "/.sPhone/system/vfs",
|
|
|
|
["src/apps/spks/appList.spk"] = "/.sPhone/apps/system/appList.spk",
|
|
["src/apps/spks/chat.spk"] = "/.sPhone/apps/system/chat.spk",
|
|
["src/apps/spks/gps.spk"] = "/.sPhone/apps/system/gps.spk",
|
|
["src/apps/spks/home.spk"] = "/.sPhone/apps/system/home.spk",
|
|
["src/apps/spks/info.spk"] = "/.sPhone/apps/system/info.spk",
|
|
["src/apps/spks/settings.spk"] = "/.sPhone/apps/system/settings.spk",
|
|
["src/apps/spks/shell.spk"] = "/.sPhone/apps/system/shell.spk",
|
|
["src/apps/spks/store.spk"] = "/.sPhone/apps/system/store.spk",
|
|
["src/apps/spks/themes.spk"] = "/.sPhone/apps/system/themes.spk",
|
|
["src/apps/spks/explorer.spk"] = "/.sPhone/apps/system/explorer.spk",
|
|
|
|
["src/interfaces/login"] = "/.sPhone/interfaces/login",
|
|
["src/interfaces/bootImage"] = "/.sPhone/interfaces/bootImage",
|
|
|
|
["src/startup"] = "/startup",
|
|
["src/startup"] = "/.sPhone/startup",
|
|
}
|
|
|
|
local githubUser = "BeaconNet"
|
|
local githubRepo = "sPhone"
|
|
local githubBranch = "master"
|
|
|
|
local w, h = term.getSize()
|
|
|
|
|
|
local function clear()
|
|
term.setBackgroundColor(colors.white)
|
|
term.clear()
|
|
term.setCursorPos(1, 1)
|
|
term.setTextColor(colors.black)
|
|
end
|
|
|
|
local function gui()
|
|
clear()
|
|
paintutils.drawLine(1,1,w,1,colors.blue)
|
|
term.setTextColor(colors.white)
|
|
term.setCursorPos(2,1)
|
|
print("sPhone Installer")
|
|
term.setCursorPos(1,2)
|
|
term.setTextColor(colors.black)
|
|
term.setBackgroundColor(colors.white)
|
|
end
|
|
|
|
local function center(text, y)
|
|
local w, h = term.getSize()
|
|
if not y then
|
|
local x, y = term.getCursorPos()
|
|
end
|
|
term.setCursorPos(math.ceil(w/2)-math.ceil(#text/2), y)
|
|
write(text)
|
|
end
|
|
|
|
local function httpGet(url, save)
|
|
if not url then
|
|
error("not enough arguments, expected 1 or 2", 2)
|
|
end
|
|
local remote = http.get(url)
|
|
if not remote then
|
|
return false
|
|
end
|
|
local text = remote.readAll()
|
|
remote.close()
|
|
if save then
|
|
local file = fs.open(save, "w")
|
|
file.write(text)
|
|
file.close()
|
|
return true
|
|
end
|
|
return text
|
|
end
|
|
|
|
local function get(user, repo, bran, path, save)
|
|
if not user or not repo or not bran or not path then
|
|
error("not enough arguments, expected 4 or 5", 2)
|
|
end
|
|
local url = "https://raw.github.com/"..user.."/"..repo.."/"..bran.."/"..path
|
|
local remote = http.get(url)
|
|
if not remote then
|
|
return false
|
|
end
|
|
local text = remote.readAll()
|
|
remote.close()
|
|
if save then
|
|
local file = fs.open(save, "w")
|
|
file.write(text)
|
|
file.close()
|
|
return true
|
|
end
|
|
return text
|
|
end
|
|
|
|
local function getFile(file, target)
|
|
return get(githubUser, githubRepo, githubBranch, file, target)
|
|
end
|
|
|
|
shell.setDir("")
|
|
|
|
gui()
|
|
|
|
local fileCount = 0
|
|
for _ in pairs(files) do
|
|
fileCount = fileCount + 1
|
|
end
|
|
local filesDownloaded = 0
|
|
|
|
local w, h = term.getSize()
|
|
|
|
term.setBackgroundColor(colors.white)
|
|
term.setTextColor(colors.black)
|
|
term.clear()
|
|
term.setCursorPos(1,1)
|
|
gui()
|
|
term.setCursorPos(2,3)
|
|
print("License\n")
|
|
printError("You must accept the license to install sPhone\n")
|
|
print(license)
|
|
|
|
paintutils.drawFilledBox(2,17,9,19,colors.lime)
|
|
term.setCursorPos(3,18)
|
|
term.setTextColor(colors.white)
|
|
print("Accept")
|
|
|
|
paintutils.drawFilledBox(18,17,25,19,colors.red)
|
|
term.setCursorPos(20,18)
|
|
term.setTextColor(colors.white)
|
|
print("Deny")
|
|
|
|
while true do
|
|
local e = {os.pullEvent()}
|
|
if e[1] == "mouse_click" then
|
|
local x,y = e[3],e[4]
|
|
if (x >= 2 and y >= 17 ) and (x <= 9 and y <= 19 ) then
|
|
break
|
|
elseif (x >= 18 and y >= 17) and (x <= 25 and y <= 19) then
|
|
os.pullEvent = old
|
|
return
|
|
end
|
|
elseif e[1] == "terminate" then
|
|
os.pullEvent = old
|
|
print("Terminated")
|
|
return
|
|
end
|
|
end
|
|
|
|
if fs.exists("/startup") then
|
|
fs.delete("/startup")
|
|
end
|
|
|
|
for k, v in pairs(files) do
|
|
term.setTextColor(colors.black)
|
|
term.setBackgroundColor(colors.white)
|
|
gui()
|
|
center(" Downloading files",6)
|
|
term.setCursorPos(1,12)
|
|
term.clearLine()
|
|
center(" "..filesDownloaded.."/"..fileCount, 12)
|
|
local ok = k:sub(1, 4) == "ext:" and httpGet(k:sub(5), v) or getFile(k, v)
|
|
if not ok then
|
|
if term.isColor() then
|
|
term.setTextColor(colors.red)
|
|
end
|
|
term.setCursorPos(2, 16)
|
|
print("Error getting file:")
|
|
term.setCursorPos(2, 17)
|
|
print(k)
|
|
sleep(1.5)
|
|
end
|
|
filesDownloaded = filesDownloaded + 1
|
|
end
|
|
term.setCursorPos(1,12)
|
|
term.clearLine()
|
|
center(" "..filesDownloaded.."/"..fileCount, 12)
|
|
|
|
local data = {}
|
|
if fs.exists("/.sPhone/config/sPhone") then
|
|
local f = fs.open("/.sPhone/config/sPhone","r")
|
|
local con = f.readAll()
|
|
f.close()
|
|
con = textutils.unserialize(con)
|
|
data = con
|
|
end
|
|
|
|
data["updated"] = true
|
|
local f = fs.open("/.sPhone/config/sPhone","w")
|
|
f.write(textutils.serialize(data))
|
|
f.close()
|
|
|
|
if not fs.exists("/startup") then
|
|
fs.copy("/.sPhone/startup","/startup")
|
|
end
|
|
center(" sPhone installed!",h-2)
|
|
center(" Rebooting...",h-1)
|
|
sleep(2)
|
|
os.reboot()
|