gluon-luci-admin: fix firmware upgrade feature

This commit is contained in:
Nils Schneider 2014-02-18 22:21:31 +01:00
parent 123fef47f0
commit 08bc198e36
2 changed files with 47 additions and 32 deletions

View File

@ -129,35 +129,13 @@ function action_upgrade()
local has_platform = nixio.fs.access("/lib/upgrade/platform.sh") local has_platform = nixio.fs.access("/lib/upgrade/platform.sh")
local has_upload = luci.http.formvalue("image") 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 -- This is step 1-3, which does the user interaction and
-- image upload. -- image upload.
-- --
-- Step 1: file upload, error on unsupported image format -- 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 -- If there is an image but user has requested step 1
-- or type is not supported, then remove it. -- or type is not supported, then remove it.
if has_image then if has_image then
@ -183,11 +161,16 @@ function action_upgrade()
-- Step 3: load iframe which calls the actual flash procedure -- Step 3: load iframe which calls the actual flash procedure
elseif step == 3 then elseif step == 3 then
luci.template.render("admin/upgrade", { -- invoke sysupgrade
step=3, local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1"
keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1") fork_exec("/sbin/sysupgrade %s %q" %
} ) { keepcfg and "" or "-n"
end , tmpfile
}
)
luci.template.render("admin/upgrade", { step=3 } )
end
end end
function _keep_pattern() function _keep_pattern()
@ -233,3 +216,27 @@ function ltn12_popen(command)
nixio.exec("/bin/sh", "-c", command) nixio.exec("/bin/sh", "-c", command)
end end
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

View File

@ -67,8 +67,18 @@ $Id$
<ul> <ul>
<li>Checksum: <code><%=checksum%></code></li> <li>Checksum: <code><%=checksum%></code></li>
<li>Size: <% <li>Size: <%
local w = require "luci.tools.webadmin" function byte_format(byte)
write(w.byte_format(filesize)) 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 if flashsize > 0 then
write(luci.i18n.translatef( write(luci.i18n.translatef(
@ -97,8 +107,6 @@ $Id$
Wait a few minutes until you try to reconnect. Wait a few minutes until you try to reconnect.
It might be necessary to renew the address of your computer to reach the device It might be necessary to renew the address of your computer to reach the device
again, depending on your settings.</p> again, depending on your settings.</p>
<iframe src="<%=REQUEST_URI%>?step=4&#38;keepcfg=<%=keepconfig and "1" or "0"%>" style="border:1px solid black; width:100%; height:150px"></iframe>
<% end %> <% end %>
<%+footer%> <%+footer%>