1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
local ubus = require "ubus"
local bit = require "bit"
local function get_wifi_hostapd_interfaces(u)
local ubuslist = u:objects()
local interfaces = {}
for _,net in ipairs(ubuslist) do
if net.find(net,"hostapd.") then
table.insert(interfaces, net)
end
end
return interfaces
end
local function scrape()
local u = ubus.connect()
local metric_hostapd_ubus_station_rrm_caps_link_measurement =
metric("hostapd_ubus_station_rrm_caps_link_measurement", "gauge")
local metric_hostapd_ubus_station_rrm_caps_neighbor_report =
metric("hostapd_ubus_station_rrm_caps_neighbor_report", "gauge")
local metric_hostapd_ubus_station_rrm_caps_beacon_report_passive =
metric("hostapd_ubus_station_rrm_caps_beacon_report_passive", "gauge")
local metric_hostapd_ubus_station_rrm_caps_beacon_report_active =
metric("hostapd_ubus_station_rrm_caps_beacon_report_active", "gauge")
local metric_hostapd_ubus_station_rrm_caps_beacon_report_table =
metric("hostapd_ubus_station_rrm_caps_beacon_report_table", "gauge")
local metric_hostapd_ubus_station_rrm_caps_lci_measurement =
metric("hostapd_ubus_station_rrm_caps_lci_measurement", "gauge")
local metric_hostapd_ubus_station_rrm_caps_ftm_range_report =
metric("hostapd_ubus_station_rrm_caps_ftm_range_report", "gauge")
local function evaluate_metrics(ifname, freq, station, vals)
local label_station = {
ifname = ifname,
freq = freq,
station = station
}
local rrm_caps_link_measurement = bit.band(bit.lshift(1, 0), vals['rrm'][1]) > 0 and 1 or 0
local rrm_caps_neighbor_report = bit.band(bit.lshift(1, 1), vals['rrm'][1]) > 0 and 1 or 0
local rrm_caps_beacon_report_passive = bit.band(bit.lshift(1, 4), vals['rrm'][1]) > 0 and 1 or 0
local rrm_caps_beacon_report_active = bit.band(bit.lshift(1, 5), vals['rrm'][1]) > 0 and 1 or 0
local rrm_caps_beacon_report_table = bit.band(bit.lshift(1, 6), vals['rrm'][1]) > 0 and 1 or 0
local rrm_caps_lci_measurement = bit.band(bit.lshift(1, 4), vals['rrm'][2]) > 0 and 1 or 0
local rrm_caps_ftm_range_report = bit.band(bit.lshift(1, 2), vals['rrm'][5]) > 0 and 1 or 0
metric_hostapd_ubus_station_rrm_caps_link_measurement(label_station, rrm_caps_link_measurement)
metric_hostapd_ubus_station_rrm_caps_neighbor_report(label_station, rrm_caps_neighbor_report)
metric_hostapd_ubus_station_rrm_caps_beacon_report_passive(label_station, rrm_caps_beacon_report_passive)
metric_hostapd_ubus_station_rrm_caps_beacon_report_active(label_station, rrm_caps_beacon_report_active)
metric_hostapd_ubus_station_rrm_caps_beacon_report_table(label_station, rrm_caps_beacon_report_table)
metric_hostapd_ubus_station_rrm_caps_lci_measurement(label_station, rrm_caps_lci_measurement)
metric_hostapd_ubus_station_rrm_caps_ftm_range_report(label_station, rrm_caps_ftm_range_report)
end
for _, hostapd_int in ipairs(get_wifi_hostapd_interfaces(u)) do
local clients_call = u:call(hostapd_int, "get_clients", {})
local ifname = hostapd_int:gsub("hostapd.", "")
for client, client_table in pairs(clients_call['clients']) do
evaluate_metrics(ifname, clients_call['freq'], client, client_table)
end
end
u:close()
end
return { scrape = scrape }
|