summaryrefslogtreecommitdiffhomepage
path: root/modules/admin-full
diff options
context:
space:
mode:
Diffstat (limited to 'modules/admin-full')
-rw-r--r--modules/admin-full/luasrc/controller/admin/system.lua94
-rw-r--r--modules/admin-full/luasrc/view/admin_system/upgrade.htm37
2 files changed, 40 insertions, 91 deletions
diff --git a/modules/admin-full/luasrc/controller/admin/system.lua b/modules/admin-full/luasrc/controller/admin/system.lua
index b99ca441b5..c89c5859b9 100644
--- a/modules/admin-full/luasrc/controller/admin/system.lua
+++ b/modules/admin-full/luasrc/controller/admin/system.lua
@@ -181,92 +181,50 @@ 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 = {}
-
- writer.COPY[#writer.COPY + 1] = "/sbin/reboot"
local ret
- 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_IMAGE then
- keep_avail = true
- end
- end
- end
+ 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 file
luci.http.setfilehandler(
function(meta, chunk, eof)
- 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")
+ if not file then
+ file = io.open(tmpfile, "w")
end
if chunk then
- uploads[meta.name]:write(chunk)
+ file:write(chunk)
end
if eof then
- uploads[meta.name]:close()
- uploads[meta.name] = filepat % meta.name
+ file:close()
end
end
)
- luci.http.formvalue() -- Parse uploads
+ local fname = luci.http.formvalue("image")
local keepcfg = keep_avail and luci.http.formvalue("keepcfg")
-
- 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
- for name, file in pairs(uploads) do
- local e = {name=name, func=function()
- local imgstream = ltn12.source.file(io.open(file))
- local kf = blocks[name].write ~= mtdow.WRITE_IMAGE
- and keepcfg and _kfile()
- return pcall(writer.write_block, writer,
- name, imgstream, kf)
- end}
-
- if blocks[name].system then
- flash[#flash+1] = e
- else
- table.insert(flash, 1, e)
+ if plat and fname then
+ ret = function()
+ return luci.sys.flash(tmpfile, keepcfg and _keep_pattern())
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
- posix.sleep(1)
- posix.exec("/tmp/reboot")
+ 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
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 8fe658a427..a3d97d6497 100644
--- a/modules/admin-full/luasrc/view/admin_system/upgrade.htm
+++ b/modules/admin-full/luasrc/view/admin_system/upgrade.htm
@@ -17,13 +17,12 @@ $Id$
<h2><%:a_s_flash%></h2>
<p><%:a_s_flash_upgrade1%></p>
<br />
-<% if next(blocks) and not next(flash) then %>
+<% if sysupgrade and not ret then %>
<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
<div class="left"><%:a_s_flash_fwimage%>:</div>
<div>
- <% for name, v in pairs(blocks) do %>
- <%=name%>: <input type="file" size="30" name="<%=name%>" /><br />
- <% end %>
+ <input type="file" size="30" name="image" />
+ <br />
<br />
<% if keep_avail then -%>
<input type="checkbox" name="keepcfg" value="1" checked="checked" />
@@ -34,28 +33,20 @@ $Id$
<input type="submit" value="<%:a_s_flash_fwupgrade%>" />
</div>
</form>
-<% elseif next(flash) then %>
+<% elseif ret then %>
<p><%:a_s_flash_received%></p>
+ <p><%:a_s_flash_inprogress%></p>
- <% reboot.exec = false
- for i, entry in ipairs(flash) do
- local name, func = entry.name, entry.func %>
- <%:a_s_flash_inprogress%> <%=name%>...
- <%=string.rep(" ", 32*1024)%>
- <%
- local stat, code = func()
- reboot.exec = reboot.exec or stat
- if stat and code then %>
- <%:ok%><br />
- <% else %>
- <%:a_s_flash_flasherr%>! (<%:code%> <%=code%>)<br />
- <% end %>
- <% if reboot.exec then %>
- <br />
- <div><%:a_s_flash_flashed%></div>
- <% end %>
+<!-- <%=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>
<% end %>
<% else %>
<div class="error"><%:a_s_flash_notimplemented%></div>
<% end %>
-<%+footer%> \ No newline at end of file
+<%+footer%>
+<% if ret == 0 then luci.sys.reboot() end %>