Merge pull request #3712 from TDT-AG/pr/20200303-luci-base
authorJo-Philipp Wich <jo@mein.io>
Wed, 4 Mar 2020 19:26:57 +0000 (20:26 +0100)
committerGitHub <noreply@github.com>
Wed, 4 Mar 2020 19:26:57 +0000 (20:26 +0100)
luci-base: extended network.js for check if new interface is createable

1  2 
modules/luci-base/htdocs/luci-static/resources/network.js

index 796b613beeb2cb20ffa237bee0faa907925ff2b2,9dcc1c8ffa90bc663ae1de905ca9b7989407cf78..c79022968ccc99132ab83285e40716f1f8b63dd4
@@@ -978,52 -978,47 +978,52 @@@ Network = L.Class.extend(/** @lends LuC
         * `false` if the given network could not be found.
         */
        deleteNetwork: function(name) {
 -              var requireFirewall = Promise.resolve(L.require('firewall')).catch(function() {});
 +              var requireFirewall = Promise.resolve(L.require('firewall')).catch(function() {}),
 +                  network = this.instantiateNetwork(name);
  
                return Promise.all([ requireFirewall, initNetworkState() ]).then(function() {
                        var uciInterface = uci.get('network', name);
  
                        if (uciInterface != null && uciInterface['.type'] == 'interface') {
 -                              uci.remove('network', name);
 +                              return Promise.resolve(network ? network.deleteConfiguration() : null).then(function() {
 +                                      uci.remove('network', name);
  
 -                              uci.sections('luci', 'ifstate', function(s) {
 -                                      if (s.interface == name)
 -                                              uci.remove('luci', s['.name']);
 -                              });
 +                                      uci.sections('luci', 'ifstate', function(s) {
 +                                              if (s.interface == name)
 +                                                      uci.remove('luci', s['.name']);
 +                                      });
  
 -                              uci.sections('network', 'alias', function(s) {
 -                                      if (s.interface == name)
 -                                              uci.remove('network', s['.name']);
 -                              });
 +                                      uci.sections('network', 'alias', function(s) {
 +                                              if (s.interface == name)
 +                                                      uci.remove('network', s['.name']);
 +                                      });
  
 -                              uci.sections('network', 'route', function(s) {
 -                                      if (s.interface == name)
 -                                              uci.remove('network', s['.name']);
 -                              });
 +                                      uci.sections('network', 'route', function(s) {
 +                                              if (s.interface == name)
 +                                                      uci.remove('network', s['.name']);
 +                                      });
  
 -                              uci.sections('network', 'route6', function(s) {
 -                                      if (s.interface == name)
 -                                              uci.remove('network', s['.name']);
 -                              });
 +                                      uci.sections('network', 'route6', function(s) {
 +                                              if (s.interface == name)
 +                                                      uci.remove('network', s['.name']);
 +                                      });
  
 -                              uci.sections('wireless', 'wifi-iface', function(s) {
 -                                      var networks = L.toArray(s.network).filter(function(network) { return network != name });
 +                                      uci.sections('wireless', 'wifi-iface', function(s) {
 +                                              var networks = L.toArray(s.network).filter(function(network) { return network != name });
  
 -                                      if (networks.length > 0)
 -                                              uci.set('wireless', s['.name'], 'network', networks.join(' '));
 -                                      else
 -                                              uci.unset('wireless', s['.name'], 'network');
 -                              });
 +                                              if (networks.length > 0)
 +                                                      uci.set('wireless', s['.name'], 'network', networks.join(' '));
 +                                              else
 +                                                      uci.unset('wireless', s['.name'], 'network');
 +                                      });
  
 -                              if (L.firewall)
 -                                      return L.firewall.deleteNetwork(name).then(function() { return true });
 +                                      if (L.firewall)
 +                                              return L.firewall.deleteNetwork(name).then(function() { return true });
  
 -                              return true;
 +                                      return true;
 +                              }).catch(function() {
 +                                      return false;
 +                              });
                        }
  
                        return false;
@@@ -2302,6 -2297,23 +2302,23 @@@ Protocol = L.Class.extend(/** @lends Lu
                return null;
        },
  
+       /**
+        * Check function for the protocol handler if a new interface is createable.
+        *
+        * This function should be overwritten by protocol specific subclasses.
+        *
+        * @abstract
+        *
+        * @param {string} ifname
+        * The name of the interface to be created.
+        *
+        * @returns {Promise<null|error message>}
+        * Returns `null` if new interface is createable, else returns (error) message.
+        */
+       isCreateable: function(ifname) {
+               return Promise.resolve(null);
+       },
        /**
         * Checks whether the protocol functionality is installed.
         *
                }
  
                return false;
 -      }
 +      },
 +
 +      /**
 +       * Cleanup related configuration entries.
 +       *
 +       * This function will be invoked if an interface is about to be removed
 +       * from the configuration and is responsible for performing any required
 +       * cleanup tasks, such as unsetting uci entries in related configurations.
 +       *
 +       * It should be overwritten by protocol specific subclasses.
 +       *
 +       * @abstract
 +       *
 +       * @returns {*|Promise<*>}
 +       * This function may return a promise which is awaited before the rest of
 +       * the configuration is removed. Any non-promise return value and any
 +       * resolved promise value is ignored. If the returned promise is rejected,
 +       * the interface removal will be aborted.
 +       */
 +      deleteConfiguration: function() {}
  });
  
  /**