From 8cd40eb1e66ec97be051465cdd9d7f51b5c1b58e Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 3 Sep 2019 16:49:25 +0200 Subject: [PATCH] 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 --- modules/luci-base/root/usr/libexec/rpcd/luci | 60 ++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci index e27149127..e94e3f1f7 100755 --- a/modules/luci-base/root/usr/libexec/rpcd/luci +++ b/modules/luci-base/root/usr/libexec/rpcd/luci @@ -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" -- 2.25.1