From 5067e2d185bbd1fdf029a8da2a84895bbccfad02 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Thu, 18 Sep 2008 19:23:08 +0000 Subject: [PATCH] Revised sysupgrade part 1 --- i18n/english/luasrc/i18n/admin-core.en.lua | 2 +- i18n/english/luasrc/i18n/admin-core.en.xml | 2 +- i18n/german/luasrc/i18n/admin-core.de.lua | 2 +- i18n/german/luasrc/i18n/admin-core.de.xml | 2 +- libs/http/luasrc/http/protocol.lua | 6 +- libs/sys/luasrc/sys/mtdow.lua | 10 +-- .../luasrc/controller/admin/system.lua | 85 +++++++++++++------ .../luasrc/view/admin_system/upgrade.htm | 32 ++++--- 8 files changed, 89 insertions(+), 52 deletions(-) diff --git a/i18n/english/luasrc/i18n/admin-core.en.lua b/i18n/english/luasrc/i18n/admin-core.en.lua index 3cb5efde54..a53a7a8011 100644 --- a/i18n/english/luasrc/i18n/admin-core.en.lua +++ b/i18n/english/luasrc/i18n/admin-core.en.lua @@ -70,7 +70,7 @@ a_s_flash_flashed = 'Firmware successfully flashed. Rebooting device...' a_s_flash_flasherr = 'Failed to flash' a_s_flash_fwimage = 'Firmwareimage' a_s_flash_received = 'Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!' -a_s_flash_inprogress = 'Writing firmware...' +a_s_flash_inprogress = 'Writing' a_s_flash_fwupgrade = 'Flash Firmware' a_s_flash_keepcfg = 'Keep configuration files' a_s_flash_notimplemented = 'Sorry, this function is not (yet) available for your platform.' diff --git a/i18n/english/luasrc/i18n/admin-core.en.xml b/i18n/english/luasrc/i18n/admin-core.en.xml index 155a5f3eab..ebeb2bc634 100644 --- a/i18n/english/luasrc/i18n/admin-core.en.xml +++ b/i18n/english/luasrc/i18n/admin-core.en.xml @@ -74,7 +74,7 @@ Failed to flash Firmwareimage Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE! -Writing firmware... +Writing Flash Firmware Keep configuration files Sorry, this function is not (yet) available for your platform. diff --git a/i18n/german/luasrc/i18n/admin-core.de.lua b/i18n/german/luasrc/i18n/admin-core.de.lua index c0169b4f98..d135bde63c 100644 --- a/i18n/german/luasrc/i18n/admin-core.de.lua +++ b/i18n/german/luasrc/i18n/admin-core.de.lua @@ -40,7 +40,7 @@ a_s_flash_flashed = 'Flashvorgang erfolgreich. Router startet neu...' a_s_flash_flasherr = 'Flashvorgang fehlgeschlagen' a_s_flash_fwimage = 'Firmwareimage' a_s_flash_received = 'Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!' -a_s_flash_inprogress = 'Schreibe Firmware...' +a_s_flash_inprogress = 'Schreibe' a_s_flash_fwupgrade = 'Firmware aktualisieren' a_s_flash_keepcfg = 'Konfigurationsdateien übernehmen' a_s_flash_notimplemented = 'Diese Funktion steht leider (noch) nicht zur Verfügung.' diff --git a/i18n/german/luasrc/i18n/admin-core.de.xml b/i18n/german/luasrc/i18n/admin-core.de.xml index f0f90b0ccd..2eabce5c6b 100644 --- a/i18n/german/luasrc/i18n/admin-core.de.xml +++ b/i18n/german/luasrc/i18n/admin-core.de.xml @@ -44,7 +44,7 @@ Flashvorgang fehlgeschlagen Firmwareimage Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS! -Schreibe Firmware... +Schreibe Firmware aktualisieren Konfigurationsdateien übernehmen Diese Funktion steht leider (noch) nicht zur Verfügung. diff --git a/libs/http/luasrc/http/protocol.lua b/libs/http/luasrc/http/protocol.lua index 93c9e79991..6873d2486e 100644 --- a/libs/http/luasrc/http/protocol.lua +++ b/libs/http/luasrc/http/protocol.lua @@ -421,7 +421,7 @@ function mimedecode_message_body( src, msg, filecb ) end if store then - store( field.headers, predata, true ) + store( field, predata, true ) end @@ -439,7 +439,7 @@ function mimedecode_message_body( src, msg, filecb ) data = data:sub( 1, #data - 78 ) if store then - store( field.headers, data, false ) + store( field, data, false ) else return nil, "Invalid MIME section header" end @@ -451,7 +451,7 @@ function mimedecode_message_body( src, msg, filecb ) lchunk, eof = parse_headers( data, field ) inhdr = not eof else - store( field.headers, lchunk, false ) + store( field, lchunk, false ) lchunk, chunk = chunk, nil end end diff --git a/libs/sys/luasrc/sys/mtdow.lua b/libs/sys/luasrc/sys/mtdow.lua index bfa2e9e937..7c03845a31 100644 --- a/libs/sys/luasrc/sys/mtdow.lua +++ b/libs/sys/luasrc/sys/mtdow.lua @@ -44,7 +44,7 @@ EmulatedWriter.blocks = { image = { magic = "eb48", device = "/dev/hda", - write = WRITE_SEPARATELY + write = WRITE_EMULATED } } @@ -193,7 +193,7 @@ function Writer._write_memory(self, devicename, imagestream) end return os.execute( - "%s write '%s' '%s'" % { + "%s write '%s' '%s' >/dev/null 2>&1" % { self.MTD, self.IMAGEFIFO, devicename } ) @@ -212,21 +212,21 @@ function Writer._write_combined(self, devicename, imagestream, appendfile) end return os.execute( - "%s -j '%s' write '%s' '%s'" % { + "%s -j '%s' write '%s' '%s' >/dev/null 2>&1" % { self.MTD, appendfile, self.IMAGEFIFO, devicename } ) end function Writer._refresh_block(self, devicename) - return os.execute("%s refresh '%s'" % {self.MTD, devicename}) + return os.execute("%s refresh '%s' >/dev/null 2>&1" % {self.MTD, devicename}) end function Writer._append(self, devicename, appendfile, erase) erase = erase and ("-e '%s' " % devicename) or '' return os.execute( - "%s %s jffs2write '%s' '%s'" % { + "%s %s jffs2write '%s' '%s' >/dev/null 2>&1" % { self.MTD, erase, appendfile, devicename } ) 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$

<%:a_s_flash%>

<%:a_s_flash_upgrade1%>


-<% if sysupgrade and not ret then %> +<% if next(blocks) and not next(flash) then %>
<%:a_s_flash_fwimage%>:
- -
+ <% for name, v in pairs(blocks) do %> + <%=name%>:
+ <% end %>
<% if keep_avail then -%> @@ -33,20 +34,23 @@ $Id$
-<% elseif ret then %> +<% elseif next(flash) then %>

<%:a_s_flash_received%>

-

<%:a_s_flash_inprogress%>

- - <% %> - <% local ret = ret() - if ret == 0 then %> -
<%:a_s_flash_flashed%>
- <% else %> -
<%:a_s_flash_flasherr%>! (<%:code%> <%=ret%>)
+ <% 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%>
+ <% else %> + <%:a_s_flash_flasherr%>! (<%:code%> <%=code%>)
+ <% end %> <% end %> <% else %>
<%:a_s_flash_notimplemented%>
<% end %> -<%+footer%> -<% if ret == 0 then luci.sys.reboot() end %> +<%+footer%> \ No newline at end of file -- 2.30.2