mirror of
https://github.com/hotwa/luci-app-openclaw.git
synced 2026-03-30 20:25:44 +00:00
Auto-link legacy ARM64 musl node assets
This commit is contained in:
@@ -307,6 +307,22 @@ download_node() {
|
||||
log_info "Node.js ${installed_ver} 安装成功"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$libc_type" = "musl" ] && [ "$node_arch" = "linux-arm64" ] && \
|
||||
[ "$OPENCLAW_INSTALL_ROOT" != "/opt" ] && oc_node_requires_opt_compat "$NODE_BIN"; then
|
||||
log_warn "检测到旧版 ARM64 musl Node.js 资产,尝试创建 /opt 兼容链接"
|
||||
if oc_ensure_opt_compat_link "$OC_ROOT"; then
|
||||
installed_ver=$(oc_read_node_version "$NODE_BIN" || true)
|
||||
if [ -n "$installed_ver" ] && oc_node_version_ge "$installed_ver" "$node_ver"; then
|
||||
log_warn "已启用兼容链接: /opt/openclaw -> ${OC_ROOT}"
|
||||
log_info "Node.js ${installed_ver} 安装成功"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
log_warn "无法创建 /opt/openclaw 兼容链接,请检查该路径是否已被其他安装占用"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$installed_ver" ]; then
|
||||
log_error "Node.js 版本过低: v${installed_ver} < v${node_ver}"
|
||||
else
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#!/bin/sh
|
||||
# Shared OpenClaw Node.js runtime/version helpers.
|
||||
|
||||
OPENCLAW_LEGACY_ARM64_MUSL_INTERPRETER="${OPENCLAW_LEGACY_ARM64_MUSL_INTERPRETER:-/opt/openclaw/node/lib/ld-musl-aarch64.so.1}"
|
||||
|
||||
oc_normalize_node_version() {
|
||||
local version="${1:-}"
|
||||
local old_ifs
|
||||
@@ -67,6 +69,15 @@ oc_read_node_version() {
|
||||
oc_normalize_node_version "$version"
|
||||
}
|
||||
|
||||
oc_node_requires_opt_compat() {
|
||||
local node_bin="${1:-}"
|
||||
|
||||
[ -n "$node_bin" ] || return 1
|
||||
[ -f "$node_bin" ] || return 1
|
||||
|
||||
grep -aqF "$OPENCLAW_LEGACY_ARM64_MUSL_INTERPRETER" "$node_bin"
|
||||
}
|
||||
|
||||
oc_select_node_release_asset_url() {
|
||||
local json_file="${1:-}"
|
||||
local node_arch="${2:-}"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Shared OpenClaw install-root and derived-path helpers.
|
||||
|
||||
OPENCLAW_DEFAULT_INSTALL_ROOT="${OPENCLAW_DEFAULT_INSTALL_ROOT:-/opt}"
|
||||
OPENCLAW_OPT_COMPAT_ROOT="${OPENCLAW_OPT_COMPAT_ROOT:-/opt}"
|
||||
|
||||
oc_normalize_install_root() {
|
||||
local path="$1"
|
||||
@@ -66,6 +67,30 @@ oc_install_root_uses_opt_workaround() {
|
||||
[ "$(oc_normalize_install_root "${1:-$OPENCLAW_INSTALL_ROOT}")" = "/opt" ]
|
||||
}
|
||||
|
||||
oc_ensure_opt_compat_link() {
|
||||
local target_root="$1"
|
||||
local compat_root compat_link current_target
|
||||
|
||||
target_root="$(oc_normalize_install_root "$target_root")"
|
||||
[ "$target_root" = "/opt" ] && return 0
|
||||
|
||||
compat_root="$(oc_normalize_install_root "$OPENCLAW_OPT_COMPAT_ROOT")"
|
||||
compat_link="${compat_root}/openclaw"
|
||||
|
||||
if [ -L "$compat_link" ]; then
|
||||
current_target="$(readlink "$compat_link" 2>/dev/null || true)"
|
||||
[ "$current_target" = "$target_root" ] && return 0
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ -e "$compat_link" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
mkdir -p "$compat_root"
|
||||
ln -s "$target_root" "$compat_link"
|
||||
}
|
||||
|
||||
oc_print_env() {
|
||||
oc_load_paths "$1"
|
||||
cat <<EOF
|
||||
@@ -74,5 +99,6 @@ OC_ROOT=$OC_ROOT
|
||||
NODE_BASE=$NODE_BASE
|
||||
OC_GLOBAL=$OC_GLOBAL
|
||||
OC_DATA=$OC_DATA
|
||||
OPENCLAW_OPT_COMPAT_ROOT=$OPENCLAW_OPT_COMPAT_ROOT
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -36,6 +36,8 @@ grep -Fq 'OPENCLAW_NODE_BINS_REPO="${OPENCLAW_NODE_BINS_REPO:-hotwa/luci-app-ope
|
||||
grep -Fq 'NODE_SELF_HOST="${NODE_SELF_HOST:-https://github.com/${OPENCLAW_NODE_BINS_REPO}/releases/download/node-bins}"' "$ENV_SCRIPT" || fail "installer should derive node-bins release URL from hotwa repo"
|
||||
grep -Fq 'NODE_RELEASE_API="${NODE_RELEASE_API:-https://api.github.com/repos/${OPENCLAW_NODE_BINS_REPO}/releases/tags/node-bins}"' "$ENV_SCRIPT" || fail "installer should derive node-bins release API from hotwa repo"
|
||||
grep -Fq 'oc_select_node_release_asset_url' "$ENV_SCRIPT" || fail "installer should dynamically select ARM64 musl asset"
|
||||
grep -Fq 'oc_node_requires_opt_compat "$NODE_BIN"' "$ENV_SCRIPT" || fail "installer should detect legacy opt-bound ARM64 musl node assets"
|
||||
grep -Fq 'oc_ensure_opt_compat_link "$OC_ROOT"' "$ENV_SCRIPT" || fail "installer should create /opt compatibility symlink for legacy assets"
|
||||
grep -Fq 'arm64_musl_url=$(resolve_arm64_musl_node_url "$node_ver") || exit 1' "$ENV_SCRIPT" || fail "installer should resolve ARM64 musl asset dynamically"
|
||||
if grep -Fq 'mirror_list="${NODE_SELF_HOST}/${musl_tarball}"' "$ENV_SCRIPT"; then
|
||||
fail "installer should not hardcode exact ARM64 musl asset path"
|
||||
|
||||
@@ -51,6 +51,17 @@ if oc_read_node_version "$tmpdir/node-bad" >/dev/null 2>&1; then
|
||||
fail "broken node binary should not be accepted"
|
||||
fi
|
||||
|
||||
cat > "$tmpdir/node-legacy-opt" <<'EOF'
|
||||
#!/bin/sh
|
||||
/opt/openclaw/node/lib/ld-musl-aarch64.so.1
|
||||
EOF
|
||||
chmod +x "$tmpdir/node-legacy-opt"
|
||||
|
||||
oc_node_requires_opt_compat "$tmpdir/node-legacy-opt" || fail "legacy opt-bound node binary should be detected"
|
||||
if oc_node_requires_opt_compat "$tmpdir/node-ok" >/dev/null 2>&1; then
|
||||
fail "modern runnable node helper should not require opt compatibility"
|
||||
fi
|
||||
|
||||
cat > "$tmpdir/node-bins-release.json" <<'EOF'
|
||||
{
|
||||
"tag_name": "node-bins",
|
||||
|
||||
@@ -27,4 +27,22 @@ trap 'rm -rf "$tmpdir"' EXIT INT TERM
|
||||
existing=$(oc_find_existing_path "$tmpdir/missing/nested")
|
||||
[ "$existing" = "$tmpdir" ] || fail "nearest existing path"
|
||||
|
||||
export OPENCLAW_OPT_COMPAT_ROOT="$tmpdir/compat-opt"
|
||||
target_root="$tmpdir/install-root/openclaw"
|
||||
mkdir -p "$target_root"
|
||||
|
||||
oc_ensure_opt_compat_link "$target_root" || fail "compat symlink should be created for custom install root"
|
||||
[ -L "$OPENCLAW_OPT_COMPAT_ROOT/openclaw" ] || fail "compat symlink should exist"
|
||||
[ "$(readlink "$OPENCLAW_OPT_COMPAT_ROOT/openclaw")" = "$target_root" ] || fail "compat symlink should point to install root"
|
||||
|
||||
oc_ensure_opt_compat_link "$target_root" || fail "compat symlink should be idempotent"
|
||||
|
||||
conflict_root="$tmpdir/conflict-openclaw"
|
||||
mkdir -p "$conflict_root"
|
||||
rm -f "$OPENCLAW_OPT_COMPAT_ROOT/openclaw"
|
||||
ln -s "$conflict_root" "$OPENCLAW_OPT_COMPAT_ROOT/openclaw"
|
||||
if oc_ensure_opt_compat_link "$target_root" >/dev/null 2>&1; then
|
||||
fail "compat symlink should fail when pointing at another install root"
|
||||
fi
|
||||
|
||||
echo "ok"
|
||||
|
||||
Reference in New Issue
Block a user