summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2019-09-03 16:49:25 +0200
committerJo-Philipp Wich <jo@mein.io>2019-09-10 15:28:16 +0200
commit8cd40eb1e66ec97be051465cdd9d7f51b5c1b58e (patch)
tree807430c1601a3a450c68ca54cbf176744d6f9014
parent8481330e427706cc798449c6c70856b6f731196d (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-xmodules/luci-base/root/usr/libexec/rpcd/luci60
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"