summaryrefslogtreecommitdiffhomepage
path: root/protocols/luci-proto-relay
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/luci-proto-relay')
-rw-r--r--protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js183
-rw-r--r--protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua68
2 files changed, 183 insertions, 68 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)';
+ }
+});
diff --git a/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua b/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua
deleted file mode 100644
index 3381d85e47..0000000000
--- a/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua
+++ /dev/null
@@ -1,68 +0,0 @@
--- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local map, section, net = ...
-
-local ipaddr, network
-local forward_bcast, forward_dhcp, gateway, expiry, retry, table
-
-
-ipaddr = section:taboption("general", Value, "ipaddr",
- translate("Local IPv4 address"),
- translate("Address to access local relay bridge"))
-
-ipaddr.datatype = "ip4addr"
-
-
-network = s:taboption("general", DynamicList, "network", translate("Relay between networks"))
-network.widget = "checkbox"
-network.exclude = arg[1]
-network.template = "cbi/network_netlist"
-network.nocreate = true
-network.nobridges = true
-network.novirtual = true
-network:depends("proto", "relay")
-
-
-forward_bcast = section:taboption("advanced", Flag, "forward_bcast",
- translate("Forward broadcast traffic"))
-
-forward_bcast.default = forward_bcast.enabled
-
-
-forward_dhcp = section:taboption("advanced", Flag, "forward_dhcp",
- translate("Forward DHCP traffic"))
-
-forward_dhcp.default = forward_dhcp.enabled
-
-
-gateway = section:taboption("advanced", Value, "gateway",
- translate("Use DHCP gateway"),
- translate("Override the gateway in DHCP responses"))
-
-gateway.datatype = "ip4addr"
-gateway:depends("forward_dhcp", forward_dhcp.enabled)
-
-
-expiry = section:taboption("advanced", Value, "expiry",
- translate("Host expiry timeout"),
- translate("Specifies the maximum amount of seconds after which hosts are presumed to be dead"))
-
-expiry.placeholder = "30"
-expiry.datatype = "min(1)"
-
-
-retry = section:taboption("advanced", Value, "retry",
- translate("ARP retry threshold"),
- translate("Specifies the maximum amount of failed ARP requests until hosts are presumed to be dead"))
-
-retry.placeholder = "5"
-retry.datatype = "min(1)"
-
-
-table = section:taboption("advanced", Value, "table",
- translate("Use routing table"),
- translate("Override the table used for internal routes"))
-
-table.placeholder = "16800"
-table.datatype = "range(0,65535)"