diff options
author | Jo-Philipp Wich <jo@mein.io> | 2019-06-06 19:24:10 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2019-07-07 15:36:25 +0200 |
commit | 2f79aa1c357932c9c573703da2dddf555b2e2e4d (patch) | |
tree | cd10a96f841e0087d32ca76038f5161db363a9c6 /modules/luci-base/root | |
parent | c5b6f4294325652899ccca0419d7058cfadd7c85 (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>
Diffstat (limited to 'modules/luci-base/root')
-rwxr-xr-x | modules/luci-base/root/usr/libexec/rpcd/luci | 79 |
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 c4566210f..dba6df0cb 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 |