summaryrefslogtreecommitdiffhomepage
path: root/protocols/luci-proto-relay/luasrc/model/network
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/luci-proto-relay/luasrc/model/network')
-rw-r--r--protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua165
1 files changed, 165 insertions, 0 deletions
diff --git a/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua b/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua
new file mode 100644
index 000000000..42bd1f846
--- /dev/null
+++ b/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua
@@ -0,0 +1,165 @@
+--[[
+LuCI - Network model - relay protocol extension
+
+Copyright 2011 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+]]--
+
+local netmod = luci.model.network
+local device = luci.util.class(netmod.interface)
+
+netmod:register_pattern_virtual("^relay-%w")
+
+local proto = netmod:register_protocol("relay")
+
+function proto.get_i18n(self)
+ return luci.i18n.translate("Relay bridge")
+end
+
+function proto.ifname(self)
+ return "relay-" .. self.sid
+end
+
+function proto.opkg_package(self)
+ return "relayd"
+end
+
+function proto.is_installed(self)
+ return nixio.fs.access("/etc/init.d/relayd")
+end
+
+function proto.is_floating(self)
+ return true
+end
+
+function proto.is_virtual(self)
+ return true
+end
+
+function proto.get_interface(self)
+ return device(self.sid, self)
+end
+
+function proto.get_interfaces(self)
+ if not self.ifaces then
+ local ifs = { }
+ local _, net, dev
+
+ for net in luci.util.imatch(self:_get("network")) do
+ net = netmod:get_network(net)
+ if net then
+ dev = net:get_interface()
+ if dev then
+ ifs[dev:name()] = dev
+ end
+ end
+ end
+
+ for dev in luci.util.imatch(self:_get("ifname")) do
+ dev = netmod:get_interface(dev)
+ if dev then
+ ifs[dev:name()] = dev
+ end
+ end
+
+ self.ifaces = { }
+
+ for _, dev in luci.util.kspairs(ifs) do
+ self.ifaces[#self.ifaces+1] = dev
+ end
+ end
+
+ return self.ifaces
+end
+
+function proto.uptime(self)
+ local net
+ local upt = 0
+ for net in luci.util.imatch(self:_get("network")) do
+ net = netmod:get_network(net)
+ if net then
+ upt = math.max(upt, net:uptime())
+ end
+ end
+ return upt
+end
+
+
+function device.__init__(self, ifname, network)
+ self.ifname = ifname
+ self.network = network
+end
+
+function device.type(self)
+ return "tunnel"
+end
+
+function device.is_up(self)
+ if self.network then
+ local _, dev
+ for _, dev in ipairs(self.network:get_interfaces()) do
+ if not dev:is_up() then
+ return false
+ end
+ end
+ return true
+ end
+ return false
+end
+
+function device._stat(self, what)
+ local v = 0
+ if self.network then
+ local _, dev
+ for _, dev in ipairs(self.network:get_interfaces()) do
+ v = v + dev[what](dev)
+ end
+ end
+ return v
+end
+
+function device.rx_bytes(self) return self:_stat("rx_bytes") end
+function device.tx_bytes(self) return self:_stat("tx_bytes") end
+function device.rx_packets(self) return self:_stat("rx_packets") end
+function device.tx_packets(self) return self:_stat("tx_packets") end
+
+function device.mac(self)
+ if self.network then
+ local _, dev
+ for _, dev in ipairs(self.network:get_interfaces()) do
+ return dev:mac()
+ end
+ end
+end
+
+function device.ipaddrs(self)
+ local addrs = { }
+ if self.network then
+ addrs[1] = luci.ip.IPv4(self.network:_get("ipaddr"))
+ end
+ return addrs
+end
+
+function device.ip6addrs(self)
+ return { }
+end
+
+function device.shortname(self)
+ return "%s %q" % { luci.i18n.translate("Relay"), self.ifname }
+end
+
+function device.get_type_i18n(self)
+ return luci.i18n.translate("Relay Bridge")
+end