diff options
-rw-r--r-- | i18n/english/luasrc/i18n/admin-core.en.lua | 2 | ||||
-rw-r--r-- | i18n/english/luasrc/i18n/admin-core.en.xml | 2 | ||||
-rw-r--r-- | i18n/german/luasrc/i18n/admin-core.de.lua | 2 | ||||
-rw-r--r-- | i18n/german/luasrc/i18n/admin-core.de.xml | 2 | ||||
-rw-r--r-- | libs/http/luasrc/http/protocol.lua | 6 | ||||
-rw-r--r-- | libs/sys/luasrc/sys/mtdow.lua | 10 | ||||
-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 |
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 3cb5efde5..a53a7a801 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 155a5f3ea..ebeb2bc63 100644 --- a/i18n/english/luasrc/i18n/admin-core.en.xml +++ b/i18n/english/luasrc/i18n/admin-core.en.xml @@ -74,7 +74,7 @@ <i18n:msg xml:id="a_s_flash_flasherr">Failed to flash</i18n:msg> <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg> <i18n:msg xml:id="a_s_flash_received">Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!</i18n:msg> -<i18n:msg xml:id="a_s_flash_inprogress">Writing firmware...</i18n:msg> +<i18n:msg xml:id="a_s_flash_inprogress">Writing</i18n:msg> <i18n:msg xml:id="a_s_flash_fwupgrade">Flash Firmware</i18n:msg> <i18n:msg xml:id="a_s_flash_keepcfg">Keep configuration files</i18n:msg> <i18n:msg xml:id="a_s_flash_notimplemented">Sorry, this function is not (yet) available for your platform.</i18n:msg> diff --git a/i18n/german/luasrc/i18n/admin-core.de.lua b/i18n/german/luasrc/i18n/admin-core.de.lua index c0169b4f9..d135bde63 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 f0f90b0cc..2eabce5c6 100644 --- a/i18n/german/luasrc/i18n/admin-core.de.xml +++ b/i18n/german/luasrc/i18n/admin-core.de.xml @@ -44,7 +44,7 @@ <i18n:msg xml:id="a_s_flash_flasherr">Flashvorgang fehlgeschlagen</i18n:msg> <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg> <i18n:msg xml:id="a_s_flash_received">Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!</i18n:msg> -<i18n:msg xml:id="a_s_flash_inprogress">Schreibe Firmware...</i18n:msg> +<i18n:msg xml:id="a_s_flash_inprogress">Schreibe</i18n:msg> <i18n:msg xml:id="a_s_flash_fwupgrade">Firmware aktualisieren</i18n:msg> <i18n:msg xml:id="a_s_flash_keepcfg">Konfigurationsdateien übernehmen</i18n:msg> <i18n:msg xml:id="a_s_flash_notimplemented">Diese Funktion steht leider (noch) nicht zur Verfügung.</i18n:msg> diff --git a/libs/http/luasrc/http/protocol.lua b/libs/http/luasrc/http/protocol.lua index 93c9e7999..6873d2486 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 bfa2e9e93..7c03845a3 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 c89c5859b..35eca2a4f 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 a3d97d649..693022f32 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 |