Add reusable obsutil installer and update flow

This commit is contained in:
Codex
2026-03-16 19:29:41 +08:00
parent f73e401748
commit 7465658ff7
5 changed files with 160 additions and 5 deletions
Executable
+115
View File
@@ -0,0 +1,115 @@
#!/usr/bin/env bash
# 下载或更新仓库内的 obsutil 二进制。
# - 默认安装到仓库根目录下的 ./obsutil
# - 若系统已有 obsutil,不会覆盖;只管理仓库内副本
# - install.sh 和手动维护都可复用这个脚本
set -Eeuo pipefail
SCRIPT_PATH="${BASH_SOURCE[0]:-$0}"
LIB_DIR="$(cd "$(dirname -- "$SCRIPT_PATH")" && pwd -P)"
ROOT_DIR="$(cd "${LIB_DIR}/.." && pwd -P)"
TARGET_BIN="${ROOT_DIR}/obsutil"
DRY_RUN=false
usage() {
cat <<'USAGE'
用法:
./lib/obsutil.sh [--dry-run]
说明:
- 下载并安装或更新仓库内的 ./obsutil
- 默认覆盖仓库里的旧版本
- dry-run 只打印将执行的动作,不实际下载
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
--dry-run) DRY_RUN=true; shift ;;
-h|--help) usage; exit 0 ;;
*) echo "未知参数:$1" >&2; usage; exit 2 ;;
esac
done
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "缺少命令:$1" >&2
exit 2
}
}
download_file() {
local url="$1"
local output="$2"
if command -v curl >/dev/null 2>&1; then
curl -fsSL "$url" -o "$output"
return 0
fi
if command -v wget >/dev/null 2>&1; then
wget -qO "$output" "$url"
return 0
fi
echo "缺少下载工具:curl 或 wget" >&2
exit 2
}
resolve_package_name() {
case "$(uname -m)" in
x86_64|amd64) printf '%s\n' "obsutil_linux_amd64.tar.gz" ;;
aarch64|arm64) printf '%s\n' "obsutil_linux_arm64.tar.gz" ;;
*)
echo "不支持的 CPU 架构:$(uname -m)" >&2
echo "请手动安装 obsutil 后再试" >&2
exit 2
;;
esac
}
need_cmd install
need_cmd tar
PACKAGE_NAME="$(resolve_package_name)"
DOWNLOAD_URL="https://obs-community-intl.obs.ap-southeast-1.myhuaweicloud.com/obsutil/current/${PACKAGE_NAME}"
if $DRY_RUN; then
if [[ -x "$TARGET_BIN" ]]; then
echo "[dry-run] 将更新仓库内 obsutil${TARGET_BIN}"
else
echo "[dry-run] 将安装仓库内 obsutil${TARGET_BIN}"
fi
echo "[dry-run] 下载地址:${DOWNLOAD_URL}"
exit 0
fi
TMP_DIR="$(mktemp -d)"
ARCHIVE_PATH="${TMP_DIR}/${PACKAGE_NAME}"
trap 'rm -rf "$TMP_DIR"' EXIT
if [[ -x "$TARGET_BIN" ]]; then
echo "开始更新仓库内 obsutil${TARGET_BIN}"
else
echo "开始安装仓库内 obsutil${TARGET_BIN}"
fi
download_file "$DOWNLOAD_URL" "$ARCHIVE_PATH"
tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR"
BINARY_PATH="$(find "$TMP_DIR" -type f -name obsutil | head -n 1)"
if [[ -z "$BINARY_PATH" ]]; then
echo "下载包中未找到 obsutil 可执行文件" >&2
exit 2
fi
install -m 755 "$BINARY_PATH" "$TARGET_BIN"
VERSION_OUTPUT="$("$TARGET_BIN" version 2>/dev/null || true)"
if [[ -z "$VERSION_OUTPUT" ]]; then
echo "obsutil 已安装,但运行校验失败:${TARGET_BIN}" >&2
exit 2
fi
echo "obsutil 已就绪:${TARGET_BIN}"
echo "$VERSION_OUTPUT" | head -n 1