summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-01-28 18:14:28 +0100
committerJo-Philipp Wich <jo@mein.io>2020-01-28 18:16:44 +0100
commit6d59a6400ed055d71e0b335679d291c22bbdbd40 (patch)
treec7f5125425a5ab5468df6751cee8b45371e13cec
parent616d44c155ae2b4f19e8b2645744a107e38a56c7 (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>
-rwxr-xr-xmodules/luci-base/root/usr/libexec/rpcd/luci71
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 75afd27a00..c2be3e92b3 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