luci-mod-network: fix device section cleanup
authorJo-Philipp Wich <jo@mein.io>
Mon, 29 Mar 2021 20:33:35 +0000 (22:33 +0200)
committerJo-Philipp Wich <jo@mein.io>
Mon, 29 Mar 2021 20:35:50 +0000 (22:35 +0200)
Ensure that device sections are only automatically removed after all
related options have been parsed, to avoid prematurely deleting sections.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js

index 3df72940aa29a201a08513f992476192e8d8410f..5ed55e24fcff0a83350828a72ce3160447661c30 100644 (file)
@@ -145,24 +145,9 @@ function deviceWrite(section_id, formvalue) {
 }
 
 function deviceRemove(section_id) {
-       var ds = lookupDevSection(this.section, section_id, false),
-           sv = ds ? uci.get('network', ds) : null;
-
-       if (sv) {
-               var empty = true;
+       var ds = lookupDevSection(this.section, section_id, false);
 
-               for (var opt in sv) {
-                       if (opt.charAt(0) == '.' || opt == 'name' || opt == this.option)
-                               continue;
-
-                       empty = false;
-               }
-
-               if (empty)
-                       uci.remove('network', ds);
-               else
-                       uci.unset('network', ds, this.option);
-       }
+       uci.unset('network', ds, this.option);
 
        if (this.migrate)
                uci.unset('network', section_id, this.option);
@@ -188,6 +173,28 @@ function deviceRefresh(section_id) {
        }
 }
 
+function sectionParse() {
+       var ds = lookupDevSection(this, this.section, false);
+
+       return form.NamedSection.prototype.parse.apply(this).then(function() {
+               var sv = ds ? uci.get('network', ds) : null;
+
+               if (sv) {
+                       var empty = true;
+
+                       for (var opt in sv) {
+                               if (opt.charAt(0) == '.' || opt == 'name')
+                                       continue;
+
+                               empty = false;
+                       }
+
+                       if (empty)
+                               uci.remove('network', ds);
+               }
+       });
+}
+
 
 var cbiTagValue = form.Value.extend({
        renderWidget: function(section_id, option_index, cfgvalue) {
@@ -387,6 +394,9 @@ return baseclass.extend({
                    o, ss;
 
                if (isIface) {
+                       if (!s.hasOwnProperty('parse'))
+                               s.parse = sectionParse;
+
                        var type;
 
                        /* If an externally configured br-xxx interface already exists,