luci-base: add getWirelessDevices() rpc method
The getWirelessDevices() method merges the results of the network.wireless/status call with corresponding per-radio and per-network iwinfo data. This allows to simplify the client side network state model implementation and saves extraneous rpc roundtrips to fetch iwinfo data after discovering the wireless devices. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
8481330e42
commit
8cd40eb1e6
1 changed files with 60 additions and 0 deletions
|
@ -274,6 +274,66 @@ local methods = {
|
|||
end
|
||||
},
|
||||
|
||||
getWirelessDevices = {
|
||||
call = function(args)
|
||||
local ubus = require "ubus".connect()
|
||||
if not ubus then
|
||||
return { error = "Unable to establish ubus connection" }
|
||||
end
|
||||
|
||||
local status = ubus:call("network.wireless", "status", {})
|
||||
if type(status) == "table" then
|
||||
local radioname, radiodata
|
||||
for radioname, radiodata in pairs(status) do
|
||||
if type(radiodata) == "table" then
|
||||
radiodata.iwinfo = ubus:call("iwinfo", "info", { device = radioname }) or {}
|
||||
radiodata.iwinfo.bitrate = nil
|
||||
radiodata.iwinfo.bssid = nil
|
||||
radiodata.iwinfo.encryption = nil
|
||||
radiodata.iwinfo.mode = nil
|
||||
radiodata.iwinfo.quality = nil
|
||||
radiodata.iwinfo.quality_max = nil
|
||||
radiodata.iwinfo.ssid = nil
|
||||
|
||||
local iwdata = nil
|
||||
|
||||
if type(radiodata.interfaces) == "table" then
|
||||
local _, interfacedata
|
||||
for _, interfacedata in ipairs(radiodata.interfaces) do
|
||||
if type(interfacedata) == "table" and
|
||||
type(interfacedata.ifname) == "string"
|
||||
then
|
||||
local iwinfo = ubus:call("iwinfo", "info", { device = interfacedata.ifname })
|
||||
|
||||
iwdata = iwdata or iwinfo
|
||||
interfacedata.iwinfo = iwinfo or {}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
radiodata.iwinfo = {}
|
||||
|
||||
local _, k, v
|
||||
for k, v in pairs(iwdata or ubus:call("iwinfo", "info", { device = radioname }) or {}) do
|
||||
if k ~= "bitrate" and k ~= "bssid" and k ~= "encryption" and
|
||||
k ~= "mode" and k ~= "quality" and k ~= "quality_max" and
|
||||
k ~= "ssid"
|
||||
then
|
||||
if type(v) == "table" then
|
||||
radiodata.iwinfo[k] = json.parse(json.stringify(v))
|
||||
else
|
||||
radiodata.iwinfo[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return status
|
||||
end
|
||||
},
|
||||
|
||||
getBoardJSON = {
|
||||
call = function(args)
|
||||
local jsc = require "luci.jsonc"
|
||||
|
|
Loading…
Reference in a new issue