diff options
author | Jo-Philipp Wich <jo@mein.io> | 2020-01-28 18:14:28 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2020-01-28 18:16:44 +0100 |
commit | 6d59a6400ed055d71e0b335679d291c22bbdbd40 (patch) | |
tree | c7f5125425a5ab5468df6751cee8b45371e13cec /modules | |
parent | 616d44c155ae2b4f19e8b2645744a107e38a56c7 (diff) |
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 <jo@mein.io>
Diffstat (limited to 'modules')
-rwxr-xr-x | modules/luci-base/root/usr/libexec/rpcd/luci | 71 |
1 files 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 |