admin-mini: Fixed firmware flash; was referring to admin-full upgrade instead of...
[project/luci.git] / modules / admin-mini / luasrc / controller / mini / system.lua
index 93f113a..2559ac1 100644 (file)
@@ -55,12 +55,11 @@ function action_backup()
                luci.template.render("mini/applyreboot")
                luci.sys.reboot()
        elseif backup then
-               luci.util.perror(backup_cmd:format(_keep_pattern()))
-               local backup_fpi = io.popen(backup_cmd:format(_keep_pattern()), "r")
+               local reader = ltn12_popen(backup_cmd:format(_keep_pattern()))
                luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
                        luci.sys.hostname(), os.date("%Y-%m-%d")})
                luci.http.prepare_content("application/x-targz")
-               luci.ltn12.pump.all(luci.ltn12.source.file(backup_fpi), luci.http.write)
+               luci.ltn12.pump.all(reader, luci.http.write)
        elseif reset then
                luci.template.render("mini/applyreboot")
                luci.util.exec("mtd -r erase rootfs_data")
@@ -151,21 +150,15 @@ function action_upgrade()
                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 fd = io.popen("/sbin/luci-flash %s %q" %{
+                       local flash = ltn12_popen("/sbin/luci-flash %s %q" %{
                                keepcfg and "-k %q" % _keep_pattern() or "", tmpfile
                        })
 
-                       if fd then
-                               while true do
-                                       local ln = fd:read("*l")
-                                       if not ln then break end
-                                       luci.http.write(ln .. "\n")
-                               end
-                               fd:close()
-                       end
+                       luci.ltn12.pump.all(flash, luci.http.write)
 
                        -- Make sure the device is rebooted
                        luci.sys.reboot()
@@ -185,7 +178,7 @@ function action_upgrade()
                        nixio.fs.unlink(tmpfile)
                end
                        
-               luci.template.render("admin_system/upgrade", {
+               luci.template.render("mini/upgrade", {
                        step=1,
                        bad_image=(has_image and not has_support or false),
                        keepavail=keep_avail,
@@ -194,7 +187,7 @@ function action_upgrade()
 
        -- Step 2: present uploaded file, show checksum, confirmation
        elseif step == 2 then
-               luci.template.render("admin_system/upgrade", {
+               luci.template.render("mini/upgrade", {
                        step=2,
                        checksum=image_checksum(),
                        filesize=nixio.fs.stat(tmpfile).size,
@@ -204,7 +197,7 @@ function action_upgrade()
        
        -- Step 3: load iframe which calls the actual flash procedure
        elseif step == 3 then
-               luci.template.render("admin_system/upgrade", {
+               luci.template.render("mini/upgrade", {
                        step=3,
                        keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1")
                } )
@@ -224,3 +217,33 @@ function _keep_pattern()
        end
        return kpattern
 end
+
+function ltn12_popen(command)
+
+       local fdi, fdo = nixio.pipe()
+       local pid = nixio.fork()
+
+       if pid > 0 then
+               fdo:close()
+               local close
+               return function()
+                       local buffer = fdi:read(2048)
+                       local wpid, stat = nixio.waitpid(pid, "nohang")
+                       if not close and wpid and stat == "exited" then
+                               close = true
+                       end
+
+                       if buffer and #buffer > 0 then
+                               return buffer
+                       elseif close then
+                               fdi:close()
+                               return nil
+                       end
+               end
+       elseif pid == 0 then
+               nixio.dup(fdo, nixio.stdout)
+               fdi:close()
+               fdo:close()
+               nixio.exec("/bin/sh", "-c", command)
+       end
+end