================================================================
  fix_eol_rpm_repo.sh & check_repo.sh
  RHEL 系 EOL 仓库修复工具包
================================================================

适用系统：
  CentOS 7 / 8
  RHEL 7 / 8 / 9
  Rocky Linux 8 / 9
  AlmaLinux 8 / 9

要求权限：root（必须用 root 执行）
要求工具：bash、curl、dnf 或 yum


================================================================
一、文件说明
================================================================

  fix_eol_rpm_repo.sh
  -------------------
  仓库修复脚本。自动检测系统版本，按大版本分代写入正确的
  yum/dnf 仓库配置，解决 EOL 后官方源 404 / 订阅失效问题。

  分发策略：
    RHEL 7 / CentOS 7   → centos-vault 7.9.2009
    RHEL 8 / CentOS 8   → centos-vault 8.5.2111
    RHEL 9              → Rocky 9 + EPEL 9（阿里云 / 163）
    Rocky 8/9, Alma 8/9 → 对应版本 Vault / 官方源

  行为摘要：
    - 备份 /etc/yum.repos.d/*.repo 到带时间戳的 backup 目录
    - 禁用 subscription-manager 插件（RHEL 未注册时避免干扰）
    - 移走旧 repo 文件
    - 写入新的可用 repo（按版本分代，不混代）
    - 执行 dnf/yum clean all && makecache 验证

  check_repo.sh
  -------------
  仓库修复自检脚本。验证 fix 脚本执行后仓库是否真正可用，
  检测混代污染、subscription-manager 干扰、网络连通性等。

  检查项（共 8 项）：
    1. 系统信息
    2. 包管理器检测
    3. 当前启用的仓库列表
    4. EL8 混代污染检测
    5. subscription-manager 插件状态
    6. makecache 元数据缓存测试
    7. 装包测试（默认 nmon，可自定义）
    8. 镜像站网络连通性

  退出码：
    0 = 全部通过
    1 = 发现问题


================================================================
二、快速开始
================================================================

1. 修复仓库

   # 自动探测最快镜像（aliyun / 163）
   bash fix_eol_rpm_repo.sh

   # 指定镜像
   bash fix_eol_rpm_repo.sh --mirror aliyun
   bash fix_eol_rpm_repo.sh --mirror 163

   # 预览模式（不实际修改，只看会写什么）
   bash fix_eol_rpm_repo.sh --dry-run

2. 验证修复结果

   # 基本自检
   bash check_repo.sh

   # 详细模式（显示完整 repolist）
   bash check_repo.sh --verbose

   # 自定义测试包（CentOS 7 没有 nmon，可换 htop/vim）
   bash check_repo.sh --install-test htop

   # 组合使用
   bash check_repo.sh --verbose --install-test vim


================================================================
三、典型使用流程
================================================================

  场景 A：CentOS 7 仓库 404（EOL 后官方源下线）
  --------------------------------------------
  bash fix_eol_rpm_repo.sh --mirror aliyun
  bash check_repo.sh --install-test wget
  # 看到 "仓库状态正常" 即可正常使用 yum

  场景 B：RHEL 9 未注册订阅，yum 报错
  -----------------------------------
  bash fix_eol_rpm_repo.sh --mirror aliyun
  # 脚本自动选择 Rocky 9 + EPEL 9 兼容源
  bash check_repo.sh
  # 确认无 EL8 污染后正常使用 dnf

  场景 C：之前手动配过源，现在一团糟
  ----------------------------------
  bash fix_eol_rpm_repo.sh --dry-run   # 先看会改什么
  bash fix_eol_rpm_repo.sh            # 确认后执行
  bash check_repo.sh --verbose        # 详细验证

  场景 D：批量运维（自动化）
  --------------------------
  # 非交互模式，指定镜像
  bash fix_eol_rpm_repo.sh --mirror aliyun
  bash check_repo.sh || echo "FAILED"
  # 退出码 0 = 成功，1 = 失败，可接入监控


================================================================
四、参数说明
================================================================

fix_eol_rpm_repo.sh
-------------------
  --mirror aliyun|163   指定镜像站（默认自动探测连通性最快的）
  --dry-run             预览模式，不写入任何文件
  -h, --help            显示帮助信息

check_repo.sh
-------------
  --verbose             显示完整 repolist 和 module list
  --install-test PKG    指定装包测试用的包名（默认 nmon）
  -h, --help            显示帮助信息


================================================================
五、回滚方法
================================================================

fix_eol_rpm_repo.sh 执行时会自动备份所有旧 repo 到：

  /etc/yum.repos.d/backup-YYYYMMDD_HHMMSS/

回滚步骤：

  # 1. 查看备份目录
  ls /etc/yum.repos.d/backup-*/

  # 2. 恢复（以实际时间戳为准）
  cp /etc/yum.repos.d/backup-20260929_170207/*.repo /etc/yum.repos.d/

  # 3. 清理 fix 写入的新 repo
  rm -f /etc/yum.repos.d/CentOS-*-Vault.repo
  rm -f /etc/yum.repos.d/Rocky-9.repo
  rm -f /etc/yum.repos.d/epel-9.repo

  # 4. 重建缓存
  dnf clean all && dnf makecache


================================================================
六、常见问题
================================================================

Q1: 为什么不用 EPEL 9 Modular？
A:  阿里云 / 163 等国内镜像只同步了 epel/9/Everything，
    没有 Modular/x86_64/repodata/repomd.xml，写了必 404。
    脚本已去掉 modular repo，nmon/htop 等工具在 Everything
    里都有。

Q2: RHEL 9 用 Rocky 9 源安全吗？
A:  作为应急方案可以，Rocky 9 与 RHEL 9 二进制兼容。
    但不能替代 Red Hat 官方订阅支持。生产环境建议注册
    subscription-manager 后用官方源。

Q3: 为什么 CentOS 7 要用 centos-vault/7.9.2009？
A:  CentOS 7 已于 2024-06-30 EOL，mirror.centos.org 上的
    普通路径已 404。Vault 是官方归档，7.9.2009 是最终版本。

Q4: 为什么不能把 EL8 源用在 EL9 上？
A:  EL8 和 EL9 的 glibc、openssl、systemd 等核心库版本不同。
    混用会导致依赖解析失败（platform:el8 模块错误）甚至
    系统损坏。脚本严格按大版本分代，不混用。

Q5: 自动选镜像的原理？
A:  用 curl -m 4 探测各镜像站的 repomd.xml，比较响应时间，
    选最快的。超时 4 秒，都超时则默认 aliyun。

Q6: Windows 编辑后传到 Linux 报 "\r" 错误？
A:  文件包含 Windows 换行符（CRLF）。修复方法：
      sed -i 's/\r$//' fix_eol_rpm_repo.sh
      sed -i 's/\r$//' check_repo.sh
    或在编辑器中转换为 LF（Unix）格式。


================================================================
七、已知限制
================================================================

  - RHEL 9 使用 Rocky 9 兼容源不等同于 Red Hat 官方支持
  - CentOS 7 的 vault 源不含 EPEL，部分工具需手动下载 RPM
  - 自动选镜像只测 aliyun 和 163，未覆盖 tuna/huawei 等
  - 脚本不处理已损坏的 RPM 数据库（需手动 rpm --rebuilddb）
  - 不注册 RHEL 订阅的情况下，RHN 相关工具不可用


================================================================
八、文件清单
================================================================

  fix_eol_rpm_repo.sh    仓库修复主脚本
  check_repo.sh          仓库修复自检脚本
  README.txt             本文件


================================================================
九、参考链接
================================================================

  阿里云开源镜像站    https://mirrors.aliyun.com
  网易开源镜像站      https://mirrors.163.com
  Rocky Linux         https://rockylinux.org
  EPEL                https://docs.fedoraproject.org/en-US/epel/
  CentOS Vault        https://vault.centos.org


================================================================
  生成日期：2026-09-29
  适用脚本版本：fix_eol_rpm_repo.sh / check_repo.sh
================================================================