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() {