diff options
-rw-r--r-- | libs/sys/luasrc/sys/mtdow.lua | 33 | ||||
-rw-r--r-- | modules/admin-full/luasrc/controller/admin/system.lua | 21 | ||||
-rw-r--r-- | modules/admin-full/luasrc/view/admin_system/upgrade.htm | 11 |
3 files changed, 50 insertions, 15 deletions
diff --git a/libs/sys/luasrc/sys/mtdow.lua b/libs/sys/luasrc/sys/mtdow.lua index 7c03845a31..0587dd4c3f 100644 --- a/libs/sys/luasrc/sys/mtdow.lua +++ b/libs/sys/luasrc/sys/mtdow.lua @@ -20,7 +20,7 @@ local util = require "luci.util" local ltn12 = require "luci.ltn12" local posix = require "posix" -local type, assert, error = type, assert, error +local type, assert, error, ipairs = type, assert, error, ipairs module "luci.sys.mtdow" @@ -63,7 +63,8 @@ CFEWriter.blocks = { image = { magic = {"4844", "5735"}, device = "linux", - write = WRITE_IMAGE + write = WRITE_IMAGE, + system = true } } @@ -72,7 +73,8 @@ CommonWriter = util.class(Writer) CommonWriter.blocks = { image = { device = "linux", - write = WRITE_COMBINED + write = WRITE_COMBINED, + system = true } } @@ -85,7 +87,8 @@ RedWriter.blocks = { }, rootfs = { device = "rootfs", - write = WRITE_COMBINED + write = WRITE_COMBINED, + system = true } } @@ -117,10 +120,11 @@ end -Writer.MTD = "/sbin/mtd" -Writer.SAFEMTD = "/tmp/mtd" +Writer.COPY = {"/sbin/mtd"} +Writer.MTD = "/tmp/mtd" Writer.IMAGEFIFO = "/tmp/mtdimage.fifo" + function Writer.write_block(self, name, imagestream, appendfile) assert(self.blocks[name], ERROR_NOTFOUND) local block = self.blocks[name] @@ -132,6 +136,8 @@ function Writer.write_block(self, name, imagestream, appendfile) end assert(imagestream, ERROR_INVMAGIC) + self:_prepare_env() + if appendfile then if block.write == WRITE_COMBINED then return (self:_write_combined(device, imagestream, appendfile) == 0) @@ -145,6 +151,21 @@ function Writer.write_block(self, name, imagestream, appendfile) end end +function Writer._prepare_env(self) + if self._prepared then + return + end + + for k, app in ipairs(self.COPY) do + local target = "/tmp/"..fs.basename(app) + fs.unlink(target) + fs.copy(app, target) + fs.chmod(target, "rwx------") + end + + self._prepared = true +end + function Writer._check_magic(self, imagestream, magic) magic = type(magic) == "table" and magic or {magic} diff --git a/modules/admin-full/luasrc/controller/admin/system.lua b/modules/admin-full/luasrc/controller/admin/system.lua index 35eca2a4f8..b99ca441b5 100644 --- a/modules/admin-full/luasrc/controller/admin/system.lua +++ b/modules/admin-full/luasrc/controller/admin/system.lua @@ -187,6 +187,8 @@ function action_upgrade() local ltn12 = require "luci.ltn12" local uploads = {} local flash = {} + + writer.COPY[#writer.COPY + 1] = "/sbin/reboot" local ret local filepat = "/tmp/mtdblock.%s" @@ -195,8 +197,7 @@ function action_upgrade() 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 + if block.write ~= mtdow.WRITE_IMAGE then keep_avail = true end end @@ -242,10 +243,18 @@ function action_upgrade() end for name, file in pairs(uploads) do - flash[name] = function() + 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, keepcfg and _kfile()) + name, imgstream, kf) + end} + + if blocks[name].system then + flash[#flash+1] = e + else + table.insert(flash, 1, e) end end @@ -256,8 +265,8 @@ function action_upgrade() if reboot.exec then local pid = posix.fork() if pid == 0 then - os.execute("sleep 1") - posix.execp("reboot") + posix.sleep(1) + posix.exec("/tmp/reboot") end end end diff --git a/modules/admin-full/luasrc/view/admin_system/upgrade.htm b/modules/admin-full/luasrc/view/admin_system/upgrade.htm index 693022f323..8fe658a427 100644 --- a/modules/admin-full/luasrc/view/admin_system/upgrade.htm +++ b/modules/admin-full/luasrc/view/admin_system/upgrade.htm @@ -38,17 +38,22 @@ $Id$ <p><%:a_s_flash_received%></p> <% reboot.exec = false - for name, func in pairs(flash) do %> + for i, entry in ipairs(flash) do + local name, func = entry.name, entry.func %> <%:a_s_flash_inprogress%> <%=name%>... - <%=string.rep(" ", 2048)%> + <%=string.rep(" ", 32*1024)%> <% local stat, code = func() reboot.exec = reboot.exec or stat if stat and code then %> - <%:a_s_flash_flashed%><br /> + <%:ok%><br /> <% else %> <%:a_s_flash_flasherr%>! (<%:code%> <%=code%>)<br /> <% end %> + <% if reboot.exec then %> + <br /> + <div><%:a_s_flash_flashed%></div> + <% end %> <% end %> <% else %> <div class="error"><%:a_s_flash_notimplemented%></div> |