#!/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 arg[1] then query = arg[1] if query == "get" then query = "" end proto = "HTTP/1.0" host = "local" end local path = nil local tmp = "/var/tmp/xxxx" if method ~= "POST" or not clength or not ctype then SendError("404","?") return end if not string.match(ctype,"multipart/form%-data") then SendError("404","??") return end local boundary = string.match(ctype,"boundary=(.*)") if not boundary then SendError("404","???") return end local filename = nil while true do local line = io.stdin:read() line = string.gsub(line,"\r","") if line == "" then break end if not filename then filename = string.match(line,'filename=%"(.*)%"') end end data = io.stdin:read("*a") local i = data:find("--"..boundary,1,true) if i then data = data:sub(1,i-1) else data = nil end if data then local file = io.open("/tmp/"..filename,"w") if file then file:write(data) file:close() end if string.match(filename,"%.tar%.gz$") then os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;gunzip -c /tmp/"..filename.."|tar -xf -"); elseif string.match(filename,"%.zip$") then os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;unzip -q /tmp/"..filename); end os.remove("/tmp/"..filename) end -- TODO validate http_print(proto.." 303") http_print("Location: http://"..host.."/reboot.html") http_print()