Browse Source

gluon-luci-admin: restructure firmware upgrades

Nils Schneider 9 years ago
parent
commit
e2ff6a6ed3

+ 49 - 69
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

+ 33 - 83
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%>
 

+ 67 - 0
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%>
+

+ 21 - 0
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>