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
This commit is contained in:
stswangzhiping
2026-03-28 22:07:20 +08:00
parent 23a1f8aad8
commit 9800e712e5

View File

@@ -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、eth0RK 等板型固定名),避免用「扫描到的第一个 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() {