libs/core: merge luci.model.wireless into luci.model.network

This commit is contained in:
Jo-Philipp Wich 2010-10-30 00:40:07 +00:00
parent 33378709a9
commit df01f3e431
2 changed files with 457 additions and 473 deletions

View file

@ -17,8 +17,8 @@ limitations under the License.
]]--
local type, pairs, ipairs, loadfile, table, tonumber, i18n
= type, pairs, ipairs, loadfile, table, tonumber, luci.i18n
local type, pairs, ipairs, loadfile, table, tonumber, math, i18n
= type, pairs, ipairs, loadfile, table, tonumber, math, luci.i18n
local nxo = require "nixio"
local ipc = require "luci.ip"
@ -32,7 +32,7 @@ module "luci.model.network"
local ifs, brs, sws, uci_r, uci_s
function list_remove(c, s, o, r)
function _list_del(c, s, o, r)
local val = uci_r:get(c, s, o)
if val then
local l = { }
@ -62,7 +62,7 @@ function list_remove(c, s, o, r)
end
end
function list_add(c, s, o, a)
function _list_add(c, s, o, a)
local val = uci_r:get(c, s, o) or ""
if type(val) == "string" then
local l = { }
@ -85,14 +85,35 @@ function list_add(c, s, o, a)
end
end
function wifi_iface(x)
function _stror(s1, s2)
if not s1 or #s1 == 0 then
return s2 and #s2 > 0 and s2
else
return s1
end
end
function _get(c, s, o)
return uci_r:get(c, s, o)
end
function _set(c, s, o, v)
if v ~= nil then
if type(v) == "boolean" then v = v and "1" or "0" end
return uci_r:set(c, s, o, v)
else
return uci_r:del(c, s, o, v)
end
end
function _wifi_iface(x)
return (
x:match("^wlan%d") or x:match("^wl%d") or x:match("^ath%d") or
x:match("^%w+%.network%d")
)
end
function wifi_lookup(ifn)
function _wifi_lookup(ifn)
-- got a radio#.network# pseudo iface, locate the corresponding section
local radio, ifnidx = ifn:match("^(%w+)%.network(%d+)$")
if radio and ifnidx then
@ -114,7 +135,7 @@ function wifi_lookup(ifn)
return sid
-- looks like wifi, try to locate the section via state vars
elseif wifi_iface(ifn) then
elseif _wifi_iface(ifn) then
local sid = nil
uci_s:foreach("wireless", "wifi-iface",
@ -129,7 +150,7 @@ function wifi_lookup(ifn)
end
end
function iface_ignore(x)
function _iface_ignore(x)
return (
x:match("^wmaster%d") or x:match("^wifi%d") or x:match("^hwsim%d") or
x:match("^imq%d") or x:match("^mon.wlan%d") or x:match("^6in4-%w") or
@ -140,70 +161,80 @@ end
function init(cursor)
if cursor then
uci_r = cursor
uci_s = cursor:substate()
uci_r = cursor or luci.model.uci.cursor()
uci_s = cursor:substate()
ifs = { }
brs = { }
sws = { }
ifs = { }
brs = { }
sws = { }
-- read interface information
local n, i
for n, i in ipairs(nxo.getifaddrs()) do
local name = i.name:match("[^:]+")
local prnt = name:match("^([^%.]+)%.")
-- read interface information
local n, i
for n, i in ipairs(nxo.getifaddrs()) do
local name = i.name:match("[^:]+")
local prnt = name:match("^([^%.]+)%.")
if not iface_ignore(name) then
ifs[name] = ifs[name] or {
idx = i.ifindex or n,
name = name,
rawname = i.name,
flags = { },
ipaddrs = { },
ip6addrs = { }
}
if not _iface_ignore(name) then
ifs[name] = ifs[name] or {
idx = i.ifindex or n,
name = name,
rawname = i.name,
flags = { },
ipaddrs = { },
ip6addrs = { }
}
if prnt then
sws[name] = true
sws[prnt] = true
end
if i.family == "packet" then
ifs[name].flags = i.flags
ifs[name].stats = i.data
ifs[name].macaddr = i.addr
elseif i.family == "inet" then
ifs[name].ipaddrs[#ifs[name].ipaddrs+1] = ipc.IPv4(i.addr, i.netmask)
elseif i.family == "inet6" then
ifs[name].ip6addrs[#ifs[name].ip6addrs+1] = ipc.IPv6(i.addr, i.netmask)
end
if prnt then
sws[name] = true
sws[prnt] = true
end
end
-- read bridge informaton
local b, l
for l in utl.execi("brctl show") do
if not l:match("STP") then
local r = utl.split(l, "%s+", nil, true)
if #r == 4 then
b = {
name = r[1],
id = r[2],
stp = r[3] == "yes",
ifnames = { ifs[r[4]] }
}
if b.ifnames[1] then
b.ifnames[1].bridge = b
end
brs[r[1]] = b
elseif b then
b.ifnames[#b.ifnames+1] = ifs[r[2]]
b.ifnames[#b.ifnames].bridge = b
end
if i.family == "packet" then
ifs[name].flags = i.flags
ifs[name].stats = i.data
ifs[name].macaddr = i.addr
elseif i.family == "inet" then
ifs[name].ipaddrs[#ifs[name].ipaddrs+1] = ipc.IPv4(i.addr, i.netmask)
elseif i.family == "inet6" then
ifs[name].ip6addrs[#ifs[name].ip6addrs+1] = ipc.IPv6(i.addr, i.netmask)
end
end
end
-- read bridge informaton
local b, l
for l in utl.execi("brctl show") do
if not l:match("STP") then
local r = utl.split(l, "%s+", nil, true)
if #r == 4 then
b = {
name = r[1],
id = r[2],
stp = r[3] == "yes",
ifnames = { ifs[r[4]] }
}
if b.ifnames[1] then
b.ifnames[1].bridge = b
end
brs[r[1]] = b
elseif b then
b.ifnames[#b.ifnames+1] = ifs[r[2]]
b.ifnames[#b.ifnames].bridge = b
end
end
end
return _M
end
function save(self, ...)
uci_r:save(...)
uci_r:load(...)
end
function commit(self, ...)
uci_r:commit(...)
uci_r:load(...)
end
function has_ipv6(self)
@ -226,10 +257,18 @@ end
function get_networks(self)
local nets = { }
local nls = { }
uci_r:foreach("network", "interface",
function(s)
nets[#nets+1] = network(s['.name'])
nls[s['.name']] = network(s['.name'])
end)
local n
for n in utl.kspairs(nls) do
nets[#nets+1] = nls[n]
end
return nets
end
@ -310,7 +349,7 @@ function rename_network(self, old, new)
end
function get_interface(self, i)
if ifs[i] or wifi_iface(i) then
if ifs[i] or _wifi_iface(i) then
return interface(i)
else
local ifc
@ -336,7 +375,7 @@ function get_interfaces(self)
-- find normal interfaces
for iface in utl.kspairs(ifs) do
if not iface_ignore(iface) and not wifi_iface(iface) then
if not _iface_ignore(iface) and not _wifi_iface(iface) then
ifaces[#ifaces+1] = interface(iface)
end
end
@ -361,7 +400,53 @@ function get_interfaces(self)
end
function ignore_interface(self, x)
return iface_ignore(x)
return _iface_ignore(x)
end
function get_wifidev(self, dev)
if uci_r:get("wireless", dev) == "wifi-device" then
return wifidev(dev)
end
end
function get_wifidevs(self)
local devs = { }
local wfd = { }
uci_r:foreach("wireless", "wifi-device",
function(s) wfd[#wfd+1] = s['.name'] end)
local dev
for _, dev in utl.vspairs(wfd) do
devs[#devs+1] = wifidev(dev)
end
return devs
end
function get_wifinet(self, net)
local wnet = _wifi_lookup(net)
if wnet then
return wifinet(wnet)
end
end
function add_wifinet(self, net, options)
if type(options) == "table" and options.device and
uci_r:get("wireless", options.device) == "wifi-device"
then
local wnet = uci_r:section("wireless", "wifi-iface", nil, options)
return wifinet(wnet)
end
end
function del_wifinet(self, net)
local wnet = _wifi_lookup(net)
if wnet then
uci_r:delete("wireless", wnet)
return true
end
return false
end
@ -379,6 +464,14 @@ function network._get(self, opt)
return v or ""
end
function network.get(self, opt)
return _get("network", self.sid, opt)
end
function network.set(self, opt, val)
return _set("network", self.sid, opt, val)
end
function network.ifname(self)
local p = self:proto()
if self:is_bridge() then
@ -475,35 +568,35 @@ function network.add_interface(self, ifname)
-- remove the interface from all ifaces
uci_r:foreach("network", "interface",
function(s)
list_remove("network", s['.name'], "ifname", ifname)
_list_del("network", s['.name'], "ifname", ifname)
end)
-- if its a wifi interface, change its network option
local wif = wifi_lookup(ifname)
local wif = _wifi_lookup(ifname)
if wif then
uci_r:set("wireless", wif, "network", self.sid)
-- add iface to our iface list
else
list_add("network", self.sid, "ifname", ifname)
_list_add("network", self.sid, "ifname", ifname)
end
end
end
function network.del_interface(self, ifname)
if not self:is_virtual() then
if type(ifname) ~= "string" then
if utl.instanceof(ifname, interface) then
ifname = ifname:name()
else
ifname = ifname:match("[^%s:]+")
end
-- if its a wireless interface, clear its network option
local wif = wifi_lookup(ifname)
local wif = _wifi_lookup(ifname)
if wif then uci_r:delete("wireless", wif, "network") end
-- remove the interface
list_remove("network", self.sid, "ifname", ifname)
_list_del("network", self.sid, "ifname", ifname)
end
end
@ -565,7 +658,7 @@ function network.contains_interface(self, ifname)
end
end
local wif = wifi_lookup(ifname)
local wif = _wifi_lookup(ifname)
if wif then
return (uci_r:get("wireless", wif, "network") == self.sid)
end
@ -581,21 +674,15 @@ end
interface = utl.class()
function interface.__init__(self, ifname)
self.wif = wifi_lookup(ifname)
if self.wif then
self.ifname = uci_s:get("wireless", self.wif, "ifname")
self.iwinfo = self.ifname and sys.wifi.getiwinfo(self.ifname) or { }
self.iwdata = uci_s:get_all("wireless", self.wif) or { }
self.iwname = ifname
end
local wif = _wifi_lookup(ifname)
if wif then self.wif = wifinet(wif) end
self.ifname = self.ifname or ifname
self.dev = ifs[self.ifname]
end
function interface.name(self)
return self.wif and uci_s:get("wireless", self.wif, "ifname") or self.ifname
return self.wif and self.wif:ifname() or self.ifname
end
function interface.mac(self)
@ -611,7 +698,7 @@ function interface.ip6addrs(self)
end
function interface.type(self)
if wifi_iface(self.ifname) then
if self.wif or _wifi_iface(self.ifname) then
return "wifi"
elseif brs[self.ifname] then
return "bridge"
@ -622,21 +709,11 @@ function interface.type(self)
end
end
function _choose(s1, s2)
if not s1 or #s1 == 0 then
return s2 and #s2 > 0 and s2
else
return s1
end
end
function interface.shortname(self)
if self.iwinfo or self.iwdata then
if self.wif then
return "%s %q" %{
i18n.translate(self.iwinfo.mode),
_choose(self.iwinfo.ssid, self.iwdata.ssid ) or
_choose(self.iwinfo.bssid, self.iwdata.bssid) or
"%s (%s)" %{ i18n.translate("unknown"), self.ifname }
self.wif:active_mode(),
self.wif:active_ssid() or self.wif:active_bssid()
}
else
return self.ifname
@ -644,13 +721,11 @@ function interface.shortname(self)
end
function interface.get_i18n(self)
if self.iwinfo or self.iwdata then
if self.wif then
return "%s: %s %q" %{
i18n.translate("Wireless Network"),
_choose(self.iwinfo.mode, self.iwdata.mode ),
_choose(self.iwinfo.ssid, self.iwdata.ssid ) or
_choose(self.iwinfo.bssid, self.iwdata.bssid) or
"%s (%s)" %{ i18n.translate("unknown"), self.ifname }
self.wif:active_mode(),
self.wif:active_ssid() or self.wif:active_bssid()
}
else
return "%s: %q" %{ self:get_type_i18n(), self:name() }
@ -671,9 +746,8 @@ function interface.get_type_i18n(self)
end
function interface.adminlink(self)
if self:type() == "wifi" then
return dsp.build_url("admin", "network", "wireless",
self.iwdata.device, self.iwname)
if self.wif then
return self.wif:adminlink()
end
end
@ -705,7 +779,11 @@ function interface.bridge_stp(self)
end
function interface.is_up(self)
return self.dev and self.dev.flags and self.dev.flags.up or false
if self.wif then
return self.wif:is_up()
else
return self.dev and self.dev.flags and self.dev.flags.up or false
end
end
function interface.is_bridge(self)
@ -753,3 +831,276 @@ function interface.get_network(self)
return self.network
end
end
function interface.get_wifinet(self)
return self.wif
end
wifidev = utl.class()
function wifidev.__init__(self, dev)
self.sid = dev
end
function wifidev.get(self, opt)
return _get("wireless", self.sid, opt)
end
function wifidev.set(self, opt, val)
return _set("wireless", self.sid, opt, val)
end
function wifidev.name(self)
return self.sid
end
function wifidev.is_up(self)
local up = false
uci_s:foreach("wireless", "wifi-iface",
function(s)
if s.device == self.sid then
if s.up == "1" then
up = true
return false
end
end
end)
return up
end
function wifidev.get_wifinet(self, net)
if uci_r:get("wireless", net) == "wifi-iface" then
return wifinet(net)
else
local wnet = _wifi_lookup(net)
if wnet then
return wifinet(wnet)
end
end
end
function wifidev.get_wifinets(self)
local nets = { }
uci_r:foreach("wireless", "wifi-iface",
function(s)
if s.device == self.sid then
nets[#nets+1] = wifinet(s['.name'])
end
end)
return nets
end
function wifidev.add_wifinet(self, options)
options = options or { }
options.device = self.sid
local wnet = uci_r:section("wifidev", "wifi-iface", nil, options)
if wnet then
return wifinet(wnet)
end
end
function wifidev.del_wifinet(self, net)
if utl.instanceof(net, wifinet) then
net = net.sid
elseif uci_r:get("wireless", net) ~= "wifi-iface" then
net = _wifi_lookup(net)
end
if net and uci_r:get("wireless", net, "device") == self.sid then
uci_r:delete("wireless", net)
return true
end
return false
end
wifinet = utl.class()
function wifinet.__init__(self, net)
self.sid = net
local dev = uci_s:get("wireless", self.sid, "ifname")
if not dev then
local num = { }
uci_r:foreach("wireless", "wifi-iface",
function(s)
if s.device then
num[s.device] = num[s.device] and num[s.device] + 1 or 1
if s['.name'] == self.sid then
dev = "%s.network%d" %{ s.device, num[s.device] }
return false
end
end
end)
end
self.wdev = dev
self.iwdata = uci_s:get_all("wireless", self.sid) or { }
self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
end
function wifinet.get(self, opt)
return _get("wireless", self.sid, opt)
end
function wifinet.set(self, opt, val)
return _set("wireless", self.sid, opt, val)
end
function wifinet.mode(self)
return uci_s:get("wireless", self.sid, "mode") or "ap"
end
function wifinet.ssid(self)
return uci_s:get("wireless", self.sid, "ssid")
end
function wifinet.bssid(self)
return uci_s:get("wireless", self.sid, "bssid")
end
function wifinet.network(self)
return uci_s:get("wifinet", self.sid, "network")
end
function wifinet.name(self)
return self.sid
end
function wifinet.ifname(self)
return self.iwinfo.ifname or self.wdev
end
function wifinet.get_device(self)
if self.iwdata.device then
return wifidev(self.iwdata.device)
end
end
function wifinet.is_up(self)
return (self.iwdata.up == "1")
end
function wifinet.active_mode(self)
local m = _stror(self.iwinfo.mode, self.iwdata.mode) or "ap"
if m == "ap" then m = "AP"
elseif m == "sta" then m = "Client"
elseif m == "adhoc" then m = "Ad-Hoc"
elseif m == "mesh" then m = "Mesh"
elseif m == "monitor" then m = "Monitor"
end
return m
end
function wifinet.active_mode_i18n(self)
return i18n.translate(self:active_mode())
end
function wifinet.active_ssid(self)
return _stror(self.iwinfo.ssid, self.iwdata.ssid)
end
function wifinet.active_bssid(self)
return _stror(self.iwinfo.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00"
end
function wifinet.active_encryption(self)
local enc = self.iwinfo and self.iwinfo.encryption
return enc and enc.description or "-"
end
function wifinet.assoclist(self)
return self.iwinfo.assoclist or { }
end
function wifinet.frequency(self)
local freq = self.iwinfo.frequency
if freq and freq > 0 then
return "%.03f" % (freq / 1000)
end
end
function wifinet.bitrate(self)
local rate = self.iwinfo.bitrate
if rate and rate > 0 then
return (rate / 1000)
end
end
function wifinet.channel(self)
return self.iwinfo.channel or
tonumber(uci_s:get("wireless", self.iwdata.device, "channel"))
end
function wifinet.signal(self)
return self.iwinfo.signal or 0
end
function wifinet.noise(self)
return self.iwinfo.noise or 0
end
function wifinet.signal_level(self, s, n)
if self:active_bssid() ~= "00:00:00:00:00:00" then
local signal = s or self:signal()
local noise = n or self:noise()
if signal < 0 and noise < 0 then
local snr = -1 * (noise - signal)
return math.floor(snr / 5)
else
return 0
end
else
return -1
end
end
function wifinet.signal_percent(self)
local qc = self.iwinfo.quality or 0
local qm = self.iwinfo.quality_max or 0
if qc > 0 and qm > 0 then
return math.floor((100 / qm) * qc)
else
return 0
end
end
function wifinet.shortname(self)
return "%s %q" %{
i18n.translate(self:active_mode()),
self:active_ssid() or self:active_bssid()
}
end
function wifinet.get_i18n(self)
return "%s: %s %q (%s)" %{
i18n.translate("Wireless Network"),
i18n.translate(self:active_mode()),
self:active_ssid() or self:active_bssid(),
self:ifname()
}
end
function wifinet.adminlink(self)
return dsp.build_url("admin", "network", "wireless",
self.iwdata.device, self.wdev)
end
function wifinet.get_network(self)
if uci_r:get("network", self.iwdata.network) == "interface" then
return network(self.iwdata.network)
end
end
function wifinet.get_interface(self)
return interface(self:ifname())
end

View file

@ -1,367 +0,0 @@
--[[
LuCI - Wireless model
Copyright 2009 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 pairs, type, i18n, uci, math = pairs, type, luci.i18n, luci.model.uci, math
local iwi = require "iwinfo"
local utl = require "luci.util"
local uct = require "luci.model.uci.bind"
module "luci.model.wireless"
local ub = uct.bind("wireless")
local st, ifs
function init(cursor)
cursor:unload("wireless")
cursor:load("wireless")
ub:init(cursor)
st = uci.cursor_state()
ifs = { }
local count = { }
ub.uci:foreach("wireless", "wifi-iface",
function(s)
if s.device then
count[s.device] = count[s.device] and count[s.device] + 1 or 1
local id = "%s.network%d" %{ s.device, count[s.device] }
ifs[id] = {
id = id,
sid = s['.name'],
count = count
}
local dev = st:get("wireless", s['.name'], "ifname")
or st:get("wireless", s['.name'], "device")
local wtype = dev and iwi.type(dev)
if dev and wtype then
ifs[id].winfo = iwi[wtype]
ifs[id].wdev = dev
end
end
end)
end
function get_device(self, dev)
return device(dev)
end
function get_devices(self)
local devs = { }
ub.uci:foreach("wireless", "wifi-device",
function(s) devs[#devs+1] = device(s['.name']) end)
return devs
end
function get_network(self, id)
if ifs[id] then
return network(ifs[id].sid)
else
local n
for n, _ in pairs(ifs) do
if ifs[n].sid == id then
return network(id)
end
end
end
end
function add_network(self, options)
if type(options) == "table" and options.device and
ub.uci:get("wireless", options.device) == "wifi-device"
then
local s = ub.uci:section("wireless", "wifi-iface", nil, options)
local c = 1
ub.uci:foreach("wireless", "wifi-iface", function(s) c = c + 1 end)
local id = "%s.network%d" %{ options.device, c }
ifs[id] = {
id = id,
sid = s,
count = c
}
local wtype = iwi.type(options.device)
if wtype then
ifs[id].winfo = iwi[wtype]
ifs[id].wdev = options.device
end
return network(s)
end
end
function del_network(self, id)
if ifs[id] then
ub.uci:delete("wireless", ifs[id].sid)
ifs[id] = nil
else
local n
for n, _ in pairs(ifs) do
if ifs[n].sid == id then
ub.uci:delete("wireless", id)
ifs[n] = nil
end
end
end
end
function shortname(self, iface)
if iface.wdev and iface.winfo then
return "%s %q" %{
i18n.translate(iface:active_mode()),
iface:active_ssid() or i18n.translate("(hidden)")
}
else
return iface:name()
end
end
function get_i18n(self, iface)
if iface.wdev and iface.winfo then
return "%s: %s %q (%s)" %{
i18n.translate("Wireless Network"),
i18n.translate(iface:active_mode()),
iface:active_ssid() or i18n.translate("(hidden)"), iface.wdev
}
else
return "%s: %q" %{ i18n.translate("Wireless Network"), iface:name() }
end
end
function find_interfaces(self, iflist, brlist)
local iface
for iface, _ in pairs(ifs) do
iflist[iface] = ifs[iface]
end
end
function ignore_interface(self, iface)
if ifs and ifs[iface] then
return false
else
return iwi.type(iface) and true or false
end
end
function add_interface(self, net, iface)
if ifs and ifs[iface] and ifs[iface].sid then
ub.uci:set("wireless", ifs[iface].sid, "network", net:name())
ifs[iface].network = net:name()
return true
end
return false
end
function del_interface(self, net, iface)
if ifs and ifs[iface] and ifs[iface].sid then
ub.uci:delete("wireless", ifs[iface].sid, "network")
--return true
end
return false
end
device = ub:section("wifi-device")
device:property("type")
device:property("channel")
device:property_bool("disabled")
function device.name(self)
return self.sid
end
function device.is_up(self)
local rv = false
if not self:disabled() then
st:foreach("wireless", "wifi-iface",
function(s)
if s.device == self:name() and s.up == "1" then
rv = true
return false
end
end)
end
return rv
end
function device.get_networks(self)
local nets = { }
ub.uci:foreach("wireless", "wifi-iface",
function(s)
if s.device == self:name() then
nets[#nets+1] = network(s['.name'])
end
end)
return nets
end
network = ub:section("wifi-iface")
network:property("mode")
network:property("ssid")
network:property("bssid")
network:property("network")
function network._init(self, sid)
local count = { }
local parent_dev = st:get("wireless", sid, "device")
or ub.uci:get("wireless", sid, "device")
local dev = st:get("wireless", sid, "ifname")
or parent_dev
if dev then
ub.uci:foreach("wireless", "wifi-iface",
function(s)
if s.device then
count[s.device] = count[s.device]
and count[s.device] + 1 or 1
if s['.name'] == sid then
self.id = "%s.network%d" %{ parent_dev, count[s.device] }
local wtype = iwi.type(dev)
if dev and wtype then
self.winfo = iwi[wtype]
self.wdev = dev
end
end
end
end)
end
end
function network.name(self)
return self.id
end
function network.ifname(self)
return self.wdev
end
function network.get_device(self)
if self.device then
return device(self.device)
end
end
function network.is_up(self)
return (st:get("wireless", self.sid, "up") == "1")
end
function network.active_mode(self)
local m = self.winfo and self.winfo.mode(self.wdev)
if not m then
m = self:mode()
if m == "ap" then m = "AP"
elseif m == "sta" then m = "Client"
elseif m == "adhoc" then m = "Ad-Hoc"
elseif m == "mesh" then m = "Mesh"
elseif m == "monitor" then m = "Monitor"
end
end
return m or "Client"
end
function network.active_mode_i18n(self)
return i18n.translate(self:active_mode())
end
function network.active_ssid(self)
return self.winfo and self.winfo.ssid(self.wdev) or
self:ssid()
end
function network.active_bssid(self)
return self.winfo and self.winfo.bssid(self.wdev) or
self:bssid() or "00:00:00:00:00:00"
end
function network.active_encryption(self)
local enc = self.winfo and self.winfo.encryption(self.wdev)
return enc and enc.description or "-"
end
function network.assoclist(self)
return self.winfo and self.winfo.assoclist(self.wdev) or { }
end
function network.frequency(self)
local freq = self.winfo and self.winfo.frequency(self.wdev)
return freq and freq > 0 and "%.03f" % (freq / 1000)
end
function network.bitrate(self)
local rate = self.winfo and self.winfo.bitrate(self.wdev)
return rate and rate > 0 and (rate / 1000)
end
function network.channel(self)
return self.winfo and self.winfo.channel(self.wdev)
end
function network.signal(self)
return self.winfo and self.winfo.signal(self.wdev) or 0
end
function network.noise(self)
return self.winfo and self.winfo.noise(self.wdev) or 0
end
function network.signal_level(self, s, n)
if self:active_bssid() ~= "00:00:00:00:00:00" then
local signal = s or self:signal()
local noise = n or self:noise()
if signal < 0 and noise < 0 then
local snr = -1 * (noise - signal)
return math.floor(snr / 5)
else
return 0
end
else
return -1
end
end
function network.signal_percent(self)
local qc = self.winfo and
self.winfo.quality(self.wdev) or 0
local qm = self.winfo and
self.winfo.quality_max(self.wdev) or 0
if qc > 0 and qm > 0 then
return math.floor((100 / qm) * qc)
else
return 0
end
end