#!/usr/bin/env bash # 校验 APT 仓库目录完整性,避免发布缺文件。 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" REPO_DIR="${APT_VERIFY_REPO_DIR:-$REPO_ROOT/dist/repo}" SUITE="${APT_REPO_SUITE:-v10}" COMPONENT="${APT_REPO_COMPONENT:-main}" ARCHES="${APT_REPO_ARCHES:-amd64 arm64}" PUBLIC_KEY_ASC_NAME="${APT_PUBLIC_KEY_ASC_NAME:-zyyun-archive-keyring.asc}" PUBLIC_KEY_GPG_NAME="${APT_PUBLIC_KEY_GPG_NAME:-zyyun-archive-keyring.gpg}" usage() { cat <] [--suite ] [--component ] [--arches "amd64 arm64"] 环境变量: APT_VERIFY_REPO_DIR 仓库目录(默认: dist/repo) APT_REPO_SUITE 仓库 suite(默认: v10) APT_REPO_COMPONENT 仓库 component(默认: main) APT_REPO_ARCHES 仓库架构(默认: "amd64 arm64") EOF } while (($# > 0)); do case "$1" in --repo-dir) REPO_DIR="${2:-}" shift 2 ;; --suite) SUITE="${2:-}" shift 2 ;; --component) COMPONENT="${2:-}" shift 2 ;; --arches) ARCHES="${2:-}" shift 2 ;; --help|-h) usage exit 0 ;; -*) echo "错误: 未知参数 $1" >&2 exit 1 ;; *) echo "错误: 不支持的位置参数 $1" >&2 exit 1 ;; esac done if [[ ! -d "$REPO_DIR" ]]; then echo "错误: 仓库目录不存在: $REPO_DIR" >&2 exit 1 fi required_files=( "$REPO_DIR/dists/$SUITE/InRelease" "$REPO_DIR/dists/$SUITE/Release" "$REPO_DIR/dists/$SUITE/Release.gpg" "$REPO_DIR/$PUBLIC_KEY_ASC_NAME" "$REPO_DIR/$PUBLIC_KEY_GPG_NAME" ) for arch in $ARCHES; do required_files+=("$REPO_DIR/dists/$SUITE/$COMPONENT/binary-$arch/Packages.gz") done for file in "${required_files[@]}"; do if [[ ! -f "$file" ]]; then echo "错误: 缺少必要文件: $file" >&2 exit 1 fi done for arch in $ARCHES; do pkg_gz="$REPO_DIR/dists/$SUITE/$COMPONENT/binary-$arch/Packages.gz" if ! gzip -t "$pkg_gz" >/dev/null 2>&1; then echo "错误: Packages.gz 不是有效 gzip 文件: $pkg_gz" >&2 exit 1 fi if gzip -dc "$pkg_gz" | grep -q '^Filename:.*\.tmp-pool-'; then echo "错误: $pkg_gz 中 Filename 仍指向构建临时目录 .tmp-pool-*,客户端无法下载。请使用最新 scripts/build-apt-repo.sh 重新生成 dist/repo。" >&2 exit 1 fi done if ! find "$REPO_DIR/pool/$COMPONENT" -type f -name "*.deb" | read -r _; then echo "错误: pool/$COMPONENT 下未发现任何 .deb 包" >&2 exit 1 fi echo "==> APT 仓库自检通过" echo " repo: $REPO_DIR" echo " suite: $SUITE" echo " component: $COMPONENT" echo " arches: $ARCHES"