mirror of
https://github.com/wolfydw/backup_OBS.git
synced 2026-05-08 06:37:02 +08:00
Add reusable obsutil installer and update flow
This commit is contained in:
Executable
+115
@@ -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
|
||||
Reference in New Issue
Block a user