mirror of
https://github.com/wolfydw/backup_OBS.git
synced 2026-05-08 06:37:02 +08:00
116 lines
2.8 KiB
Bash
Executable File
116 lines
2.8 KiB
Bash
Executable File
#!/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
|