From e2ff6a6ed3ba455d5cf0acaa2d129a4be3a67758 Mon Sep 17 00:00:00 2001 From: Nils Schneider <nils@nilsschneider.net> Date: Thu, 28 Aug 2014 12:53:51 +0200 Subject: [PATCH] gluon-luci-admin: restructure firmware upgrades --- .../lib/lua/luci/controller/admin/upgrade.lua | 118 ++++++++---------- .../usr/lib/lua/luci/view/admin/upgrade.htm | 116 +++++------------ .../lua/luci/view/admin/upgrade_confirm.htm | 67 ++++++++++ .../lua/luci/view/admin/upgrade_reboot.htm | 21 ++++ 4 files changed, 170 insertions(+), 152 deletions(-) create mode 100644 package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm create mode 100644 package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_reboot.htm diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/upgrade.lua b/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/upgrade.lua index ff248bfae..868c2bbdb 100644 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/upgrade.lua +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/controller/admin/upgrade.lua @@ -16,51 +16,16 @@ $Id$ module("luci.controller.admin.upgrade", package.seeall) 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 function action_upgrade() - require("luci.model.uci") - 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 local file luci.http.setfilehandler( @@ -77,19 +42,10 @@ function action_upgrade() end ) - -- Determine state - local keep_avail = true local step = tonumber(luci.http.formvalue("step") or 1) local has_image = nixio.fs.access(tmpfile) - local has_support = image_supported() - 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. - -- + local has_support = image_supported(tmpfile) -- Step 1: file upload, error on unsupported image format if not has_image or not has_support or step == 1 then @@ -100,33 +56,21 @@ function action_upgrade() end luci.template.render("admin/upgrade", { - step=1, - bad_image=(has_image and not has_support or false), - keepavail=keep_avail, - supported=has_platform + bad_image=(has_image and not has_support or false) } ) -- Step 2: present uploaded file, show checksum, confirmation elseif step == 2 then - luci.template.render("admin/upgrade", { - step=2, - checksum=image_checksum(), + luci.template.render("admin/upgrade_confirm", { + checksum=image_checksum(tmpfile), filesize=nixio.fs.stat(tmpfile).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 - -- 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 } ) + local keepcfg = luci.http.formvalue("keepcfg") == "1" + fork_exec("/sbin/sysupgrade %s %q" % { keepcfg and "" or "-n", tmpfile }) + luci.http.redirect(luci.dispatcher.build_url("admin", "upgrade", "reboot")) end end @@ -153,3 +97,39 @@ function fork_exec(command) nixio.exec("/bin/sh", "-c", command) 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 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 8c9ea4f54..343ed4952 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 @@ -17,89 +17,39 @@ $Id$ <h2>Firmware aktualisieren</h2> -<% if step == 1 then %> - <% if supported then %> - <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data"> - <p> - Hier kannst du ein manuelles Firmwareupdate durchführen. - </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> +<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data"> +<p> + Hier kannst du ein manuelles Firmwareupdate durchführen. +</p> +<% if bad_image then %> +<p class="error">Die übermittelte Firmwaredatei kann nicht verwendet werden.</p> <% 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%> diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm new file mode 100644 index 000000000..ac3757619 --- /dev/null +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm @@ -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%> + diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_reboot.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_reboot.htm new file mode 100644 index 000000000..b9baa2794 --- /dev/null +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_reboot.htm @@ -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> -- GitLab