shell_repo仓库生成

make_local_repo_final.sh

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
#!/bin/bash
# -----------------------------------------------------------------------------
# 脚本名称: make_local_repo_final.sh
# 功能: 清洗缓存目录名,按系统版本构建仓库,并生成对应 repo 文件
# -----------------------------------------------------------------------------

set -e

# =================配置区域=================
# 1. 动态获取系统版本 (例如: RHEL-8.9)
if [ -f /etc/os-release ]; then
    source /etc/os-release
    OS_NAME=${ID^^}       # 转大写,如 RHEL
    OS_VER=${VERSION_ID}  # 如 8.9
    DISTRO_NAME="${OS_NAME}-${OS_VER}"
else
    DISTRO_NAME="Generic-Linux"
fi

# DNF 缓存源目录
CACHE_SRC="/var/cache/dnf"

# 目标仓库根目录 (增加版本号层级)
REPO_BASE="/opt/local_repo"
REPO_DEST="$REPO_BASE/$DISTRO_NAME"

# Repo 配置文件存放位置
LOCAL_REPO_FILE="$REPO_DEST/local-${DISTRO_NAME}.repo"
SYSTEM_REPO_DIR="/etc/yum.repos.d"

# =========================================

# 2. 检查 createrepo
if ! command -v createrepo &> /dev/null; then
    echo "错误: 未找到 createrepo 命令。"
    echo "请先安装: dnf install createrepo -y"
    exit 1
fi

# 3. 创建目标根目录
if [ ! -d "$REPO_DEST" ]; then
    echo ">> 创建版本化仓库目录: $REPO_DEST"
    mkdir -p "$REPO_DEST"
fi

echo ">> 开始构建仓库 (来源: $CACHE_SRC)..."
echo "------------------------------------------------"

# 初始化 Repo 文件头
echo "# Local Repo for $DISTRO_NAME" > "$LOCAL_REPO_FILE"

# 4. 遍历缓存目录
for dir in "$CACHE_SRC"/*; do
    if [ -d "$dir" ]; then
        # 获取原始目录名
        base_name=$(basename "$dir")
        
        # [你的逻辑] 清洗目录名:去除后面的哈希值
        clean_name=$(echo "$base_name" | sed -E 's/-[0-9a-f]{16,}.*//')
        if [ -z "$clean_name" ]; then clean_name="$base_name"; fi

        # 检查是否有 RPM 包
        rpm_count=$(find "$dir" -name "*.rpm" | wc -l)

        if [ "$rpm_count" -gt 0 ]; then
            # 定义具体的子仓库路径
            repo_subdir="$REPO_DEST/$clean_name"
            pkg_dir="$repo_subdir/packages"

            echo "正在处理: $clean_name (发现 $rpm_count 个包)"

            # 创建 packages 目录
            mkdir -p "$pkg_dir"

            # 复制 RPM (使用 -n 跳过已存在的)
            find "$dir" -name "*.rpm" -exec cp -n {} "$pkg_dir/" \;

            # 生成/更新 repodata (针对 repo_subdir)
            echo "  -> 生成 repodata..."
            createrepo --update "$repo_subdir" > /dev/null

            # =========================================
            # [新增] 动态追加内容到 .repo 文件
            # =========================================
            cat >> "$LOCAL_REPO_FILE" <<EOF

[Local-${clean_name}]
name=Local ${DISTRO_NAME} ${clean_name}
baseurl=file://${repo_subdir}
enabled=1
gpgcheck=0
skip_if_unavailable=1
EOF
            echo "  -> 已添加到配置文件"
            echo "------------------------------------------------"
        fi
    fi
done

echo "================================================"
echo "所有任务完成!"
echo "1. 仓库根路径: $REPO_DEST"
echo "2. 生成的Repo: $LOCAL_REPO_FILE"
echo "3. 系统已应用: $SYSTEM_REPO_DIR/local-${DISTRO_NAME}.repo"
echo "================================================"