diff options
author | Steven Barth <steven@midlink.org> | 2008-09-18 19:23:08 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2008-09-18 19:23:08 +0000 |
commit | 5067e2d185bbd1fdf029a8da2a84895bbccfad02 (patch) | |
tree | d0caa1289fce35bacaae1f1055aaa8317828cf13 /modules/admin-full | |
parent | 60579b28e861af7780b596eca70a547b4bb779d1 (diff) |
Revised sysupgrade part 1
Diffstat (limited to 'modules/admin-full')
-rw-r--r-- | modules/admin-full/luasrc/controller/admin/system.lua | 85 | ||||
-rw-r--r-- | modules/admin-full/luasrc/view/admin_system/upgrade.htm | 32 |
2 files changed, 77 insertions, 40 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 diff --git a/modules/admin-full/luasrc/view/admin_system/upgrade.htm b/modules/admin-full/luasrc/view/admin_system/upgrade.htm index a3d97d6497..693022f323 100644 --- a/modules/admin-full/luasrc/view/admin_system/upgrade.htm +++ b/modules/admin-full/luasrc/view/admin_system/upgrade.htm @@ -17,12 +17,13 @@ $Id$ <h2><%:a_s_flash%></h2> <p><%:a_s_flash_upgrade1%></p> <br /> -<% if sysupgrade and not ret then %> +<% if next(blocks) and not next(flash) then %> <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data"> <div class="left"><%:a_s_flash_fwimage%>:</div> <div> - <input type="file" size="30" name="image" /> - <br /> + <% for name, v in pairs(blocks) do %> + <%=name%>: <input type="file" size="30" name="<%=name%>" /><br /> + <% end %> <br /> <% if keep_avail then -%> <input type="checkbox" name="keepcfg" value="1" checked="checked" /> @@ -33,20 +34,23 @@ $Id$ <input type="submit" value="<%:a_s_flash_fwupgrade%>" /> </div> </form> -<% elseif ret then %> +<% elseif next(flash) then %> <p><%:a_s_flash_received%></p> - <p><%:a_s_flash_inprogress%></p> -<!-- <%=string.rep(" ", 2048)%> --> - <% %> - <% local ret = ret() - if ret == 0 then %> -<div class="ok"><%:a_s_flash_flashed%></div> - <% else %> -<div class="error"><%:a_s_flash_flasherr%>! (<%:code%> <%=ret%>)</div> + <% reboot.exec = false + for name, func in pairs(flash) do %> + <%:a_s_flash_inprogress%> <%=name%>... + <%=string.rep(" ", 2048)%> + <% + local stat, code = func() + reboot.exec = reboot.exec or stat + if stat and code then %> + <%:a_s_flash_flashed%><br /> + <% else %> + <%:a_s_flash_flasherr%>! (<%:code%> <%=code%>)<br /> + <% end %> <% end %> <% else %> <div class="error"><%:a_s_flash_notimplemented%></div> <% end %> -<%+footer%> -<% if ret == 0 then luci.sys.reboot() end %> +<%+footer%>
\ No newline at end of file |