diff options
author | Jo-Philipp Wich <jo@mein.io> | 2019-09-03 16:49:25 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-09-10 15:28:16 +0200 |
commit | 8cd40eb1e66ec97be051465cdd9d7f51b5c1b58e (patch) | |
tree | 807430c1601a3a450c68ca54cbf176744d6f9014 | |
parent | 8481330e427706cc798449c6c70856b6f731196d (diff) |
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>
-rwxr-xr-x | modules/luci-base/root/usr/libexec/rpcd/luci | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci index e27149127c..e94e3f1f74 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" |