diff mbox series

[OpenWrt-Devel,luci,1/2] luci-mod-system: use "system" new "validate_firmware_image" ubus method

Message ID 20190925145138.6185-1-zajec5@gmail.com
State Accepted
Headers show
Series [OpenWrt-Devel,luci,1/2] luci-mod-system: use "system" new "validate_firmware_image" ubus method | expand

Commit Message

Rafał Miłecki Sept. 25, 2019, 2:51 p.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

This new ubus method provides more properly-formatted details about
firmware file. Use it to check if uploaded image is valid.

The old "sysupgrade --test" method is left for now to provide stderr
output.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 .../resources/view/system/flash.js            | 30 ++++++++++++-------
 1 file changed, 20 insertions(+), 10 deletions(-)

Comments

Rafał Miłecki Sept. 26, 2019, 4:27 a.m. UTC | #1
On 25.09.2019 16:51, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> This new ubus method provides more properly-formatted details about
> firmware file. Use it to check if uploaded image is valid.
> 
> The old "sysupgrade --test" method is left for now to provide stderr
> output.
> 
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>

Missed part:

diff --git a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json
index 31c154cbc..182f24988 100644
--- a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json
+++ b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json
@@ -44,6 +44,7 @@
  				"network.device": [ "status" ],
  				"network.interface": [ "dump" ],
  				"network": [ "get_proto_handlers" ],
+				"system": [ "validate_firmware_image" ],
  				"uci": [ "changes", "get" ]
  			},
  			"uci": [ "*" ]
diff mbox series

Patch

diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
index 9ad64dad4..784ec135b 100644
--- a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
+++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
@@ -2,7 +2,7 @@ 
 'require form';
 'require rpc';
 
-var callFileStat, callFileRead, callFileWrite, callFileExec, callFileRemove;
+var callFileStat, callFileRead, callFileWrite, callFileExec, callFileRemove, callSystemValidateFirmwareImage;
 
 callFileStat = rpc.declare({
 	object: 'file',
@@ -38,6 +38,12 @@  callFileRemove = rpc.declare({
 	params: [ 'path' ]
 });
 
+callSystemValidateFirmwareImage = rpc.declare({
+	object: 'system',
+	method: 'validate_firmware_image',
+	params: [ 'path' ]
+});
+
 function pingDevice(proto, ipaddr) {
 	var target = '%s://%s%s?%s'.format(proto || 'http', ipaddr || window.location.host, L.resource('icons/loading.gif'), Math.random());
 
@@ -345,13 +351,17 @@  return L.view.extend({
 					E('span', { 'class': 'spinning' }, _('Verifying the uploaded image file.'))
 				]);
 
+				return callSystemValidateFirmwareImage('/tmp/firmware.bin')
+					.then(function(res) { return [ reply, res ]; });
+			}, this, ev.target))
+			.then(L.bind(function(btn, reply) {
 				return callFileExec('/sbin/sysupgrade', [ '--test', '/tmp/firmware.bin' ])
-					.then(function(res) { return [ reply, res ] });
+					.then(function(res) { reply.push(res); return reply; });
 			}, this, ev.target))
 			.then(L.bind(function(btn, res) {
 				var keep = document.querySelector('[data-name="keep"] input[type="checkbox"]'),
 				    force = E('input', { type: 'checkbox' }),
-				    is_invalid = (res[1].code != 0),
+				    is_valid = res[1].valid,
 				    is_too_big = (storage_size > 0 && res[0].size > storage_size),
 				    body = [];
 
@@ -363,7 +373,7 @@  return L.view.extend({
 					E('li', {}, keep.checked ? _('Configuration files will be kept') : _('Caution: Configuration files will be erased'))
 				]));
 
-				if (is_invalid || is_too_big)
+				if (!is_valid || is_too_big)
 					body.push(E('hr'));
 
 				if (is_too_big)
@@ -371,15 +381,15 @@  return L.view.extend({
 						_('It appears that you are trying to flash an image that does not fit into the flash memory, please verify the image file!')
 					]));
 
-				if (is_invalid)
+				if (!is_valid)
 					body.push(E('p', { 'class': 'alert-message' }, [
-						res[1].stderr ? res[1].stderr : '',
-						res[1].stderr ? E('br') : '',
-						res[1].stderr ? E('br') : '',
+						res[2].stderr ? res[2].stderr : '',
+						res[2].stderr ? E('br') : '',
+						res[2].stderr ? E('br') : '',
 						_('The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform.')
 					]));
 
-				if (is_invalid || is_too_big)
+				if (!is_valid || is_too_big)
 					body.push(E('p', {}, E('label', { 'class': 'btn alert-message danger' }, [
 						force, ' ', _('Force upgrade'),
 						E('br'), E('br'),
@@ -389,7 +399,7 @@  return L.view.extend({
 				var cntbtn = E('button', {
 					'class': 'btn cbi-button-action important',
 					'click': L.ui.createHandlerFn(this, 'handleSysupgradeConfirm', btn, keep.checked, force.checked),
-					'disabled': (is_invalid || is_too_big) ? true : null
+					'disabled': (!is_valid || is_too_big) ? true : null
 				}, [ _('Continue') ]);
 
 				body.push(E('div', { 'class': 'right' }, [