diff options
author | Rafał Miłecki <rafal@milecki.pl> | 2021-05-29 17:19:02 +0200 |
---|---|---|
committer | Rafał Miłecki <rafal@milecki.pl> | 2021-05-29 18:19:14 +0200 |
commit | e7c9c63c657963daa1a0d57dcb0848d88e909c25 (patch) | |
tree | 3a2a380dbf4779e3bc1acd12c346cd44c4f44818 /modules/luci-mod-network | |
parent | 79947af064122438c803f3b7bc580ede093a26e4 (diff) |
luci-mod-network: split config migration into 2 steps
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@hauke-m.de>
Fixes: 74be304e541f ("treewide: use "device" option in UCI "interface" sections")
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'modules/luci-mod-network')
-rw-r--r-- | modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js | 47 |
1 files changed, 34 insertions, 13 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..54c7b6cb3d 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,33 @@ return view.extend({ tasks.push(uci.callSet('network', ns['.name'], { 'type': '', + 'ifname': '', 'device': 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 +375,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 +390,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], |