diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/system.lua b/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/system.lua index 9836284fb06e1bfc27c1b7eb58783ec3a5406348..fb7eabde36d31d7bc50bdf410019cd2d34fc96d9 100644 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/system.lua +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/system.lua @@ -129,35 +129,13 @@ function action_upgrade() local has_platform = nixio.fs.access("/lib/upgrade/platform.sh") local has_upload = luci.http.formvalue("image") - -- This does the actual flashing which is invoked inside an iframe - -- so don't produce meaningful errors here because the the - -- previous pages should arrange the stuff as required. - if step == 4 then - if has_platform and has_image and has_support then - -- Mimetype text/plain - luci.http.prepare_content("text/plain") - luci.http.write("Starting luci-flash...\n") - - -- Now invoke sysupgrade - local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1" - local flash = ltn12_popen("/sbin/luci-flash %s %q" %{ - keepcfg and "-k %q" % _keep_pattern() or "", tmpfile - }) - - luci.ltn12.pump.all(flash, luci.http.write) - - -- Make sure the device is rebooted - luci.sys.reboot() - end - - -- -- This is step 1-3, which does the user interaction and -- image upload. -- -- Step 1: file upload, error on unsupported image format - elseif not has_image or not has_support or step == 1 then + if not has_image or not has_support or step == 1 then -- If there is an image but user has requested step 1 -- or type is not supported, then remove it. if has_image then @@ -183,11 +161,16 @@ function action_upgrade() -- Step 3: load iframe which calls the actual flash procedure elseif step == 3 then - luci.template.render("admin/upgrade", { - step=3, - keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1") - } ) - end + -- invoke sysupgrade + local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1" + fork_exec("/sbin/sysupgrade %s %q" % + { keepcfg and "" or "-n" + , tmpfile + } + ) + + luci.template.render("admin/upgrade", { step=3 } ) + end end function _keep_pattern() @@ -233,3 +216,27 @@ function ltn12_popen(command) nixio.exec("/bin/sh", "-c", command) end end + +function fork_exec(command) + local pid = nixio.fork() + if pid > 0 then + return + elseif pid == 0 then + -- change to root dir + nixio.chdir("/") + + -- patch stdin, out, err to /dev/null + local null = nixio.open("/dev/null", "w+") + if null then + nixio.dup(null, nixio.stderr) + nixio.dup(null, nixio.stdout) + nixio.dup(null, nixio.stdin) + if null:fileno() > 2 then + null:close() + end + end + + -- replace with target command + nixio.exec("/bin/sh", "-c", command) + end +end diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm index 3380dc633df41a0416e87de14f998c2e1cbfefea..d8827a030faef6c7232487c83b090a32061db19c 100644 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm @@ -67,8 +67,18 @@ $Id$ <ul> <li>Checksum: <code><%=checksum%></code></li> <li>Size: <% - local w = require "luci.tools.webadmin" - write(w.byte_format(filesize)) + function byte_format(byte) + local suff = {"B", "KB", "MB", "GB", "TB"} + for i=1, 5 do + if byte > 1024 and i < 5 then + byte = byte / 1024 + else + return string.format("%.2f %s", byte, suff[i]) + end + end + end + + write(byte_format(filesize)) if flashsize > 0 then write(luci.i18n.translatef( @@ -97,8 +107,6 @@ $Id$ Wait a few minutes until you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings.</p> - - <iframe src="<%=REQUEST_URI%>?step=4&keepcfg=<%=keepconfig and "1" or "0"%>" style="border:1px solid black; width:100%; height:150px"></iframe> <% end %> <%+footer%>