From 1df1a4170b88c25073ccc3127e581a4b7c263a7f Mon Sep 17 00:00:00 2001 From: 10000ge10000 <10000ge10000@users.noreply.github.com> Date: Tue, 17 Mar 2026 01:51:20 +0800 Subject: [PATCH] =?UTF-8?q?release=20v2.0.0:=20=E9=80=82=E9=85=8D=20OpenCl?= =?UTF-8?q?aw=20v2026.3.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重大变更: - 配置管理菜单重构,更清晰的导航结构 - 新增高级配置菜单 - 新增全局环境变量 /etc/profile.d/openclaw.sh 修复: - QQ 机器人插件配置名称不匹配 (#XX) - 安装运行环境报错缺少 libstdcpp6 (#28) - 环境变量路径混乱 (#42) 新增: - 查看日志功能 - 飞书 Bot 配置流程优化 适配: - Node.js 版本升级到 22.16.0 - OpenClaw 版本升级到 v2026.3.13 - 依赖声明新增 libstdcpp6 --- .github/workflows/build-node-musl.yml | 138 +++++- CHANGELOG.md | 77 +++ Makefile | 4 +- README.md | 2 +- VERSION | 2 +- docs/UPGRADE_GUIDE_v2026.3.13.md | 652 ++++++++++++++++++++++++++ docs/images/2.png | Bin 0 -> 187969 bytes luasrc/controller/openclaw.lua | 4 +- root/etc/init.d/openclaw | 49 ++ root/etc/profile.d/openclaw.sh | 50 ++ root/etc/uci-defaults/99-openclaw | 29 +- root/usr/bin/openclaw-env | 172 +++++-- root/usr/share/openclaw/oc-config.sh | 486 +++++++++++++++++-- scripts/build-node-musl.sh | 302 +++++++++--- scripts/build_ipk.sh | 83 +++- scripts/build_run.sh | 9 +- 16 files changed, 1885 insertions(+), 174 deletions(-) create mode 100644 docs/UPGRADE_GUIDE_v2026.3.13.md create mode 100644 docs/images/2.png create mode 100644 root/etc/profile.d/openclaw.sh diff --git a/.github/workflows/build-node-musl.yml b/.github/workflows/build-node-musl.yml index 9b271b6..b549cec 100644 --- a/.github/workflows/build-node-musl.yml +++ b/.github/workflows/build-node-musl.yml @@ -2,41 +2,57 @@ name: Build Node.js ARM64 musl on: workflow_dispatch: + inputs: + build_v1: + description: 'Build V1 (22.15.1) - Legacy compatibility' + required: false + default: true + type: boolean + build_v2: + description: 'Build V2 (22.16.0) - Current version' + required: false + default: true + type: boolean jobs: - build: - name: Build Node.js ARM64 musl + # ── V1 构建: 使用 Alpine apk 模式 (22.15.1) ── + build-v1: + name: Build Node.js V1 (Legacy) + if: ${{ inputs.build_v1 }} runs-on: ubuntu-latest permissions: contents: write + outputs: + artifact_name: ${{ steps.build_info.outputs.artifact_name }} steps: - name: Checkout uses: actions/checkout@v4 - - name: Extract Node.js version from source - id: node_ver - run: | - NODE_VER=$(grep -oP 'NODE_VERSION="\$\{NODE_VERSION:-\K[0-9.]+' root/usr/bin/openclaw-env) - echo "version=${NODE_VER}" >> "$GITHUB_OUTPUT" - echo "Node.js version from openclaw-env: v${NODE_VER}" - - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: linux/arm64 - - name: Build Node.js ARM64 musl portable + - name: Build Node.js V1 ARM64 musl (apk mode) run: | - NODE_VER="${{ steps.node_ver.outputs.version }}" + NODE_VER="22.15.1" mkdir -p dist - echo "=== Building Node.js v${NODE_VER} ARM64 musl portable tarball ===" + echo "=== Building Node.js v${NODE_VER} ARM64 musl (apk mode) ===" docker run --rm --platform linux/arm64 \ -v "$PWD/dist:/output" \ -v "$PWD/scripts/build-node-musl.sh:/build-node-musl.sh:ro" \ -e "NODE_VER=${NODE_VER}" \ + -e "BUILD_MODE=apk" \ alpine:3.21 sh /build-node-musl.sh + - name: Build info + id: build_info + run: | + ARTIFACT_NAME=$(ls dist/*.tar.xz | head -1 | xargs basename) + echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT" + echo "Artifact: ${ARTIFACT_NAME}" + - name: Verify tarball run: | echo "=== Output files ===" @@ -48,9 +64,90 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: node-arm64-musl + name: node-arm64-musl-v1 path: dist/*.tar.xz + # ── V2 构建: 使用交叉编译模式 (22.16.0) ── + build-v2: + name: Build Node.js V2 (Current) + if: ${{ inputs.build_v2 }} + runs-on: ubuntu-latest + permissions: + contents: write + outputs: + artifact_name: ${{ steps.build_info.outputs.artifact_name }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: linux/arm64 + + - name: Build Node.js V2 ARM64 musl (cross mode) + run: | + NODE_VER="22.16.0" + mkdir -p dist + echo "=== Building Node.js v${NODE_VER} ARM64 musl (cross mode) ===" + docker run --rm --platform linux/arm64 \ + -v "$PWD/dist:/output" \ + -v "$PWD/scripts/build-node-musl.sh:/build-node-musl.sh:ro" \ + -e "NODE_VER=${NODE_VER}" \ + -e "BUILD_MODE=cross" \ + alpine:3.21 sh /build-node-musl.sh + + - name: Build info + id: build_info + run: | + ARTIFACT_NAME=$(ls dist/*.tar.xz | head -1 | xargs basename) + echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT" + echo "Artifact: ${ARTIFACT_NAME}" + + - name: Verify tarball + run: | + echo "=== Output files ===" + ls -lh dist/ + echo "" + echo "=== Tarball contents (first 20 entries) ===" + tar tJf dist/*.tar.xz | head -20 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: node-arm64-musl-v2 + path: dist/*.tar.xz + + # ── 发布到 GitHub Release ── + release: + name: Create/Update Release + needs: [build-v1, build-v2] + if: always() && (needs.build-v1.result == 'success' || needs.build-v2.result == 'success') + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Download V1 artifact + if: ${{ needs.build-v1.result == 'success' }} + uses: actions/download-artifact@v4 + with: + name: node-arm64-musl-v1 + path: dist/ + + - name: Download V2 artifact + if: ${{ needs.build-v2.result == 'success' }} + uses: actions/download-artifact@v4 + with: + name: node-arm64-musl-v2 + path: dist/ + + - name: List all artifacts + run: | + echo "=== All artifacts ===" + ls -lh dist/ + - name: Create/Update Release uses: softprops/action-gh-release@v2 with: @@ -66,7 +163,16 @@ jobs: Node.js 官方 [unofficial-builds](https://unofficial-builds.nodejs.org/) 仅提供 x64 musl 构建,不提供 ARM64 musl。 此 Release 使用 Alpine Linux ARM64 (musl libc) 环境打包。 - **注意**: 文件名中的版本号为 Alpine `apk add nodejs` 实际安装的版本, - 构建时自动从 `openclaw-env` 读取。 + ## 版本说明 - `openclaw-env setup` 会在 ARM64 musl 设备上自动从此处下载。 + | 文件 | 版本 | 用途 | + |------|------|------| + | `node-v22.16.0-linux-arm64-musl.tar.xz` | V2 (当前) | OpenClaw v2026.3.11+ (要求 >= 22.16.0) | + | `node-v22.15.1-linux-arm64-musl.tar.xz` | V1 (旧版) | OpenClaw v2026.3.8 及更早版本 | + + ## 构建模式 + + - **V2 (22.16.0)**: 交叉编译模式,从 Node.js 官方 glibc 版本转换为 musl + - **V1 (22.15.1)**: Alpine apk 模式,使用 Alpine 仓库的 Node.js + + `openclaw-env setup` 会在 ARM64 musl 设备上自动从此处下载合适的版本。 diff --git a/CHANGELOG.md b/CHANGELOG.md index ff38197..ceaf299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,83 @@ 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。 +## [2.0.0] - 2026-03-16 + +### 重大变更 +- **配置管理菜单重构**: 主菜单采用分组样式,更清晰的导航结构 + - AI 模型配置:配置 AI 模型和提供商、设置活动模型 + - 消息渠道:配置消息渠道 (电报/QQ/飞书) + - 系统管理:健康检查与状态、查看日志、重启 Gateway + - 高级选项:高级配置、重置配置、显示当前配置概览 +- **新增高级配置菜单**: 独立的高级配置入口,包含: + - Gateway 端口/绑定地址/运行模式配置 + - 日志级别设置 + - ACP Dispatch 开关 + - 官方完整配置向导入口 + - 原始 JSON 查看/编辑 + - 配置备份导出/导入 + +### 修复 +- **QQ 机器人插件配置名称不匹配** (#XX): OpenClaw v2026.3.13 加强了配置验证,`plugins.allow` 中的插件名称必须与实际安装的插件名完全匹配 + - 问题:旧版本写入的是 `openclaw-qqbot`,但实际插件名是 `@tencent-connect/openclaw-qqbot` + - 影响:配置验证失败导致 Gateway 启动后立即退出,procd 进入 crash loop 保护 + - 修复:新增 `fix_plugin_config` 函数自动检测并修正不匹配的插件名称 + - 修复:`configure_qq` 安装插件后调用 `ensure_qqbot_plugin_allowed` 确保正确的插件名写入配置 + - 修复:`init.d` 服务启动前自动修复配置中的插件名称 +- **安装运行环境报错** (#28): 部分系统缺少 `libstdcpp6` 导致 Node.js 无法运行,安装 pnpm 时卡住 + - 依赖声明新增 `libstdcpp6`,安装时自动拉取 C++ 标准库 + - Node.js 验证逻辑改进:检测到运行失败时提示缺失的库并给出修复命令 +- **环境变量路径混乱** (#42): 用户通过 SSH 直接运行 `openclaw` 命令时,CLI 使用默认 `HOME=/root` 导致配置文件和 skills 散落在 `/root/.openclaw/` 而非正确的 `/opt/openclaw/data/.openclaw/` + - 新增 `/etc/profile.d/openclaw.sh` 全局环境变量脚本,SSH 登录后自动设置正确的 PATH、OPENCLAW_HOME 等变量 + - 升级时自动迁移 `/root/.openclaw/` 下的 skills、sessions、openclaw.json 到正确路径 + - 用户现在可以直接运行 `npm`、`npx`、`openclaw config` 等命令 + +### 新增 +- **全局环境变量**: `/etc/profile.d/openclaw.sh` 为 SSH 用户提供: + - PATH 包含 Node.js 和 OpenClaw bin 目录 + - OPENCLAW_HOME、OPENCLAW_STATE_DIR、OPENCLAW_CONFIG_PATH 正确指向安装路径 + - `openclaw` 命令别名(当全局安装时) +- **查看日志功能**: 主菜单新增「查看日志」选项,显示最近 100 条 OpenClaw 日志 + +### 变更 +- Makefile 新增 `/etc/profile.d/openclaw.sh` 安装步骤 +- 依赖声明新增 `libstdcpp6` +- **飞书 Bot 配置流程优化**: 参考 QQ Bot 实现,大幅简化配置步骤 + - 新增 App ID 格式验证(`cli_xxx` 格式) + - 新增 App Secret 长度检查 + - 使用 OpenClaw CLI 一键配置(`oc_cmd channels add --channel feishu`) + - 配置保存后自动验证 + - 新增详细的事件订阅、权限配置、插件安装指引 + +### 适配 OpenClaw v2026.3.13 + +#### 升级说明 +- **Node.js 版本升级**: 从 22.15.1 升级到 22.16.0 (OpenClaw v2026.3.11+ 最低要求) +- **OpenClaw 版本升级**: 从 v2026.3.8 升级到 v2026.3.13 + +#### 重要安全修复 +- WebSocket 跨站劫持漏洞修复 (GHSA-5wcw-8jjv-m286) +- 设备配对安全增强:切换到短期引导令牌 (GHSA-99qw-6mr3-36qr) +- 命令审批安全加固:Unicode 不可见字符转义、执行检测规范化 +- 多渠道 Webhook 安全增强:飞书/LINE/Zalo 签名验证强化 + +#### 新功能支持 +- **Fast Mode**: OpenAI/Anthropic 快速响应模式支持 +- **Control UI 重构**: 新版 Dashboard-v2 模块化界面 +- **Ollama 本地向导**: 支持本地或云端+本地混合模式 +- **Kubernetes 部署**: 新增 K8s 部署清单和文档 +- **Docker 时区**: 新增 `OPENCLAW_TZ` 环境变量支持 + +#### 破坏性变更处理 +- **Cron 主动投递收紧**: 升级后建议运行 `openclaw doctor --fix` 迁移旧版 cron 存储 +- **插件安全策略**: 禁用隐式工作区插件自动加载,需显式信任决策 +- **Node.js 最低版本**: 要求 >= 22.16.0 (已在 openclaw-env 中更新) + +#### 配置兼容性 +- 现有配置文件完全兼容,无需手动迁移 +- 已预设 `gateway.controlUi.dangerouslyDisableDeviceAuth=true` 禁用设备认证 +- 已预设 `gateway.controlUi.allowInsecureAuth=true` 允许不安全认证 + ## [1.0.15] - 2026-03-13 ### 修复 diff --git a/Makefile b/Makefile index 23a04c5..6cdc6bb 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ PKG_MAINTAINER:=10000ge10000 <10000ge10000@users.noreply.github.com> PKG_LICENSE:=GPL-3.0 LUCI_TITLE:=OpenClaw AI 网关 LuCI 管理插件 -LUCI_DEPENDS:=+luci-compat +luci-base +curl +openssl-util +script-utils +tar +LUCI_DEPENDS:=+luci-compat +luci-base +curl +openssl-util +script-utils +tar +libstdcpp6 LUCI_PKGARCH:=all # 优先使用 luci.mk (feeds 模式), 不可用时回退 package.mk @@ -52,6 +52,8 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./root/etc/uci-defaults/99-openclaw $(1)/etc/uci-defaults/99-openclaw $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./root/etc/init.d/openclaw $(1)/etc/init.d/openclaw + $(INSTALL_DIR) $(1)/etc/profile.d + $(INSTALL_DATA) ./root/etc/profile.d/openclaw.sh $(1)/etc/profile.d/openclaw.sh $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) ./root/usr/bin/openclaw-env $(1)/usr/bin/openclaw-env $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller diff --git a/README.md b/README.md index f17246d..7752d06 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ 在路由器上运行 OpenClaw,通过 LuCI 管理界面完成安装、配置和服务管理。
- OpenClaw LuCI 管理界面 + OpenClaw LuCI 管理界面
**系统要求** diff --git a/VERSION b/VERSION index a970716..227cea2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.15 +2.0.0 diff --git a/docs/UPGRADE_GUIDE_v2026.3.13.md b/docs/UPGRADE_GUIDE_v2026.3.13.md new file mode 100644 index 0000000..218ae30 --- /dev/null +++ b/docs/UPGRADE_GUIDE_v2026.3.13.md @@ -0,0 +1,652 @@ +# OpenClaw 版本升级推进流程文档 + +## 概述 + +本文档详细记录了从 OpenClaw v2026.3.8 升级到 v2026.3.13 的完整分析和推进流程。 + +| 项目 | 当前版本 | 目标版本 | +|------|----------|----------| +| OpenClaw | v2026.3.8 | v2026.3.13 | +| 发布日期 | 2026-03-09 | 2026-03-14 | +| Node.js 要求 | >= 22.x | >= 22.16.0 | + +--- + +## 一、版本差异分析报告 + +### 1.1 版本发布时间线 + +| 版本 | 发布日期 | 类型 | +|------|----------|------| +| v2026.3.8 | 2026-03-09 | 稳定版 (当前) | +| v2026.3.11 | 2026-03-12 | 稳定版 | +| v2026.3.12 | 2026-03-13 | 稳定版 | +| v2026.3.13 | 2026-03-14 | 稳定版 (目标) | + +### 1.2 关键变更摘要 + +#### 🔴 重大变更 (Breaking Changes) + +1. **Node.js 最低版本要求提升** + - 旧版本: Node.js >= 22.x + - 新版本: Node.js >= 22.16.0 + - **影响**: 当前项目 `NODE_VERSION="22.15.1"` 不满足要求,必须升级 + +2. **Cron/主动投递收紧 (v2026.3.11)** + - 孤立的直接 cron 发送不再通过临时 agent 发送或主会话摘要通知 + - 需要运行 `openclaw doctor --fix` 迁移旧版 cron 存储 + +3. **插件安全策略变更 (v2026.3.12)** + - 禁用隐式工作区插件自动加载 + - 克隆的仓库不能执行工作区插件代码,需要显式信任决策 + +#### 🟡 安全修复 + +| 编号 | 描述 | 影响范围 | +|------|------|----------| +| GHSA-5wcw-8jjv-m286 | WebSocket 跨站劫持漏洞修复 | Gateway 模式 | +| GHSA-99qw-6mr3-36qr | 设备配对安全:切换到短期引导令牌 | 配对流程 | +| GHSA-pcqg-f7rg-xfvv | 执行审批:Unicode 不可见字符转义 | 命令审批 | +| GHSA-9r3v-37xh-2cf6 | 执行检测:Unicode 规范化 | 命令检测 | +| GHSA-f8r2-vg7x-gh8m | 执行白名单:POSIX 大小写敏感 | 命令白名单 | +| GHSA-r7vr-gr74-94p8 | 命令权限:/config 和 /debug 需所有者权限 | 权限控制 | +| GHSA-rqpp-rjj8-7wv8 | Gateway 认证:清除未绑定客户端声明范围 | 认证安全 | +| GHSA-vmhq-cqm9-6p7q | 浏览器请求:阻止持久化配置文件变更 | 浏览器控制 | +| GHSA-2rqg-gjgv-84jm | Agent 安全:拒绝公共生成运行血统字段 | Agent 安全 | +| GHSA-wcxr-59v9-rxr8 | 会话状态:沙箱会话树可见性强制执行 | 会话隔离 | +| GHSA-2pwv-x786-56f8 | 设备配对:限制令牌范围 | 令牌安全 | +| GHSA-jv4g-m82p-2j93 | WebSocket 预认证:缩短握手保留时间 | 连接安全 | +| GHSA-6rph-mmhp-h7h9 | 代理附件:恢复媒体存储大小限制 | 文件上传 | +| GHSA-jf5v-pqgw-gm5m | 主机环境:阻止继承 GIT_EXEC_PATH | 环境隔离 | +| GHSA-g353-mgv3-8pcj | 飞书 Webhook:要求加密密钥 | 飞书渠道 | +| GHSA-m69h-jm2f-2pv8 | 飞书反应:群组授权和提及门控 | 飞书渠道 | +| GHSA-mhxh-9pjm-w7q5 | LINE Webhook:空事件也需要签名 | LINE 渠道 | +| GHSA-5m9r-p9g7-679c | Zalo Webhook:限制无效密钥猜测速率 | Zalo 渠道 | + +#### 🟢 新增功能 + +1. **Control UI/Dashboard-v2 重构** (v2026.3.12) + - 模块化概览、聊天、配置、agent 和会话视图 + - 命令面板、移动端底部标签 + - 斜杠命令、搜索、导出、固定消息等聊天工具 + +2. **OpenAI/GPT-5.4 Fast Mode** (v2026.3.12) + - 可配置的会话级快速切换 + - 跨 `/fast`、TUI、Control UI 和 ACP 支持 + - 每模型配置默认值和 OpenAI/Codex 请求整形 + +3. **Anthropic/Claude Fast Mode** (v2026.3.12) + - 映射共享 `/fast` 切换到 Anthropic API `service_tier` 请求 + - Anthropic 和 OpenAI fast-mode 层级的实时验证 + +4. **提供商插件架构** (v2026.3.12) + - Ollama、vLLM、SGLang 迁移到提供商插件架构 + - 提供商拥有的引导、发现、模型选择器设置 + +5. **Kubernetes 部署支持** (v2026.3.12) + - 原始清单、Kind 设置、部署文档 + +6. **Ollama 本地模式向导** (v2026.3.11) + - 本地或云端+本地模式的首选 Ollama 设置 + - 基于浏览器的云端登录 + - 精选模型建议 + +7. **Docker 时区支持** (v2026.3.13) + - 新增 `OPENCLAW_TZ` 环境变量 + +8. **iOS/macOS UI 改进** + - iOS: 欢迎屏幕、停靠工具栏、聊天模型选择器 + - macOS: 聊天模型选择器、思考级别选择持久化 + +#### 🔵 Bug 修复 (精选) + +| 类别 | 修复内容 | +|------|----------| +| 模型支持 | Kimi Coding 工具调用格式修复、OpenRouter 模型 ID 规范化 | +| Telegram | HTML 消息分块、最终预览投递、IPv4 回退重试 | +| Discord | 回复分块、自动线程归档时长配置 | +| 飞书 | 本地图片自动转换、非 ASCII 文件名保留 | +| Mattermost | 块流重复消息修复、Markdown 格式保留 | +| 会话管理 | 重置模型重新计算、会话发现、ACP 会话别名 | +| 性能 | 构建内存回归修复 (~2x)、插件 SDK 块去重 | + +### 1.3 配置文件格式变化 + +#### 新增配置项 + +```json +{ + "agents": { + "defaults": { + "compaction": { + "postIndexSync": true + }, + "memorySearch": { + "sync": { + "sessions": { + "postCompactionForce": false + } + } + } + } + }, + "channels": { + "discord": { + "autoArchiveDuration": 60 // 60, 1440, 4320, 10080 分钟 + } + } +} +``` + +#### Fast Mode 使用说明 + +Fast Mode 是 OpenClaw v2026.3.12 新增的功能,用于启用 OpenAI/Anthropic 的快速响应模式。 + +**注意**: Fast Mode 不是通过配置文件直接设置的,而是通过以下方式启用: + +1. **TUI 界面**: 使用 `/fast` 命令切换 +2. **Control UI**: 在聊天界面中切换 Fast Mode 开关 +3. **API 调用**: 在请求参数中设置 `fastMode: true` + +**配置示例** (通过 CLI 设置): +```bash +# 在会话中切换 Fast Mode +openclaw tui +# 然后输入 /fast 命令 + +# 或通过 Control UI (http://<设备IP>:18789) 在聊天设置中启用 +``` + +**支持的模型**: +- OpenAI: GPT-4/5 系列 (需要 API 支持 fast tier) +- Anthropic: Claude 系列 (需要 API 支持 service_tier) + +#### 废弃/变更配置项 + +- `channels.zalouser.dangerouslyAllowNameMatching` - 新增危险选项 +- `channels.slack.dangerouslyAllowNameMatching` - 新增危险选项 +- `channels.teams.dangerouslyAllowNameMatching` - 新增危险选项 + +### 1.4 API 接口变动 + +| 接口 | 变化类型 | 描述 | +|------|----------|------| +| `/pair` | 安全增强 | 使用短期引导令牌替代共享凭证 | +| `sessions_spawn` | 新增 | 支持 `resumeSessionId` 参数 | +| `sessions.patch` | 新增字段 | 支持 `spawnedBy`、`spawnDepth` 血统字段 | +| `node.pending.*` | 新增 | 内存中待处理工作队列原语 | + +### 1.5 依赖项变更 + +#### Node.js 版本要求 + +``` +旧版本: "engines": { "node": ">=22.x" } +新版本: "engines": { "node": ">=22.16.0" } +``` + +#### 包管理器 + +``` +pnpm@10.23.0 (无变化) +``` + +#### 核心依赖更新 (精选) + +| 包名 | 变化 | +|------|------| +| `@agentclientprotocol/sdk` | 升级到 0.16.1 | +| `playwright-core` | 升级到 1.58.2 | +| `sharp` | 升级到 ^0.34.5 | +| `hono` | 升级到 4.12.7 | +| `zod` | 升级到 ^4.3.6 | + +### 1.6 二进制文件大小变化 + +| 指标 | v2026.3.8 | v2026.3.13 | 变化 | +|------|-----------|------------|------| +| npm 包解压大小 | ~90MB | ~95MB | +5MB | +| 文件数量 | ~4500 | ~4730 | +230 | + +--- + +## 二、需要修改的文件清单及具体修改内容 + +### 2.1 必须修改的文件 + +#### 2.1.1 `root/usr/bin/openclaw-env` + +**修改原因**: Node.js 版本要求提升 + +```diff +- NODE_VERSION="${NODE_VERSION:-22.15.1}" ++ NODE_VERSION="${NODE_VERSION:-22.16.0}" + +- # 经过验证的 OpenClaw 稳定版本 (更新此值需同步测试) +- OC_TESTED_VERSION="2026.3.8" ++ # 经过验证的 OpenClaw 稳定版本 (更新此值需同步测试) ++ OC_TESTED_VERSION="2026.3.13" +``` + +#### 2.1.2 `CHANGELOG.md` + +**新增内容**: + +```markdown +## [2.1.0] - 2026-03-XX + +### 适配 OpenClaw v2026.3.13 + +#### 升级说明 +- **Node.js 版本升级**: 从 22.15.1 升级到 22.16.0 (OpenClaw 最低要求) +- **OpenClaw 版本升级**: 从 v2026.3.8 升级到 v2026.3.13 + +#### 重要变更 +- 安全修复: WebSocket 跨站劫持漏洞、设备配对安全增强 +- 新功能: Control UI 重构、Fast Mode 支持、Ollama 本地向导 +- 插件安全: 禁用隐式工作区插件自动加载 + +#### 配置迁移 +- 升级后建议运行 `openclaw doctor --fix` 迁移旧版 cron 存储 +``` + +#### 2.1.3 `VERSION` + +```diff +- 2.0.0 ++ 2.1.0 +``` + +### 2.2 建议修改的文件 + +#### 2.2.1 `root/usr/share/openclaw/oc-config.sh` + +**检查点**: +1. 确认 `openclaw doctor --fix` 命令在升级后可用 +2. 检查是否有新增的配置项需要在菜单中展示 +3. 确认 Fast Mode 配置是否需要 UI 入口 + +**建议新增菜单项**: + +```bash +# 在模型配置菜单中新增 Fast Mode 开关 +configure_fast_mode() { + local current + current=$(get_config ".params.fastMode // false") + + if [ "$current" = "true" ]; then + status="已启用" + else + status="已禁用" + fi + + echo "" + echo "=== Fast Mode 配置 ===" + echo "当前状态: $status" + echo "" + echo "Fast Mode 可启用 OpenAI/Anthropic 的快速响应模式" + echo "需要 API 密钥支持相应的服务层级" + echo "" + echo "1) 启用" + echo "2) 禁用" + echo "0) 返回" + echo "" + read -p "请选择: " choice + + case $choice in + 1) set_config ".params.fastMode = true" ;; + 2) set_config ".params.fastMode = false" ;; + 0) return ;; + esac +} +``` + +#### 2.2.2 `luasrc/model/cbi/openclaw/basic.lua` + +**检查点**: +1. 确认配置项与新版 OpenClaw 兼容 +2. 考虑新增 Fast Mode 配置 UI + +#### 2.2.3 `README.md` + +**更新内容**: +- 更新版本号引用 +- 添加升级注意事项 +- 更新 Node.js 版本要求说明 + +### 2.3 需要验证的文件 + +| 文件 | 验证内容 | +|------|----------| +| `root/etc/init.d/openclaw` | 启动脚本兼容性 | +| `scripts/build_run.sh` | 构建脚本 Node.js 版本 | +| `scripts/build_ipk.sh` | IPK 构建脚本 | + +--- + +## 三、升级测试方案 + +### 3.1 测试环境准备 + +#### 3.1.1 测试矩阵 + +| 环境 | 架构 | libc | 固件 | +|------|------|------|------| +| x86_64-glibc | x86_64 | glibc | Debian/Ubuntu | +| x86_64-musl | x86_64 | musl | OpenWrt/iStoreOS | +| aarch64-musl | aarch64 | musl | OpenWrt/iStoreOS | + +#### 3.1.2 测试前准备 + +```bash +# 1. 备份当前配置 +cp -r /opt/openclaw/data/.openclaw /tmp/openclaw-backup + +# 2. 记录当前版本 +openclaw --version + +# 3. 检查 Node.js 版本 +node --version +``` + +### 3.2 升级测试步骤 + +#### 3.2.1 全新安装测试 + +```bash +# 1. 清理旧环境 +rm -rf /opt/openclaw + +# 2. 安装新版本 +openclaw-env setup + +# 3. 验证版本 +openclaw --version # 应显示 2026.3.13 +node --version # 应显示 v22.16.0 或更高 + +# 4. 运行引导 +openclaw onboard + +# 5. 基础功能测试 +openclaw doctor +``` + +#### 3.2.2 升级安装测试 + +```bash +# 1. 从 v2026.3.8 升级 +export OC_VERSION=2026.3.13 +openclaw-env upgrade + +# 2. 验证版本 +openclaw --version + +# 3. 运行迁移 +openclaw doctor --fix + +# 4. 验证配置 +openclaw config list +``` + +#### 3.2.3 配置兼容性测试 + +```bash +# 1. 恢复旧配置 +cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/ + +# 2. 重启服务 +/etc/init.d/openclaw restart + +# 3. 检查日志 +logread -f | grep -i openclaw + +# 4. 验证渠道 +openclaw channels list +``` + +### 3.3 功能回归测试清单 + +| 测试项 | 测试内容 | 预期结果 | 状态 | +|--------|----------|----------|------| +| 基础启动 | Gateway 启动 | 正常启动 | [ ] | +| 模型配置 | 设置活动模型 | 配置保存成功 | [ ] | +| Telegram | 消息收发 | 双向通信正常 | [ ] | +| QQ Bot | 消息收发 | 双向通信正常 | [ ] | +| 飞书 | 消息收发 | 双向通信正常 | [ ] | +| Discord | 消息收发 | 双向通信正常 | [ ] | +| Doctor | 健康检查 | 无错误报告 | [ ] | +| Doctor --fix | 迁移修复 | 成功执行 | [ ] | +| Fast Mode | 开关切换 | 配置生效 | [ ] | +| LuCI 界面 | 页面加载 | 正常显示 | [ ] | +| 日志查看 | 日志输出 | 正常显示 | [ ] | +| 备份恢复 | 配置备份/恢复 | 功能正常 | [ ] | + +### 3.4 性能测试 + +```bash +# 1. 内存占用 +ps aux | grep node + +# 2. 启动时间 +time /etc/init.d/openclaw start + +# 3. 响应延迟 +curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000/health +``` + +### 3.5 回滚策略 + +#### 3.5.1 自动回滚脚本 + +```bash +#!/bin/sh +# rollback.sh - OpenClaw 版本回滚脚本 + +echo "=== OpenClaw 版本回滚 ===" + +# 1. 停止服务 +/etc/init.d/openclaw stop + +# 2. 备份当前状态 +cp -r /opt/openclaw/data/.openclaw /tmp/openclaw-failed-upgrade + +# 3. 恢复旧版本 +export OC_VERSION=2026.3.8 +openclaw-env upgrade + +# 4. 恢复配置 +cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/ + +# 5. 重启服务 +/etc/init.d/openclaw start + +# 6. 验证 +openclaw --version +echo "回滚完成" +``` + +#### 3.5.2 手动回滚步骤 + +```bash +# 1. 停止服务 +/etc/init.d/openclaw stop + +# 2. 卸载新版本 +npm uninstall -g openclaw --prefix /opt/openclaw/global + +# 3. 安装旧版本 +npm install -g openclaw@2026.3.8 --prefix /opt/openclaw/global + +# 4. 恢复 Node.js (如需要) +# 重新运行 openclaw-env node 安装 22.15.1 + +# 5. 恢复配置 +cp -r /tmp/openclaw-backup/* /opt/openclaw/data/.openclaw/ + +# 6. 重启服务 +/etc/init.d/openclaw start +``` + +--- + +## 四、发布前检查清单 + +### 4.1 代码检查 + +- [ ] 所有文件修改已提交 +- [ ] CHANGELOG.md 已更新 +- [ ] VERSION 文件已更新 +- [ ] README.md 已更新 + +### 4.2 测试检查 + +- [ ] x86_64-glibc 环境测试通过 +- [ ] x86_64-musl 环境测试通过 +- [ ] aarch64-musl 环境测试通过 +- [ ] 全新安装测试通过 +- [ ] 升级安装测试通过 +- [ ] 配置兼容性测试通过 +- [ ] 功能回归测试通过 +- [ ] 性能测试无退化 + +### 4.3 文档检查 + +- [ ] 升级指南已更新 +- [ ] 用户文档已更新 +- [ ] API 文档已更新 (如有变化) + +### 4.4 构建检查 + +- [ ] IPK 构建成功 +- [ ] 离线安装包构建成功 +- [ ] 文件大小合理 + +### 4.5 安全检查 + +- [ ] 无已知安全漏洞 +- [ ] 敏感信息已清理 +- [ ] 权限设置正确 + +--- + +## 五、用户升级指南草稿 + +### OpenClaw v2026.3.13 升级指南 + +#### 升级前须知 + +1. **Node.js 版本要求**: 本次升级要求 Node.js >= 22.16.0 +2. **配置兼容性**: 现有配置文件兼容,无需手动迁移 +3. **建议备份**: 升级前建议备份当前配置 + +#### 升级方式 + +##### 方式一:通过 LuCI 界面升级 + +1. 登录 LuCI 管理界面 +2. 进入「服务」→「OpenClaw」 +3. 点击「系统管理」→「升级 OpenClaw」 +4. 等待升级完成 +5. 验证版本号已更新 + +##### 方式二:通过命令行升级 + +```bash +# SSH 登录后执行 +openclaw-env upgrade + +# 升级后运行迁移 +openclaw doctor --fix + +# 验证版本 +openclaw --version +``` + +##### 方式三:指定版本升级 + +```bash +# 指定升级到 v2026.3.13 +export OC_VERSION=2026.3.13 +openclaw-env upgrade +``` + +#### 升级后验证 + +```bash +# 1. 检查服务状态 +/etc/init.d/openclaw status + +# 2. 检查版本 +openclaw --version + +# 3. 运行健康检查 +openclaw doctor + +# 4. 检查日志 +logread | grep -i openclaw | tail -20 +``` + +#### 新功能体验 + +1. **Fast Mode**: 在模型配置中启用快速响应模式 +2. **Control UI**: 访问 `http://<设备IP>:3000` 体验新版控制面板 +3. **Ollama 本地向导**: 运行 `openclaw onboard` 配置本地模型 + +#### 常见问题 + +**Q: 升级后服务无法启动?** + +A: 检查 Node.js 版本是否满足要求: +```bash +node --version # 应显示 v22.16.0 或更高 +``` + +**Q: 升级后配置丢失?** + +A: 配置文件位于 `/opt/openclaw/data/.openclaw/`,检查是否正确恢复。 + +**Q: 如何回滚到旧版本?** + +A: 执行以下命令: +```bash +export OC_VERSION=2026.3.8 +openclaw-env upgrade +``` + +#### 安全改进说明 + +本次升级包含多项安全修复,建议所有用户尽快升级: + +- WebSocket 跨站劫持漏洞修复 +- 设备配对安全增强 +- 命令审批安全加固 +- 多个渠道 Webhook 安全增强 + +--- + +## 六、附录 + +### A. 版本发布说明链接 + +- [v2026.3.13 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.13-1) +- [v2026.3.12 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.12) +- [v2026.3.11 Release Notes](https://github.com/openclaw/openclaw/releases/tag/v2026.3.11) + +### B. 相关 Issue 和 PR + +本次升级涉及的主要变更: +- Node.js 最低版本要求: #45640 +- Fast Mode 支持: 多个 PR +- 安全修复: 多个 GHSA 编号 + +### C. 联系方式 + +如有问题,请通过以下方式反馈: +- GitHub Issues: https://github.com/10000ge10000/luci-app-openclaw/issues +- OpenClaw 官方: https://github.com/openclaw/openclaw/issues + +--- + +**文档版本**: 1.0 +**创建日期**: 2026-03-16 +**最后更新**: 2026-03-16 diff --git a/docs/images/2.png b/docs/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..121ca5e2e92fc2ec0fb72686d30eb0f295a41416 GIT binary patch literal 187969 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

lenH(QE^GxX=MOAIHEa|ntz~F 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⩛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 Bv}^zX literal 0 HcmV?d00001 diff --git a/luasrc/controller/openclaw.lua b/luasrc/controller/openclaw.lua index 5ba6c07..4a96cca 100644 --- a/luasrc/controller/openclaw.lua +++ b/luasrc/controller/openclaw.lua @@ -374,6 +374,8 @@ function action_uninstall() sys.exec("uci set openclaw.main.enabled=0; uci commit openclaw 2>/dev/null") -- 删除 Node.js + OpenClaw 运行环境 sys.exec("rm -rf /opt/openclaw") + -- 清理旧数据迁移后可能残留的目录 + sys.exec("rm -rf /root/.openclaw 2>/dev/null") -- 清理临时文件 sys.exec("rm -f /tmp/openclaw-setup.* /tmp/openclaw-update.log /var/run/openclaw*.pid") -- 删除 openclaw 系统用户 @@ -382,7 +384,7 @@ function action_uninstall() http.prepare_content("application/json") http.write_json({ status = "ok", - message = "运行环境已卸载。Node.js、OpenClaw 及相关数据已清理。" + message = "运行环境已卸载。已清理: Node.js 运行环境 (/opt/openclaw)、旧数据目录 (/root/.openclaw)、临时文件。" }) end diff --git a/root/etc/init.d/openclaw b/root/etc/init.d/openclaw index a4a786e..df25c8c 100755 --- a/root/etc/init.d/openclaw +++ b/root/etc/init.d/openclaw @@ -193,6 +193,55 @@ fi # 同步 UCI 到 JSON sync_uci_to_json + # v2026.3.13: 修复插件配置中的插件名称不匹配问题 + # OpenClaw 加强了配置验证,plugins.allow 中的名称必须与实际插件名完全匹配 + # 问题: 旧版本写入的是 "openclaw-qqbot",但实际插件名是 "@tencent-connect/openclaw-qqbot" + fix_plugin_config() { + local qqbot_ext_dir="${OC_DATA}/.openclaw/extensions/openclaw-qqbot" + [ ! -d "$qqbot_ext_dir" ] && return + [ ! -f "$CONFIG_FILE" ] && return + + "$NODE_BIN" -e " + const fs=require('fs'); + try{ + const d=JSON.parse(fs.readFileSync('${CONFIG_FILE}','utf8')); + if(!d.plugins)d.plugins={}; + let modified=false; + + // 修复 plugins.allow 数组中的插件名称 + if(Array.isArray(d.plugins.allow)){ + const oldName='openclaw-qqbot'; + const newName='@tencent-connect/openclaw-qqbot'; + const idx=d.plugins.allow.indexOf(oldName); + if(idx!==-1){ + if(!d.plugins.allow.includes(newName)){ + d.plugins.allow[idx]=newName; + modified=true; + }else{ + d.plugins.allow.splice(idx,1); + modified=true; + } + } + } + + // 同时修复 plugins.entries 中的键名 + if(d.plugins.entries && d.plugins.entries['openclaw-qqbot']){ + if(!d.plugins.entries['@tencent-connect/openclaw-qqbot']){ + d.plugins.entries['@tencent-connect/openclaw-qqbot']=d.plugins.entries['openclaw-qqbot']; + } + delete d.plugins.entries['openclaw-qqbot']; + modified=true; + } + + if(modified){ + fs.writeFileSync('${CONFIG_FILE}',JSON.stringify(d,null,2)); + console.log('FIXED'); + } + }catch(e){} + " 2>/dev/null && chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null + } + fix_plugin_config + # 修复数据目录权限 (防止 root 用户操作后留下无法读取的文件) chown -R openclaw:openclaw "$OC_DATA" 2>/dev/null || true diff --git a/root/etc/profile.d/openclaw.sh b/root/etc/profile.d/openclaw.sh new file mode 100644 index 0000000..969cfcf --- /dev/null +++ b/root/etc/profile.d/openclaw.sh @@ -0,0 +1,50 @@ +#!/bin/sh +# ============================================================================ +# luci-app-openclaw — 全局环境变量 +# 仅在 Node.js 已安装时生效,为 SSH 登录用户提供正确的运行环境 +# 解决 Issue #42: 统一配置文件路径,避免 /root/.openclaw 与 /opt/openclaw/data/.openclaw 混乱 +# ============================================================================ + +NODE_BASE="/opt/openclaw/node" +OC_GLOBAL="/opt/openclaw/global" +OC_DATA="/opt/openclaw/data" + +# 检查 Node.js 是否已安装 +[ -x "${NODE_BASE}/bin/node" ] || return 0 + +# 添加 Node.js 和 OpenClaw 到 PATH (非侵入式,检查是否已存在) +case ":$PATH:" in + *":${NODE_BASE}/bin:"*) ;; + *) export PATH="${NODE_BASE}/bin:${OC_GLOBAL}/bin:$PATH" ;; +esac + +# 设置 Node.js ICU 数据路径 +export NODE_ICU_DATA="${NODE_BASE}/share/icu" + +# 设置 OpenClaw 核心环境变量 +# 这些变量确保 openclaw 命令使用正确的配置路径 +export OPENCLAW_HOME="$OC_DATA" +export OPENCLAW_STATE_DIR="${OC_DATA}/.openclaw" +export OPENCLAW_CONFIG_PATH="${OC_DATA}/.openclaw/openclaw.json" + +# 设置 HOME 为 OpenClaw 数据目录 +# 这是解决 Issue #42 的关键:确保 OpenClaw CLI 使用正确的配置路径 +# 注意:这会影响 cd ~ 等行为,但为了配置一致性是必要的 +export HOME="$OC_DATA" + +# 创建便捷别名:用户可直接运行 openclaw 命令 +if [ -x "${OC_GLOBAL}/bin/openclaw" ] || [ -x "${NODE_BASE}/bin/openclaw" ]; then + # openclaw 已在 PATH 中,无需别名 + : +else + # 尝试查找 openclaw 入口并创建别名 + for _oc_dir in "${OC_GLOBAL}/lib/node_modules/openclaw" "${OC_GLOBAL}/node_modules/openclaw" "${NODE_BASE}/lib/node_modules/openclaw"; do + if [ -f "${_oc_dir}/openclaw.mjs" ]; then + alias openclaw="${NODE_BASE}/bin/node ${_oc_dir}/openclaw.mjs" + break + elif [ -f "${_oc_dir}/dist/cli.js" ]; then + alias openclaw="${NODE_BASE}/bin/node ${_oc_dir}/dist/cli.js" + break + fi + done +fi diff --git a/root/etc/uci-defaults/99-openclaw b/root/etc/uci-defaults/99-openclaw index e97f476..6c1bf88 100755 --- a/root/etc/uci-defaults/99-openclaw +++ b/root/etc/uci-defaults/99-openclaw @@ -1,5 +1,32 @@ #!/bin/sh -# luci-app-openclaw — 首次安装初始化脚本 +# luci-app-openclaw — 首次安装/升级初始化脚本 + +# ── v1.0.16: 清理错误路径下的配置文件 (Issue #42) ── +# 用户在 SSH 中直接运行 openclaw 命令时,可能创建了 /root/.openclaw/ 目录 +# 需要迁移数据并清理,避免路径混乱 +if [ -d "/root/.openclaw" ]; then + OC_DATA="/opt/openclaw/data" + # 迁移 skills 目录 (如果存在且目标不存在) + if [ -d "/root/.openclaw/skills" ] && [ ! -d "${OC_DATA}/.openclaw/skills" ]; then + mkdir -p "${OC_DATA}/.openclaw" + mv "/root/.openclaw/skills" "${OC_DATA}/.openclaw/" 2>/dev/null + chown -R openclaw:openclaw "${OC_DATA}/.openclaw/skills" 2>/dev/null + fi + # 迁移 sessions 目录 (如果存在且目标不存在) + if [ -d "/root/.openclaw/sessions" ] && [ ! -d "${OC_DATA}/.openclaw/sessions" ]; then + mkdir -p "${OC_DATA}/.openclaw" + mv "/root/.openclaw/sessions" "${OC_DATA}/.openclaw/" 2>/dev/null + chown -R openclaw:openclaw "${OC_DATA}/.openclaw/sessions" 2>/dev/null + fi + # 迁移 openclaw.json (仅当目标不存在时) + if [ -f "/root/.openclaw/openclaw.json" ] && [ ! -f "${OC_DATA}/.openclaw/openclaw.json" ]; then + mkdir -p "${OC_DATA}/.openclaw" + mv "/root/.openclaw/openclaw.json" "${OC_DATA}/.openclaw/" 2>/dev/null + chown openclaw:openclaw "${OC_DATA}/.openclaw/openclaw.json" 2>/dev/null + fi + # 清理空的旧目录 + rmdir "/root/.openclaw" 2>/dev/null || true +fi # 创建 openclaw 系统用户 (无 home, 无 shell) if ! id openclaw >/dev/null 2>&1; then diff --git a/root/usr/bin/openclaw-env b/root/usr/bin/openclaw-env index 1f50b87..764618e 100755 --- a/root/usr/bin/openclaw-env +++ b/root/usr/bin/openclaw-env @@ -11,9 +11,15 @@ # ============================================================================ set -e -NODE_VERSION="${NODE_VERSION:-22.15.1}" +# ── Node.js 版本策略 (双版本兼容) ── +# V2: 当前推荐版本,用于 OpenClaw v2026.3.11+ (要求 >= 22.16.0) +# V1: 旧版兼容,用于 OpenClaw v2026.3.8 及更早版本 +NODE_VERSION_V2="22.16.0" +NODE_VERSION_V1="22.15.1" +# 默认使用 V2 版本 (可通过 NODE_VERSION 环境变量覆盖) +NODE_VERSION="${NODE_VERSION:-${NODE_VERSION_V2}}" # 经过验证的 OpenClaw 稳定版本 (更新此值需同步测试) -OC_TESTED_VERSION="2026.3.8" +OC_TESTED_VERSION="2026.3.13" # 用户可通过 OC_VERSION 环境变量覆盖安装版本 OC_VERSION="${OC_VERSION:-}" NODE_BASE="/opt/openclaw/node" @@ -155,7 +161,7 @@ download_node() { log_warn "当前 Node.js v${current_ver}, 将更新到 v${node_ver}" fi - # ── 构建下载 URL 列表 (按优先级排列) ── + # ── 构建下载 URL 列表 (按优先级排列,支持双版本回退) ── local mirror_list="" local musl_tarball="node-v${node_ver}-${node_arch}-musl.tar.xz" local glibc_tarball="node-v${node_ver}-${node_arch}.tar.xz" @@ -166,10 +172,15 @@ download_node() { if [ "$node_arch" = "linux-arm64" ]; then # ARM64 musl: unofficial-builds 不提供,从项目自托管下载 - # 1) 项目自托管 ARM64 musl 构建 + # 1) 项目自托管 ARM64 musl 构建 (当前版本) mirror_list="${NODE_SELF_HOST}/${musl_tarball}" # 2) unofficial-builds (留作将来可能支持) mirror_list="$mirror_list ${NODE_MUSL_MIRROR}/v${node_ver}/${musl_tarball}" + # 3) 回退到 V1 版本 (兼容旧环境,仅当请求 V2 时) + if [ "$node_ver" = "$NODE_VERSION_V2" ]; then + local v1_tarball="node-v${NODE_VERSION_V1}-${node_arch}-musl.tar.xz" + mirror_list="$mirror_list ${NODE_SELF_HOST}/${v1_tarball}" + fi else # x64 musl: unofficial-builds 提供 # 1) unofficial-builds @@ -623,30 +634,135 @@ do_factory_reset() { log_info "出厂设置已恢复,Gateway 重启中..." } +# ── 离线安装 (从本地文件安装 Node.js + OpenClaw) ── +do_setup_offline() { + local offline_dir="${2:-/tmp/openclaw-offline}" + + if [ ! -d "$offline_dir" ]; then + log_error "离线安装目录不存在: $offline_dir" + log_error "此命令通常由离线 .run 安装器自动调用" + exit 1 + fi + + # 检查是否已安装 + if [ -x "$NODE_BIN" ] && [ -n "$(find_oc_entry)" ]; then + log_warn "OpenClaw 运行环境已安装" + log_warn "如需重新离线安装,请先卸载现有环境" + exit 0 + fi + + echo "╔══════════════════════════════════════════════════════════════╗" + echo "║ 一万AI分享 OpenClaw 离线安装 ║" + echo "╚══════════════════════════════════════════════════════════════╝" + echo "" + echo " 架构: $(uname -m)" + echo " 安装路径: ${NODE_BASE}" + echo " 数据路径: ${OC_DATA}" + echo " 离线包: ${offline_dir}" + echo "" + + # [1] 安装 Node.js + local node_tarball="$offline_dir/node.tar.xz" + if [ -f "$node_tarball" ]; then + echo "=== 安装 Node.js (离线) ===" + rm -rf "$NODE_BASE" 2>/dev/null + [ -d /overlay/upper ] && rm -rf "/overlay/upper${NODE_BASE}" 2>/dev/null + ensure_mkdir "$NODE_BASE" + + if tar --strip-components=1 -xf "$node_tarball" -C "$NODE_BASE" 2>/dev/null; then + : # GNU tar + else + local tmp_extract="/tmp/node-extract-$$" + ensure_mkdir "$tmp_extract" + tar xf "$node_tarball" -C "$tmp_extract" + local top_dir=$(ls "$tmp_extract" 2>/dev/null | head -1) + if [ -n "$top_dir" ] && [ -d "$tmp_extract/$top_dir" ]; then + cp -a "$tmp_extract/$top_dir/." "$NODE_BASE/" + fi + rm -rf "$tmp_extract" + fi + + if [ -x "$NODE_BIN" ]; then + log_info "Node.js $($NODE_BIN --version 2>/dev/null) 安装成功" + else + log_error "Node.js 安装失败" + exit 1 + fi + else + log_error "未找到 Node.js 离线包: $node_tarball" + exit 1 + fi + + # [2] 安装 OpenClaw + local oc_tarball="$offline_dir/openclaw-deps.tar.gz" + if [ -f "$oc_tarball" ]; then + echo "" + echo "=== 安装 OpenClaw (离线) ===" + rm -rf "$OC_GLOBAL" 2>/dev/null + [ -d /overlay/upper ] && rm -rf "/overlay/upper${OC_GLOBAL}" 2>/dev/null + ensure_mkdir "$OC_GLOBAL" + + tar xzf "$oc_tarball" -C "$OC_GLOBAL" + + 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:]') + log_info "OpenClaw v${oc_ver} 安装成功" + else + log_error "OpenClaw 安装验证失败" + exit 1 + fi + else + log_error "未找到 OpenClaw 离线包: $oc_tarball" + exit 1 + fi + + # [3] 初始化 + init_openclaw + + echo "" + echo "╔══════════════════════════════════════════════════════════════╗" + echo "║ ✅ 离线安装完成! ║" + echo "║ ║" + echo "║ 下一步: ║" + echo "║ uci set openclaw.main.enabled=1 ║" + echo "║ uci commit openclaw ║" + echo "║ /etc/init.d/openclaw enable ║" + echo "║ /etc/init.d/openclaw start ║" + echo "║ ║" + echo "║ 或在 LuCI → 服务 → OpenClaw 中启用 ║" + echo "╚══════════════════════════════════════════════════════════════╝" +} + # ── 主入口 ── case "${1:-}" in -setup) -do_setup -;; -check) -do_check -;; -upgrade) -do_upgrade -;; -node) -download_node "$NODE_VERSION" -;; -factory-reset) -do_factory_reset -;; -*) -echo "" -echo " setup — 完整安装 (下载 Node.js + pnpm + OpenClaw)" -echo " check — 检查环境状态" -echo " upgrade — 升级 OpenClaw 到最新版" -echo " node — 仅下载/更新 Node.js" -echo " factory-reset — 恢复出厂设置 (清除所有配置)" -exit 1 -;; + setup) + do_setup + ;; + setup-offline) + do_setup_offline "$@" + ;; + check) + do_check + ;; + upgrade) + do_upgrade + ;; + node) + download_node "$NODE_VERSION" + ;; + factory-reset) + do_factory_reset + ;; + *) + echo "用法: openclaw-env {setup|setup-offline|check|upgrade|node|factory-reset}" + echo "" + echo " setup — 完整安装 (下载 Node.js + pnpm + OpenClaw)" + echo " setup-offline — 离线安装 (从本地文件安装,由 .run 安装器调用)" + echo " check — 检查环境状态" + echo " upgrade — 升级 OpenClaw 到最新版" + echo " node — 仅下载/更新 Node.js" + echo " factory-reset — 恢复出厂设置 (清除所有配置)" + exit 1 + ;; esac diff --git a/root/usr/share/openclaw/oc-config.sh b/root/usr/share/openclaw/oc-config.sh index cdfc19f..f6d280b 100755 --- a/root/usr/share/openclaw/oc-config.sh +++ b/root/usr/share/openclaw/oc-config.sh @@ -91,20 +91,100 @@ json_get() { json_set() { local key="$1" value="$2" + local _js_err="" + + # 步骤1: 确保配置文件存在 if [ ! -f "$CONFIG_FILE" ]; then - mkdir -p "$(dirname "$CONFIG_FILE")" + # 检查父目录是否可创建 + local parent_dir="$(dirname "$CONFIG_FILE")" + if ! mkdir -p "$parent_dir" 2>/dev/null; then + echo "ERROR: 无法创建配置目录 $parent_dir" >&2 + echo "HINT: 请检查 /opt/openclaw/data 是否存在且有写权限" >&2 + return 1 + fi + + # 检查目录权限 + if [ ! -w "$parent_dir" ]; then + echo "ERROR: 配置目录 $parent_dir 不可写" >&2 + echo "HINT: 请运行: chmod 755 $parent_dir" >&2 + return 1 + fi + + # 尝试修复所有权 chown -R openclaw:openclaw "$OC_STATE_DIR" 2>/dev/null || true - echo '{}' > "$CONFIG_FILE" + + # 创建空配置文件 + if ! echo '{}' > "$CONFIG_FILE" 2>/dev/null; then + echo "ERROR: 无法创建配置文件 $CONFIG_FILE" >&2 + echo "HINT: 请检查磁盘空间和文件系统状态" >&2 + return 1 + fi + + chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null || true fi - _JS_KEY="$key" _JS_VAL="$value" "$NODE_BIN" -e " + + # 步骤2: 检查配置文件是否可写 + if [ ! -w "$CONFIG_FILE" ]; then + echo "ERROR: 配置文件 $CONFIG_FILE 不可写" >&2 + echo "HINT: 请运行: chmod 644 $CONFIG_FILE" >&2 + return 1 + fi + + # 步骤3: 检查 Node.js 是否可用 + if [ ! -x "$NODE_BIN" ]; then + echo "ERROR: Node.js 不可用: $NODE_BIN" >&2 + echo "HINT: 请先运行 openclaw-env setup 安装 Node.js" >&2 + return 1 + fi + + # 步骤4: 使用临时文件传递值,避免环境变量转义问题 + local tmp_val_file="/tmp/.oc_json_val_$$" + if ! printf '%s' "$value" > "$tmp_val_file" 2>/dev/null; then + echo "ERROR: 无法创建临时文件 $tmp_val_file" >&2 + return 1 + fi + + # 步骤5: 执行 JSON 写入 + _JS_KEY="$key" _JS_DEBUG="${OC_CONFIG_DEBUG:-0}" "$NODE_BIN" -e " const fs=require('fs');let d={}; - try{d=JSON.parse(fs.readFileSync('${CONFIG_FILE}','utf8'));}catch(e){} + const debug=process.env._JS_DEBUG==='1'; + try{ + const content=fs.readFileSync('${CONFIG_FILE}','utf8'); + d=JSON.parse(content); + }catch(e){ + if(debug)console.error('JSON parse warning:',e.message); + } const ks=process.env._JS_KEY.split('.');let o=d; - for(let i=0;i/dev/null + try{ + fs.writeFileSync('${CONFIG_FILE}',JSON.stringify(d,null,2)); + if(debug)console.log('JSON saved successfully'); + }catch(e){ + console.error('ERROR: Failed to write config:',e.message); + process.exit(1); + } + " 2>&1 + local _js_rc=$? + + # 清理临时文件 + rm -f "$tmp_val_file" 2>/dev/null + + # 步骤6: 检查执行结果 + if [ $_js_rc -ne 0 ]; then + echo "ERROR: JSON 写入失败 (exit code: $_js_rc)" >&2 + return 1 + fi + + # 步骤7: 修复文件所有权 + chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null || true + + return 0 } # ── 启用 auth 插件 ── @@ -125,6 +205,100 @@ enable_auth_plugins() { " 2>/dev/null } +# ── 修复插件配置中的插件名称不匹配问题 ── +# v2026.3.13: OpenClaw 加强了配置验证,plugins.allow 中的名称必须与实际插件名完全匹配 +# 问题: 旧版本写入的是 "openclaw-qqbot",但实际插件名是 "@tencent-connect/openclaw-qqbot" +# 此函数会自动检测并修正不匹配的插件名称 +fix_plugin_config() { + [ ! -f "$CONFIG_FILE" ] && return + [ ! -x "$NODE_BIN" ] && return + + # 检查是否存在 qqbot 插件目录 + local qqbot_ext_dir="${OC_STATE_DIR}/extensions/openclaw-qqbot" + [ ! -d "$qqbot_ext_dir" ] && return + + # 读取并修复 plugins.allow 中的插件名称 + local fixed=0 + "$NODE_BIN" -e " + const fs=require('fs'); + try{ + const d=JSON.parse(fs.readFileSync('${CONFIG_FILE}','utf8')); + if(!d.plugins)d.plugins={}; + + // 修复 plugins.allow 数组中的插件名称 + if(Array.isArray(d.plugins.allow)){ + const oldName='openclaw-qqbot'; + const newName='@tencent-connect/openclaw-qqbot'; + const idx=d.plugins.allow.indexOf(oldName); + if(idx!==-1){ + // 检查是否已有正确的名称 + if(!d.plugins.allow.includes(newName)){ + d.plugins.allow[idx]=newName; + console.log('FIXED'); + }else{ + // 已有正确名称,删除错误的 + d.plugins.allow.splice(idx,1); + console.log('REMOVED_DUPLICATE'); + } + fs.writeFileSync('${CONFIG_FILE}',JSON.stringify(d,null,2)); + } + } + + // 同时修复 plugins.entries 中的键名 + if(d.plugins.entries && d.plugins.entries['openclaw-qqbot']){ + if(!d.plugins.entries['@tencent-connect/openclaw-qqbot']){ + d.plugins.entries['@tencent-connect/openclaw-qqbot']=d.plugins.entries['openclaw-qqbot']; + } + delete d.plugins.entries['openclaw-qqbot']; + fs.writeFileSync('${CONFIG_FILE}',JSON.stringify(d,null,2)); + console.log('FIXED_ENTRIES'); + } + }catch(e){} + " 2>/dev/null | while read line; do + case "$line" in + FIXED|REMOVED_DUPLICATE|FIXED_ENTRIES) + echo -e " ${GREEN}✅ 已修复插件配置名称: openclaw-qqbot → @tencent-connect/openclaw-qqbot${NC}" + fixed=1 + ;; + esac + done + + # 确保配置文件权限正确 + chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null || true + + return $fixed +} + +# ── 确保 qqbot 插件在 plugins.allow 中 ── +ensure_qqbot_plugin_allowed() { + [ ! -f "$CONFIG_FILE" ] && return + [ ! -x "$NODE_BIN" ] && return + + "$NODE_BIN" -e " + const fs=require('fs'); + try{ + const d=JSON.parse(fs.readFileSync('${CONFIG_FILE}','utf8')); + if(!d.plugins)d.plugins={}; + if(!Array.isArray(d.plugins.allow))d.plugins.allow=[]; + + const correctName='@tencent-connect/openclaw-qqbot'; + const oldName='openclaw-qqbot'; + + // 移除旧的不正确名称 + d.plugins.allow=d.plugins.allow.filter(n=>n!==oldName); + + // 添加正确的名称(如果不存在) + if(!d.plugins.allow.includes(correctName)){ + d.plugins.allow.push(correctName); + fs.writeFileSync('${CONFIG_FILE}',JSON.stringify(d,null,2)); + console.log('ADDED'); + } + }catch(e){} + " 2>/dev/null + + chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null || true +} + # ── 模型认证: 将 API Key 写入 auth-profiles.json (而非 openclaw.json) ── # 用法: auth_set_apikey [profile_id] # 例: auth_set_apikey openai sk-xxx @@ -1262,6 +1436,12 @@ configure_qq() { fi echo "" fi + + # v2026.3.13: 确保插件名称正确写入 plugins.allow + # OpenClaw 要求 plugins.allow 中的名称必须与实际插件名完全匹配 + if [ "$plugin_installed" -eq 1 ]; then + ensure_qqbot_plugin_allowed + fi else echo -e " ${YELLOW}已跳过插件安装,继续配置 QQ 机器人参数。${NC}" echo -e " ${CYAN}稍后安装命令: openclaw plugins install @tencent-connect/openclaw-qqbot@latest${NC}" @@ -1449,27 +1629,87 @@ configure_feishu() { echo "" echo -e " ${BOLD}🐦 飞书 Bot 配置${NC}" echo "" - echo -e " ${YELLOW}获取凭据: ${CYAN}https://open.feishu.cn${NC} → 创建企业自建应用" - echo "" - local current_appid=$(json_get channels.feishu.appId) - if [ -n "$current_appid" ]; then - echo -e " ${GREEN}当前 App ID: ${current_appid}${NC}" + # 检查 Node.js 是否可用 + if [ ! -x "$NODE_BIN" ]; then + echo -e " ${RED}❌ Node.js 不可用,请先安装运行环境${NC}" + return 1 fi - prompt_with_default "请输入飞书 App ID" "" fs_appid - prompt_with_default "请输入飞书 App Secret" "" fs_secret - fs_appid=$(sanitize_input "$fs_appid" | tr -d '[:space:]') - fs_secret=$(sanitize_input "$fs_secret" | tr -d '[:space:]') + # 检查并安装 Python 3 (飞书插件依赖) + if ! command -v python3 >/dev/null 2>&1; then + echo -e " ${YELLOW}⚠️ 飞书插件需要 Python 3 支持${NC}" + echo -e " ${CYAN}正在尝试安装 python3-light...${NC}" + opkg update >/dev/null 2>&1 + # 使用 python3-light 减少安装体积 (约 2MB vs 完整版 30MB+) + opkg install python3-light 2>&1 | tail -5 || true + if command -v python3 >/dev/null 2>&1; then + echo -e " ${GREEN}✅ Python 3 安装成功${NC}" + else + echo -e " ${RED}❌ Python 3 安装失败${NC}" + echo -e " ${YELLOW}请手动安装: opkg install python3-light${NC}" + echo "" + prompt_with_default "是否继续尝试安装飞书? (y/n)" "n" continue_install + if ! confirm_yes "$continue_install"; then + return 1 + fi + fi + fi - if [ -n "$fs_appid" ] && [ -n "$fs_secret" ]; then - json_set channels.feishu.appId "$fs_appid" - json_set channels.feishu.appSecret "$fs_secret" - chown openclaw:openclaw "$CONFIG_FILE" 2>/dev/null || true - echo -e " ${GREEN}✅ 飞书配置已保存${NC}" - ask_restart + echo -e " ${DIM}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e " ${CYAN}飞书官方安装向导${NC}" + echo -e " ${DIM}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo "" + echo -e " ${YELLOW}即将执行飞书官方安装命令:${NC}" + echo -e " ${CYAN}npx -y @larksuite/openclaw-lark-tools install${NC}" + echo "" + echo -e " ${DIM}安装过程中可以:${NC}" + echo -e " ${DIM} • 新建机器人: 扫描二维码一键创建${NC}" + echo -e " ${DIM} • 关联已有机器人: 输入 App ID 和 App Secret${NC}" + echo "" + echo -e " ${YELLOW}提示: 若命令行出错,可在命令前增加 sudo 重新执行${NC}" + echo "" + + prompt_with_default "是否开始安装? (y/n)" "y" do_install + if ! confirm_yes "$do_install"; then + echo -e " ${YELLOW}已取消安装${NC}" + return + fi + + echo "" + echo -e " ${CYAN}正在启动飞书安装向导...${NC}" + echo "" + + # 执行官方安装命令 + cd "$OC_DATA" + NPX_BIN="${NODE_BASE}/bin/npx" + local install_rc=0 + if [ -x "$NPX_BIN" ]; then + "$NPX_BIN" -y @larksuite/openclaw-lark-tools install || install_rc=$? else - echo -e " ${YELLOW}信息不完整,已取消。${NC}" + # 如果 npx 不存在,使用 node 运行 + "$NODE_BIN" "$NODE_BASE/lib/node_modules/npm/bin/npx-cli.js" -y @larksuite/openclaw-lark-tools install || install_rc=$? + fi + + echo "" + if [ $install_rc -eq 0 ]; then + echo -e " ${GREEN}✅ 飞书安装完成!${NC}" + echo "" + echo -e " ${DIM}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e " ${YELLOW}下一步:${NC}" + echo -e " ${DIM}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo "" + echo -e " 1. 在飞书中向机器人发送任意消息,即可开始对话" + echo -e " 2. 发送 ${CYAN}/feishu auth${NC} 完成批量授权" + echo -e " 3. 发送 ${CYAN}/feishu start${NC} 验证安装是否成功" + echo -e " 4. 发送 ${CYAN}学习一下我安装的新飞书插件,列出有哪些能力${NC}" + echo "" + else + echo -e " ${YELLOW}⚠️ 安装向导退出 (exit: $install_rc)${NC}" + echo "" + echo -e " ${CYAN}手动安装命令:${NC}" + echo -e " ${CYAN}npx -y @larksuite/openclaw-lark-tools install${NC}" + echo "" fi } @@ -2086,26 +2326,161 @@ main_menu() { echo -e "${GREEN}║${NC} ${BOLD}OpenClaw AI Gateway — OpenWrt 配置管理${NC} ${GREEN}║${NC}" echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" echo "" - echo -e " ${CYAN}1)${NC} 📋 查看当前配置" - echo -e " ${CYAN}2)${NC} 🤖 配置 AI 模型提供商" - echo -e " ${CYAN}3)${NC} 🔄 设定当前活跃模型" - echo -e " ${CYAN}4)${NC} 📡 配置消息渠道 (QQ/Telegram/Discord/飞书/Slack)" - echo -e " ${CYAN}5)${NC} 🔍 健康检查 / 诊断" + echo -e " ${DIM}━━━ AI 模型配置 ━━━${NC}" + echo -e " ${CYAN}1)${NC} 🤖 配置 AI 模型和提供商" + echo -e " ${CYAN}2)${NC} 🎯 设置活动模型" + echo "" + echo -e " ${DIM}━━━ 消息渠道 ━━━${NC}" + echo -e " ${CYAN}3)${NC} 📡 配置消息渠道 (电报/QQ/飞书)" + echo "" + echo -e " ${DIM}━━━ 系统管理 ━━━${NC}" + echo -e " ${CYAN}4)${NC} 🩺 健康检查与状态" + echo -e " ${CYAN}5)${NC} 📋 查看日志" echo -e " ${CYAN}6)${NC} 🔄 重启 Gateway" - echo -e " ${CYAN}7)${NC} 📝 查看原始配置文件" - echo -e " ${CYAN}8)${NC} 💾 备份/还原配置" - echo -e " ${CYAN}9)${NC} ⚠️ 恢复默认配置" + echo "" + echo -e " ${DIM}━━━ 高级选项 ━━━${NC}" + echo -e " ${CYAN}7)${NC} 🔧 高级配置" + echo -e " ${CYAN}8)${NC} ♻️ 重置配置" + echo -e " ${CYAN}9)${NC} 📊 显示当前配置概览" + echo "" echo -e " ${CYAN}0)${NC} 退出" echo "" prompt_with_default "请选择" "1" menu_choice case "$menu_choice" in - 1) show_current_config ;; - 2) configure_model ;; - 3) set_active_model ;; - 4) configure_channels ;; - 5) health_check ;; + 1) configure_model ;; + 2) set_active_model ;; + 3) configure_channels ;; + 4) health_check ;; + 5) + echo "" + echo -e " ${CYAN}=== OpenClaw 日志 ===${NC}" + echo "" + logread -e openclaw 2>/dev/null | tail -100 || echo " (无法读取日志)" + echo "" + prompt_with_default "按回车继续" "" _ + ;; 6) restart_gateway ;; + 7) advanced_menu ;; + 8) reset_to_defaults ;; + 9) show_current_config ;; + 0) + echo -e " ${GREEN}再见!${NC}" + exit 0 + ;; + *) echo -e " ${YELLOW}无效选择${NC}" ;; + esac + done +} + +# ── 高级配置菜单 ── +advanced_menu() { + while true; do + local gw_port gw_bind gw_mode log_level acp_dispatch + gw_port=$(json_get "gateway.port" 2>/dev/null || echo "18789") + gw_bind=$(json_get "gateway.bind" 2>/dev/null || echo "lan") + gw_mode=$(json_get "gateway.mode" 2>/dev/null || echo "local") + log_level=$(json_get "gateway.logLevel" 2>/dev/null || echo "") + acp_dispatch=$(json_get "acp.dispatch.enabled" 2>/dev/null || echo "false") + + echo "" + echo -e " ${BOLD}🔧 高级配置${NC}" + echo "" + echo -e " ${CYAN}1)${NC} Gateway 端口 ${DIM}(当前: ${gw_port})${NC}" + echo -e " ${CYAN}2)${NC} Gateway 绑定地址 ${DIM}(当前: ${gw_bind})${NC}" + echo -e " ${CYAN}3)${NC} Gateway 运行模式 ${DIM}(当前: ${gw_mode})${NC}" + echo -e " ${CYAN}4)${NC} 日志级别 ${DIM}(当前: ${log_level:-未设置})${NC}" + echo -e " ${CYAN}5)${NC} ACP Dispatch 设置 ${DIM}(当前: ${acp_dispatch})${NC}" + echo -e " ${CYAN}6)${NC} 官方完整配置向导 ${DIM}(oc configure)${NC}" + echo -e " ${CYAN}7)${NC} 查看原始配置 JSON" + echo -e " ${CYAN}8)${NC} 编辑配置文件 ${DIM}(vi / nano)${NC}" + echo -e " ${CYAN}9)${NC} 导出配置备份" + echo -e " ${CYAN}10)${NC} 导入配置" + echo -e " ${CYAN}0)${NC} 返回主菜单" + echo "" + prompt_with_default "请选择" "0" adv_choice + + case "$adv_choice" in + 1) + echo "" + prompt_with_default "请输入 Gateway 端口" "$gw_port" new_port + if [ -n "$new_port" ] && [ "$new_port" != "$gw_port" ]; then + json_set "gateway.port" "$new_port" + # 同步到 UCI + uci set openclaw.main.port="$new_port" 2>/dev/null + uci commit openclaw 2>/dev/null + echo -e " ${GREEN}✅ 端口已设置为 ${new_port}${NC}" + ask_restart + fi + ;; + 2) + echo "" + echo -e " ${CYAN}绑定地址选项:${NC}" + echo " lan - 仅 LAN 接口 (推荐)" + echo " loopback - 仅本机访问" + echo " all - 所有接口 (0.0.0.0)" + echo "" + prompt_with_default "请输入绑定地址" "$gw_bind" new_bind + if [ -n "$new_bind" ]; then + case "$new_bind" in + lan|loopback|all) + json_set "gateway.bind" "$new_bind" + uci set openclaw.main.bind="$new_bind" 2>/dev/null + uci commit openclaw 2>/dev/null + echo -e " ${GREEN}✅ 绑定地址已设置为 ${new_bind}${NC}" + ask_restart + ;; + *) echo -e " ${YELLOW}无效选项${NC}" ;; + esac + fi + ;; + 3) + echo "" + echo -e " ${CYAN}运行模式选项:${NC}" + echo " local - 本地模式 (推荐)" + echo " remote - 远程模式" + echo "" + prompt_with_default "请输入运行模式" "$gw_mode" new_mode + if [ -n "$new_mode" ] && [ "$new_mode" != "$gw_mode" ]; then + json_set "gateway.mode" "$new_mode" + echo -e " ${GREEN}✅ 运行模式已设置为 ${new_mode}${NC}" + ask_restart + fi + ;; + 4) + echo "" + echo -e " ${CYAN}日志级别选项:${NC}" + echo " debug, info, warn, error" + echo "" + prompt_with_default "请输入日志级别" "${log_level:-info}" new_level + if [ -n "$new_level" ]; then + json_set "gateway.logLevel" "$new_level" + echo -e " ${GREEN}✅ 日志级别已设置为 ${new_level}${NC}" + ask_restart + fi + ;; + 5) + echo "" + echo -e " ${CYAN}ACP Dispatch 选项:${NC}" + echo " true - 启用 (可能占用大量内存)" + echo " false - 禁用 (推荐路由器使用)" + echo "" + prompt_with_default "请输入设置" "$acp_dispatch" new_acp + case "$new_acp" in + true|false) + json_set "acp.dispatch.enabled" "$new_acp" + echo -e " ${GREEN}✅ ACP Dispatch 已设置为 ${new_acp}${NC}" + ask_restart + ;; + *) echo -e " ${YELLOW}无效选项${NC}" ;; + esac + ;; + 6) + echo "" + echo -e " ${CYAN}启动官方配置向导...${NC}" + oc_cmd configure + ask_restart + ;; 7) echo "" echo -e " ${CYAN}配置文件路径: ${CONFIG_FILE}${NC}" @@ -2116,18 +2491,41 @@ main_menu() { echo " (配置文件不存在)" fi echo "" - prompt_with_default "是否用 vi 编辑? (y/n)" "n" do_edit - if confirm_yes "$do_edit"; then + prompt_with_default "按回车继续" "" _ + ;; + 8) + echo "" + if [ -f "$CONFIG_FILE" ]; then vi "$CONFIG_FILE" ask_restart + else + echo -e " ${YELLOW}配置文件不存在${NC}" fi ;; - 8) backup_restore_menu ;; - 9) reset_to_defaults ;; - 0) - echo -e " ${GREEN}再见!${NC}" - exit 0 + 9) backup_restore_menu ;; + 10) + echo "" + echo -e " ${CYAN}导入配置${NC}" + echo "" + local backup_dir="${OC_STATE_DIR}/backups" + if [ -d "$backup_dir" ]; then + echo " 可用备份:" + ls -lt "$backup_dir"/*.json 2>/dev/null | head -5 | while read -r line; do + echo " $(echo "$line" | awk '{print $NF}')" + done + fi + echo "" + prompt_with_default "请输入备份文件路径" "" import_path + if [ -n "$import_path" ] && [ -f "$import_path" ]; then + cp "$import_path" "$CONFIG_FILE" + chown openclaw:openclaw "$CONFIG_FILE" + echo -e " ${GREEN}✅ 配置已导入${NC}" + ask_restart + else + echo -e " ${YELLOW}文件不存在${NC}" + fi ;; + 0) return ;; *) echo -e " ${YELLOW}无效选择${NC}" ;; esac done diff --git a/scripts/build-node-musl.sh b/scripts/build-node-musl.sh index 6fbea3c..fe2656f 100755 --- a/scripts/build-node-musl.sh +++ b/scripts/build-node-musl.sh @@ -1,114 +1,262 @@ #!/bin/sh +# ============================================================================ +# Node.js ARM64 musl 构建脚本 # 在 Alpine ARM64 Docker 容器内运行 -# 环境变量: NODE_VER (目标版本号), /output (输出目录) +# +# 环境变量: +# NODE_VER (目标版本号) +# BUILD_MODE (apk|cross) - apk: 使用 Alpine apk, cross: 从官方 glibc 版本交叉编译 +# /output (输出目录) # # 打包策略: +# 1. apk 模式: 使用 Alpine apk 安装 nodejs,版本受限于 Alpine 仓库 +# 2. cross 模式: 从 Node.js 官方下载 glibc 版本,转换为 musl # 使用 patchelf 修改 node 二进制的 ELF interpreter 和 rpath, # 使其直接使用打包的 musl 链接器和共享库,无需 LD_LIBRARY_PATH。 # 这样 process.execPath 返回正确的 node 路径,子进程 fork 也能正常工作。 # 安装路径固定为 /opt/openclaw/node (与 openclaw-env 一致)。 +# ============================================================================ set -e INSTALL_PREFIX="/opt/openclaw/node" +BUILD_MODE="${BUILD_MODE:-apk}" -apk add --no-cache nodejs npm xz icu-data-full patchelf +echo "=== Node.js ARM64 musl Build ===" +echo " Target version: v${NODE_VER}" +echo " Build mode: ${BUILD_MODE}" -ACTUAL_VER=$(node --version | sed 's/^v//') -echo "Alpine Node.js version: v${ACTUAL_VER} (requested: v${NODE_VER})" +# ── apk 模式: 使用 Alpine 仓库的 Node.js ── +build_apk() { + echo "" + echo "=== Building with Alpine apk mode ===" + apk add --no-cache nodejs npm xz icu-data-full patchelf -# 使用实际版本号作为文件名 (Alpine apk 的 nodejs 版本可能与请求版本不同) -if [ "$ACTUAL_VER" != "$NODE_VER" ]; then - echo "WARNING: Actual version (${ACTUAL_VER}) differs from requested (${NODE_VER})" - echo " Using actual version for package name" -fi -PKG_NAME="node-v${ACTUAL_VER}-linux-arm64-musl" -PKG_DIR="/tmp/${PKG_NAME}" -mkdir -p "${PKG_DIR}/bin" "${PKG_DIR}/lib/node_modules" "${PKG_DIR}/include/node" + ACTUAL_VER=$(node --version | sed 's/^v//') + echo "Alpine Node.js version: v${ACTUAL_VER} (requested: v${NODE_VER})" -# 复制 node 二进制 -cp "$(which node)" "${PKG_DIR}/bin/node" -chmod +x "${PKG_DIR}/bin/node" + # 使用实际版本号作为文件名 (Alpine apk 的 nodejs 版本可能与请求版本不同) + if [ "$ACTUAL_VER" != "$NODE_VER" ]; then + echo "WARNING: Actual version (${ACTUAL_VER}) differs from requested (${NODE_VER})" + echo " Using actual version for package name" + fi + PKG_NAME="node-v${ACTUAL_VER}-linux-arm64-musl" + PKG_DIR="/tmp/${PKG_NAME}" + mkdir -p "${PKG_DIR}/bin" "${PKG_DIR}/lib/node_modules" "${PKG_DIR}/include/node" -# 收集 node 依赖的所有共享库 (Alpine node 是动态链接的) -echo "=== Collecting shared libraries ===" -LIB_DIR="${PKG_DIR}/lib" -ldd "$(which node)" 2>/dev/null | while read -r line; do - # 解析 ldd 输出: libxxx.so => /usr/lib/libxxx.so (0x...) - lib_path=$(echo "$line" | grep -oE '/[^ ]+\.so[^ ]*' | head -1) - if [ -n "$lib_path" ] && [ -f "$lib_path" ]; then - cp -L "$lib_path" "$LIB_DIR/" 2>/dev/null || true - echo " + $(basename "$lib_path")" - fi -done -# 确保 musl 动态链接器也在 -if [ -f /lib/ld-musl-aarch64.so.1 ]; then - cp -L /lib/ld-musl-aarch64.so.1 "$LIB_DIR/" 2>/dev/null || true - echo " + ld-musl-aarch64.so.1" -fi -echo "Libraries collected: $(ls "$LIB_DIR"/*.so* 2>/dev/null | wc -l) files" + # 复制 node 二进制 + cp "$(which node)" "${PKG_DIR}/bin/node" + chmod +x "${PKG_DIR}/bin/node" -# 用 patchelf 修改 node 二进制: -# - interpreter 指向打包的 musl 链接器 (绝对路径,对应安装后的位置) -# - rpath 指向打包的 lib 目录 -echo "=== Patching ELF binary ===" -patchelf --set-interpreter "${INSTALL_PREFIX}/lib/ld-musl-aarch64.so.1" "${PKG_DIR}/bin/node" -patchelf --set-rpath "${INSTALL_PREFIX}/lib" "${PKG_DIR}/bin/node" -echo " interpreter: ${INSTALL_PREFIX}/lib/ld-musl-aarch64.so.1" -echo " rpath: ${INSTALL_PREFIX}/lib" + # 收集 node 依赖的所有共享库 (Alpine node 是动态链接的) + echo "=== Collecting shared libraries ===" + LIB_DIR="${PKG_DIR}/lib" + ldd "$(which node)" 2>/dev/null | while read -r line; do + lib_path=$(echo "$line" | grep -oE '/[^ ]+\.so[^ ]*' | head -1) + if [ -n "$lib_path" ] && [ -f "$lib_path" ]; then + cp -L "$lib_path" "$LIB_DIR/" 2>/dev/null || true + echo " + $(basename "$lib_path")" + fi + done + # 确保 musl 动态链接器也在 + if [ -f /lib/ld-musl-aarch64.so.1 ]; then + cp -L /lib/ld-musl-aarch64.so.1 "$LIB_DIR/" 2>/dev/null || true + echo " + ld-musl-aarch64.so.1" + fi + echo "Libraries collected: $(ls "$LIB_DIR"/*.so* 2>/dev/null | wc -l) files" -# 复制 ICU 完整数据 (npm 的 Intl.Collator 需要) -echo "=== Copying ICU data ===" -ICU_DAT=$(find /usr/share/icu -name "icudt*.dat" 2>/dev/null | head -1) -if [ -n "$ICU_DAT" ] && [ -f "$ICU_DAT" ]; then - mkdir -p "${PKG_DIR}/share/icu" - cp "$ICU_DAT" "${PKG_DIR}/share/icu/" - echo " + $(basename "$ICU_DAT") ($(du -h "$ICU_DAT" | cut -f1))" -else - echo " WARNING: ICU data file not found" -fi + # 复制 ICU 完整数据 + echo "=== Copying ICU data ===" + ICU_DAT=$(find /usr/share/icu -name "icudt*.dat" 2>/dev/null | head -1) + if [ -n "$ICU_DAT" ] && [ -f "$ICU_DAT" ]; then + mkdir -p "${PKG_DIR}/share/icu" + cp "$ICU_DAT" "${PKG_DIR}/share/icu/" + echo " + $(basename "$ICU_DAT") ($(du -h "$ICU_DAT" | cut -f1))" + else + echo " WARNING: ICU data file not found" + fi -# 创建 node wrapper 脚本 (只设置 NODE_ICU_DATA,ELF 层面已解决链接器和库路径) -cat > "${PKG_DIR}/bin/node-wrapper" << 'NODEWRAPPER' + # 复制 npm + if [ -d /usr/lib/node_modules/npm ]; then + cp -r /usr/lib/node_modules/npm "${PKG_DIR}/lib/node_modules/" + fi + + # 返回包名供后续使用 + echo "PKG_NAME=${PKG_NAME}" >> /tmp/build_env + echo "PKG_DIR=${PKG_DIR}" >> /tmp/build_env +} + +# ── cross 模式: 从 Node.js 官方 glibc 版本交叉编译 ── +build_cross() { + echo "" + echo "=== Building with cross-compilation mode ===" + apk add --no-cache xz patchelf curl wget ca-certificates + + # 下载 Node.js 官方 ARM64 glibc 版本 + NODE_TARBALL="node-v${NODE_VER}-linux-arm64.tar.xz" + NODE_URL="https://nodejs.org/dist/v${NODE_VER}/${NODE_TARBALL}" + + echo "=== Downloading Node.js v${NODE_VER} ARM64 glibc ===" + cd /tmp + if ! curl -fSL -o "$NODE_TARBALL" "$NODE_URL"; then + echo "ERROR: Failed to download Node.js from $NODE_URL" + exit 1 + fi + + # 解压 + echo "=== Extracting Node.js ===" + rm -rf "node-v${NODE_VER}-linux-arm64" 2>/dev/null || true + tar xf "$NODE_TARBALL" + SRC_DIR="node-v${NODE_VER}-linux-arm64" + + # 创建输出目录 + PKG_NAME="node-v${NODE_VER}-linux-arm64-musl" + PKG_DIR="/tmp/${PKG_NAME}" + rm -rf "$PKG_DIR" 2>/dev/null || true + mkdir -p "${PKG_DIR}/bin" "${PKG_DIR}/lib" "${PKG_DIR}/share/icu" + + # 复制 node 二进制 + echo "=== Copying Node.js binary ===" + cp "${SRC_DIR}/bin/node" "${PKG_DIR}/bin/node" + chmod +x "${PKG_DIR}/bin/node" + + # 复制 npm + if [ -d "${SRC_DIR}/lib/node_modules/npm" ]; then + mkdir -p "${PKG_DIR}/lib/node_modules" + cp -r "${SRC_DIR}/lib/node_modules/npm" "${PKG_DIR}/lib/node_modules/" + fi + + # 复制 ICU 数据 + ICU_DAT=$(find "${SRC_DIR}" -name "icudt*.dat" 2>/dev/null | head -1) + if [ -n "$ICU_DAT" ] && [ -f "$ICU_DAT" ]; then + cp "$ICU_DAT" "${PKG_DIR}/share/icu/" + echo " + ICU data: $(basename "$ICU_DAT")" + fi + + # ── 关键步骤: musl 库收集 ── + echo "=== Converting to musl libc ===" + + # 复制 musl 动态链接器 + if [ -f /lib/ld-musl-aarch64.so.1 ]; then + cp -L /lib/ld-musl-aarch64.so.1 "${PKG_DIR}/lib/" + echo " + ld-musl-aarch64.so.1" + else + echo "ERROR: musl dynamic linker not found" + exit 1 + fi + + # 收集 musl 版本的依赖库 + # Node.js 官方 ARM64 版本依赖: libcrypto, libssl, libz, libstdc++, libgcc_s + # 这些库需要从 Alpine (musl) 版本获取 + echo "=== Collecting musl libraries ===" + LIB_DIR="${PKG_DIR}/lib" + + # 安装必要的库包 + apk add --no-cache libcrypto3 libssl3 zlib libstdc++ libgcc + + # 复制库文件 + for lib in libcrypto.so.3 libssl.so.3 libz.so.1 libstdc++.so.6 libgcc_s.so.1; do + for libpath in /usr/lib/$lib /lib/$lib; do + if [ -f "$libpath" ]; then + cp -L "$libpath" "$LIB_DIR/" 2>/dev/null || true + echo " + $lib" + break + fi + done + done + + # 收集所有 musl 库的依赖 + for lib in "$LIB_DIR"/*.so*; do + [ -f "$lib" ] || continue + ldd "$lib" 2>/dev/null | while read -r line; do + lib_path=$(echo "$line" | grep -oE '/[^ ]+\.so[^ ]*' | head -1) + if [ -n "$lib_path" ] && [ -f "$lib_path" ]; then + lib_name=$(basename "$lib_path") + [ -f "$LIB_DIR/$lib_name" ] || cp -L "$lib_path" "$LIB_DIR/" 2>/dev/null || true + fi + done + done + + echo "Libraries collected: $(ls "$LIB_DIR"/*.so* 2>/dev/null | wc -l) files" + + # 返回包名供后续使用 + echo "PKG_NAME=${PKG_NAME}" >> /tmp/build_env + echo "PKG_DIR=${PKG_DIR}" >> /tmp/build_env +} + +# ── 公共步骤: patchelf 和打包 ── +finalize_package() { + . /tmp/build_env + + # 用 patchelf 修改 node 二进制 + echo "=== Patching ELF binary ===" + patchelf --set-interpreter "${INSTALL_PREFIX}/lib/ld-musl-aarch64.so.1" "${PKG_DIR}/bin/node" + patchelf --set-rpath "${INSTALL_PREFIX}/lib" "${PKG_DIR}/bin/node" + echo " interpreter: ${INSTALL_PREFIX}/lib/ld-musl-aarch64.so.1" + echo " rpath: ${INSTALL_PREFIX}/lib" + + # 创建 node wrapper 脚本 + cat > "${PKG_DIR}/bin/node-wrapper" << 'NODEWRAPPER' #!/bin/sh SELF_DIR="$(cd "$(dirname "$0")" && pwd)" export NODE_ICU_DATA="${SELF_DIR}/../share/icu" exec "${SELF_DIR}/node" "$@" NODEWRAPPER -chmod +x "${PKG_DIR}/bin/node-wrapper" + chmod +x "${PKG_DIR}/bin/node-wrapper" -# 复制 npm -if [ -d /usr/lib/node_modules/npm ]; then - cp -r /usr/lib/node_modules/npm "${PKG_DIR}/lib/node_modules/" -fi - -# 创建 npm wrapper (直接调用 patchelf 后的 node,只需设置 ICU) -cat > "${PKG_DIR}/bin/npm" << 'NPMWRAPPER' + # 创建 npm wrapper + cat > "${PKG_DIR}/bin/npm" << 'NPMWRAPPER' #!/bin/sh SELF_DIR="$(cd "$(dirname "$0")" && pwd)" export NODE_ICU_DATA="${SELF_DIR}/../share/icu" exec "${SELF_DIR}/node" "${SELF_DIR}/../lib/node_modules/npm/bin/npm-cli.js" "$@" NPMWRAPPER -# 创建 npx wrapper -cat > "${PKG_DIR}/bin/npx" << 'NPXWRAPPER' + + # 创建 npx wrapper + cat > "${PKG_DIR}/bin/npx" << 'NPXWRAPPER' #!/bin/sh SELF_DIR="$(cd "$(dirname "$0")" && pwd)" export NODE_ICU_DATA="${SELF_DIR}/../share/icu" exec "${SELF_DIR}/node" "${SELF_DIR}/../lib/node_modules/npm/bin/npx-cli.js" "$@" NPXWRAPPER -chmod +x "${PKG_DIR}/bin/npm" "${PKG_DIR}/bin/npx" + chmod +x "${PKG_DIR}/bin/npm" "${PKG_DIR}/bin/npx" -# 验证 (需要将打包内容放到目标路径来测试 patchelf 结果) -echo "=== Verification ===" -mkdir -p "${INSTALL_PREFIX}" -cp -a "${PKG_DIR}"/* "${INSTALL_PREFIX}/" -"${INSTALL_PREFIX}/bin/node" --version -"${INSTALL_PREFIX}/bin/node" -e "console.log('execPath:', process.execPath)" -"${INSTALL_PREFIX}/bin/node" -e "console.log(process.arch, process.platform, process.versions.modules)" -NODE_ICU_DATA="${INSTALL_PREFIX}/share/icu" "${INSTALL_PREFIX}/bin/npm" --version 2>/dev/null || echo "npm needs ICU data" -rm -rf "${INSTALL_PREFIX}" + # 验证 + echo "=== Verification ===" + mkdir -p "${INSTALL_PREFIX}" + cp -a "${PKG_DIR}"/* "${INSTALL_PREFIX}/" + + # 设置库路径并测试 + export LD_LIBRARY_PATH="${INSTALL_PREFIX}/lib" + + "${INSTALL_PREFIX}/bin/node" --version + "${INSTALL_PREFIX}/bin/node" -e "console.log('execPath:', process.execPath)" + "${INSTALL_PREFIX}/bin/node" -e "console.log(process.arch, process.platform, process.versions.modules)" + NODE_ICU_DATA="${INSTALL_PREFIX}/share/icu" "${INSTALL_PREFIX}/bin/npm" --version 2>/dev/null || echo "npm needs ICU data" + + rm -rf "${INSTALL_PREFIX}" -# 打包 -cd /tmp -tar cJf "/output/${PKG_NAME}.tar.xz" "${PKG_NAME}" -ls -lh "/output/${PKG_NAME}.tar.xz" -echo "=== Done: ${PKG_NAME}.tar.xz ===" + # 打包 + echo "=== Creating tarball ===" + cd /tmp + tar cJf "/output/${PKG_NAME}.tar.xz" "${PKG_NAME}" + ls -lh "/output/${PKG_NAME}.tar.xz" + echo "=== Done: ${PKG_NAME}.tar.xz ===" +} + +# ── 主入口 ── +rm -f /tmp/build_env + +case "$BUILD_MODE" in + apk) + build_apk + ;; + cross) + build_cross + ;; + *) + echo "ERROR: Unknown BUILD_MODE: $BUILD_MODE" + exit 1 + ;; +esac + +finalize_package diff --git a/scripts/build_ipk.sh b/scripts/build_ipk.sh index a365d72..cc1c452 100755 --- a/scripts/build_ipk.sh +++ b/scripts/build_ipk.sh @@ -41,6 +41,11 @@ mkdir -p "$DATA_DIR/etc/init.d" cp "$PKG_DIR/root/etc/init.d/openclaw" "$DATA_DIR/etc/init.d/" chmod +x "$DATA_DIR/etc/init.d/openclaw" +# profile.d (v1.0.16+: 全局环境变量) +mkdir -p "$DATA_DIR/etc/profile.d" +cp "$PKG_DIR/root/etc/profile.d/openclaw.sh" "$DATA_DIR/etc/profile.d/" +chmod +x "$DATA_DIR/etc/profile.d/openclaw.sh" + # bin mkdir -p "$DATA_DIR/usr/bin" cp "$PKG_DIR/root/usr/bin/openclaw-env" "$DATA_DIR/usr/bin/" @@ -68,6 +73,11 @@ cp "$PKG_DIR/root/usr/share/openclaw/web-pty.js" "$DATA_DIR/usr/share/openclaw/" # Web PTY UI cp -r "$PKG_DIR/root/usr/share/openclaw/ui" "$DATA_DIR/usr/share/openclaw/" +# profile.d 环境变量脚本 (v1.0.16+) +mkdir -p "$DATA_DIR/etc/profile.d" +cp "$PKG_DIR/root/etc/profile.d/openclaw.sh" "$DATA_DIR/etc/profile.d/" +chmod +x "$DATA_DIR/etc/profile.d/openclaw.sh" + # i18n (po2lmo 可选) mkdir -p "$DATA_DIR/usr/lib/lua/luci/i18n" if command -v po2lmo >/dev/null 2>&1 && [ -f "$PKG_DIR/po/zh-cn/openclaw.po" ]; then @@ -86,7 +96,7 @@ mkdir -p "$CTRL_DIR" cat > "$CTRL_DIR/control" << EOF Package: ${PKG_NAME} Version: ${PKG_VERSION}-${PKG_RELEASE} -Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar +Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar, libstdcpp6 Source: https://github.com/10000ge10000/luci-app-openclaw SourceName: ${PKG_NAME} License: GPL-3.0 @@ -101,20 +111,84 @@ EOF cat > "$CTRL_DIR/postinst" << 'EOF' #!/bin/sh [ -n "${IPKG_INSTROOT}" ] || { - ( . /etc/uci-defaults/99-openclaw ) && rm -f /etc/uci-defaults/99-openclaw + # ══════════════════════════════════════════════════════════════ + # 配置文件冲突处理 (opkg 将新配置保存为 .opkg 后缀) + # ══════════════════════════════════════════════════════════════ + # opkg 配置文件冲突处理流程: + # 1. opkg 检测到 /etc/config/openclaw 已存在且内容不同 + # 2. opkg 保留旧配置,将新配置保存为 /etc/config/openclaw-opkg + # 3. postinst 需要合并用户配置到新配置文件 + + OLD_CONFIG="/etc/config/openclaw" + NEW_CONFIG="/etc/config/openclaw-opkg" + + if [ -f "$NEW_CONFIG" ]; then + echo "检测到配置文件冲突,正在智能合并..." + + # 步骤1: 从旧配置中提取用户设置 (在替换之前!) + # 使用 sed 直接解析 UCI 格式,不依赖 uci 命令 + USER_ENABLED=$(sed -n "s/^\s*option\s\+enabled\s\+['\"]\\?\\([^'\"]*\\)['\"]\\?.*/\\1/p" "$OLD_CONFIG" 2>/dev/null | tail -1) + USER_PORT=$(sed -n "s/^\s*option\s\+port\s\+['\"]\\?\\([^'\"]*\\)['\"]\\?.*/\\1/p" "$OLD_CONFIG" 2>/dev/null | tail -1) + USER_BIND=$(sed -n "s/^\s*option\s\+bind\s\+['\"]\\?\\([^'\"]*\\)['\"]\\?.*/\\1/p" "$OLD_CONFIG" 2>/dev/null | tail -1) + USER_TOKEN=$(sed -n "s/^\s*option\s\+token\s\+['\"]\\?\\([^'\"]*\\)['\"]\\?.*/\\1/p" "$OLD_CONFIG" 2>/dev/null | tail -1) + USER_PTY_PORT=$(sed -n "s/^\s*option\s\+pty_port\s\+['\"]\\?\\([^'\"]*\\)['\"]\\?.*/\\1/p" "$OLD_CONFIG" 2>/dev/null | tail -1) + + # 步骤2: 备份旧配置 (带时间戳) + BAK_FILE="/etc/config/openclaw.$(date +%Y%m%d%H%M%S).bak" + cp "$OLD_CONFIG" "$BAK_FILE" 2>/dev/null || true + echo "旧配置已备份到: $BAK_FILE" + + # 步骤3: 使用新配置文件 + mv "$NEW_CONFIG" "$OLD_CONFIG" 2>/dev/null || cp "$NEW_CONFIG" "$OLD_CONFIG" 2>/dev/null || true + rm -f "$NEW_CONFIG" 2>/dev/null || true + + # 步骤4: 合并用户设置到新配置 + # 直接使用 sed 修改配置文件,兼容性更好 + [ -n "$USER_ENABLED" ] && sed -i "s/^\(\s*option\s\+enabled\s\+\).*/\\1'$USER_ENABLED'/" "$OLD_CONFIG" 2>/dev/null || true + [ -n "$USER_PORT" ] && sed -i "s/^\(\s*option\s\+port\s\+\).*/\\1'$USER_PORT'/" "$OLD_CONFIG" 2>/dev/null || true + [ -n "$USER_BIND" ] && sed -i "s/^\(\s*option\s\+bind\s\+\).*/\\1'$USER_BIND'/" "$OLD_CONFIG" 2>/dev/null || true + [ -n "$USER_TOKEN" ] && sed -i "s/^\(\s*option\s\+token\s\+\).*/\\1'$USER_TOKEN'/" "$OLD_CONFIG" 2>/dev/null || true + [ -n "$USER_PTY_PORT" ] && sed -i "s/^\(\s*option\s\+pty_port\s\+\).*/\\1'$USER_PTY_PORT'/" "$OLD_CONFIG" 2>/dev/null || true + + echo "配置合并完成,用户设置已保留" + fi + + # 执行 uci-defaults 初始化脚本 + if [ -f /etc/uci-defaults/99-openclaw ]; then + ( . /etc/uci-defaults/99-openclaw ) && rm -f /etc/uci-defaults/99-openclaw + fi + + # 清理 LuCI 缓存 rm -f /tmp/luci-indexcache /tmp/luci-modulecache/* /tmp/luci-indexcache.*.json 2>/dev/null + # 重启 Web PTY (使其加载新文件和新 token) PTY_PID=$(pgrep -f 'web-pty.js' 2>/dev/null | head -1) [ -n "$PTY_PID" ] && kill "$PTY_PID" 2>/dev/null || true + exit 0 } EOF chmod +x "$CTRL_DIR/postinst" +cat > "$CTRL_DIR/prerm" << 'EOF' +#!/bin/sh +[ -n "${IPKG_INSTROOT}" ] || { + # 升级前备份当前配置 + if [ -f /etc/config/openclaw ]; then + cp /etc/config/openclaw /etc/config/openclaw.pre-upgrade.bak 2>/dev/null || true + fi +} +EOF +chmod +x "$CTRL_DIR/prerm" + cat > "$CTRL_DIR/postrm" << 'EOF' #!/bin/sh [ -n "${IPKG_INSTROOT}" ] || { rm -f /tmp/luci-indexcache /tmp/luci-modulecache/* 2>/dev/null + # 清理备份文件 (仅在完全卸载时) + if [ "$1" = "0" ]; then + rm -f /etc/config/openclaw.user.bak /etc/config/openclaw.pre-upgrade.bak 2>/dev/null + fi } EOF chmod +x "$CTRL_DIR/postrm" @@ -145,3 +219,8 @@ echo "文件大小: ${IPK_SIZE} bytes" echo "安装大小: ${INSTALLED_SIZE} KB" echo "" echo "安装方法: opkg install ${PKG_NAME}_${PKG_VERSION}-${PKG_RELEASE}_all.ipk" + +# ── 同步构建 .run 包 ── +echo "" +echo "=== 同步构建 .run 包 ===" +"$SCRIPT_DIR/build_run.sh" "$OUT_DIR" diff --git a/scripts/build_run.sh b/scripts/build_run.sh index a5b35dc..4ca6235 100755 --- a/scripts/build_run.sh +++ b/scripts/build_run.sh @@ -44,6 +44,11 @@ install_files() { cp "$PKG_DIR/root/etc/init.d/openclaw" "$dest/etc/init.d/" chmod +x "$dest/etc/init.d/openclaw" + # profile.d (v1.0.16+: 全局环境变量) + mkdir -p "$dest/etc/profile.d" + cp "$PKG_DIR/root/etc/profile.d/openclaw.sh" "$dest/etc/profile.d/" + chmod +x "$dest/etc/profile.d/openclaw.sh" + # bin mkdir -p "$dest/usr/bin" cp "$PKG_DIR/root/usr/bin/openclaw-env" "$dest/usr/bin/" @@ -134,7 +139,7 @@ mkdir -p "$INFO_DIR" cat > "$INFO_DIR/$PKG.control" << CTLEOF Package: $PKG Version: $PKG_VER -Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar +Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar, libstdcpp6 Section: luci Architecture: all Installed-Size: 0 @@ -170,7 +175,7 @@ cat >> "$STATUS_FILE" << STEOF Package: $PKG Version: $PKG_VER -Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar +Depends: luci-compat, luci-base, curl, openssl-util, script-utils, tar, libstdcpp6 Status: install user installed Architecture: all Conffiles: