mirror of https://git.openwrt.org/project/luci.git
Revised sysupgrade part 1
This commit is contained in:
parent
60579b28e8
commit
5067e2d185
|
@ -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.'
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.'
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
||||
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
|
||||
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 = {}
|
||||
|
||||
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
|
||||
|
|
|
@ -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%>
|
Loading…
Reference in New Issue