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