refactor: 重构 OpenClaw config.yaml 更新逻辑

- _configureOpenClaw 改名为 _updateOpenClawOrigin(targetId)
- active 时传真实 claw_id,inactive 时传 '0000'
- 每次 _applyStatus(含 status_update)都调用,文件无变化则幂等跳过
- 有变化时 pkill -9 -x openclaw-gateway,不再依赖 openclaw CLI 或 systemctl --user
- 移除 _openClawConfigured 标志位

Made-with: Cursor
This commit is contained in:
stswangzhiping
2026-03-24 16:22:05 +08:00
parent 4a1a2de300
commit 7c03a59c57

View File

@@ -1,7 +1,7 @@
'use strict';
const WebSocket = require('ws');
const { execFileSync } = require('child_process');
const { execFileSync, execSync } = require('child_process');
const config = require('./config');
const log = require('./logger');
const { getBoxId } = require('./fingerprint');
@@ -52,8 +52,6 @@ class ClawClient {
// 最近一次 WS 错误是否是证书时间问题NTP 未同步)
this._certTimeError = false;
// 记录已为哪个 clawId 配置过 openclaw防止 WS 重连时重复执行)
this._openClawConfigured = null;
// systemd watchdog
this._sdTimer = null;
@@ -390,65 +388,54 @@ class ClawClient {
log.info('clawd', '╚════════════════════════════════════╝');
log.info('clawd', '');
log.info('clawd', '等待激活,心跳正常运行...');
this._updateOpenClawOrigin('0000');
} else {
led.status.setApps();
led.display.showTime();
log.info('clawd', `已激活 claw_id = ${this._cfg.claw_id}`);
if (this._cfg.claw_id && this._openClawConfigured !== this._cfg.claw_id) {
this._openClawConfigured = this._cfg.claw_id;
this._configureOpenClaw(this._cfg.claw_id);
}
this._updateOpenClawOrigin(String(this._cfg.claw_id));
}
}
// ── OpenClaw 配置 ────────────────────────────────────────────────────────────
_configureOpenClaw(clawId) {
_updateOpenClawOrigin(targetId) {
const { existsSync, readFileSync, writeFileSync } = require('fs');
// 1. 直接修改 openclaw 配置文件(避免用 root 执行 openclaw CLI 超时问题)
const configFile = '/home/sts/.openclaw/config/config.yaml';
if (!existsSync(configFile)) {
log.warn('clawd', `openclaw 配置文件不存在: ${configFile}`);
return;
}
try {
let content = readFileSync(configFile, 'utf8');
const newOrigin = `https://${clawId}.claw.cutos.ai`;
const content = readFileSync(configFile, 'utf8');
const newOrigin = `https://${targetId}.claw.cutos.ai`;
// 替换 https://xxxx.claw.cutos.ai 为当前 clawId 对应的域名
// 替换 https://任意子域.claw.cutos.ai 为目标域名
const updated = content.replace(
/https:\/\/\d+\.claw\.cutos\.ai/g,
/https:\/\/[^"'\s]+\.claw\.cutos\.ai/g,
newOrigin
);
if (updated === content) {
log.info('clawd', `openclaw allowedOrigins 已是最新,无需修改`);
} else {
writeFileSync(configFile, updated, 'utf8');
log.info('clawd', `openclaw config 已更新: ${newOrigin}`);
log.info('clawd', `openclaw origin 已是 ${newOrigin},无需变更`);
return;
}
writeFileSync(configFile, updated, 'utf8');
log.info('clawd', `openclaw config 已更新: ${newOrigin}`);
// 文件有变化kill -9 openclaw-gateway让它被 systemd --user 自动拉起
try {
execSync('pkill -9 -x openclaw-gateway', { timeout: 3000 });
log.info('clawd', 'openclaw-gateway 已终止,等待自动重启');
} catch (_) {
// pkill 找不到进程时返回非 0属于正常情况进程未运行
log.info('clawd', 'openclaw-gateway 进程不存在,无需终止');
}
} catch (e) {
log.warn('clawd', `openclaw config 修改失败: ${e.message}`);
return;
}
// 2. 用 sts 身份执行 openclaw gateway restart
const openclaw = '/home/sts/.npm-global/bin/openclaw';
if (!existsSync(openclaw)) {
log.warn('clawd', 'openclaw 未找到,跳过 gateway restart');
return;
}
try {
execFileSync('su', ['-', 'sts', '-c', `${openclaw} gateway restart`], {
timeout: 15000,
stdio: 'ignore',
});
log.info('clawd', 'openclaw gateway restart 完成');
} catch (e) {
log.warn('clawd', `openclaw gateway restart 失败: ${e.message}`);
log.warn('clawd', `openclaw config 更新失败: ${e.message}`);
}
}