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
|
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 = {
|
getBoardJSON = {
|
||||||
call = function(args)
|
call = function(args)
|
||||||
local jsc = require "luci.jsonc"
|
local jsc = require "luci.jsonc"
|
||||||
|
|
Loading…
Reference in a new issue