luci-base: remove further related section types on deleting network
authorJo-Philipp Wich <jo@mein.io>
Fri, 22 Oct 2021 17:44:43 +0000 (19:44 +0200)
committerJo-Philipp Wich <jo@mein.io>
Fri, 22 Oct 2021 17:44:43 +0000 (19:44 +0200)
When removing a `config interface` section in `/etc/config/network`, drop
related `rule` and `rule6` sections too, as well as related `dhcp` sections
in `/etc/config/dhcp`.

Ref: https://forum.openwrt.org/t/grooming-etc-config/109764/7
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/network.js

index 17dd055e2520a5c914f2ac2a9d67c5ef3cd88ae3..2a402bcd57e733ce2267c7633e24199f18293550 100644 (file)
@@ -1005,9 +1005,10 @@ Network = baseclass.extend(/** @lends LuCI.network.prototype */ {
         */
        deleteNetwork: function(name) {
                var requireFirewall = Promise.resolve(L.require('firewall')).catch(function() {}),
+                   loadDHCP = L.resolveDefault(uci.load('dhcp')),
                    network = this.instantiateNetwork(name);
 
-               return Promise.all([ requireFirewall, initNetworkState() ]).then(function(res) {
+               return Promise.all([ requireFirewall, loadDHCP, initNetworkState() ]).then(function(res) {
                        var uciInterface = uci.get('network', name),
                            firewall = res[0];
 
@@ -1020,19 +1021,23 @@ Network = baseclass.extend(/** @lends LuCI.network.prototype */ {
                                                        uci.remove('luci', s['.name']);
                                        });
 
-                                       uci.sections('network', 'alias', function(s) {
-                                               if (s.interface == name)
-                                                       uci.remove('network', s['.name']);
-                                       });
+                                       uci.sections('network', null, function(s) {
+                                               switch (s['.type']) {
+                                               case 'alias':
+                                               case 'route':
+                                               case 'route6':
+                                                       if (s.interface == name)
+                                                               uci.remove('network', s['.name']);
 
-                                       uci.sections('network', 'route', function(s) {
-                                               if (s.interface == name)
-                                                       uci.remove('network', s['.name']);
-                                       });
+                                                       break;
 
-                                       uci.sections('network', 'route6', function(s) {
-                                               if (s.interface == name)
-                                                       uci.remove('network', s['.name']);
+                                               case 'rule':
+                                               case 'rule6':
+                                                       if (s.in == name || s.out == name)
+                                                               uci.remove('network', s['.name']);
+
+                                                       break;
+                                               }
                                        });
 
                                        uci.sections('wireless', 'wifi-iface', function(s) {
@@ -1044,6 +1049,11 @@ Network = baseclass.extend(/** @lends LuCI.network.prototype */ {
                                                        uci.unset('wireless', s['.name'], 'network');
                                        });
 
+                                       uci.sections('dhcp', 'dhcp', function(s) {
+                                               if (s.interface == name)
+                                                       uci.remove('dhcp', s['.name']);
+                                       });
+
                                        if (firewall)
                                                return firewall.deleteNetwork(name).then(function() { return true });