return outputter
end
-function scraper_wifi()
- local rv = { }
- local ntm = require "luci.model.network".init()
+local ubus = require "ubus"
+local iwinfo = require "iwinfo"
- local metric_wifi_network_up = metric("wifi_network_up","gauge")
+function scraper_wifi()
local metric_wifi_network_quality = metric("wifi_network_quality","gauge")
local metric_wifi_network_bitrate = metric("wifi_network_bitrate","gauge")
local metric_wifi_network_noise = metric("wifi_network_noise","gauge")
local metric_wifi_station_tx_packets = metric("wifi_station_tx_packets","gauge")
local metric_wifi_station_rx_packets = metric("wifi_station_rx_packets","gauge")
- local dev
- for _, dev in ipairs(ntm:get_wifidevs()) do
- local rd = {
- up = dev:is_up(),
- device = dev:name(),
- name = dev:get_i18n(),
- networks = { }
- }
-
- local net
- for _, net in ipairs(dev:get_wifinets()) do
+ local u = ubus.connect()
+ local status = u:call("network.wireless", "status", {})
+
+ for dev, dev_table in pairs(status) do
+ for _, intf in ipairs(dev_table['interfaces']) do
+ local ifname = intf['ifname']
+ local iw = iwinfo[iwinfo.type(ifname)]
local labels = {
- channel = net:channel(),
- ssid = net:active_ssid(),
- bssid = net:active_bssid(),
- mode = net:active_mode(),
- ifname = net:ifname(),
- country = net:country(),
- frequency = net:frequency(),
+ channel = iw.channel(ifname),
+ ssid = iw.ssid(ifname),
+ bssid = iw.bssid(ifname),
+ mode = iw.mode(ifname),
+ ifname = ifname,
+ country = iw.country(ifname),
+ frequency = iw.frequency(ifname),
+ device = dev,
}
- if net:is_up() then
- metric_wifi_network_up(labels, 1)
- local signal = net:signal_percent()
- if signal ~= 0 then
- metric_wifi_network_quality(labels, net:signal_percent())
- end
- metric_wifi_network_noise(labels, net:noise())
- local bitrate = net:bitrate()
- if bitrate then
- metric_wifi_network_bitrate(labels, bitrate)
- end
-
- local assoclist = net:assoclist()
- for mac, station in pairs(assoclist) do
- local labels = {
- ifname = net:ifname(),
- mac = mac,
- }
- metric_wifi_station_signal(labels, station.signal)
- metric_wifi_station_tx_packets(labels, station.tx_packets)
- metric_wifi_station_rx_packets(labels, station.rx_packets)
- end
- else
- metric_wifi_network_up(labels, 0)
+
+ local qc = iw.quality(ifname) or 0
+ local qm = iw.quality_max(ifname) or 0
+ local quality = 0
+ if qc > 0 and qm > 0 then
+ quality = math.floor((100 / qm) * qc)
+ end
+
+ metric_wifi_network_quality(labels, quality)
+ metric_wifi_network_noise(labels, iw.noise(ifname) or 0)
+ metric_wifi_network_bitrate(labels, iw.bitrate(ifname) or 0)
+ metric_wifi_network_signal(labels, iw.signal(ifname) or -255)
+
+ local assoclist = iw.assoclist(ifname)
+ for mac, station in pairs(assoclist) do
+ local labels = {
+ ifname = ifname,
+ mac = mac,
+ }
+ metric_wifi_station_signal(labels, station.signal)
+ metric_wifi_station_tx_packets(labels, station.tx_packets)
+ metric_wifi_station_rx_packets(labels, station.rx_packets)
end
end
- rv[#rv+1] = rd
end
end