3e7063b30a
* 重构 Cask 升级逻辑,引入失败隔离与针对性重试机制 * 新增通过环境变量自定义重试次数与延迟间隔的功能 * 优化启动器下载流程,集成 curl 自动退避重试策略 * 改进 Cask 失败处理,仅对未成功项进行二次重试并移除强制标志 * 更新文档,详细说明网络瞬时错误处理与新版本升级逻辑 * 增强脚本健壮性,完善针对数值参数的合法性校验机制
82 lines
2.7 KiB
Bash
Executable File
82 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 目标:下载远程升级脚本、执行、销毁临时文件
|
||
set -euo pipefail
|
||
|
||
REMOTE="https://git.orionc.me/orion/script/raw/branch/main/homebrew/brew-upgrade-manager.sh"
|
||
TEMP="$(mktemp "${TMPDIR:-/tmp}/brew-upgrade-manager.XXXXXX.sh")"
|
||
KEYCHAIN_SERVICE="${BREWUP_KEYCHAIN_SERVICE:-brewup-sudo-password}"
|
||
ASKPASS_TEMP="$(mktemp "${TMPDIR:-/tmp}/brewup-askpass.XXXXXX.sh")"
|
||
cleanup() {
|
||
rm -f "$TEMP" "$ASKPASS_TEMP"
|
||
}
|
||
trap cleanup EXIT INT TERM
|
||
|
||
PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"
|
||
export PATH
|
||
|
||
setup_sudo_askpass() {
|
||
cat > "$ASKPASS_TEMP" <<'EOF'
|
||
#!/usr/bin/env bash
|
||
exec /usr/bin/security find-generic-password -a "${USER:-$(id -un)}" -s "${BREWUP_KEYCHAIN_SERVICE:-brewup-sudo-password}" -w
|
||
EOF
|
||
chmod 700 "$ASKPASS_TEMP"
|
||
export SUDO_ASKPASS="$ASKPASS_TEMP"
|
||
export BREWUP_KEYCHAIN_SERVICE="$KEYCHAIN_SERVICE"
|
||
|
||
if ! /usr/bin/security find-generic-password -a "$USER" -s "$KEYCHAIN_SERVICE" -w >/dev/null 2>&1; then
|
||
printf "首次使用:请输入一次 sudo 密码,将保存到 macOS Keychain:"
|
||
IFS= read -r -s BREWUP_SUDO_PASSWORD
|
||
printf "\n"
|
||
/usr/bin/security add-generic-password -U -a "$USER" -s "$KEYCHAIN_SERVICE" -w "$BREWUP_SUDO_PASSWORD" >/dev/null
|
||
unset BREWUP_SUDO_PASSWORD
|
||
fi
|
||
|
||
echo "正在通过 Keychain 准备 sudo 凭据..."
|
||
if ! sudo -A -v; then
|
||
echo "Keychain 中的 sudo 密码不可用,请删除后重新保存:" >&2
|
||
echo " security delete-generic-password -a \"$USER\" -s \"$KEYCHAIN_SERVICE\"" >&2
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
setup_sudo_askpass
|
||
|
||
echo "正在下载远程脚本..."
|
||
download_retries="${BREWUP_DOWNLOAD_RETRIES:-3}"
|
||
download_retry_delay="${BREWUP_DOWNLOAD_RETRY_DELAY_SECONDS:-2}"
|
||
[[ "$download_retries" =~ ^[1-9][0-9]*$ ]] || download_retries=3
|
||
[[ "$download_retry_delay" =~ ^[0-9]+$ ]] || download_retry_delay=2
|
||
|
||
curl_retry_all_errors=()
|
||
if curl --help all 2>/dev/null | grep -q -- '--retry-all-errors'; then
|
||
curl_retry_all_errors+=(--retry-all-errors)
|
||
fi
|
||
|
||
curl -f -sSL \
|
||
--retry "$download_retries" \
|
||
--retry-delay "$download_retry_delay" \
|
||
"${curl_retry_all_errors[@]}" \
|
||
"$REMOTE" -o "$TEMP"
|
||
chmod 600 "$TEMP"
|
||
|
||
if [[ -n "${BREWUP_SHA256:-}" ]]; then
|
||
echo "正在校验脚本 SHA256..."
|
||
actual_sha256="$(shasum -a 256 "$TEMP")"
|
||
actual_sha256="${actual_sha256%% *}"
|
||
if [[ "$actual_sha256" != "$BREWUP_SHA256" ]]; then
|
||
echo "脚本 SHA256 不匹配,已停止执行。" >&2
|
||
echo "Expected: $BREWUP_SHA256" >&2
|
||
echo "Actual: $actual_sha256" >&2
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
|
||
if [[ "${BREWUP_DEBUG:-}" == "1" ]]; then
|
||
echo "Downloaded script first line:"
|
||
head -n 1 "$TEMP"
|
||
fi
|
||
|
||
export COLUMNS="130"
|
||
bash "$TEMP" "$@"
|