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>
This commit is contained in:
Jo-Philipp Wich 2019-06-06 19:24:10 +02:00
parent c5b6f42943
commit 2f79aa1c35

View file

@ -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