diff options
Diffstat (limited to 'modules/admin-full/luasrc/controller/admin/system.lua')
-rw-r--r-- | modules/admin-full/luasrc/controller/admin/system.lua | 85 |
1 files changed, 59 insertions, 26 deletions
diff --git a/modules/admin-full/luasrc/controller/admin/system.lua b/modules/admin-full/luasrc/controller/admin/system.lua index c89c5859b9..35eca2a4f8 100644 --- a/modules/admin-full/luasrc/controller/admin/system.lua +++ b/modules/admin-full/luasrc/controller/admin/system.lua @@ -181,50 +181,83 @@ end function action_upgrade() require("luci.model.uci") + local mtdow = require "luci.sys.mtdow" + local writer = mtdow.native_writer() + local blocks = writer and writer.blocks + local ltn12 = require "luci.ltn12" + local uploads = {} + local flash = {} local ret - local plat = luci.fs.mtime("/lib/upgrade/platform.sh") - local tmpfile = "/tmp/firmware.img" - local broadcom = os.execute('grep brcm_ /lib/upgrade/platform.sh >/dev/null 2>&1') == 0 - - local keep_avail = not broadcom + local filepat = "/tmp/mtdblock.%s" + local kfile = "/tmp/mtdappend.tgz" + + local keep_avail = false + if blocks then + for k, block in pairs(blocks) do + if block.write == mtdow.WRITE_COMBINED + or block.write == mtdow.WRITE_EMULATED then + keep_avail = true + end + end + end - local file luci.http.setfilehandler( function(meta, chunk, eof) - if not file then - file = io.open(tmpfile, "w") + if not meta or not blocks or not blocks[meta.name] then + return + end + if not uploads[meta.name] then + uploads[meta.name] = io.open(filepat % meta.name, "w") end if chunk then - file:write(chunk) + uploads[meta.name]:write(chunk) end if eof then - file:close() + uploads[meta.name]:close() + uploads[meta.name] = filepat % meta.name end end ) - local fname = luci.http.formvalue("image") + luci.http.formvalue() -- Parse uploads local keepcfg = keep_avail and luci.http.formvalue("keepcfg") - - if plat and fname then - ret = function() - return luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + + local function _kfile() + luci.fs.unlink(kfile) + + local kpattern = "" + local files = luci.model.uci.cursor():get_all("luci", "flash_keep") + if files then + kpattern = "" + for k, v in pairs(files) do + if k:sub(1,1) ~= "." and luci.fs.glob(v) then + kpattern = kpattern .. " '" .. v .. "'" + end + end end + + local stat = os.execute("tar czf '%s' %s >/dev/null 2>&1" % {kfile, kpattern}) + return stat == 0 and kfile end - luci.http.prepare_content("text/html") - luci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret, keep_avail=keep_avail}) -end + for name, file in pairs(uploads) do + flash[name] = function() + local imgstream = ltn12.source.file(io.open(file)) + return pcall(writer.write_block, writer, + name, imgstream, keepcfg and _kfile()) + end + end + + local reboot = {} -function _keep_pattern() - local kpattern = "" - local files = luci.model.uci.cursor():get_all("luci", "flash_keep") - if files then - kpattern = "" - for k,v in pairs(files) do - kpattern = kpattern .. " " .. v + luci.template.render("admin_system/upgrade", {blocks=blocks, + flash=flash, keep_avail=keep_avail, reboot=reboot}) + if reboot.exec then + local pid = posix.fork() + if pid == 0 then + os.execute("sleep 1") + posix.execp("reboot") end end - return kpattern end |