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>
This commit is contained in:
parent
616d44c155
commit
6d59a6400e
1 changed files with 54 additions and 17 deletions
|
@ -363,25 +363,62 @@ local methods = {
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local line = swc:read("*l")
|
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+)")
|
local pnum = line:match("^Port (%d+):")
|
||||||
if port then
|
if pnum then
|
||||||
local speed = line:match(" speed:(%d+)")
|
port = {
|
||||||
local duplex = line:match(" (%w+)-duplex")
|
port = tonumber(pnum),
|
||||||
local txflow = line:match(" (txflow)")
|
duplex = false,
|
||||||
local rxflow = line:match(" (rxflow)")
|
speed = 0,
|
||||||
local auto = line:match(" (auto)")
|
link = false,
|
||||||
|
auto = false,
|
||||||
ports[#ports+1] = {
|
rxflow = false,
|
||||||
port = tonumber(port) or 0,
|
txflow = false
|
||||||
speed = tonumber(speed) or 0,
|
|
||||||
link = (up == "up"),
|
|
||||||
duplex = (duplex == "full"),
|
|
||||||
rxflow = (not not rxflow),
|
|
||||||
txflow = (not not txflow),
|
|
||||||
auto = (not not auto)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue