#!/usr/bin/lua local function read_scan() local h = io.popen("ubus call iwinfo scan '{\"device\":\"radio0\"}' 2>/dev/null") local raw = h:read("*a") h:close() return raw end local function jsondec(s) local json = require("luci.jsonc") return json.parse(s) end local function jsonenc(t) local json = require("luci.jsonc") return json.stringify(t) end io.write("Content-Type: application/json\r\n\r\n") local raw = read_scan() local data = raw and jsondec(raw) if not data or not data.results then io.write(jsonenc({ ok = false, error = "scan failed or no results" })) os.exit(0) end local best = {} for _, n in ipairs(data.results) do local ssid = n.ssid if ssid and ssid ~= "" then local prev = best[ssid] if not prev or (n.signal or -999) > prev.signal then best[ssid] = { ssid = ssid, signal = n.signal or -999, quality = n.quality or 0, quality_max = n.quality_max or 70, band = n.band, channel = n.channel, secured = n.encryption and n.encryption.enabled or false, } end end end local list = {} for _, v in pairs(best) do list[#list+1] = v end table.sort(list, function(a, b) return a.signal > b.signal end) io.write(jsonenc({ ok = true, networks = list }))