gluon-luci-admin: restructure firmware upgrades
This commit is contained in:
parent
9d11f4bda1
commit
e2ff6a6ed3
@ -16,51 +16,16 @@ $Id$
|
|||||||
module("luci.controller.admin.upgrade", package.seeall)
|
module("luci.controller.admin.upgrade", package.seeall)
|
||||||
|
|
||||||
function index()
|
function index()
|
||||||
entry({"admin", "upgrade"}, call("action_upgrade"), "Firmware aktualisieren", 90)
|
local has_platform = nixio.fs.access("/lib/upgrade/platform.sh")
|
||||||
|
if has_platform then
|
||||||
|
entry({"admin", "upgrade"}, call("action_upgrade"), "Firmware aktualisieren", 90)
|
||||||
|
entry({"admin", "upgrade", "reboot"}, template("admin/upgrade_reboot"), nil, nil)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function action_upgrade()
|
function action_upgrade()
|
||||||
require("luci.model.uci")
|
|
||||||
|
|
||||||
local tmpfile = "/tmp/firmware.img"
|
local tmpfile = "/tmp/firmware.img"
|
||||||
|
|
||||||
local function image_supported()
|
|
||||||
-- XXX: yay...
|
|
||||||
return ( 0 == os.execute(
|
|
||||||
". /lib/functions.sh; " ..
|
|
||||||
"include /lib/upgrade; " ..
|
|
||||||
"platform_check_image %q >/dev/null"
|
|
||||||
% tmpfile
|
|
||||||
) )
|
|
||||||
end
|
|
||||||
|
|
||||||
local function image_checksum()
|
|
||||||
return (luci.sys.exec("md5sum %q" % tmpfile):match("^([^%s]+)"))
|
|
||||||
end
|
|
||||||
|
|
||||||
local function storage_size()
|
|
||||||
local size = 0
|
|
||||||
if nixio.fs.access("/proc/mtd") then
|
|
||||||
for l in io.lines("/proc/mtd") do
|
|
||||||
local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
|
|
||||||
if n == "linux" then
|
|
||||||
size = tonumber(s, 16)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif nixio.fs.access("/proc/partitions") then
|
|
||||||
for l in io.lines("/proc/partitions") do
|
|
||||||
local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
|
|
||||||
if b and n and not n:match('[0-9]') then
|
|
||||||
size = tonumber(b) * 1024
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return size
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Install upload handler
|
-- Install upload handler
|
||||||
local file
|
local file
|
||||||
luci.http.setfilehandler(
|
luci.http.setfilehandler(
|
||||||
@ -77,19 +42,10 @@ function action_upgrade()
|
|||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
-- Determine state
|
-- Determine state
|
||||||
local keep_avail = true
|
|
||||||
local step = tonumber(luci.http.formvalue("step") or 1)
|
local step = tonumber(luci.http.formvalue("step") or 1)
|
||||||
local has_image = nixio.fs.access(tmpfile)
|
local has_image = nixio.fs.access(tmpfile)
|
||||||
local has_support = image_supported()
|
local has_support = image_supported(tmpfile)
|
||||||
local has_platform = nixio.fs.access("/lib/upgrade/platform.sh")
|
|
||||||
local has_upload = luci.http.formvalue("image")
|
|
||||||
|
|
||||||
--
|
|
||||||
-- This is step 1-3, which does the user interaction and
|
|
||||||
-- image upload.
|
|
||||||
--
|
|
||||||
|
|
||||||
-- Step 1: file upload, error on unsupported image format
|
-- Step 1: file upload, error on unsupported image format
|
||||||
if not has_image or not has_support or step == 1 then
|
if not has_image or not has_support or step == 1 then
|
||||||
@ -100,33 +56,21 @@ function action_upgrade()
|
|||||||
end
|
end
|
||||||
|
|
||||||
luci.template.render("admin/upgrade", {
|
luci.template.render("admin/upgrade", {
|
||||||
step=1,
|
bad_image=(has_image and not has_support or false)
|
||||||
bad_image=(has_image and not has_support or false),
|
|
||||||
keepavail=keep_avail,
|
|
||||||
supported=has_platform
|
|
||||||
} )
|
} )
|
||||||
|
|
||||||
-- Step 2: present uploaded file, show checksum, confirmation
|
-- Step 2: present uploaded file, show checksum, confirmation
|
||||||
elseif step == 2 then
|
elseif step == 2 then
|
||||||
luci.template.render("admin/upgrade", {
|
luci.template.render("admin/upgrade_confirm", {
|
||||||
step=2,
|
checksum=image_checksum(tmpfile),
|
||||||
checksum=image_checksum(),
|
|
||||||
filesize=nixio.fs.stat(tmpfile).size,
|
filesize=nixio.fs.stat(tmpfile).size,
|
||||||
flashsize=storage_size(),
|
flashsize=storage_size(),
|
||||||
keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1")
|
keepconfig=luci.http.formvalue("keepcfg") == "1"
|
||||||
} )
|
} )
|
||||||
|
|
||||||
-- Step 3: load iframe which calls the actual flash procedure
|
|
||||||
elseif step == 3 then
|
elseif step == 3 then
|
||||||
-- invoke sysupgrade
|
local keepcfg = luci.http.formvalue("keepcfg") == "1"
|
||||||
local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1"
|
fork_exec("/sbin/sysupgrade %s %q" % { keepcfg and "" or "-n", tmpfile })
|
||||||
fork_exec("/sbin/sysupgrade %s %q" %
|
luci.http.redirect(luci.dispatcher.build_url("admin", "upgrade", "reboot"))
|
||||||
{ keepcfg and "" or "-n"
|
|
||||||
, tmpfile
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
luci.template.render("admin/upgrade", { step=3 } )
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -153,3 +97,39 @@ function fork_exec(command)
|
|||||||
nixio.exec("/bin/sh", "-c", command)
|
nixio.exec("/bin/sh", "-c", command)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function image_supported(tmpfile)
|
||||||
|
-- XXX: yay...
|
||||||
|
return ( 0 == os.execute(
|
||||||
|
". /lib/functions.sh; " ..
|
||||||
|
"include /lib/upgrade; " ..
|
||||||
|
"platform_check_image %q >/dev/null"
|
||||||
|
% tmpfile
|
||||||
|
) )
|
||||||
|
end
|
||||||
|
|
||||||
|
function storage_size()
|
||||||
|
local size = 0
|
||||||
|
if nixio.fs.access("/proc/mtd") then
|
||||||
|
for l in io.lines("/proc/mtd") do
|
||||||
|
local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
|
||||||
|
if n == "linux" then
|
||||||
|
size = tonumber(s, 16)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif nixio.fs.access("/proc/partitions") then
|
||||||
|
for l in io.lines("/proc/partitions") do
|
||||||
|
local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
|
||||||
|
if b and n and not n:match('[0-9]') then
|
||||||
|
size = tonumber(b) * 1024
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return size
|
||||||
|
end
|
||||||
|
|
||||||
|
function image_checksum(tmpfile)
|
||||||
|
return (luci.sys.exec("md5sum %q" % tmpfile):match("^([^%s]+)"))
|
||||||
|
end
|
||||||
|
@ -17,89 +17,39 @@ $Id$
|
|||||||
|
|
||||||
<h2>Firmware aktualisieren</h2>
|
<h2>Firmware aktualisieren</h2>
|
||||||
|
|
||||||
<% if step == 1 then %>
|
<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
|
||||||
<% if supported then %>
|
<p>
|
||||||
<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
|
Hier kannst du ein manuelles Firmwareupdate durchführen.
|
||||||
<p>
|
</p>
|
||||||
Hier kannst du ein manuelles Firmwareupdate durchführen.
|
<% if bad_image then %>
|
||||||
</p>
|
<p class="error">Die übermittelte Firmwaredatei kann nicht verwendet werden.</p>
|
||||||
<% if bad_image then %>
|
|
||||||
<p class="error">Die übermittelte Firmwaredatei kann nicht verwendet werden.</p>
|
|
||||||
<% end %>
|
|
||||||
<div>
|
|
||||||
<h3>Firmware image</h3>
|
|
||||||
<input type="hidden" name="step" value="2" />
|
|
||||||
<input type="file" size="30" name="image" />
|
|
||||||
<% if keepavail then -%>
|
|
||||||
<br/>
|
|
||||||
<input type="checkbox" name="keepcfg" value="1" checked="checked" />
|
|
||||||
<label for="keepcfg">Einstellungen beibehalten</label>
|
|
||||||
<% end -%>
|
|
||||||
|
|
||||||
<div class="cbi-page-actions right">
|
|
||||||
<input class="cbi-button cbi-button-apply" type="submit" value="Upload image" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<% else %>
|
|
||||||
<p class="error">Auf diesem Gerät kann kein Upgrade durchgeführt werden.
|
|
||||||
Bitte führe das Upgrade manuell durch.</p>
|
|
||||||
<% end %>
|
|
||||||
<% elseif step == 2 then %>
|
|
||||||
<p>
|
|
||||||
Die Firmwaredatei wurde übermittelt. Bitte vergleiche MD5-Checksumme
|
|
||||||
und Dateigröße und klicke anschließend auf "Fortfahren".
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<% if flashsize > 0 and filesize > flashsize then %>
|
|
||||||
<p class="error">Die Firmware passt nicht in den Speicher des Gerätes.</p>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<ul>
|
|
||||||
<li>md5sum: <code><%=checksum%></code></li>
|
|
||||||
<li>Größe: <%
|
|
||||||
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(
|
|
||||||
" (%s available)",
|
|
||||||
w.byte_format(flashsize)
|
|
||||||
))
|
|
||||||
end
|
|
||||||
%></li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
<div class="cbi-page-actions right">
|
|
||||||
<form style="display:inline">
|
|
||||||
<input type="hidden" name="step" value="3" />
|
|
||||||
<input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
|
|
||||||
<input class="cbi-button cbi-button-apply" type="submit" value="Fortfahren" />
|
|
||||||
</form>
|
|
||||||
<form style="display:inline">
|
|
||||||
<input type="hidden" name="step" value="1" />
|
|
||||||
<input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
|
|
||||||
<input class="cbi-button cbi-button-reset" type="submit" value="Abbrechen" />
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<% elseif step == 3 then %>
|
|
||||||
<p>
|
|
||||||
Die Firmware wird jetzt aktualisiert.
|
|
||||||
<strong>UNTERBRICH AUF KEINEN FALL DIE STROMVERSORGUNG!</strong>
|
|
||||||
Dieser Vorgang wird einige Minuten dauern. Anschließend startet
|
|
||||||
das Gerät automatisch neu.
|
|
||||||
</p>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<div class="cbi-section-node">
|
||||||
|
<div class="cbi-value">
|
||||||
|
<label class="cbi-value-title">
|
||||||
|
Firmware-Datei
|
||||||
|
</label>
|
||||||
|
<div class="cbi-value-field">
|
||||||
|
<input class="cbi-input-file" type="file" name="image" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cbi-value cbi-value-last">
|
||||||
|
<label class="cbi-value-title">
|
||||||
|
Einstellungen beibehalten
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="cbi-value-field">
|
||||||
|
<input id="keepcfg" class="cbi-input-checkbox" type="checkbox" name="keepcfg" value="1" checked="checked" />
|
||||||
|
<label for="keepcfg"></label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cbi-page-actions right">
|
||||||
|
<input type="hidden" name="step" value="2" />
|
||||||
|
<input class="cbi-button cbi-button-apply" type="submit" value="Upload image" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
<%+footer%>
|
<%+footer%>
|
||||||
|
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
<%#
|
||||||
|
LuCI - Lua Configuration Interface
|
||||||
|
Copyright 2008 Steven Barth <steven@midlink.org>
|
||||||
|
Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
|
||||||
|
-%>
|
||||||
|
|
||||||
|
<%+header%>
|
||||||
|
|
||||||
|
<h2>Firmware aktualisieren</h2>
|
||||||
|
<p>
|
||||||
|
Die Firmwaredatei wurde übermittelt. Bitte vergleiche MD5-Checksumme
|
||||||
|
und Dateigröße und klicke anschließend auf "Fortfahren".
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<% if flashsize > 0 and filesize > flashsize then %>
|
||||||
|
<p class="error">Die Firmware passt nicht in den Speicher des Gerätes.</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<ul>
|
||||||
|
<li>md5sum: <code><%=checksum%></code></li>
|
||||||
|
<li>Größe: <%
|
||||||
|
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(
|
||||||
|
" (%s available)",
|
||||||
|
w.byte_format(flashsize)
|
||||||
|
))
|
||||||
|
end
|
||||||
|
%></li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
<div class="cbi-page-actions right">
|
||||||
|
<form style="display:inline">
|
||||||
|
<input type="hidden" name="step" value="3" />
|
||||||
|
<input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
|
||||||
|
<input class="cbi-button cbi-button-apply" type="submit" value="Fortfahren" />
|
||||||
|
</form>
|
||||||
|
<form style="display:inline">
|
||||||
|
<input type="hidden" name="step" value="1" />
|
||||||
|
<input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
|
||||||
|
<input class="cbi-button cbi-button-reset" type="submit" value="Abbrechen" />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<%+footer%>
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<title>Firmware wird aktualisiert</title>
|
||||||
|
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="maincontainer">
|
||||||
|
<div id="maincontent">
|
||||||
|
<p>
|
||||||
|
Die Firmware wird jetzt aktualisiert.
|
||||||
|
<strong>UNTERBRICH AUF KEINEN FALL DIE STROMVERSORGUNG!</strong>
|
||||||
|
Dieser Vorgang wird einige Minuten dauern.
|
||||||
|
Anschließend startet das Gerät automatisch neu.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user