mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-01 10:43:56 +08:00
💐 Sync 2026-07-09 02:25:04
This commit is contained in:
1 parent
f077ddaf47
commit
2af7926aeb
37 files changed
+597
-329
No files matched your search
@@ -448,7 +448,13 @@ if(changed){
|
||||
fi
|
||||
fix_openclaw_state_permissions 2>/dev/null || true
|
||||
|
||||
rm -rf /tmp/jiti 2>/dev/null || true
|
||||
# 不再每次启动都清理 /tmp/jiti。
|
||||
# OpenClaw 在低性能 OpenWrt 设备上依赖 JITI/模块缓存降低冷启动成本;
|
||||
# 每次 rm -rf 会让 gateway 在第一条 "starting..." 日志前重新编译/装载模块,
|
||||
# 实测会额外拉长 20 秒以上。需要强制清理时再显式打开 UCI 开关。
|
||||
if [ "$(uci -q get openclaw.main.clear_jiti_cache_on_start 2>/dev/null || echo 0)" = "1" ]; then
|
||||
rm -rf /tmp/jiti 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# v2026.4.10: 优化配置迁移 - 只在版本变更时运行 doctor --fix
|
||||
# 原因: doctor --fix 耗时 ~50 秒,每次重启都运行严重影响启动速度
|
||||
@@ -637,6 +643,13 @@ _ensure_port_free() {
|
||||
}
|
||||
_ensure_port_free "$port"
|
||||
|
||||
# Node 22 原生编译缓存。OpenClaw 主入口在路由器上首次 import/compile 较慢;
|
||||
# 保留该缓存可以显著缩短后续重启时 gateway 第一条日志前的等待时间。
|
||||
local node_compile_cache="/tmp/openclaw-node-compile-cache"
|
||||
mkdir -p "$node_compile_cache" 2>/dev/null || true
|
||||
chown openclaw:openclaw "$node_compile_cache" 2>/dev/null || true
|
||||
chmod 700 "$node_compile_cache" 2>/dev/null || true
|
||||
|
||||
# 启动 OpenClaw Gateway (主服务, 前台运行)
|
||||
# v2026.4.7/4.9: 环境变量安全验证 (阻止危险变量注入)
|
||||
_validate_path() {
|
||||
@@ -660,13 +673,15 @@ _ensure_port_free "$port"
|
||||
OPENCLAW_STATE_DIR="${OC_DATA}/.openclaw" \
|
||||
OPENCLAW_CONFIG_PATH="$CONFIG_FILE" \
|
||||
OPENCLAW_GATEWAY_TOKEN="$gw_token" \
|
||||
NODE_COMPILE_CACHE="$node_compile_cache" \
|
||||
NODE_ICU_DATA="${NODE_BASE}/share/icu" \
|
||||
NODE_BASE="$NODE_BASE" \
|
||||
OC_GLOBAL="$OC_GLOBAL" \
|
||||
OC_DATA="$OC_DATA" \
|
||||
PATH="${NODE_BASE}/bin:${OC_GLOBAL}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
procd_set_param user openclaw
|
||||
procd_set_param respawn 3600 10 5
|
||||
procd_set_param term_timeout 2
|
||||
procd_set_param respawn 3600 1 5
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param pidfile /var/run/openclaw.pid
|
||||
@@ -689,6 +704,7 @@ procd_set_param env \
|
||||
OC_CONFIG_PORT="$pty_port" \
|
||||
OC_PTY_TOKEN="$pty_token" \
|
||||
OC_CONFIG_SCRIPT="/usr/share/openclaw/oc-config.sh" \
|
||||
NODE_COMPILE_CACHE="$node_compile_cache" \
|
||||
NODE_ICU_DATA="${NODE_BASE}/share/icu" \
|
||||
NODE_BASE="$NODE_BASE" \
|
||||
OC_GLOBAL="$OC_GLOBAL" \
|
||||
@@ -699,6 +715,7 @@ OPENCLAW_STATE_DIR="${OC_DATA}/.openclaw" \
|
||||
OPENCLAW_CONFIG_PATH="$CONFIG_FILE" \
|
||||
PATH="${NODE_BASE}/bin:${OC_GLOBAL}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
procd_set_param respawn 3600 5 5
|
||||
procd_set_param term_timeout 2
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param pidfile /var/run/openclaw-pty.pid
|
||||
@@ -842,9 +859,10 @@ fi
|
||||
}
|
||||
|
||||
status_service() {
|
||||
local port pty_port
|
||||
local port pty_port enabled
|
||||
port=$(uci -q get openclaw.main.port || echo "18789")
|
||||
pty_port=$(uci -q get openclaw.main.pty_port || echo "18793")
|
||||
enabled=$(uci -q get openclaw.main.enabled || echo "0")
|
||||
|
||||
echo "=== OpenClaw 服务状态 ==="
|
||||
|
||||
@@ -908,10 +926,31 @@ local mins=$(( (uptime % 3600) / 60 ))
|
||||
echo "运行时间: ${hours}小时 ${mins}分钟"
|
||||
fi
|
||||
fi
|
||||
elif pgrep -f "openclaw.*gateway" >/dev/null 2>&1; then
|
||||
echo "网关: 正在启动 (首次启动可能需要 2~5 分钟)"
|
||||
else
|
||||
echo "网关: 已停止"
|
||||
local procd_running procd_pid procd_exit procd_pid_alive pidfile_pid pidfile_stale crash_loop
|
||||
procd_running=$(ubus call service list '{"name":"openclaw"}' 2>/dev/null | jsonfilter -e '$.openclaw.instances.gateway.running' 2>/dev/null | tr -d '[:space:]')
|
||||
procd_pid=$(ubus call service list '{"name":"openclaw"}' 2>/dev/null | jsonfilter -e '$.openclaw.instances.gateway.pid' 2>/dev/null | tr -d '[:space:]')
|
||||
procd_exit=$(ubus call service list '{"name":"openclaw"}' 2>/dev/null | jsonfilter -e '$.openclaw.instances.gateway.exit_code' 2>/dev/null | tr -d '[:space:]')
|
||||
[ "$procd_pid" = "null" ] && procd_pid=""
|
||||
[ "$procd_exit" = "null" ] && procd_exit=""
|
||||
procd_pid_alive=0
|
||||
[ -n "$procd_pid" ] && [ -d "/proc/$procd_pid" ] && procd_pid_alive=1
|
||||
pidfile_pid=$(cat /var/run/openclaw.pid 2>/dev/null | tr -d '[:space:]')
|
||||
pidfile_stale=0
|
||||
[ -n "$pidfile_pid" ] && [ ! -d "/proc/$pidfile_pid" ] && pidfile_stale=1
|
||||
crash_loop=$(logread 2>/dev/null | grep -E 'Instance openclaw::gateway.*crash loop' | tail -1)
|
||||
if [ "$enabled" != "1" ]; then
|
||||
echo "网关: 已禁用"
|
||||
elif [ -n "$procd_exit" ] && [ "$procd_exit" != "0" ] && [ "$procd_running" != "true" ]; then
|
||||
echo "网关: 启动失败 (退出码 $procd_exit)"
|
||||
elif [ -n "$crash_loop" ] && [ "$pidfile_stale" = "1" ] && [ "$procd_running" != "true" ] && [ "$procd_pid_alive" != "1" ]; then
|
||||
echo "网关: 启动失败 (procd crash-loop 抑制)"
|
||||
elif [ "$procd_running" = "true" ] || [ "$procd_pid_alive" = "1" ]; then
|
||||
echo "网关: 正在启动 (通常 20~40 秒,首次安装或负载较高时会更久)"
|
||||
[ -n "$procd_pid" ] && echo "进程ID: $procd_pid"
|
||||
else
|
||||
echo "网关: 已停止"
|
||||
fi
|
||||
fi
|
||||
|
||||
# PTY port
|
||||
|
||||
@@ -229,6 +229,35 @@ assert_node_runtime() {
|
||||
if command -v oc_assert_node_min_version >/dev/null 2>&1; then
|
||||
oc_assert_node_min_version "$NODE_BIN" "$required" || exit 1
|
||||
fi
|
||||
|
||||
# OpenClaw CLI 依赖 Unicode property escapes(例如 \p{Extended_Pictographic})。
|
||||
# ARM64 musl 自托管 Node 包必须带上 NODE_ICU_DATA,否则用户直接执行
|
||||
# `openclaw status` 等子命令会在 CLI 入口阶段抛 SyntaxError。
|
||||
if ! NODE_ICU_DATA="${NODE_BASE}/share/icu" "$NODE_BIN" -e "new RegExp('\\\\p{Extended_Pictographic}','u')" >/dev/null 2>&1; then
|
||||
log_error "Node.js ICU/Unicode 正则能力异常,请重新安装 Node.js 运行时"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_openclaw_cli_wrapper() {
|
||||
local oc_entry
|
||||
oc_entry=$(find_oc_entry)
|
||||
[ -n "$oc_entry" ] || return 1
|
||||
ensure_mkdir "$OC_GLOBAL/bin"
|
||||
# npm 默认生成的 openclaw 可能是指向 openclaw.mjs 的 symlink。
|
||||
# 写 wrapper 前必须先 unlink,否则重定向会顺着 symlink 覆盖真实 CLI 入口。
|
||||
rm -f "$OC_GLOBAL/bin/openclaw" 2>/dev/null || true
|
||||
cat > "$OC_GLOBAL/bin/openclaw" << EOF
|
||||
#!/bin/sh
|
||||
export HOME="${OC_DATA}"
|
||||
export OPENCLAW_HOME="${OC_DATA}"
|
||||
export OPENCLAW_STATE_DIR="${OC_DATA}/.openclaw"
|
||||
export OPENCLAW_CONFIG_PATH="${OC_DATA}/.openclaw/openclaw.json"
|
||||
export NODE_ICU_DATA="${NODE_BASE}/share/icu"
|
||||
export PATH="${NODE_BASE}/bin:${OC_GLOBAL}/bin:\$PATH"
|
||||
exec "${NODE_BIN}" "${oc_entry}" "\$@"
|
||||
EOF
|
||||
chmod +x "$OC_GLOBAL/bin/openclaw" 2>/dev/null || true
|
||||
}
|
||||
|
||||
detect_arch() {
|
||||
@@ -471,6 +500,7 @@ install_openclaw() {
|
||||
fi
|
||||
|
||||
if [ -n "$oc_ver" ]; then
|
||||
install_openclaw_cli_wrapper || true
|
||||
log_info "OpenClaw v${oc_ver} 安装成功"
|
||||
assert_node_runtime
|
||||
else
|
||||
@@ -510,6 +540,7 @@ do_setup() {
|
||||
|
||||
# 检查是否已安装
|
||||
if [ -x "$NODE_BIN" ] && [ -n "$(find_oc_entry)" ]; then
|
||||
install_openclaw_cli_wrapper || true
|
||||
local oc_ver=""
|
||||
local oc_entry="$(find_oc_entry)"
|
||||
local oc_pkg_dir="$(dirname "$oc_entry")"
|
||||
@@ -665,6 +696,7 @@ do_upgrade() {
|
||||
|
||||
echo ""
|
||||
if [ -n "$new_ver" ]; then
|
||||
install_openclaw_cli_wrapper || true
|
||||
assert_node_runtime
|
||||
if [ "$current_ver" = "$new_ver" ]; then
|
||||
log_info "当前已是最新版本 v${new_ver}"
|
||||
@@ -827,6 +859,7 @@ do_setup_offline() {
|
||||
local oc_entry=$(find_oc_entry)
|
||||
if [ -n "$oc_entry" ]; then
|
||||
local oc_ver=$("$NODE_BIN" "$oc_entry" --version 2>/dev/null | tr -d '[:space:]')
|
||||
install_openclaw_cli_wrapper || true
|
||||
log_info "OpenClaw v${oc_ver} 安装成功"
|
||||
assert_node_runtime
|
||||
else
|
||||
|
||||
@@ -338,7 +338,15 @@ async function restartGateway() {
|
||||
console.log(`\n${C.yellow}正在重启 Gateway...${C.reset}`);
|
||||
|
||||
try {
|
||||
await runCommand('/etc/init.d/openclaw', ['restart_gateway']);
|
||||
await runCommand('/bin/sh', ['-c', [
|
||||
"if [ \"$(uci -q get openclaw.main.enabled 2>/dev/null || echo 0)\" != \"1\" ]; then",
|
||||
" uci -q set openclaw.main.enabled='1';",
|
||||
" uci -q commit openclaw;",
|
||||
" /etc/init.d/openclaw enable >/dev/null 2>&1 || true;",
|
||||
'fi;',
|
||||
'/etc/init.d/openclaw restart_gateway >/dev/null 2>&1 || true;',
|
||||
'/etc/init.d/openclaw start >/dev/null 2>&1 || true'
|
||||
].join(' ')]);
|
||||
} catch {}
|
||||
|
||||
const spin = spinner({ text: 'Gateway 启动中,请稍候 (约 15-30 秒)...' });
|
||||
|
||||
@@ -558,12 +558,22 @@ restart_gateway() {
|
||||
# 修复数据目录权限 (root 用户操作可能改变了文件属主)
|
||||
fix_openclaw_state_permissions 2>/dev/null || true
|
||||
|
||||
# 首次安装后 UCI 默认保持 disabled。用户在配置向导中确认“立即重启”
|
||||
# 即表示希望当前配置生效,这里同步启用服务,避免提示重启但实际仍为“已禁用”。
|
||||
if [ "$(uci -q get openclaw.main.enabled 2>/dev/null || echo 0)" != "1" ]; then
|
||||
echo -e " ${CYAN}检测到 Gateway 未启用,正在启用服务...${NC}"
|
||||
uci -q set openclaw.main.enabled='1' 2>/dev/null || true
|
||||
uci -q commit openclaw 2>/dev/null || true
|
||||
/etc/init.d/openclaw enable >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
local port
|
||||
port=$(json_get gateway.port)
|
||||
port=${port:-18789}
|
||||
|
||||
# ── kill gateway 进程,让 procd respawn ──
|
||||
/etc/init.d/openclaw restart_gateway >/dev/null 2>&1
|
||||
/etc/init.d/openclaw start >/dev/null 2>&1
|
||||
|
||||
# ── 等待端口恢复 (最多 30 秒,含端口释放 + Node.js 冷启动) ──
|
||||
echo -e " ${YELLOW}⏳ Gateway 启动中,请稍候 (约 15-30 秒)...${NC}"
|
||||
|
||||
Reference in new issue
Block a user