luci-proto-gre: improvement of LuCI interface
authorJan Bětík <jan.betik@svine.su>
Sat, 10 Oct 2020 21:48:17 +0000 (23:48 +0200)
committerJordan Sokolic <oofnik@gmail.com>
Sat, 27 Feb 2021 13:29:22 +0000 (15:29 +0200)
Better handling of Type of Service (IPv4), Traffic Class (IPv6) values
Optional value Local endpoint address is detected and pre-filled in the interface

Signed-off-by: Jan Bětík <jan.betik@svine.su>
protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js
protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js
protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js
protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js

index e431bccd760ab42f7a9d933dffd282a00f5ead49..f43e92019d198ed4846fac064e5d135a3c0948e2 100644 (file)
@@ -46,6 +46,13 @@ return network.registerProtocol('gre', {
                o = s.taboption('general', form.Value, 'ipaddr', _("Local IPv4 address"), _("The local IPv4 address over which the tunnel is created (optional)."));
                o.optional = true;
                o.datatype = 'ip4addr("nomask")';
+               o.load = function(section_id) {
+                       return network.getWANNetworks().then(L.bind(function(nets) {
+                               if (nets.length)
+                                       this.placeholder = nets[0].getIPAddr();
+                               return form.Value.prototype.load.apply(this, [section_id]);
+                       }, this));
+               };
 
                // -- advanced ---------------------------------------------------------------------
 
@@ -64,11 +71,11 @@ return network.registerProtocol('gre', {
                o.placeholder = 64;
                o.datatype = 'min(1)';
 
-               o = s.taboption('advanced', form.Value, 'tos', _('Override TOS'), _("Specify a TOS (Type of Service). Can be either <code>inherit</code> (the outer      header inherits the value of the inner header) or an hexadecimal value starting with <code>0x</code> (optional)."));
+               o = s.taboption('advanced', form.Value, 'tos', _("Override TOS"), _("Specify a TOS (Type of Service). Can be <code>inherit</code> (the outer header inherits the value of the inner header), or an hexadecimal value <code>00..FF</code> (optional)."));
                o.optional = true;
                o.validate = function(section_id, value) {
-                       if (value.length > 0 && !value.match(/^0x[a-fA-F0-9]{1,2}$/) && !value.match(/^inherit$/i))
-                               return _('Invalid value');
+                       if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i))
+                               return _("Invalid TOS value, expected 00..FF or inherit");
 
                        return true;
                };
@@ -79,6 +86,9 @@ return network.registerProtocol('gre', {
                o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional)."));
                o.optional = true;
 
+               o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional)."));
+               o.optional = true;
+
                o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional)."));
                o.optional = true;
                o.datatype = 'integer';
index 426b5d98dfe0f51905637d1bfac6ea86cfb2352b..bb61805bdadcd56096afdc5708408b8f936f6632 100644 (file)
@@ -46,6 +46,13 @@ return network.registerProtocol('gretap', {
                o = s.taboption('general', form.Value, 'ipaddr', _("Local IPv4 address"), _("The local IPv4 address over which the tunnel is created (optional)."));
                o.optional = true;
                o.datatype = 'ip4addr("nomask")';
+               o.load = function(section_id) {
+                       return network.getWANNetworks().then(L.bind(function(nets) {
+                               if (nets.length)
+                                       this.placeholder = nets[0].getIPAddr();
+                               return form.Value.prototype.load.apply(this, [section_id]);
+                       }, this));
+               };
 
                o = s.taboption('general', widgets.NetworkSelect, 'network', _("Network interface"), _("Logical network to which the tunnel will be added (bridged) (optional)."));
                o.exclude = s.section;
@@ -69,11 +76,11 @@ return network.registerProtocol('gretap', {
                o.placeholder = 64;
                o.datatype = 'min(1)';
 
-               o = s.taboption('advanced', form.Value, 'tos', _('Override TOS'), _("Specify a TOS (Type of Service). Can be either <code>inherit</code> (the outer      header inherits the value of the inner header) or an hexadecimal value starting with <code>0x</code> (optional)."));
+               o = s.taboption('advanced', form.Value, 'tos', _("Override TOS"), _("Specify a TOS (Type of Service). Can be <code>inherit</code> (the outer header inherits the value of the inner header) or an hexadecimal value <code>00..FF</code> (optional)."));
                o.optional = true;
                o.validate = function(section_id, value) {
-                       if (value.length > 0 && !value.match(/^0x[a-fA-F0-9]{1,2}$/) && !value.match(/^inherit$/i))
-                               return _('Invalid value');
+                       if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i))
+                               return _("Invalid TOS value, expected 00..FF or inherit");
 
                        return true;
                };
@@ -84,6 +91,9 @@ return network.registerProtocol('gretap', {
                o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional)."));
                o.optional = true;
 
+               o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional)."));
+               o.optional = true;
+
                o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional)."));
                o.optional = true;
                o.datatype = 'integer';
index bd9a43e27b828c0dde600e930d4cdae2e8fb0d0b..d8fb3d337732894bb9bae72a695c0c34fb5b91fb 100644 (file)
@@ -46,6 +46,13 @@ return network.registerProtocol('grev6', {
                o = s.taboption('general', form.Value, 'ip6addr', _("Local IPv6 address"), _("The local IPv6 address over which the tunnel is created (optional)."));
                o.optional = true;
                o.datatype = 'ip6addr("nomask")';
+               o.load = function(section_id) {
+                       return network.getWAN6Networks().then(L.bind(function(nets) {
+                               if (Array.isArray(nets) && nets.length)
+                                       this.placeholder = nets[0].getIP6Addr();
+                               return form.Value.prototype.load.apply(this, [section_id]);
+                       }, this));
+               };
 
                o = s.taboption('general', widgets.NetworkSelect, 'weakif', _("Source interface"), _("Logical network from which to select the local endpoint if local IPv6 address is empty and no WAN IPv6 is available (optional)."));
                o.exclude = s.section;
@@ -69,11 +76,11 @@ return network.registerProtocol('grev6', {
                o.placeholder = 64;
                o.datatype = 'min(1)';
 
-               o = s.taboption('advanced', form.Value, 'tos', _('Traffic Class'), _("Specify a Traffic Class. Can be either <code>inherit</code> (the outer header inherits the value of the inner header) or an hexadecimal value starting with <code>0x</code> (optional)."));
+               o = s.taboption('advanced', form.Value, 'tos', _("Traffic Class"), _("Specify a Traffic Class. Can be <code>inherit</code> (the outer header inherits the value of the inner header) or an hexadecimal value <code>00..FF</code> (optional)."));
                o.optional = true;
                o.validate = function(section_id, value) {
-                       if (value.length > 0 && !value.match(/^0x[a-fA-F0-9]{1,2}$/) && !value.match(/^inherit$/i))
-                               return _('Invalid value');
+                       if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i)))
+                               return _("Invalid Traffic Class value, expected 00..FF or inherit");
 
                        return true;
                };
@@ -81,6 +88,9 @@ return network.registerProtocol('grev6', {
                o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional)."));
                o.optional = true;
 
+               o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional)."));
+               o.optional = true;
+
                o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional)."));
                o.optional = true;
                o.datatype = 'integer';
index 3b1a5037191b0611b112bb27ac97facd1826adb9..bf3eead669f55a6b3000cdb1a5b6a07ff9276d61 100644 (file)
@@ -42,6 +42,13 @@ return network.registerProtocol('grev6tap', {
                o = s.taboption('general', form.Value, 'peer6addr', _("Remote IPv6 address or FQDN"), _("The IPv6 address or the fully-qualified domain name of the remote tunnel end."));
                o.optional = false;
                o.datatype = 'or(hostname,ip6addr("nomask"))';
+               o.load = function(section_id) {
+                       return network.getWAN6Networks().then(L.bind(function(nets) {
+                               if (Array.isArray(nets) && nets.length)
+                                       this.placeholder = nets[0].getIP6Addr();
+                               return form.Value.prototype.load.apply(this, [section_id]);
+                       }, this));
+               };
 
                o = s.taboption('general', form.Value, 'ip6addr', _("Local IPv6 address"), _("The local IPv6 address over which the tunnel is created (optional)."));
                o.optional = true;
@@ -74,11 +81,11 @@ return network.registerProtocol('grev6tap', {
                o.placeholder = 64;
                o.datatype = 'min(1)';
 
-               o = s.taboption('advanced', form.Value, 'tos', _('Traffic Class'), _("Specify a Traffic Class. Can be either <code>inherit</code> (the outer header inherits the value of the inner header) or an hexadecimal value starting with <code>0x</code> (optional)."));
+               o = s.taboption('advanced', form.Value, 'tos', _("Traffic Class"), _("Specify a Traffic Class. Can be <code>inherit</code> (the outer header inherits the value of the inner header) or an hexadecimal value <code>00..FF</code> (optional)."));
                o.optional = true;
                o.validate = function(section_id, value) {
-                       if (value.length > 0 && !value.match(/^0x[a-fA-F0-9]{1,2}$/) && !value.match(/^inherit$/i))
-                               return _('Invalid value');
+                       if (value.length > 0 && !value.match(/^[a-f0-9]{1,2}$/i) && !value.match(/^inherit$/i))
+                               return _("Invalid Traffic Class value, expected 00..FF or inherit");
 
                        return true;
                };
@@ -86,6 +93,9 @@ return network.registerProtocol('grev6tap', {
                o = s.taboption('advanced', form.Flag, 'nohostroute', _("No host route"), _("Do not create host route to peer (optional)."));
                o.optional = true;
 
+               o = s.taboption('advanced', form.Flag, 'multicast', _("Multicast"), _("Enable support for multicast traffic (optional)."));
+               o.optional = true;
+
                o = s.taboption('advanced', form.Value, 'ikey', _("Incoming key"), _("Key for incoming packets (optional)."));
                o.optional = true;
                o.datatype = 'integer';