1 local function get_devices()
2 local handle = io.popen("ubnt-manager -l")
3 local result = handle:read("*a")
7 for device in result:gmatch("%S+") do table.insert(devices, device) end
11 local function get_metric_airos6(device_data, label)
13 metric("ubnt_uptime", "counter", label, device_data['host']['uptime'])
14 metric("ubnt_totalram", "gauge", label, device_data['host']['totalram'])
15 metric("ubnt_freeram", "gauge", label, device_data['host']['freeram'])
16 metric("ubnt_cpuload", "gauge", label, device_data['host']['cpuload'])
17 metric("ubnt_cpubusy", "gauge", label, device_data['host']['cpubusy'])
18 metric("ubnt_cputotal", "gauge", label, device_data['host']['cputotal'])
21 metric("ubnt_channel", "gauge", label, device_data['wireless']['channel'])
23 for freq in device_data['wireless']['frequency']:gmatch("%S+") do
24 table.insert(freqstring, freq)
27 metric("ubnt_frequency", "gauge", label, tonumber(freqstring[1]))
30 metric("ubnt_dfs", "gauge", label, tonumber(device_data['wireless']['dfs']))
31 metric("ubnt_signal", "gauge", label, device_data['wireless']['signal'])
32 metric("ubnt_rssi", "gauge", label, device_data['wireless']['rssi'])
33 metric("ubnt_noisef", "gauge", label, device_data['wireless']['noisef'])
34 metric("ubnt_txpower", "gauge", label, device_data['wireless']['txpower'])
35 metric("ubnt_distance", "gauge", label, device_data['wireless']['distance'])
36 metric("ubnt_txrate", "gauge", label,
37 tonumber(device_data['wireless']['txrate']))
38 metric("ubnt_rxrate", "gauge", label,
39 tonumber(device_data['wireless']['rxrate']))
40 metric("ubnt_count", "gauge", label, device_data['wireless']['count'])
43 local function get_metric_airos8(device_data, label)
45 metric("ubnt_uptime", "counter", label, device_data['host']['uptime'])
46 metric("ubnt_loadavg", "gauge", label, device_data['host']['loadavg'])
47 metric("ubnt_totalram", "gauge", label, device_data['host']['totalram'])
48 metric("ubnt_freeram", "gauge", label, device_data['host']['freeram'])
49 metric("ubnt_temperature", "gauge", label,
50 device_data['host']['temperature'])
51 metric("ubnt_cpuload", "gauge", label, device_data['host']['cpuload'])
52 metric("ubnt_timestamp", "counter", label, device_data['host']['timestamp'])
55 metric("ubnt_band", "gauge", label, device_data['wireless']['band'])
56 metric("ubnt_frequency", "gauge", label,
57 device_data['wireless']['frequency'])
58 metric("ubnt_center1_freq", "gauge", label,
59 device_data['wireless']['center1_freq'])
60 metric("ubnt_dfs", "gauge", label, device_data['wireless']['dfs'])
61 metric("ubnt_distance", "gauge", label, device_data['wireless']['distance'])
62 metric("ubnt_noisef", "gauge", label, device_data['wireless']['noisef'])
63 metric("ubnt_txpower", "gauge", label, device_data['wireless']['txpower'])
64 metric("ubnt_aprepeater", "gauge", label,
65 device_data['wireless']['aprepeater'])
66 metric("ubnt_rstatus", "gauge", label, device_data['wireless']['rstatus'])
67 metric("ubnt_chanbw", "gauge", label, device_data['wireless']['chanbw'])
68 metric("ubnt_rx_chainmask", "gauge", label,
69 device_data['wireless']['rx_chainmask'])
70 metric("ubnt_tx_chainmask", "gauge", label,
71 device_data['wireless']['tx_chainmask'])
72 metric("ubnt_cac_state", "gauge", label,
73 device_data['wireless']['cac_state'])
74 metric("ubnt_cac_timeout", "gauge", label,
75 device_data['wireless']['cac_timeout'])
76 metric("ubnt_rx_idx", "gauge", label, device_data['wireless']['rx_idx'])
77 metric("ubnt_rx_nss", "gauge", label, device_data['wireless']['rx_nss'])
78 metric("ubnt_tx_idx", "gauge", label, device_data['wireless']['tx_idx'])
79 metric("ubnt_tx_nss", "gauge", label, device_data['wireless']['tx_nss'])
80 metric("ubnt_count", "gauge", label, device_data['wireless']['count'])
82 -- wireless throughput
83 metric("ubnt_throughput_tx", "gauge", label,
84 device_data['wireless']['throughput']['tx'])
85 metric("ubnt_throughput_rx", "gauge", label,
86 device_data['wireless']['throughput']['rx'])
89 metric("ubnt_polling_cb_capacity", "gauge", label,
90 device_data['wireless']['polling']['cb_capacity'])
91 metric("ubnt_polling_dl_capacity", "gauge", label,
92 device_data['wireless']['polling']['dl_capacity'])
93 metric("ubnt_polling_ul_capacity", "gauge", label,
94 device_data['wireless']['polling']['ul_capacity'])
95 metric("ubnt_use", "gauge", label, device_data['wireless']['polling']['use'])
96 metric("ubnt_tx_use", "gauge", label,
97 device_data['wireless']['polling']['tx_use'])
98 metric("ubnt_rx_use", "gauge", label,
99 device_data['wireless']['polling']['rx_use'])
100 metric("ubnt_atpc_status", "gauge", label,
101 device_data['wireless']['polling']['atpc_status'])
102 metric("ubnt_atpc_status", "gauge", label,
103 device_data['wireless']['polling']['atpc_status'])
106 local function get_metric(device)
107 local json = require('cjson')
108 local handle = io.popen("ubnt-manager -j -t " .. device)
109 local result = handle:read("*a")
111 local device_data = json.decode(result)
113 if not device_data['host'] then return end
114 if not device_data['wireless'] then return end
116 local hostname = device_data['host']['hostname']
117 local devmodel = device_data['host']['devmodel']
118 local fwversion = device_data['host']['fwversion']
119 local essid = device_data['wireless']['essid']
125 fwversion = fwversion,
130 if fwversion:find("v8.", 1, true) then
131 get_metric_airos8(device_data, label)
132 elseif fwversion:find("v6.", 1, true) then
133 get_metric_airos6(device_data, label)
137 local function scrape()
138 for _, device in ipairs(get_devices()) do get_metric(device) end
141 return {scrape = scrape}