summaryrefslogtreecommitdiffhomepage
path: root/protocols/luci-proto-relay
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2019-08-20 15:31:35 +0200
committerJo-Philipp Wich <jo@mein.io>2019-09-10 15:28:16 +0200
commit6a2a53a82918ea2ccbbbe23510aa0279827b2783 (patch)
tree7f065f96cc0f255ced7256c1d9092f0e1433fda0 /protocols/luci-proto-relay
parent0674fc20414e575c346ceb2066ff3af7e8601a48 (diff)
protocols: add client side protocol handler implementations
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'protocols/luci-proto-relay')
-rw-r--r--protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js183
1 files changed, 183 insertions, 0 deletions
diff --git a/protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js b/protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js
new file mode 100644
index 0000000000..b3082276b1
--- /dev/null
+++ b/protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js
@@ -0,0 +1,183 @@
+'use strict';
+'require uci';
+'require form';
+'require network';
+'require tools.widgets as widgets';
+
+network.registerPatternVirtual(/^relay-.+$/);
+
+var RelayDevicePrototype = {
+ __init__: function(ifname, network) {
+ this.ifname = ifname;
+ this.network = network;
+ },
+
+ _aggregateDevices: function(fn, first) {
+ var devices = this.network ? this.network.getDevices() : [],
+ rv = 0;
+
+ for (var i = 0; i < devices.length; i++) {
+ var v = devices[i][fn].apply(devices[i]);
+
+ if (v != null) {
+ if (first)
+ return v;
+
+ rv += v;
+ }
+ }
+
+ return first ? null : [ rv, devices.length ];
+ },
+
+ getPorts: function() { return this.network ? this.network.getDevices() : [] },
+
+ getType: function() { return 'tunnel' },
+ getTypeI18n: function() { return _('Relay Bridge') },
+
+ getShortName: function() {
+ return '%s "%h"'.format(_('Relay'), this.ifname);
+ },
+
+ isUp: function() {
+ var res = this._aggregateDevices('isUp');
+ return (res[1] > 0 && res[0] == res[1]);
+ },
+
+ getTXBytes: function() { return this._aggregateDevices('getTXBytes')[0] },
+ getRXBytes: function() { return this._aggregateDevices('getRXBytes')[0] },
+ getTXPackets: function() { return this._aggregateDevices('getTXPackets')[0] },
+ getRXPackets: function() { return this._aggregateDevices('getRXPackets')[0] },
+
+ getMAC: function() { return this._aggregateDevices('getMAC', true) },
+
+ getIPAddrs: function() {
+ var ipaddr = this.network ? L.toArray(uci.get('network', this.network.getName(), 'ipaddr'))[0] : null;
+ return (ipaddr != null ? [ ipaddr ] : []);
+ },
+
+ getIP6Addrs: function() { return [] }
+};
+
+return network.registerProtocol('relay', {
+ getI18n: function() {
+ return _('Relay bridge');
+ },
+
+ getIfname: function() {
+ return 'relay-%s'.format(this.sid);
+ },
+
+ getOpkgPackage: function() {
+ return 'relayd';
+ },
+
+ isFloating: function() {
+ return true;
+ },
+
+ isVirtual: function() {
+ return true;
+ },
+
+ containsDevice: function(ifname) {
+ return (network.getIfnameOf(ifname) == this.getIfname());
+ },
+
+ isUp: function() {
+ var dev = this.getDevice();
+ return (dev ? dev.isUp() : false);
+ },
+
+ getDevice: function() {
+ return network.instantiateDevice(this.sid, this, RelayDevicePrototype);
+ },
+
+ getDevices: function() {
+ if (this.devices)
+ return this.devices;
+
+ var networkNames = L.toArray(uci.get('network', this.sid, 'network')),
+ deviceNames = L.toArray(uci.get('network', this.sid, 'ifname')),
+ devices = {},
+ rv = [];
+
+ for (var i = 0; i < networkNames.length; i++) {
+ var net = network.instantiateNetwork(networkNames[i]),
+ dev = net ? net.getDevice() : null;
+
+ if (dev)
+ devices[dev.getName()] = dev;
+ }
+
+ for (var i = 0; i < deviceNames.length; i++) {
+ var dev = network.getDevice(deviceNames[i]);
+
+ if (dev)
+ devices[dev.getName()] = dev;
+ }
+
+ deviceNames = Object.keys(devices);
+ deviceNames.sort();
+
+ for (var i = 0; i < deviceNames.length; i++)
+ rv.push(devices[deviceNames[i]]);
+
+ this.devices = rv;
+
+ return rv;
+ },
+
+ getUptime: function() {
+ var networkNames = L.toArray(uci.get('network', this.sid, 'network')),
+ uptime = 0;
+
+ for (var i = 0; i < networkNames.length; i++) {
+ var net = network.instantiateNetwork(networkNames[i]);
+ if (net)
+ uptime = Math.max(uptime, net.getUptime());
+ }
+
+ return uptime;
+ },
+
+ getErrors: function() {
+ return null;
+ },
+
+ renderFormOptions: function(s) {
+ var o;
+
+ o = s.taboption('general', form.Value, 'ipaddr', _('Local IPv4 address'), _('Address to access local relay bridge'));
+ o.datatype = 'ip4addr("nomask")';
+
+ o = s.taboption('general', widgets.NetworkSelect, 'network', _('Relay between networks'));
+ o.exclude = s.section;
+ o.multiple = true;
+ o.nocreate = true;
+ o.nobridges = true;
+ o.novirtual = true;
+
+ o = s.taboption('advanced', form.Flag, 'forward_bcast', _('Forward broadcast traffic'));
+ o.default = o.enabled;
+
+ o = s.taboption('advanced', form.Flag, 'forward_dhcp', _('Forward DHCP traffic'));
+ o.default = o.enabled;
+
+ o = s.taboption('advanced', form.Value, 'gateway', _('Use DHCP gateway'), _('Override the gateway in DHCP responses'));
+ o.datatype = 'ip4addr("nomask")';
+ o.depends('forward_dhcp', '1');
+
+ o = s.taboption('advanced', form.Value, 'expiry', _('Host expiry timeout'), _('Specifies the maximum amount of seconds after which hosts are presumed to be dead'));
+ o.placeholder = '30';
+ o.datatype = 'min(1)';
+
+ o = s.taboption('advanced', form.Value, 'retry', _('ARP retry threshold'), _('Specifies the maximum amount of failed ARP requests until hosts are presumed to be dead'));
+ o.placeholder = '5';
+ o.datatype = 'min(1)';
+
+ o = s.taboption('advanced', form.Value, 'table', _('Use routing table'), _('Override the table used for internal routes'));
+ o.placeholder = '16800';
+ o.datatype = 'range(0,65535)';
+ }
+});