octonet/octoserve/var/www/update.lua

167 lines
4.6 KiB
Lua

#!/usr/bin/lua
local host = os.getenv("HTTP_HOST")
local proto = os.getenv("SERVER_PROTOCOL")
local query = os.getenv("QUERY_STRING")
local method = os.getenv("REQUEST_METHOD")
local clength = os.getenv("CONTENT_LENGTH")
local ctype = os.getenv("CONTENT_TYPE")
function http_print(s)
if s then
io.stdout:write(tostring(s).."\r\n")
else
io.stdout:write("\r\n")
end
end
function SendError(err,desc)
http_print(proto.." "..err)
http_print("Content-Type: text/html")
http_print()
local file = io.open("e404.html")
if file then
local tmp = file:read("*a")
tmp = string.gsub(tmp,"404 Not Found",err .. " " .. desc)
http_print(tmp)
file:close()
end
end
if not query then query = "" end
if not proto then proto = "HTTP/1.0" end
local DoUpdate = false
local DoCheck = false
if arg[1] then
if arg[1] == "doupdate" then
DoUpdate = true
DoCheck = true
else
query = arg[1]
end
end
if query == "check" then
DoCheck = true
end
local userver = "download.digital-devices.de/download/linux"
local NewImage = "octonet.0000000000.img"
local CurImage = "octonet.0000000000.img"
if DoCheck then
local tmp = io.open("/config/updateserver")
if tmp then
userver = tmp:read()
tmp:close()
end
local tmp = io.popen(string.format("wget http://%s/octonet/ -q -O -",userver),"r")
local serverdir = tmp:read("*a")
tmp:close()
local tmp = io.popen("ls /config/octonet.*.img","r")
local configdir = tmp:read("*a")
tmp:close()
for v in string.gmatch(serverdir,"[\"/](octonet%.%d+%.img)\"") do
if v > NewImage then
NewImage = v
end
end
for v in string.gmatch(configdir,"(octonet%.%d+%.img)") do
if v > CurImage then
CurImage = v
end
end
end
if DoUpdate then
if NewImage > CurImage then
os.execute("echo CheckDone >/tmp/updatestatus")
os.remove("/config/tmpimage")
local wgetstatus = os.execute(string.format("wget -q -P /config http://%s/octonet/%s -O /config/tmpimage >/dev/null 2>/dev/null",userver,NewImage))
if wgetstatus == 0 then
local ShaFile = string.gsub(NewImage,".img",".sha")
wgetstatus = os.execute(string.format("wget -q -P /config http://%s/octonet/%s -O /config/%s >/dev/null 2>/dev/null",userver,ShaFile,ShaFile))
os.execute("echo DownloadDone >/tmp/updatestatus")
if wgetstatus == 0 then
local tmp = io.popen(string.format("sha256sum /config/tmpimage","r"))
local csum1 = tmp:read()
tmp:close()
local csum2 = io.open(string.format("/config/%s",ShaFile)):read()
csum1 = string.match(csum1,"(%x+)")
csum2 = string.match(csum2,"(%x+)")
if csum1 == csum2 then
os.execute("lua /etc/switch/swsetup.lua gb yb");
os.rename("/config/tmpimage",string.format("/config/%s",NewImage))
os.remove(string.format("/config/%s",CurImage))
os.remove(string.format("/config/%s",string.gsub(CurImage,".img",".sha")))
os.remove("/boot/uImage")
os.execute("echo VerifyDone >/tmp/updatestatus")
else
print("Error")
os.remove("/config/tmpimage")
os.remove(string.format("/config/%s",ShaFile))
os.execute("echo VerifyError >/tmp/updatestatus")
return
end
else
os.remove("/config/tmpimage")
os.remove(string.format("/config/%s",ShaFile))
os.execute("echo DownloadError >/tmp/updatestatus")
end
else
os.remove("/config/tmpimage")
os.execute("echo DownloadError >/tmp/updatestatus")
end
else
os.execute("echo CheckError >/tmp/updatestatus")
end
return
end
JSONData = ""
if query == "check" then
JSONData = "{ \"Info\":\""
if NewImage > CurImage then
JSONData = JSONData .. string.match(NewImage,"octonet%.(%d+)")
end
JSONData = JSONData .. "\"}"
elseif query == "update" then
os.remove("/tmp/updatestatus")
JSONData = "{ \"Status\":\"Started\", \"Error\":false }"
os.execute("lua update.lua doupdate >/dev/null 2>/dev/null &")
elseif query == "updatestatus" then
local tmp = io.open("/tmp/updatestatus")
local updatestatus = ""
if tmp then
updatestatus = tmp:read()
tmp:close()
end
UpdateError = "false"
if string.match(updatestatus,"(Error)") then
UpdateError = "true"
end
JSONData = "{ \"Status\":\""..updatestatus.."\", \"Error\":"..UpdateError.." }"
else
JSONData = "{ \"Status\":\""..query.."\", \"Error\":true }"
end
http_print(proto.." 200" )
http_print("Pragma: no-cache")
http_print("Cache-Control: no-cache")
http_print("Content-Type: application/json; charset=UTF-8")
http_print(string.format("Content-Length: %d",#JSONData))
http_print()
http_print(JSONData)