diff options
author | Jo-Philipp Wich <jo@mein.io> | 2019-08-20 15:31:35 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-09-10 15:28:16 +0200 |
commit | 6a2a53a82918ea2ccbbbe23510aa0279827b2783 (patch) | |
tree | 7f065f96cc0f255ced7256c1d9092f0e1433fda0 /protocols/luci-proto-relay | |
parent | 0674fc20414e575c346ceb2066ff3af7e8601a48 (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.js | 183 |
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)'; + } +}); |