From 9800e712e552bd20579613fbf440dea0287fabbc Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Sat, 28 Mar 2026 22:07:20 +0800 Subject: [PATCH] fix(network): LAN LED use end0/eth0 carrier only, decouple from WiFi hasLanCableCarrier no longer locks first scanned iface (NM/WiFi could change which iface had carrier). Prefer sysfs end0 then eth0 each poll; fallback hasWiredCarrier only if neither exists. Made-with: Cursor --- lib/network.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/network.js b/lib/network.js index 23af83c..7213c6e 100644 --- a/lib/network.js +++ b/lib/network.js @@ -62,12 +62,12 @@ function hasWiredCarrier() { return getWiredIfaceWithCarrier() !== null; } -/** LAN 灯:未配 CLAWD_ETH_IFACE 时,首次见 carrier 的有线口会缓存,之后只读该口(拔线即灭) */ -let _lanMonitoredIface = null; - /** - * LAN 面板灯专用:优先 CLAWD_ETH_IFACE;否则自动锁定首次出现的 getWiredIfaceWithCarrier(), - * 之后仅看该口 carrier(避免「任意有线」与其它虚拟口混淆)。多口同时在线时仍以扫描序为准,可用手动 env 覆盖。 + * LAN 面板灯专用:只反映「板载以太网插线」,与 WiFi 无关。 + * - CLAWD_ETH_IFACE:只用该口 carrier + * - 否则每次优先读 end0、eth0(RK 等板型固定名),避免用「扫描到的第一个 carrier 口」 + * (该口会随 WiFi 断开/连接、NM 重排而变化,导致 LAN 灯跟 WiFi 联动) + * - 若无 end0/eth0 节点再退回 hasWiredCarrier() */ function hasLanCableCarrier() { const explicit = process.env.CLAWD_ETH_IFACE; @@ -79,19 +79,14 @@ function hasLanCableCarrier() { } } - if (_lanMonitoredIface) { + for (const n of ['end0', 'eth0']) { try { - return fs.readFileSync(`/sys/class/net/${_lanMonitoredIface}/carrier`, 'utf8').trim() === '1'; - } catch (_) { - _lanMonitoredIface = null; - return false; - } + if (!fs.existsSync(`/sys/class/net/${n}`)) continue; + return fs.readFileSync(`/sys/class/net/${n}/carrier`, 'utf8').trim() === '1'; + } catch (_) {} } - const wired = getWiredIfaceWithCarrier(); - if (!wired) return false; - _lanMonitoredIface = wired; - return true; + return hasWiredCarrier(); } function _tryPingInternet() {