fix(network): auto-cache LAN iface for carrier when CLAWD_ETH_IFACE unset

First getWiredIfaceWithCarrier() result locks _lanMonitoredIface; subsequent
hasLanCableCarrier only reads that sysfs carrier so unplug reliably turns LAN off.
CLAWD_ETH_IFACE still overrides.

Made-with: Cursor
This commit is contained in:
stswangzhiping
2026-03-28 21:53:21 +08:00
parent 8f5a8ec896
commit a186857126

View File

@@ -62,9 +62,12 @@ function hasWiredCarrier() {
return getWiredIfaceWithCarrier() !== null; return getWiredIfaceWithCarrier() !== null;
} }
/** LAN 灯:未配 CLAWD_ETH_IFACE 时,首次见 carrier 的有线口会缓存,之后只读该口(拔线即灭) */
let _lanMonitoredIface = null;
/** /**
* LAN 面板灯专用:若设置 CLAWD_ETH_IFACE,只认该口 carrier拔网线必灭 * LAN 面板灯专用:优先 CLAWD_ETH_IFACE;否则自动锁定首次出现的 getWiredIfaceWithCarrier()
* 未设置时退回 hasWiredCarrier()(可能受其它网口影响,建议在 box 上配置 end0 等) * 之后仅看该口 carrier避免「任意有线」与其它虚拟口混淆。多口同时在线时仍以扫描序为准可用手动 env 覆盖
*/ */
function hasLanCableCarrier() { function hasLanCableCarrier() {
const explicit = process.env.CLAWD_ETH_IFACE; const explicit = process.env.CLAWD_ETH_IFACE;
@@ -75,7 +78,20 @@ function hasLanCableCarrier() {
return false; return false;
} }
} }
return hasWiredCarrier();
if (_lanMonitoredIface) {
try {
return fs.readFileSync(`/sys/class/net/${_lanMonitoredIface}/carrier`, 'utf8').trim() === '1';
} catch (_) {
_lanMonitoredIface = null;
return false;
}
}
const wired = getWiredIfaceWithCarrier();
if (!wired) return false;
_lanMonitoredIface = wired;
return true;
} }
function _tryPingInternet() { function _tryPingInternet() {