luci-mod-network: add bridge interface migration
authorRafał Miłecki <rafal@milecki.pl>
Tue, 18 May 2021 18:09:58 +0000 (20:09 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Thu, 27 May 2021 10:19:08 +0000 (12:19 +0200)
LuCI now supports the updated UCI syntax for bridges that requires:
1. device section for L2
2. interface section for L3

Check for legacy syntax usage and offser user a migration to allow
changing network config.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit bca76a767316a689d59dfd4974dcb7bfb04db1e8)

modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js

index bc4e1b7fe370dc938cd578d66542bf994feae0df..ba52a98637b35e35d87e8f191472ccd1776b41ff 100644 (file)
@@ -298,7 +298,52 @@ return view.extend({
                ]);
        },
 
+       interfaceWithIfnameSections: function() {
+               return uci.sections('network', 'interface').filter(function(ns) {
+                       return ns.type == 'bridge' && !ns.ports && ns.ifname;
+               });
+       },
+
+       handleMigration: function(ev) {
+               var interfaces = this.interfaceWithIfnameSections();
+               var tasks = [];
+
+               interfaces.forEach(function(ns) {
+                       var device_name = 'br-' + ns['.name'];
+
+                       tasks.push(uci.callAdd('network', 'device', null, {
+                               'name': device_name,
+                               'type': 'bridge',
+                               'ports': L.toArray(ns.ifname)
+                       }));
+
+                       tasks.push(uci.callSet('network', ns['.name'], {
+                               'type': '',
+                               'ifname': device_name
+                       }));
+               });
+
+               return Promise.all(tasks)
+                       .then(L.bind(ui.changes.init, ui.changes))
+                       .then(L.bind(ui.changes.apply, ui.changes));
+       },
+
+       renderMigration: 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 moved from "interface" sections to "device" sections 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')
+                               }, _('Continue')))
+               ]);
+       },
+
        render: function(data) {
+               if (this.interfaceWithIfnameSections().length)
+                       return this.renderMigration();
+
                var dslModemType = data[0],
                    netDevs = data[1],
                    m, s, o;