fix(kernel): fetch 脚本改内置 SHA pin(sing-box 停发 checksums.txt)+修正 wintun SHA
- sing-box v1.13 起 Release 不再发布 checksums.txt,原脚本下载它 404,桌面内核 拉取全平台失效。改为脚本内置各压缩包 SHA256(case 表,版本不符即报错)。 - WINTUN_SHA256 原值(90a6c2..)错误,更正为 wintun-0.14.1.zip 官方哈希(07c256..)。 - 已在 macOS 验证 windows/amd64 全流程:sing-box.exe + wintun.dll 下载+校验+解压通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -32,7 +32,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# ── Wintun ZIP SHA256(对应 WINTUN_VERSION=0.14.1)─────────────────────────
|
||||
# 更新 WINTUN_VERSION 时须同步更新此值:
|
||||
# curl -sL https://www.wintun.net/builds/wintun-<ver>.zip | sha256sum
|
||||
WINTUN_SHA256="90a6c2a17e62685b571c9afc2d5a6e7dc59c74d3fde3ad66b4ab4e2e4b0d649a"
|
||||
WINTUN_SHA256="07c256185d6ee3652e09fa55c0b673e2624b565e02c4b9091c79ca7d2f24ef51"
|
||||
|
||||
# ── 参数解析 ─────────────────────────────────────────────────────────────────
|
||||
if [[ $# -lt 2 ]]; then
|
||||
@@ -82,7 +82,19 @@ ARCHIVE_FILE="${ARCHIVE_STEM}.${ARCHIVE_EXT}"
|
||||
|
||||
GITHUB_BASE="https://github.com/SagerNet/sing-box/releases/download/${SINGBOX_VERSION}"
|
||||
ARCHIVE_URL="${GITHUB_BASE}/${ARCHIVE_FILE}"
|
||||
CHECKSUMS_URL="${GITHUB_BASE}/checksums.txt"
|
||||
|
||||
# ── sing-box 压缩包 SHA256(内置 pin)──────────────────────────────────────────
|
||||
# sing-box 自 v1.13 起的 Release 不再发布 checksums.txt,故改为脚本内置各压缩包
|
||||
# 的 SHA256。更新 SINGBOX_VERSION 时必须同步更新下表(case 键含版本号,未更新会
|
||||
# 命中 *) 分支并报错,以防用错版本的哈希):
|
||||
# curl -fsSL "${GITHUB_BASE}/<archive>" | shasum -a 256
|
||||
EXPECTED_HASH=""
|
||||
case "${ARCHIVE_FILE}" in
|
||||
sing-box-1.13.12-windows-amd64.zip) EXPECTED_HASH="e93fc531134eb1beb4efa3c74990a24e48456098a31c03b60d5ddf17f223cf98" ;;
|
||||
sing-box-1.13.12-darwin-arm64.tar.gz) EXPECTED_HASH="43eef86f0ea4a79c3696974f397a963c46a457ee46d1ffac9aa913944a5fc986" ;;
|
||||
sing-box-1.13.12-darwin-amd64.tar.gz) EXPECTED_HASH="f3275316451bf1983bc059599c69c8ed0232d53a619d15cfd535f95cc9a4477a" ;;
|
||||
sing-box-1.13.12-linux-amd64.tar.gz) EXPECTED_HASH="1540533adb3df24f5ad5f14b5c7ca3dbc2401b10a1c1eb278fcadcada47ec6c4" ;;
|
||||
esac
|
||||
|
||||
OUT_BIN="${DIST_DIR}/${BIN_NAME}"
|
||||
|
||||
@@ -104,23 +116,12 @@ _sha256() {
|
||||
fi
|
||||
}
|
||||
|
||||
# ── 幂等检查(已有产物则校验 SHA256)────────────────────────────────────────
|
||||
# ── 幂等检查(已有产物则跳过;--force 强制重下)────────────────────────────────
|
||||
if [[ "${FORCE}" == false && -f "${OUT_BIN}" ]]; then
|
||||
CACHED_SUMS="${DIST_DIR}/checksums.txt"
|
||||
if [[ -f "${CACHED_SUMS}" ]]; then
|
||||
EXPECTED_HASH=""
|
||||
EXPECTED_HASH="$(grep "${ARCHIVE_FILE}" "${CACHED_SUMS}" | awk '{print $1}')" || true
|
||||
if [[ -n "${EXPECTED_HASH}" ]]; then
|
||||
ACTUAL_HASH="$(_sha256 "${OUT_BIN}")"
|
||||
# 注: 校验的是二进制本身,不是压缩包;用 EXPECTED_HASH 做存档记录匹配
|
||||
# 直接对比压缩包解压后的二进制需另行记录;此处以文件存在+校验文件存在为幂等条件
|
||||
printf '✓ %s 已存在(checksums.txt 已缓存),跳过下载\n' "${OUT_BIN}"
|
||||
printf ' 当前 SHA256: %s\n' "${ACTUAL_HASH}"
|
||||
printf ' (传 --force 强制重新下载并校验压缩包)\n'
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
printf '✓ %s 已存在但无校验缓存,继续下载验证…\n' "${OUT_BIN}"
|
||||
printf '✓ %s 已存在,跳过下载\n' "${OUT_BIN}"
|
||||
printf ' 当前 SHA256: %s\n' "$(_sha256 "${OUT_BIN}")"
|
||||
printf ' (传 --force 强制重新下载并校验压缩包)\n'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# ── 创建目录 ─────────────────────────────────────────────────────────────────
|
||||
@@ -128,13 +129,14 @@ mkdir -p "${DIST_DIR}"
|
||||
mkdir -p "${CACHE_DIR}"
|
||||
|
||||
ARCHIVE_CACHE="${CACHE_DIR}/${ARCHIVE_FILE}"
|
||||
CHECKSUMS_CACHE="${CACHE_DIR}/checksums-${VERSION_BARE}.txt"
|
||||
|
||||
# ── 下载 checksums.txt ───────────────────────────────────────────────────────
|
||||
printf '==> 下载 checksums.txt for %s…\n' "${SINGBOX_VERSION}"
|
||||
curl -fSL --retry 3 --retry-delay 2 \
|
||||
-o "${CHECKSUMS_CACHE}" \
|
||||
"${CHECKSUMS_URL}"
|
||||
# 未在内置 pin 表中找到该压缩包的 SHA256(多半是 SINGBOX_VERSION 升级后没同步哈希)
|
||||
if [[ -z "${EXPECTED_HASH}" ]]; then
|
||||
printf '✗ 脚本内未内置 %s 的 SHA256\n' "${ARCHIVE_FILE}" >&2
|
||||
printf ' 升级 SINGBOX_VERSION 后需在本脚本 case 表补该压缩包哈希:\n' >&2
|
||||
printf ' curl -fsSL "%s" | shasum -a 256\n' "${ARCHIVE_URL}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ── 下载二进制压缩包 ──────────────────────────────────────────────────────────
|
||||
printf '==> 下载 %s…\n' "${ARCHIVE_FILE}"
|
||||
@@ -142,16 +144,9 @@ curl -fSL --retry 3 --retry-delay 2 \
|
||||
-o "${ARCHIVE_CACHE}" \
|
||||
"${ARCHIVE_URL}"
|
||||
|
||||
# ── SHA256 校验(对压缩包)───────────────────────────────────────────────────
|
||||
# ── SHA256 校验(对压缩包,比对内置 pin)──────────────────────────────────────
|
||||
printf '==> 校验 SHA256…\n'
|
||||
|
||||
EXPECTED_HASH=""
|
||||
EXPECTED_HASH="$(grep "${ARCHIVE_FILE}" "${CHECKSUMS_CACHE}" | awk '{print $1}')"
|
||||
if [[ -z "${EXPECTED_HASH}" ]]; then
|
||||
printf '✗ checksums.txt 中未找到 %s 的校验值\n' "${ARCHIVE_FILE}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ACTUAL_HASH="$(_sha256 "${ARCHIVE_CACHE}")"
|
||||
if [[ "${ACTUAL_HASH}" != "${EXPECTED_HASH}" ]]; then
|
||||
printf '✗ SHA256 不匹配!\n' >&2
|
||||
@@ -187,9 +182,6 @@ fi
|
||||
cp "${INNER_DIR}/${BIN_NAME}" "${OUT_BIN}"
|
||||
chmod 755 "${OUT_BIN}"
|
||||
|
||||
# ── 缓存 checksums.txt 到产物目录(供幂等复查)────────────────────────────────
|
||||
cp "${CHECKSUMS_CACHE}" "${DIST_DIR}/checksums.txt"
|
||||
|
||||
printf '\n✓ sing-box 二进制: %s\n' "${OUT_BIN}"
|
||||
printf ' 版本验证: %s version\n' "${OUT_BIN}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user