From 5fd21bc9efedb29ff8376f8043ed2a4b74788d6b Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 12 Sep 2019 11:01:19 +0200 Subject: [PATCH] luci-base: add luci/getSwconfigFeatures and luci/getSwconfigPortState Signed-off-by: Jo-Philipp Wich --- modules/luci-base/root/usr/libexec/rpcd/luci | 107 ++++++++++++++++++ .../root/usr/share/rpcd/acl.d/luci-base.json | 2 +- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci index 850b159ac..99c172a96 100755 --- a/modules/luci-base/root/usr/libexec/rpcd/luci +++ b/modules/luci-base/root/usr/libexec/rpcd/luci @@ -468,6 +468,113 @@ local methods = { return rv end + }, + + getSwconfigFeatures = { + args = { switch = "switch0" }, + call = function(args) + local util = require "luci.util" + + -- Parse some common switch properties from swconfig help output. + local swc, err = io.popen("swconfig dev %s help 2>/dev/null" % util.shellquote(args.switch)) + if swc then + local is_port_attr = false + local is_vlan_attr = false + local rv = {} + + while true do + local line = swc:read("*l") + if not line then break end + + if line:match("^%s+%-%-vlan") then + is_vlan_attr = true + + elseif line:match("^%s+%-%-port") then + is_vlan_attr = false + is_port_attr = true + + elseif line:match("cpu @") then + rv.switch_title = line:match("^switch%d: %w+%((.-)%)") + rv.num_vlans = tonumber(line:match("vlans: (%d+)")) or 16 + rv.min_vid = 1 + + elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then + if is_vlan_attr then rv.vid_option = line:match(": (%w+)") end + + elseif line:match(": enable_vlan4k") then + rv.vlan4k_option = "enable_vlan4k" + + elseif line:match(": enable_vlan") then + rv.vlan_option = "enable_vlan" + + elseif line:match(": enable_learning") then + rv.learning_option = "enable_learning" + + elseif line:match(": enable_mirror_rx") then + rv.mirror_option = "enable_mirror_rx" + + elseif line:match(": max_length") then + rv.jumbo_option = "max_length" + end + end + + swc:close() + + if not next(rv) then + return { error = "No such switch" } + end + + return rv + else + return { error = err } + end + end + }, + + getSwconfigPortState = { + args = { switch = "switch0" }, + call = function(args) + local util = require "luci.util" + + local swc, err = io.popen("swconfig dev %s show 2>/dev/null" % util.shellquote(args.switch)) + if swc then + local ports = { } + + while true do + local line = swc:read("*l") + if not line then break end + + local port, up = line:match("port:(%d+) link:(%w+)") + if port then + local speed = line:match(" speed:(%d+)") + local duplex = line:match(" (%w+)-duplex") + local txflow = line:match(" (txflow)") + local rxflow = line:match(" (rxflow)") + local auto = line:match(" (auto)") + + ports[#ports+1] = { + port = tonumber(port) or 0, + speed = tonumber(speed) or 0, + link = (up == "up"), + duplex = (duplex == "full"), + rxflow = (not not rxflow), + txflow = (not not txflow), + auto = (not not auto) + } + end + end + + swc:close() + + if not next(ports) then + return { error = "No such switch" } + end + + return { result = ports } + else + return { error = err } + end + end } } diff --git a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json index 1952a7c3a..a0852eaec 100644 --- a/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json +++ b/modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json @@ -28,7 +28,7 @@ "ubus": { "file": [ "list", "read", "stat" ], "iwinfo": [ "assoclist", "freqlist", "txpowerlist", "countrylist" ], - "luci": [ "getBoardJSON", "getDUIDHints", "getHostHints", "getIfaddrs", "getInitList", "getLocaltime", "getTimezones", "getDHCPLeases", "getLEDs", "getNetworkDevices", "getUSBDevices", "getWirelessDevices" ], + "luci": [ "getBoardJSON", "getDUIDHints", "getHostHints", "getIfaddrs", "getInitList", "getLocaltime", "getTimezones", "getDHCPLeases", "getLEDs", "getNetworkDevices", "getUSBDevices", "getWirelessDevices", "getSwconfigFeatures", "getSwconfigPortState" ], "network.device": [ "status" ], "network.interface": [ "dump" ], "network": [ "get_proto_handlers" ], -- 2.25.1