From 8e2088f8d421647ccae9b38d6489e4b46164a335 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 28 Jan 2020 18:14:28 +0100 Subject: [PATCH] luci-base: make swconfig port state parsing more robust Since swconfig output varies wildly among different switch drivers, rely on a simpler more robust parsing approach to find the required information. Ref: https://forum.openwrt.org/t/cannot-read-property-link/50766 Signed-off-by: Jo-Philipp Wich (cherry picked from commit 6d59a6400ed055d71e0b335679d291c22bbdbd40) --- modules/luci-base/root/usr/libexec/rpcd/luci | 71 +++++++++++++++----- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci index 75afd27a0..c2be3e92b 100755 --- a/modules/luci-base/root/usr/libexec/rpcd/luci +++ b/modules/luci-base/root/usr/libexec/rpcd/luci @@ -363,25 +363,62 @@ local methods = { while true do local line = swc:read("*l") - if not line then break end + if not line or (line:match("^VLAN %d+:") and #ports > 0) 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) + local pnum = line:match("^Port (%d+):") + if pnum then + port = { + port = tonumber(pnum), + duplex = false, + speed = 0, + link = false, + auto = false, + rxflow = false, + txflow = false } + + ports[#ports+1] = port + end + + if port then + local m + + if line:match("full[%- ]duplex") then + port.duplex = true + end + + m = line:match(" speed:(%d+)") + if m then + port.speed = tonumber(m) + end + + m = line:match("(%d+) Mbps") + if m and port.speed == 0 then + port.speed = tonumber(m) + end + + m = line:match("link: (%d+)") + if m and port.speed == 0 then + port.speed = tonumber(m) + end + + if line:match("link: ?up") or line:match("status: ?up") then + port.link = true + end + + if line:match("auto%-negotiate") or line:match("link:.-auto") then + port.auto = true + end + + if line:match("link:.-rxflow") then + port.rxflow = true + end + + if line:match("link:.-txflow") then + port.txflow = true + end end end -- 2.25.1