You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.4 KiB

  1. local ubus = require "ubus"
  2. local iwinfo = require "iwinfo"
  3. local function scrape()
  4. local metric_wifi_network_quality = metric("wifi_network_quality","gauge")
  5. local metric_wifi_network_bitrate = metric("wifi_network_bitrate","gauge")
  6. local metric_wifi_network_noise = metric("wifi_network_noise","gauge")
  7. local metric_wifi_network_signal = metric("wifi_network_signal","gauge")
  8. local u = ubus.connect()
  9. local status = u:call("network.wireless", "status", {})
  10. for dev, dev_table in pairs(status) do
  11. for _, intf in ipairs(dev_table['interfaces']) do
  12. local ifname = intf['ifname']
  13. local iw = iwinfo[iwinfo.type(ifname)]
  14. local labels = {
  15. channel = iw.channel(ifname),
  16. ssid = iw.ssid(ifname),
  17. bssid = iw.bssid(ifname),
  18. mode = iw.mode(ifname),
  19. ifname = ifname,
  20. country = iw.country(ifname),
  21. frequency = iw.frequency(ifname),
  22. device = dev,
  23. }
  24. local qc = iw.quality(ifname) or 0
  25. local qm = iw.quality_max(ifname) or 0
  26. local quality = 0
  27. if qc > 0 and qm > 0 then
  28. quality = math.floor((100 / qm) * qc)
  29. end
  30. metric_wifi_network_quality(labels, quality)
  31. metric_wifi_network_noise(labels, iw.noise(ifname) or 0)
  32. metric_wifi_network_bitrate(labels, iw.bitrate(ifname) or 0)
  33. metric_wifi_network_signal(labels, iw.signal(ifname) or -255)
  34. end
  35. end
  36. end
  37. return { scrape = scrape }