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.'
<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>
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.'
<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>
end
if store then
- store( field.headers, predata, true )
+ store( field, predata, true )
end
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
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
image = {
magic = "eb48",
device = "/dev/hda",
- write = WRITE_SEPARATELY
+ write = WRITE_EMULATED
}
}
end
return os.execute(
- "%s write '%s' '%s'" % {
+ "%s write '%s' '%s' >/dev/null 2>&1" % {
self.MTD, self.IMAGEFIFO, devicename
}
)
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
}
)
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
<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" />
<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