[PATCH luci] luci-mod-network: split config migration into 2 steps

Rafał Miłecki zajec5 at gmail.com
Sat May 29 08:25:06 PDT 2021


From: Rafał Miłecki <rafal at milecki.pl>

Problem with handling all migrations in 1 step is that uci.sections()
doesn't include changes queued using uci.callAdd() and uci.callSet().
That could result in unexpected behaviour and generating invalid
configs.

For the sake of simplicity and reliability use 2 steps migration. The
downside is that users may get prompted twice to migrate.

Reported-by: Hauke Mehrtens <hauke at hauke-m.de>
Fixes: 74be304e541f ("treewide: use "device" option in UCI "interface" sections")
Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 .../resources/view/network/interfaces.js      | 48 +++++++++++++------
 1 file changed, 34 insertions(+), 14 deletions(-)

diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js
index 6f8fd614b1..343bc31cfd 100644
--- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js
+++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js
@@ -317,11 +317,10 @@ return view.extend({
 		});
 	},
 
-	handleMigration: function(ev) {
-		var interfaces = this.interfaceBridgeWithIfnameSections();
+	handleBridgeMigration: function(ev) {
 		var tasks = [];
 
-		interfaces.forEach(function(ns) {
+		this.interfaceBridgeWithIfnameSections().forEach(function(ns) {
 			var device_name = 'br-' + ns['.name'];
 
 			tasks.push(uci.callAdd('network', 'device', null, {
@@ -332,12 +331,32 @@ return view.extend({
 
 			tasks.push(uci.callSet('network', ns['.name'], {
 				'type': '',
-				'device': device_name
+				'ifname': device_name
 			}));
 		});
 
+		return Promise.all(tasks)
+			.then(L.bind(ui.changes.init, ui.changes))
+			.then(L.bind(ui.changes.apply, ui.changes));
+	},
+
+	renderBridgeMigration: function() {
+		ui.showModal(_('Network bridge configuration migration'), [
+			E('p', _('The existing network configuration needs to be changed for LuCI to function properly.')),
+			E('p', _('Upon pressing "Continue", bridges configuration will be updated and the network will be restarted to apply the updated configuration.')),
+			E('div', { 'class': 'right' },
+				E('button', {
+					'class': 'btn cbi-button-action important',
+					'click': ui.createHandlerFn(this, 'handleBridgeMigration')
+				}, _('Continue')))
+		]);
+	},
+
+	handleIfnameMigration: function(ev) {
+		var tasks = [];
+
 		this.deviceWithIfnameSections().forEach(function(ds) {
-			tasks.push(uci.callSet('network', ds['.name'], {
+			tasks.push(uci.add('network', ds['.name'], {
 				'ifname': '',
 				'ports': L.toArray(ds.ifname)
 			}));
@@ -355,14 +374,14 @@ return view.extend({
 			.then(L.bind(ui.changes.apply, ui.changes));
 	},
 
-	renderMigration: function() {
-		ui.showModal(_('Network bridge configuration migration'), [
+	renderIfnameMigration: function() {
+		ui.showModal(_('Network ifname configuration migration'), [
 			E('p', _('The existing network configuration needs to be changed for LuCI to function properly.')),
-			E('p', _('Upon pressing "Continue", bridges configuration will be updated and the network will be restarted to apply the updated configuration.')),
+			E('p', _('Upon pressing "Continue", ifname options will get renamed and the network will be restarted to apply the updated configuration.')),
 			E('div', { 'class': 'right' },
 				E('button', {
 					'class': 'btn cbi-button-action important',
-					'click': ui.createHandlerFn(this, 'handleMigration')
+					'click': ui.createHandlerFn(this, 'handleIfnameMigration')
 				}, _('Continue')))
 		]);
 	},
@@ -370,11 +389,12 @@ return view.extend({
 	render: function(data) {
 		var netifdVersion = (data[3] || '').match(/Version: ([^\n]+)/);
 
-		if (netifdVersion && netifdVersion[1] >= "2021-05-26" &&
-		    (this.interfaceBridgeWithIfnameSections().length ||
-		     this.deviceWithIfnameSections().length ||
-		     this.interfaceWithIfnameSections().length))
-			return this.renderMigration();
+		if (netifdVersion && netifdVersion[1] >= "2021-05-26") {
+			if (this.interfaceBridgeWithIfnameSections().length)
+				return this.renderBridgeMigration();
+			else if (this.deviceWithIfnameSections().length || this.interfaceWithIfnameSections().length)
+				return this.renderIfnameMigration();
+		}
 
 		var dslModemType = data[0],
 		    netDevs = data[1],
-- 
2.26.2




More information about the openwrt-devel mailing list