summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2019-06-06 19:24:10 +0200
committerJo-Philipp Wich <jo@mein.io>2019-07-07 15:36:25 +0200
commit2f79aa1c357932c9c573703da2dddf555b2e2e4d (patch)
treecd10a96f841e0087d32ca76038f5161db363a9c6
parentc5b6f4294325652899ccca0419d7058cfadd7c85 (diff)
luci-base: implement further ubus calls
Implement new ubus rpcd backend calls for later use in the frontend: - netdevs: dump information about Linux network devices present - boardjson: dump /etc/board.json if present - offload_support: query whether netfilter offloading is supported Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rwxr-xr-xmodules/luci-base/root/usr/libexec/rpcd/luci79
1 files changed, 78 insertions, 1 deletions
diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci
index c4566210f6..dba6df0cb9 100755
--- a/modules/luci-base/root/usr/libexec/rpcd/luci
+++ b/modules/luci-base/root/usr/libexec/rpcd/luci
@@ -196,6 +196,83 @@ local methods = {
}
end
end
+ },
+
+ netdevs = {
+ call = function(args)
+ local dir = fs.dir("/sys/class/net")
+ local result = { }
+ if dir then
+ local dev
+ for dev in dir do
+ if not result[dev] then
+ result[dev] = { name = dev }
+ end
+
+ if fs.access("/sys/class/net/"..dev.."/master") then
+ local brname = fs.basename(fs.readlink("/sys/class/net/"..dev.."/master"))
+ if not result[brname] then
+ result[brname] = { name = brname }
+ end
+
+ if not result[brname].ports then
+ result[brname].ports = { }
+ end
+
+ result[brname].ports[#result[brname].ports+1] = dev
+ elseif fs.access("/sys/class/net/"..dev.."/bridge") then
+ if not result[dev].ports then
+ result[dev].ports = { }
+ end
+
+ result[dev].id = readfile("/sys/class/net/"..dev.."/bridge/bridge_id")
+ result[dev].stp = (readfile("/sys/class/net/"..dev.."/bridge/stp_state") ~= "0")
+ result[dev].bridge = true
+ end
+
+ local opr = readfile("/sys/class/net/"..dev.."/operstate")
+
+ result[dev].up = (opr == "up" or opr == "unknown")
+ result[dev].type = tonumber(readfile("/sys/class/net/"..dev.."/type"))
+ result[dev].name = dev
+
+ local mtu = tonumber(readfile("/sys/class/net/"..dev.."/mtu"))
+ if mtu and mtu > 0 then
+ result[dev].mtu = mtu
+ end
+
+ local qlen = tonumber(readfile("/sys/class/net/"..dev.."/tx_queue_len"))
+ if qlen and qlen > 0 then
+ result[dev].qlen = qlen
+ end
+
+ local master = fs.readlink("/sys/class/net/"..dev.."/master")
+ if master then
+ result[dev].master = fs.basename(master)
+ end
+
+ local mac = readfile("/sys/class/net/"..dev.."/address")
+ if mac and #mac == 17 then
+ result[dev].mac = mac
+ end
+ end
+ end
+ return result
+ end
+ },
+
+ boardjson = {
+ call = function(args)
+ local jsc = require "luci.jsonc"
+ return jsc.parse(fs.readfile("/etc/board.json") or "")
+ end
+ },
+
+ offload_support = {
+ call = function()
+ local fs = require "nixio.fs"
+ return { offload_support = not not fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt") }
+ end
}
}
@@ -256,6 +333,6 @@ elseif arg[1] == "call" then
local args = parseInput()
local method = validateArgs(arg[2], args)
local result, code = method.call(args)
- print(json.stringify(result))
+ print((json.stringify(result):gsub("^%[%]$", "{}")))
os.exit(code or 0)
end