diff --git a/projects/updater/install.lua b/projects/updater/install.lua index af11425..881ab77 100644 --- a/projects/updater/install.lua +++ b/projects/updater/install.lua @@ -1,79 +1,95 @@ -args = {...} +local args = {...} -url = "http://lua.gaywine.org" +local url = "http://lua.gaywine.org" -path = "bin/" +local path = "bin/" if not fs.exists(path) then fs.makeDir(path) end -temp = "temp/" +local temp = "temp/" if not fs.exists(temp) then fs.makeDir(temp) end if #args > 0 then programToInstall = args[1] +else + print("usage:") + print("install.lua ") + print("install.lua ") end if #args > 1 then + print("WARNING: custom paths are currently not supported.") customPath = shell.resolve(args[2]) end -function downloadFile(filename) - fileUrl = url .. "/files/" .. programToInstall .. "/" .. filename +local function downloadFile(filename) + print("downloading " .. filename .. "...") + local fileUrl = url .. "/files/" .. programToInstall .. "/" .. filename - result = http.get(fileUrl) - resultText = result.readAll() + local result = http.get(fileUrl) + local resultText = result.readAll() - file = fs.open(temp .. filename, "w") - file.write(resultText) - file.close() + local file = fs.open(temp .. filename, "w") + file.write(resultText) + file.close() end -function split(pString, pPattern) - local Table = {} -- NOTE: use {n = 0} in Lua-5.0 - local fpat = "(.-)" .. pPattern - local last_end = 1 - local s, e, cap = pString:find(fpat, 1) - while s do - if s ~= 1 or cap ~= "" then - table.insert(Table,cap) - end - last_end = e+1 - s, e, cap = pString:find(fpat, last_end) - end - if last_end <= #pString then - cap = pString:sub(last_end) - table.insert(Table, cap) - end - return Table +local function split(pString, pPattern) + local Table = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pPattern + local last_end = 1 + local s, e, cap = pString:find(fpat, 1) + while s do + if s ~= 1 or cap ~= "" then + table.insert(Table, cap) + end + last_end = e + 1 + s, e, cap = pString:find(fpat, last_end) + end + if last_end <= #pString then + cap = pString:sub(last_end) + table.insert(Table, cap) + end + return Table end -function getAllFiles() - indexesUrl = url .. "/indexes/" .. programToInstall +local function getAllFiles() + local indexesUrl = url .. "/indexes/" .. programToInstall - result = http.get(indexesUrl) - resultText = result.readAll() - resultTable = split(resultText, "\n") + local result = http.get(indexesUrl) + local resultText = result.readAll() + local resultTable = split(resultText, "\n") - finalResult = {} - for key, value in ipairs(resultTable) do - finalResult[key] = split(value, " ")[1] - end + local indexesFile = fs.open("bin/indexes.dat", "w") + indexesFile.write(resultText) + indexesFile.close() - return finalResult + local programsFile = fs.open(path .. "programs.dat", "a") + programsFile.write(programToInstall) + programsFile.close() + + local finalResult = {} + for key, value in ipairs(resultTable) do + finalResult[key] = split(value, " ")[1] + end + + return finalResult end -function finishInstall(files) +local function finishInstall(files) for key, file in ipairs(files) do if customPath ~= nil then + print("moving " .. file .. " to " .. customPath .. "...") fs.move(temp .. file, customPath .. "/" .. file) else - fs.move(temp .. binary, path .. binary) + print("moving " .. file .. " to " .. path .. programToInstall .. "...") + fs.move(temp .. file, path .. programToInstall .. "/" .. file) end end if customPath ~= nil then - program = "shell.run(" .. customPath .. "/run.lua)" + local program = "shell.run(" .. customPath .. "/run.lua)" file = fs.open(path .. programToInstall .. "/run.lua") file.write(program) file.close() @@ -82,8 +98,27 @@ function finishInstall(files) fs.delete(temp) end -local files = getAllFiles() -for _,value in ipairs(files) do - downloadFile(value) +if not fs.exists(path .. "programs.dat") then + local file = fs.open(path .. "programs.dat", "w") + file.write("") + file.close() +end +local programsFile = fs.open(path .. "programs.dat", "r") +local programsText = programsFile.readAll() +local programsTable = split(programsText, "\n") +local shouldInstall = true +for _, value in ipairs(programsTable) do + if value == programToInstall then + print(programToInstall .. " is already installed. checking for updates instead...") + shouldInstall = false + end +end +if shouldInstall then + local files = getAllFiles() + for _, value in ipairs(files) do + downloadFile(value) + end + finishInstall(files) +elseif fs.exists(path .. "updater/update.lua") then + shell.run(path .. "updater/update.lua " .. programToInstall) end -finishInstall(files) \ No newline at end of file diff --git a/projects/updater/update.lua b/projects/updater/update.lua index bfe699d..8b94b0d 100644 --- a/projects/updater/update.lua +++ b/projects/updater/update.lua @@ -1 +1,133 @@ -print('fuck') \ No newline at end of file +args = {...} + +url = "http://lua.gaywine.org" + +path = "bin/" +if not fs.exists(path) then + fs.makeDir(path) +end +temp = "temp/" +if not fs.exists(temp) then + fs.makeDir(temp) +end + +if #args > 0 then + programToInstall = args[1] +end +if #args > 1 then + print("WARNING: custom paths are currently not supported.") + customPath = shell.resolve(args[2]) +end + +local function downloadFile(filename) + print("downloading " .. filename .. "...") + local fileUrl = url .. "/files/" .. programToInstall .. "/" .. filename + + local result = http.get(fileUrl) + local resultText = result.readAll() + + local file = fs.open(temp .. filename, "w") + file.write(resultText) + file.close() +end + +local function split(pString, pPattern) + local Table = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pPattern + local last_end = 1 + local s, e, cap = pString:find(fpat, 1) + while s do + if s ~= 1 or cap ~= "" then + table.insert(Table, cap) + end + last_end = e + 1 + s, e, cap = pString:find(fpat, last_end) + end + if last_end <= #pString then + cap = pString:sub(last_end) + table.insert(Table, cap) + end + return Table +end + +local function getAllFiles() + local indexesUrl = url .. "/indexes/" .. programToInstall + local updateUrl = url .. "/updates/" .. programToInstall + + local currentFiles = "" + if fs.exists(path .. "indexes.dat") then + local indexesFile = fs.open(path .. "indexes.dat", "r") + currentFiles = indexesFile.readAll() + indexesFile.close() + end + + local result = http.post(indexesUrl, currentFiles) + local resultText = result.readAll() + local resultTable = split(resultText, "\n") + + local result2 = http.get(indexesUrl) + local resultText2 = result2.readAll() + local resultTable2 = split(resultText2, "\n") + + local newIndexesFile = fs.open(path .. "indexes.dat", "w") + newIndexesFile.write(resultText) + newIndexesFile.close() + + local finalResult = {} + for key, value in ipairs(resultTable2) do + local filename = split(value, " ")[1] + for key2, value2 in ipairs(resultTable) do + local valueTable = split(value2, " ") + local filePath = path .. programToInstall .. "/" .. valueTable[1] + if valueTable[2] == "delete" and fs.exists(filePath) then + fs.delete(filePath) + elseif valueTable[2] == "download" then + finalResult[#finalResult + 1] = valueTable[1] + end + end + end + + return finalResult +end + +local function finishInstall(files) + for key, file in ipairs(files) do + if customPath ~= nil then + print("moving " .. file .. " to " .. customPath .. "...") + fs.move(temp .. file, customPath .. "/" .. file) + else + print("moving " .. file .. " to " .. path .. programToInstall .. "...") + fs.move(temp .. file, path .. programToInstall .. "/" .. file) + end + end + + if customPath ~= nil then + local program = "shell.run(" .. customPath .. "/run.lua)" + file = fs.open(path .. programToInstall .. "/run.lua") + file.write(program) + file.close() + end + + fs.delete(temp) +end + +if programToInstall == nil then + print("no program specified, updating all...") + local programsFile = fs.open(path .. "programs.dat", "r") + local programsText = programsFile.readAll() + local programsTable = split(programsText, "\n") + for _, value in ipairs(programsTable) do + programToInstall = value + local files = getAllFiles() + for _, value in ipairs(files) do + downloadFile(value) + end + finishInstall(files) + end +else + local files = getAllFiles() + for _, value in ipairs(files) do + downloadFile(value) + end + finishInstall(files) +end