local ubus = require "ubus" local iwinfo = require "iwinfo" local function scrape() 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_dbm","gauge") local metric_wifi_network_signal = metric("wifi_network_signal_dbm","gauge") local metric_wifi_clients = metric("wifi_network_clients", "gauge") local metric_wifi_airtime_total = metric("wifi_network_airtime_total", "gauge") local metric_wifi_airtime_busy = metric("wifi_network_airtime_busy", "gauge") local metric_wifi_airtime_utilization = metric("wifi_network_airtime_utilization", "gauge") 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'] if ifname ~= nil then local iw = iwinfo[iwinfo.type(ifname)] local labels = { channel = iw.channel(ifname), ssid = iw.ssid(ifname), bssid = string.lower(iw.bssid(ifname)), mode = iw.mode(ifname), ifname = ifname, country = iw.country(ifname), frequency = iw.frequency(ifname), device = dev, } 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 local wifi_clients = 0 for _ in pairs(iw.assoclist(ifname)) do wifi_clients = wifi_clients +1 end local hostapd_status = u:call("hostapd." .. ifname, "get_status", {}) 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) metric_wifi_clients(labels, wifi_clients) metric_wifi_airtime_total(labels, hostapd_status.airtime.time) metric_wifi_airtime_busy(labels, hostapd_status.airtime.time_busy) metric_wifi_airtime_utilization(labels, hostapd_status.airtime.utilization) end end end end return { scrape = scrape }