From 61905d67655bd46155e6fcd2c0ee151bae073045 Mon Sep 17 00:00:00 2001 From: SuperManito <68613938+SuperManito@users.noreply.github.com> Date: Sat, 6 May 2023 22:47:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=83=A8=E5=88=86=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E5=8F=82=E6=95=B0=20&=20=E4=B8=80=E4=BA=9B=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChangeMirrors.sh | 546 +++++++++++++++++++----------------- README.md | 2 +- docs/index.md | 2 +- docs/main.sh | 546 +++++++++++++++++++----------------- docs/use/command-options.md | 32 ++- 5 files changed, 606 insertions(+), 522 deletions(-) diff --git a/ChangeMirrors.sh b/ChangeMirrors.sh index 910388d..99a1db5 100644 --- a/ChangeMirrors.sh +++ b/ChangeMirrors.sh @@ -175,18 +175,65 @@ function StartTitle() { echo -e ' 欢迎使用 GNU/Linux 一键更换软件源脚本' } -function AuthorSignature() { - echo -e "[\033[1;34m官网\033[0m] ${WEBSITE}\n" +## 报错退出 +function Output_Error() { + [ "$1" ] && echo -e "\n$ERROR $1\n" + exit 1 } ## 权限判定 function PermissionJudgment() { if [ $UID -ne 0 ]; then - echo -e "\n$ERROR 权限不足,请使用 Root 用户运行本脚本\n" - exit 1 + Output_Error "权限不足,请使用 Root 用户运行本脚本" fi } +## 命令选项兼容性判断 +function CheckCommandOptions() { + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_DEBIAN}" ]]; then + if [[ "${SOURCE_SECURITY}" == "true" || "${SOURCE_BRANCH_SECURITY}" == "true" ]]; then + Output_Error "当前系统不支持使用 debian-security 仓库故无法使用相关参数,请确认后重试!" + fi + fi + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_REDHAT}") + if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_CENTOS}" && "${SYSTEM_JUDGMENT}" != "${SYSTEM_RHEL}" ]]; then + if [[ "${SOURCE_VAULT}" == "true" || "${SOURCE_BRANCH_VAULT}" == "true" ]]; then + Output_Error "当前系统不支持使用 centos-vault 仓库故无法使用相关参数,请确认后重试!" + fi + fi + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_FEDORA}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + esac + ;; + "${SYSTEM_OPENEULER}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_OPENSUSE}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_ARCH}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + esac + +} + ## 系统判定变量 function EnvJudgment() { ## 定义系统名称 @@ -209,20 +256,15 @@ function EnvJudgment() { elif [[ "${SYSTEM_NAME}" == *"openSUSE"* ]]; then SYSTEM_FACTIONS="${SYSTEM_OPENSUSE}" else - echo -e "\n$ERROR 无法判断当前运行环境,请先确认本脚本是否已经适配当前操作系统\n" - exit 1 + Output_Error "无法判断当前运行环境,请先确认本脚本是否已经适配当前操作系统" fi - ## 开始使用 - StartTitle ## 判定系统名称、版本、版本号 case "${SYSTEM_FACTIONS}" in "${SYSTEM_DEBIAN}") if [ ! -x /usr/bin/lsb_release ]; then apt-get install -y lsb-release if [ $? -ne 0 ]; then - echo -e "\n$ERROR lsb-release 软件包安装失败" - echo -e "\n本脚本需要通过 lsb_release 指令判断系统类型,当前可能为精简安装的系统,因为正常情况下系统会自带该软件包,请自行安装后重新执行脚本!\n" - exit 1 + Output_Error "lsb-release 软件包安装失败\n本脚本需要通过 lsb_release 指令判断系统类型,当前可能为精简安装的系统,因为正常情况下系统会自带该软件包,请自行安装后重新执行脚本!" fi fi SYSTEM_JUDGMENT="$(lsb_release -is)" @@ -272,7 +314,7 @@ function EnvJudgment() { if [[ -z "${SOURCE_BRANCH}" ]]; then ## 默认 SOURCE_BRANCH="$(echo "${SYSTEM_JUDGMENT,,}" | sed "s/ /-/g")" - ## 定制 + ## 处理特殊 case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}") case ${SYSTEM_VERSION_NUMBER:0:1} in @@ -285,7 +327,7 @@ function EnvJudgment() { esac ;; "${SYSTEM_CENTOS}") - if [[ ${DEVICE_ARCH} == "x86_64" ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]]; then SOURCE_BRANCH="centos" else SOURCE_BRANCH="centos-altarch" @@ -294,7 +336,7 @@ function EnvJudgment() { "${SYSTEM_CENTOS_STREAM}") case ${SYSTEM_VERSION_NUMBER:0:1} in 8) - if [[ ${DEVICE_ARCH} == "x86_64" ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]]; then SOURCE_BRANCH="centos" else SOURCE_BRANCH="centos-altarch" @@ -306,14 +348,14 @@ function EnvJudgment() { esac ;; "${SYSTEM_UBUNTU}") - if [[ ${DEVICE_ARCH} == "x86_64" ]] || [[ ${DEVICE_ARCH} == *i?86* ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]] || [[ "${DEVICE_ARCH}" == *i?86* ]]; then SOURCE_BRANCH="ubuntu" else SOURCE_BRANCH="ubuntu-ports" fi ;; "${SYSTEM_ARCH}") - if [[ ${DEVICE_ARCH} == "x86_64" ]] || [[ ${DEVICE_ARCH} == *i?86* ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]] || [[ "${DEVICE_ARCH}" == *i?86* ]]; then SOURCE_BRANCH="archlinux" else SOURCE_BRANCH="archlinuxarm" @@ -330,6 +372,10 @@ function EnvJudgment() { SYNC_TXT="同步" ;; esac + ## 命令选项兼容性判断 + CheckCommandOptions + ## 开始使用 + StartTitle } ## 选择软件源 @@ -398,9 +444,7 @@ function ChooseMirrors() { continue fi done - if [[ ${USE_INTRANET_SOURCE} == "true" ]]; then - SOURCE="${intranet_source}" - elif [[ -z "${USE_INTRANET_SOURCE}" ]]; then + if [[ -z "${USE_INTRANET_SOURCE}" ]]; then local CHOICE=$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}") read -p "${CHOICE}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -414,12 +458,14 @@ function ChooseMirrors() { echo -e "\n$WARN 输入错误,默认不使用内网地址!" ;; esac + elif [[ "${USE_INTRANET_SOURCE}" == "true" ]]; then + SOURCE="${intranet_source}" fi } function Title() { local system_name="${SYSTEM_PRETTY_NAME:-"${SYSTEM_NAME} ${SYSTEM_VERSION_NUMBER}"}" - local arch="${DEVICE_ARCH}" + local arch=""${DEVICE_ARCH}"" local date="$(date "+%Y-%m-%d %H:%M:%S")" local timezone="$(timedatectl status 2>/dev/null | grep "Time zone" | awk -F ':' '{print$2}' | awk -F ' ' '{print$1}')" @@ -469,7 +515,7 @@ function ChooseMirrors() { ## 选择同步软件源所使用的 WEB 协议( HTTP:80 端口,HTTPS:443 端口) function ChooseWebProtocol() { if [[ -z "${WEB_PROTOCOL}" ]]; then - if [[ ${ONLY_HTTP} == "True" ]]; then + if [[ "${ONLY_HTTP}" == "True" ]]; then WEB_PROTOCOL="http" else local CHOICE=$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}") @@ -494,40 +540,47 @@ function ChooseWebProtocol() { # 适用于 RHEL/CentOS(Stream)/RockyLinux 的 EPEL 附加软件包(安装/换源) function ChooseInstallEPEL() { - if [[ -z "${INSTALL_EPEL}" ]]; then - case "${SYSTEM_JUDGMENT}" in - "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") - ## 判断是否已安装 EPEL 软件包 - rpm -qa | grep epel-release -q - VERIFICATION_EPEL=$? - ## 判断 /etc/yum.repos.d 目录下是否存在 epel 附加软件包 repo 源文件 - [ -d $Dir_RedHatRepos ] && ls $Dir_RedHatRepos | grep epel -q - VERIFICATION_EPELFILES=$? - ## 判断 /etc/yum.repos.d.bak 目录下是否存在 epel 附加软件包 repo 源文件 - [ -d $Dir_RedHatReposBackup ] && ls $Dir_RedHatReposBackup | grep epel -q - VERIFICATION_EPELBACKUPFILES=$? + function Check() { + ## 判断是否已安装 EPEL 软件包 + rpm -qa | grep epel-release -q + VERIFICATION_EPEL=$? + ## 判断 /etc/yum.repos.d 目录下是否存在 epel 附加软件包 repo 源文件 + [ -d $Dir_RedHatRepos ] && ls $Dir_RedHatRepos | grep epel -q + VERIFICATION_EPELFILES=$? + ## 判断 /etc/yum.repos.d.bak 目录下是否存在 epel 附加软件包 repo 源文件 + [ -d $Dir_RedHatReposBackup ] && ls $Dir_RedHatReposBackup | grep epel -q + VERIFICATION_EPELBACKUPFILES=$? + } - if [ ${VERIFICATION_EPEL} -eq 0 ]; then - local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}") - else - local CHOICE=$(echo -e "\n${BOLD}└─ 是否安装 EPEL 附加软件包? [Y/n] ${PLAIN}") - fi - read -p "${CHOICE}" INPUT - [[ -z "${INPUT}" ]] && INPUT=Y - case "${INPUT}" in - [Yy] | [Yy][Ee][Ss]) - INSTALL_EPEL="True" - ;; - [Nn] | [Nn][Oo]) - INSTALL_EPEL="False" - ;; - *) - echo -e "\n$WARN 输入错误,默认不更换!" - INSTALL_EPEL="False" + if [[ "${SYSTEM_FACTIONS}" == "${SYSTEM_REDHAT}" ]]; then + if [[ -z "${INSTALL_EPEL}" ]]; then + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") + Check + if [ ${VERIFICATION_EPEL} -eq 0 ]; then + local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}") + else + local CHOICE=$(echo -e "\n${BOLD}└─ 是否安装 EPEL 附加软件包? [Y/n] ${PLAIN}") + fi + read -p "${CHOICE}" INPUT + [[ -z "${INPUT}" ]] && INPUT=Y + case "${INPUT}" in + [Yy] | [Yy][Ee][Ss]) + INSTALL_EPEL="True" + ;; + [Nn] | [Nn][Oo]) + INSTALL_EPEL="False" + ;; + *) + echo -e "\n$WARN 输入错误,默认不更换!" + INSTALL_EPEL="False" + ;; + esac ;; esac - ;; - esac + elif [[ "${INSTALL_EPEL}" == "true" ]]; then + Check + fi fi } @@ -540,8 +593,8 @@ function CloseFirewall() { } if [ -x /usr/bin/systemctl ]; then - if [[ $(systemctl is-active firewalld) == "active" ]]; then - if [[ ${CLOSE_FIREWALL} == "true" ]]; then + if [[ "$(systemctl is-active firewalld)" == "active" ]]; then + if [[ "${CLOSE_FIREWALL}" == "true" ]]; then Main elif [[ -z "${CLOSE_FIREWALL}" ]]; then local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}") @@ -563,7 +616,7 @@ function CloseFirewall() { ## 备份原有软件源 function BackupOriginMirrors() { - if [[ $BACKUP == "true" || -z "${BACKUP}" ]]; then + if [[ "${BACKUP}" == "true" ]]; then local VERIFICATION_FILES=1 local VERIFICATION_BACKUPFILES=1 @@ -607,7 +660,7 @@ function BackupOriginMirrors() { ## /etc/apt/sources.list if [ -s $File_DebianSourceList ]; then if [ -s $File_DebianSourceListBackup ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP1=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 list 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP1}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -636,7 +689,7 @@ function BackupOriginMirrors() { ## /etc/apt/sources.list.d if [ -d $Dir_DebianExtendSource ] && [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_DebianExtendSourceBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP2=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 list 扩展源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP2}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -664,7 +717,7 @@ function BackupOriginMirrors() { ## /etc/yum.repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_RedHatReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP3=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP3}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -694,7 +747,7 @@ function BackupOriginMirrors() { ## /etc/yum.repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_openEulerReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP4=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP4}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -724,7 +777,7 @@ function BackupOriginMirrors() { ## /etc/zypp/repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_openSUSEReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP4=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP4}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -754,7 +807,7 @@ function BackupOriginMirrors() { ## /etc/pacman.d/mirrorlist if [ -s $File_ArchMirrorList ]; then if [ -s $File_ArchMirrorListBackup ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP5=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的软件源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP5}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -793,15 +846,20 @@ function RemoveOriginMirrors() { "${SYSTEM_REDHAT}") if [ -d $Dir_RedHatRepos ]; then # Fedora Linux 特殊,只删除以 fedora 开头的文件 - if [[ "${SYSTEM_JUDGMENT}" == "${SYSTEM_FEDORA}" ]]; then + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_FEDORA}") rm -rf $Dir_RedHatRepos/fedora* - else - if [ -f $Dir_RedHatRepos/epel.repo ]; then - ls $Dir_RedHatRepos/ | egrep -v epel | xargs rm -rf - else - rm -rf $Dir_RedHatRepos/* + ;; + *) + if [[ "${ONLY_EPEL}" == "false" ]]; then + if [ -f $Dir_RedHatRepos/epel.repo ]; then + ls $Dir_RedHatRepos/ | egrep -v epel | xargs rm -rf + else + rm -rf $Dir_RedHatRepos/* + fi fi - fi + ;; + esac fi ;; "${SYSTEM_OPENEULER}") @@ -902,7 +960,7 @@ function UpdateSoftware() { [Yy] | [Yy][Ee][Ss]) ;; [Nn] | [Nn][Oo]) Main - if [[ ${CLEAN_CACHE} == "true" ]]; then + if [[ "${CLEAN_CACHE}" == "true" ]]; then CleanCache elif [[ -z "${CLEAN_CACHE}" ]]; then CleanCacheInteraction @@ -931,9 +989,9 @@ function UpdateSoftware() { case "${SYSTEM_FACTIONS}" in "${SYSTEM_DEBIAN}" | "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENSUSE}") if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_RHEL}" ]]; then - if [[ ${UPDATA_SOFTWARE} == "true" ]]; then + if [[ "${UPDATA_SOFTWARE}" == "true" ]]; then Main - if [[ ${CLEAN_CACHE} == "true" ]]; then + if [[ "${CLEAN_CACHE}" == "true" ]]; then CleanCache elif [[ -z "${CLEAN_CACHE}" ]]; then CleanCacheInteraction @@ -948,8 +1006,7 @@ function UpdateSoftware() { ## 运行结束 function RunEnd() { - echo -e "\n$COMPLETE 脚本执行结束\n" - AuthorSignature + echo -e "\n$COMPLETE 脚本执行结束 [\033[1;34m官网\033[0m] ${WEBSITE}\n" } ############################################################################## @@ -976,19 +1033,19 @@ deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-updates ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-updates ${source_suffix} deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix}" >>$File_DebianSourceList - if [[ ${USE_ABROAD_SOURCE} == "true" ]]; then - echo "# deb ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - -deb https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb-src https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList + ## 处理 debian-security 仓库 + local security_url="${SOURCE_SECURITY:-"${SOURCE}"}" + if [[ -z "${SOURCE_SECURITY}" ]]; then + if [[ "${USE_ABROAD_SOURCE}" == "true" ]]; then + local security_url="https://security.debian.org/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" + else + local security_url="${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" + fi else - echo "deb ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb-src ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - -# deb https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList + local security_url="${WEB_PROTOCOL}://${SOURCE_SECURITY}/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" fi + echo "deb ${security_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} +# deb-src ${security_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList ;; "${SYSTEM_UBUNTU}") source_suffix="main restricted universe multiverse" @@ -1002,9 +1059,6 @@ deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix} deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb http://security.ubuntu.com/ubuntu ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src http://security.ubuntu.com/ubuntu ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - ## 预发布软件源(不建议启用) # deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-proposed ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-proposed ${source_suffix}" >>$File_DebianSourceList @@ -1033,8 +1087,6 @@ function RedHatMirrors() { ## 生成 repo 源文件 GenRepoFiles_EPEL - sed -i 's|^metalink=|#metalink=|g' $Dir_RedHatRepos/epel* - # 更换 WEB 协议(HTTP/HTTPS) case ${SYSTEM_VERSION_NUMBER:0:1} in 9 | 8) @@ -1045,6 +1097,7 @@ function RedHatMirrors() { ;; esac # 修改源 + sed -i 's|^metalink=|#metalink=|g' $Dir_RedHatRepos/epel* case ${SYSTEM_VERSION_NUMBER:0:1} in 9) sed -i "s|download.example/pub|${SOURCE}|g" $Dir_RedHatRepos/epel* @@ -1054,7 +1107,11 @@ function RedHatMirrors() { ;; esac } - + ## 仅 EPEL 模式 + if [[ "${ONLY_EPEL}" == "true" ]]; then + EPELMirrors + return + fi ## 生成基于 RedHat 发行版和及其衍生发行版的官方 repo 源文件 case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}") @@ -1090,77 +1147,55 @@ function RedHatMirrors() { "${SYSTEM_RHEL}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - ## 禁用签名 - sed -i "s|^gpgcheck=1|gpgcheck=0|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - sed -i "s|^gpgkey=|#gpgkey=|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo # wget "${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}/RPM-GPG-KEY-rockyofficial" -P /etc/pki/rpm-gpg # wget "${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}/RPM-GPG-KEY-Rocky-9" -P /etc/pki/rpm-gpg - - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|^gpgcheck=1|gpgcheck=0|g" \ + -e "s|^gpgkey=|#gpgkey=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ rocky.repo \ rocky-addons.repo \ rocky-devel.repo \ rocky-extras.repo ;; *) + sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* - - # Red Hat Enterprise Linux 修改版本号 case ${SYSTEM_VERSION_NUMBER:0:1} in 8) - ## CentOS 8 操作系统版本结束了生命周期(EOL),Linux 社区已不再维护该操作系统版本,最终版本为 8.5.2011 - # 原 centos 镜像中的 CentOS 8 相关内容已被官方移动,从 2022-02 开始切换至 centos-vault 源 sed -i 's|mirror.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Sources.repo # 单独处理 CentOS-Sources.repo sed -i "s/\$releasever/8.5.2111/g" CentOS-* + # 单独处理 CentOS-Linux-Sources.repo + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos-vault"}|g" CentOS-Linux-Sources.repo ;; 7) + sed -i "s|mirror.centos.org/\$contentdir|mirror.centos.org/${SOURCE_BRANCH}|g" CentOS-* sed -i "s/\$releasever/7/g" CentOS-* + # 单独处理 CentOS-Sources.repo + sed -i "s|vault.centos.org/centos|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Sources.repo ;; esac - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* - # 更换软件源 sed -i "s|mirror.centos.org|${SOURCE}|g" CentOS-* ;; esac ;; "${SYSTEM_CENTOS}") - sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* - - # 更换 WEB 协议(HTTP/HTTPS) sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* - # 更换软件源 + sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* case ${SYSTEM_VERSION_NUMBER:0:1} in 8) + ## CentOS 8 操作系统版本结束了生命周期(EOL),Linux 社区已不再维护该操作系统版本,最终版本为 8.5.2011 + # 原 centos 镜像中的 CentOS 8 相关内容已被官方移动,从 2022-02 开始切换至 centos-vault 源 sed -i 's|mirror.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Sources.repo # 单独处理 CentOS-Sources.repo sed -i "s/\$releasever/8.5.2111/g" CentOS-* + # 单独处理 CentOS-Linux-Sources.repo + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos-vault"}|g" CentOS-Linux-Sources.repo ;; 7) sed -i "s|mirror.centos.org/\$contentdir|mirror.centos.org/${SOURCE_BRANCH}|g" CentOS-* + sed -i "s|vault.centos.org/centos|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Sources.repo # 单独处理 CentOS-Sources.repo ;; esac sed -i "s|mirror.centos.org|${SOURCE}|g" CentOS-* @@ -1169,99 +1204,58 @@ function RedHatMirrors() { # CentOS Stream 9 使用的是 centos-stream 镜像,而 CentOS Stream 8 使用的是 centos 镜像 case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^metalink=|#metalink=|g' \ - centos.repo \ - centos-addons.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=https|baseurl=${WEB_PROTOCOL}|g" \ - centos.repo \ - centos-addons.repo - # 更换软件源 - sed -i "s|mirror.stream.centos.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=https|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^metalink=|#metalink=|g" \ + -e "s|mirror.stream.centos.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ centos.repo \ centos-addons.repo ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-Stream-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Stream-Sources.repo # 单独处理 CentOS-Stream-Sources.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-Stream-* - # 更换软件源 - sed -i "s|mirror.centos.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" CentOS-Stream-* + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Stream-Sources.repo # 单独处理 CentOS-Stream-Sources.repo + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|mirror.centos.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + CentOS-Stream-* ;; esac ;; "${SYSTEM_ROCKY}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ rocky.repo \ rocky-addons.repo \ rocky-devel.repo \ rocky-extras.repo ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' Rocky-* - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" Rocky-* - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" Rocky-* + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + Rocky-* ;; esac ;; "${SYSTEM_ALMA}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' almalinux-* - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" almalinux-* - # 更换软件源 - sed -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ -e "s|repo.almalinux.org/vault|${SOURCE}/${SOURCE_BRANCH}-vault|g" \ - -i almalinux-* + -i \ + almalinux-* ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - almalinux-ha.repo \ - almalinux-nfv.repo \ - almalinux-plus.repo \ - almalinux-powertools.repo \ - almalinux-resilientstorage.repo \ - almalinux-rt.repo \ - almalinux-sap.repo \ - almalinux-saphana.repo \ - almalinux.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - almalinux-ha.repo \ - almalinux-nfv.repo \ - almalinux-plus.repo \ - almalinux-powertools.repo \ - almalinux-resilientstorage.repo \ - almalinux-rt.repo \ - almalinux-sap.repo \ - almalinux-saphana.repo \ - almalinux.repo - # 更换软件源 - sed -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ -e "s|repo.almalinux.org/vault|${SOURCE}/${SOURCE_BRANCH}-vault|g" \ -i \ almalinux-ha.repo \ @@ -1277,24 +1271,10 @@ function RedHatMirrors() { esac ;; "${SYSTEM_FEDORA}") - sed -i 's|^metalink=|#metalink=|g' \ - fedora.repo \ - fedora-updates.repo \ - fedora-modular.repo \ - fedora-updates-modular.repo \ - fedora-updates-testing.repo \ - fedora-updates-testing-modular.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - fedora.repo \ - fedora-updates.repo \ - fedora-modular.repo \ - fedora-updates-modular.repo \ - fedora-updates-testing.repo \ - fedora-updates-testing-modular.repo - # 更换软件源 - sed -i "s|download.example/pub/fedora/linux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^metalink=|#metalink=|g" \ + -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|download.example/pub/fedora/linux|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ fedora.repo \ fedora-updates.repo \ fedora-modular.repo \ @@ -1307,7 +1287,7 @@ function RedHatMirrors() { ## EPEL 附加软件包(安装/换源) case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") - [[ ${INSTALL_EPEL} == "True" ]] && EPELMirrors + [[ "${INSTALL_EPEL}" == "True" ]] && EPELMirrors ;; esac } @@ -1317,10 +1297,10 @@ function openEulerMirrors() { GenRepoFiles_openEuler cd $Dir_openEulerRepos - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" openEuler.repo - # 更换软件源 - sed -i "s|repo.openeuler.org|${SOURCE}/${SOURCE_BRANCH}|g" openEuler.repo + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|repo.openeuler.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + openEuler.repo } ## 更换基于 openSUSE 发行版的软件源 @@ -3955,7 +3935,7 @@ EOF ## 生成 openSUSE 官方 repo 源文件 function GenRepoFiles_openSUSE() { case $1 in - leap) + "leap") case $2 in 15.[0-2]) cat >$Dir_openSUSERepos/repo-debug-non-oss.repo <<\EOF @@ -4168,7 +4148,7 @@ EOF ;; esac ;; - tumbleweed) + "tumbleweed") cat >$Dir_openSUSERepos/repo-debug.repo <<\EOF [repo-debug] name=openSUSE-Tumbleweed-Debug @@ -4495,26 +4475,26 @@ function CommandOptions() { echo -e " 选项命令(参数名/含义/参数值): - --source 指定软件源地址 地址 - --branch 指定软件源分支 分支名 - --abroad 使用海外软件源 无 - --web-protocol 指定 WEB 协议 http 或 https - --intranet 使用内网地址 true 或 false - --install-epel 安装 EPEL 附加软件包 true 或 false - --close-firewall 关闭防火墙 true 或 false - --backup 备份原有软件源 true 或 false - --ignore-backup-tips 忽略覆盖备份提示 无 - --updata-software 更新软件包 true 或 false - --clean-cache 清理下载缓存 true 或 false - + --source 指定软件源地址 地址 + --source-security 指定 debian-security 软件源地址 地址 + --source-vault 指定 centos-vault 软件源地址 地址 + --branch 指定软件源分支(路径) 分支名 + --branch-security 指定 debian-security 软件源分支(路径) 分支名 + --branch-vault 指定 centos-vault 软件源分支(路径) 分支名 + --abroad 使用海外软件源 无 + --web-protocol 指定 WEB 协议 http 或 https + --intranet 优先使用内网地址 true 或 false + --install-epel 安装 EPEL 附加软件包 true 或 false + --only-epel 仅更换 EPEL 软件源模式 无 + --close-firewall 关闭防火墙 true 或 false + --backup 备份原有软件源 true 或 false + --ignore-backup-tips 忽略覆盖备份提示 无 + --updata-software 更新软件包 true 或 false + --clean-cache 清理下载缓存 true 或 false + 问题报告 https://github.com/SuperManito/LinuxMirrors/issues " } - ## 报错退出 - function Output_Command_Error() { - echo -e "\n$ERROR $1\n" - exit 1 - } ## 判断参数 while [ $# -gt 0 ]; do @@ -4528,13 +4508,39 @@ function CommandOptions() { if [ $2 ]; then echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" if [ $? -eq 0 ]; then - Output_Command_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" else SOURCE="$2" shift fi else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --source-security) + if [ $2 ]; then + echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" + if [ $? -eq 0 ]; then + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + else + SOURCE_SECURITY="$2" + shift + fi + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --source-vault) + if [ $2 ]; then + echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" + if [ $? -eq 0 ]; then + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + else + SOURCE_VAULT="$2" + shift + fi + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" fi ;; ## 指定软件源分支 @@ -4543,7 +4549,23 @@ function CommandOptions() { SOURCE_BRANCH="$2" shift else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --branch-security) + if [ $2 ]; then + SOURCE_BRANCH_SECURITY="$2" + shift + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --branch-vault) + if [ $2 ]; then + SOURCE_BRANCH_VAULT="$2" + shift + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" fi ;; ## 优先使用内网地址 @@ -4555,11 +4577,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## WEB 协议(HTTP/HTTPS) @@ -4571,11 +4593,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 http 或 https 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 http 或 https 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 WEB 协议(HTTP/HTTPS)!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 WEB 协议(HTTP/HTTPS)!" fi ;; ## 安装 EPEL 附加软件包 @@ -4587,13 +4609,17 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; + --only-epel) + ONLY_EPEL="true" + INSTALL_EPEL="true" + ;; ## 关闭防火墙 --close-firewall) if [ $2 ]; then @@ -4603,11 +4629,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 备份原有软件源 @@ -4619,11 +4645,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 忽略覆盖备份提示 @@ -4639,11 +4665,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 清理下载缓存 @@ -4655,11 +4681,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; --help) @@ -4667,11 +4693,15 @@ function CommandOptions() { exit ;; *) - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请确认后重新输入!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请确认后重新输入!" ;; esac shift done + ## 赋予部分命令参数默认值 + ONLY_EPEL="${ONLY_EPEL:-"false"}" + BACKUP="${BACKUP:-"true"}" + IGNORE_BACKUP_TIPS="${IGNORE_BACKUP_TIPS:-"false"}" } ## 组合函数 diff --git a/README.md b/README.md index 4a294a0..37ae962 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@

-- ### 适配系统及版本号 +- ### 适配系统及其版本 diff --git a/docs/index.md b/docs/index.md index c86716b..1fdbd3d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,7 +8,7 @@ hide: GNU/Linux 一键更换系统软件源脚本 · 让换源更简单 -## 适配系统及版本号 +## 适配系统及其版本 !!! example inline end "适配计划" diff --git a/docs/main.sh b/docs/main.sh index 910388d..99a1db5 100644 --- a/docs/main.sh +++ b/docs/main.sh @@ -175,18 +175,65 @@ function StartTitle() { echo -e ' 欢迎使用 GNU/Linux 一键更换软件源脚本' } -function AuthorSignature() { - echo -e "[\033[1;34m官网\033[0m] ${WEBSITE}\n" +## 报错退出 +function Output_Error() { + [ "$1" ] && echo -e "\n$ERROR $1\n" + exit 1 } ## 权限判定 function PermissionJudgment() { if [ $UID -ne 0 ]; then - echo -e "\n$ERROR 权限不足,请使用 Root 用户运行本脚本\n" - exit 1 + Output_Error "权限不足,请使用 Root 用户运行本脚本" fi } +## 命令选项兼容性判断 +function CheckCommandOptions() { + case "${SYSTEM_FACTIONS}" in + "${SYSTEM_DEBIAN}") + if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_DEBIAN}" ]]; then + if [[ "${SOURCE_SECURITY}" == "true" || "${SOURCE_BRANCH_SECURITY}" == "true" ]]; then + Output_Error "当前系统不支持使用 debian-security 仓库故无法使用相关参数,请确认后重试!" + fi + fi + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_REDHAT}") + if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_CENTOS}" && "${SYSTEM_JUDGMENT}" != "${SYSTEM_RHEL}" ]]; then + if [[ "${SOURCE_VAULT}" == "true" || "${SOURCE_BRANCH_VAULT}" == "true" ]]; then + Output_Error "当前系统不支持使用 centos-vault 仓库故无法使用相关参数,请确认后重试!" + fi + fi + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_FEDORA}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + esac + ;; + "${SYSTEM_OPENEULER}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_OPENSUSE}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + "${SYSTEM_ARCH}") + if [[ "${INSTALL_EPEL}" == "true" || "${ONLY_EPEL}" == "true" ]]; then + Output_Error "当前系统不支持安装 EPEL 附件软件包故无法使用相关参数,请确认后重试!" + fi + ;; + esac + +} + ## 系统判定变量 function EnvJudgment() { ## 定义系统名称 @@ -209,20 +256,15 @@ function EnvJudgment() { elif [[ "${SYSTEM_NAME}" == *"openSUSE"* ]]; then SYSTEM_FACTIONS="${SYSTEM_OPENSUSE}" else - echo -e "\n$ERROR 无法判断当前运行环境,请先确认本脚本是否已经适配当前操作系统\n" - exit 1 + Output_Error "无法判断当前运行环境,请先确认本脚本是否已经适配当前操作系统" fi - ## 开始使用 - StartTitle ## 判定系统名称、版本、版本号 case "${SYSTEM_FACTIONS}" in "${SYSTEM_DEBIAN}") if [ ! -x /usr/bin/lsb_release ]; then apt-get install -y lsb-release if [ $? -ne 0 ]; then - echo -e "\n$ERROR lsb-release 软件包安装失败" - echo -e "\n本脚本需要通过 lsb_release 指令判断系统类型,当前可能为精简安装的系统,因为正常情况下系统会自带该软件包,请自行安装后重新执行脚本!\n" - exit 1 + Output_Error "lsb-release 软件包安装失败\n本脚本需要通过 lsb_release 指令判断系统类型,当前可能为精简安装的系统,因为正常情况下系统会自带该软件包,请自行安装后重新执行脚本!" fi fi SYSTEM_JUDGMENT="$(lsb_release -is)" @@ -272,7 +314,7 @@ function EnvJudgment() { if [[ -z "${SOURCE_BRANCH}" ]]; then ## 默认 SOURCE_BRANCH="$(echo "${SYSTEM_JUDGMENT,,}" | sed "s/ /-/g")" - ## 定制 + ## 处理特殊 case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}") case ${SYSTEM_VERSION_NUMBER:0:1} in @@ -285,7 +327,7 @@ function EnvJudgment() { esac ;; "${SYSTEM_CENTOS}") - if [[ ${DEVICE_ARCH} == "x86_64" ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]]; then SOURCE_BRANCH="centos" else SOURCE_BRANCH="centos-altarch" @@ -294,7 +336,7 @@ function EnvJudgment() { "${SYSTEM_CENTOS_STREAM}") case ${SYSTEM_VERSION_NUMBER:0:1} in 8) - if [[ ${DEVICE_ARCH} == "x86_64" ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]]; then SOURCE_BRANCH="centos" else SOURCE_BRANCH="centos-altarch" @@ -306,14 +348,14 @@ function EnvJudgment() { esac ;; "${SYSTEM_UBUNTU}") - if [[ ${DEVICE_ARCH} == "x86_64" ]] || [[ ${DEVICE_ARCH} == *i?86* ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]] || [[ "${DEVICE_ARCH}" == *i?86* ]]; then SOURCE_BRANCH="ubuntu" else SOURCE_BRANCH="ubuntu-ports" fi ;; "${SYSTEM_ARCH}") - if [[ ${DEVICE_ARCH} == "x86_64" ]] || [[ ${DEVICE_ARCH} == *i?86* ]]; then + if [[ "${DEVICE_ARCH}" == "x86_64" ]] || [[ "${DEVICE_ARCH}" == *i?86* ]]; then SOURCE_BRANCH="archlinux" else SOURCE_BRANCH="archlinuxarm" @@ -330,6 +372,10 @@ function EnvJudgment() { SYNC_TXT="同步" ;; esac + ## 命令选项兼容性判断 + CheckCommandOptions + ## 开始使用 + StartTitle } ## 选择软件源 @@ -398,9 +444,7 @@ function ChooseMirrors() { continue fi done - if [[ ${USE_INTRANET_SOURCE} == "true" ]]; then - SOURCE="${intranet_source}" - elif [[ -z "${USE_INTRANET_SOURCE}" ]]; then + if [[ -z "${USE_INTRANET_SOURCE}" ]]; then local CHOICE=$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}") read -p "${CHOICE}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -414,12 +458,14 @@ function ChooseMirrors() { echo -e "\n$WARN 输入错误,默认不使用内网地址!" ;; esac + elif [[ "${USE_INTRANET_SOURCE}" == "true" ]]; then + SOURCE="${intranet_source}" fi } function Title() { local system_name="${SYSTEM_PRETTY_NAME:-"${SYSTEM_NAME} ${SYSTEM_VERSION_NUMBER}"}" - local arch="${DEVICE_ARCH}" + local arch=""${DEVICE_ARCH}"" local date="$(date "+%Y-%m-%d %H:%M:%S")" local timezone="$(timedatectl status 2>/dev/null | grep "Time zone" | awk -F ':' '{print$2}' | awk -F ' ' '{print$1}')" @@ -469,7 +515,7 @@ function ChooseMirrors() { ## 选择同步软件源所使用的 WEB 协议( HTTP:80 端口,HTTPS:443 端口) function ChooseWebProtocol() { if [[ -z "${WEB_PROTOCOL}" ]]; then - if [[ ${ONLY_HTTP} == "True" ]]; then + if [[ "${ONLY_HTTP}" == "True" ]]; then WEB_PROTOCOL="http" else local CHOICE=$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}") @@ -494,40 +540,47 @@ function ChooseWebProtocol() { # 适用于 RHEL/CentOS(Stream)/RockyLinux 的 EPEL 附加软件包(安装/换源) function ChooseInstallEPEL() { - if [[ -z "${INSTALL_EPEL}" ]]; then - case "${SYSTEM_JUDGMENT}" in - "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") - ## 判断是否已安装 EPEL 软件包 - rpm -qa | grep epel-release -q - VERIFICATION_EPEL=$? - ## 判断 /etc/yum.repos.d 目录下是否存在 epel 附加软件包 repo 源文件 - [ -d $Dir_RedHatRepos ] && ls $Dir_RedHatRepos | grep epel -q - VERIFICATION_EPELFILES=$? - ## 判断 /etc/yum.repos.d.bak 目录下是否存在 epel 附加软件包 repo 源文件 - [ -d $Dir_RedHatReposBackup ] && ls $Dir_RedHatReposBackup | grep epel -q - VERIFICATION_EPELBACKUPFILES=$? + function Check() { + ## 判断是否已安装 EPEL 软件包 + rpm -qa | grep epel-release -q + VERIFICATION_EPEL=$? + ## 判断 /etc/yum.repos.d 目录下是否存在 epel 附加软件包 repo 源文件 + [ -d $Dir_RedHatRepos ] && ls $Dir_RedHatRepos | grep epel -q + VERIFICATION_EPELFILES=$? + ## 判断 /etc/yum.repos.d.bak 目录下是否存在 epel 附加软件包 repo 源文件 + [ -d $Dir_RedHatReposBackup ] && ls $Dir_RedHatReposBackup | grep epel -q + VERIFICATION_EPELBACKUPFILES=$? + } - if [ ${VERIFICATION_EPEL} -eq 0 ]; then - local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}") - else - local CHOICE=$(echo -e "\n${BOLD}└─ 是否安装 EPEL 附加软件包? [Y/n] ${PLAIN}") - fi - read -p "${CHOICE}" INPUT - [[ -z "${INPUT}" ]] && INPUT=Y - case "${INPUT}" in - [Yy] | [Yy][Ee][Ss]) - INSTALL_EPEL="True" - ;; - [Nn] | [Nn][Oo]) - INSTALL_EPEL="False" - ;; - *) - echo -e "\n$WARN 输入错误,默认不更换!" - INSTALL_EPEL="False" + if [[ "${SYSTEM_FACTIONS}" == "${SYSTEM_REDHAT}" ]]; then + if [[ -z "${INSTALL_EPEL}" ]]; then + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") + Check + if [ ${VERIFICATION_EPEL} -eq 0 ]; then + local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}") + else + local CHOICE=$(echo -e "\n${BOLD}└─ 是否安装 EPEL 附加软件包? [Y/n] ${PLAIN}") + fi + read -p "${CHOICE}" INPUT + [[ -z "${INPUT}" ]] && INPUT=Y + case "${INPUT}" in + [Yy] | [Yy][Ee][Ss]) + INSTALL_EPEL="True" + ;; + [Nn] | [Nn][Oo]) + INSTALL_EPEL="False" + ;; + *) + echo -e "\n$WARN 输入错误,默认不更换!" + INSTALL_EPEL="False" + ;; + esac ;; esac - ;; - esac + elif [[ "${INSTALL_EPEL}" == "true" ]]; then + Check + fi fi } @@ -540,8 +593,8 @@ function CloseFirewall() { } if [ -x /usr/bin/systemctl ]; then - if [[ $(systemctl is-active firewalld) == "active" ]]; then - if [[ ${CLOSE_FIREWALL} == "true" ]]; then + if [[ "$(systemctl is-active firewalld)" == "active" ]]; then + if [[ "${CLOSE_FIREWALL}" == "true" ]]; then Main elif [[ -z "${CLOSE_FIREWALL}" ]]; then local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}") @@ -563,7 +616,7 @@ function CloseFirewall() { ## 备份原有软件源 function BackupOriginMirrors() { - if [[ $BACKUP == "true" || -z "${BACKUP}" ]]; then + if [[ "${BACKUP}" == "true" ]]; then local VERIFICATION_FILES=1 local VERIFICATION_BACKUPFILES=1 @@ -607,7 +660,7 @@ function BackupOriginMirrors() { ## /etc/apt/sources.list if [ -s $File_DebianSourceList ]; then if [ -s $File_DebianSourceListBackup ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP1=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 list 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP1}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -636,7 +689,7 @@ function BackupOriginMirrors() { ## /etc/apt/sources.list.d if [ -d $Dir_DebianExtendSource ] && [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_DebianExtendSourceBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP2=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 list 扩展源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP2}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -664,7 +717,7 @@ function BackupOriginMirrors() { ## /etc/yum.repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_RedHatReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP3=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP3}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -694,7 +747,7 @@ function BackupOriginMirrors() { ## /etc/yum.repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_openEulerReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP4=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP4}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -724,7 +777,7 @@ function BackupOriginMirrors() { ## /etc/zypp/repos.d if [ ${VERIFICATION_FILES} -eq 0 ]; then if [ -d $Dir_openSUSEReposBackup ] && [ ${VERIFICATION_BACKUPFILES} -eq 0 ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP4=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP4}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -754,7 +807,7 @@ function BackupOriginMirrors() { ## /etc/pacman.d/mirrorlist if [ -s $File_ArchMirrorList ]; then if [ -s $File_ArchMirrorListBackup ]; then - if [[ -z "${IGNORE_BACKUP_TIPS}" ]]; then + if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then local CHOICE_BACKUP5=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的软件源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}") read -p "${CHOICE_BACKUP5}" INPUT [[ -z "${INPUT}" ]] && INPUT=Y @@ -793,15 +846,20 @@ function RemoveOriginMirrors() { "${SYSTEM_REDHAT}") if [ -d $Dir_RedHatRepos ]; then # Fedora Linux 特殊,只删除以 fedora 开头的文件 - if [[ "${SYSTEM_JUDGMENT}" == "${SYSTEM_FEDORA}" ]]; then + case "${SYSTEM_JUDGMENT}" in + "${SYSTEM_FEDORA}") rm -rf $Dir_RedHatRepos/fedora* - else - if [ -f $Dir_RedHatRepos/epel.repo ]; then - ls $Dir_RedHatRepos/ | egrep -v epel | xargs rm -rf - else - rm -rf $Dir_RedHatRepos/* + ;; + *) + if [[ "${ONLY_EPEL}" == "false" ]]; then + if [ -f $Dir_RedHatRepos/epel.repo ]; then + ls $Dir_RedHatRepos/ | egrep -v epel | xargs rm -rf + else + rm -rf $Dir_RedHatRepos/* + fi fi - fi + ;; + esac fi ;; "${SYSTEM_OPENEULER}") @@ -902,7 +960,7 @@ function UpdateSoftware() { [Yy] | [Yy][Ee][Ss]) ;; [Nn] | [Nn][Oo]) Main - if [[ ${CLEAN_CACHE} == "true" ]]; then + if [[ "${CLEAN_CACHE}" == "true" ]]; then CleanCache elif [[ -z "${CLEAN_CACHE}" ]]; then CleanCacheInteraction @@ -931,9 +989,9 @@ function UpdateSoftware() { case "${SYSTEM_FACTIONS}" in "${SYSTEM_DEBIAN}" | "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENSUSE}") if [[ "${SYSTEM_JUDGMENT}" != "${SYSTEM_RHEL}" ]]; then - if [[ ${UPDATA_SOFTWARE} == "true" ]]; then + if [[ "${UPDATA_SOFTWARE}" == "true" ]]; then Main - if [[ ${CLEAN_CACHE} == "true" ]]; then + if [[ "${CLEAN_CACHE}" == "true" ]]; then CleanCache elif [[ -z "${CLEAN_CACHE}" ]]; then CleanCacheInteraction @@ -948,8 +1006,7 @@ function UpdateSoftware() { ## 运行结束 function RunEnd() { - echo -e "\n$COMPLETE 脚本执行结束\n" - AuthorSignature + echo -e "\n$COMPLETE 脚本执行结束 [\033[1;34m官网\033[0m] ${WEBSITE}\n" } ############################################################################## @@ -976,19 +1033,19 @@ deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-updates ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-updates ${source_suffix} deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix}" >>$File_DebianSourceList - if [[ ${USE_ABROAD_SOURCE} == "true" ]]; then - echo "# deb ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - -deb https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb-src https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList + ## 处理 debian-security 仓库 + local security_url="${SOURCE_SECURITY:-"${SOURCE}"}" + if [[ -z "${SOURCE_SECURITY}" ]]; then + if [[ "${USE_ABROAD_SOURCE}" == "true" ]]; then + local security_url="https://security.debian.org/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" + else + local security_url="${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" + fi else - echo "deb ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb-src ${basic_url}-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - -# deb https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src https://security.debian.org/debian-security ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList + local security_url="${WEB_PROTOCOL}://${SOURCE_SECURITY}/${SOURCE_BRANCH_SECURITY:-"${SOURCE_BRANCH}-security"}" fi + echo "deb ${security_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} +# deb-src ${security_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix}" >>$File_DebianSourceList ;; "${SYSTEM_UBUNTU}") source_suffix="main restricted universe multiverse" @@ -1002,9 +1059,6 @@ deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-backports ${source_suffix} deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# deb http://security.ubuntu.com/ubuntu ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} -# # deb-src http://security.ubuntu.com/ubuntu ${SYSTEM_VERSION_CODENAME}-security ${source_suffix} - ## 预发布软件源(不建议启用) # deb ${basic_url} ${SYSTEM_VERSION_CODENAME}-proposed ${source_suffix} # deb-src ${basic_url} ${SYSTEM_VERSION_CODENAME}-proposed ${source_suffix}" >>$File_DebianSourceList @@ -1033,8 +1087,6 @@ function RedHatMirrors() { ## 生成 repo 源文件 GenRepoFiles_EPEL - sed -i 's|^metalink=|#metalink=|g' $Dir_RedHatRepos/epel* - # 更换 WEB 协议(HTTP/HTTPS) case ${SYSTEM_VERSION_NUMBER:0:1} in 9 | 8) @@ -1045,6 +1097,7 @@ function RedHatMirrors() { ;; esac # 修改源 + sed -i 's|^metalink=|#metalink=|g' $Dir_RedHatRepos/epel* case ${SYSTEM_VERSION_NUMBER:0:1} in 9) sed -i "s|download.example/pub|${SOURCE}|g" $Dir_RedHatRepos/epel* @@ -1054,7 +1107,11 @@ function RedHatMirrors() { ;; esac } - + ## 仅 EPEL 模式 + if [[ "${ONLY_EPEL}" == "true" ]]; then + EPELMirrors + return + fi ## 生成基于 RedHat 发行版和及其衍生发行版的官方 repo 源文件 case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}") @@ -1090,77 +1147,55 @@ function RedHatMirrors() { "${SYSTEM_RHEL}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - ## 禁用签名 - sed -i "s|^gpgcheck=1|gpgcheck=0|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - sed -i "s|^gpgkey=|#gpgkey=|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo # wget "${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}/RPM-GPG-KEY-rockyofficial" -P /etc/pki/rpm-gpg # wget "${WEB_PROTOCOL}://${SOURCE}/${SOURCE_BRANCH}/RPM-GPG-KEY-Rocky-9" -P /etc/pki/rpm-gpg - - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|^gpgcheck=1|gpgcheck=0|g" \ + -e "s|^gpgkey=|#gpgkey=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ rocky.repo \ rocky-addons.repo \ rocky-devel.repo \ rocky-extras.repo ;; *) + sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* - - # Red Hat Enterprise Linux 修改版本号 case ${SYSTEM_VERSION_NUMBER:0:1} in 8) - ## CentOS 8 操作系统版本结束了生命周期(EOL),Linux 社区已不再维护该操作系统版本,最终版本为 8.5.2011 - # 原 centos 镜像中的 CentOS 8 相关内容已被官方移动,从 2022-02 开始切换至 centos-vault 源 sed -i 's|mirror.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Sources.repo # 单独处理 CentOS-Sources.repo sed -i "s/\$releasever/8.5.2111/g" CentOS-* + # 单独处理 CentOS-Linux-Sources.repo + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos-vault"}|g" CentOS-Linux-Sources.repo ;; 7) + sed -i "s|mirror.centos.org/\$contentdir|mirror.centos.org/${SOURCE_BRANCH}|g" CentOS-* sed -i "s/\$releasever/7/g" CentOS-* + # 单独处理 CentOS-Sources.repo + sed -i "s|vault.centos.org/centos|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Sources.repo ;; esac - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* - # 更换软件源 sed -i "s|mirror.centos.org|${SOURCE}|g" CentOS-* ;; esac ;; "${SYSTEM_CENTOS}") - sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* - - # 更换 WEB 协议(HTTP/HTTPS) sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-* - # 更换软件源 + sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-* case ${SYSTEM_VERSION_NUMBER:0:1} in 8) + ## CentOS 8 操作系统版本结束了生命周期(EOL),Linux 社区已不再维护该操作系统版本,最终版本为 8.5.2011 + # 原 centos 镜像中的 CentOS 8 相关内容已被官方移动,从 2022-02 开始切换至 centos-vault 源 sed -i 's|mirror.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Sources.repo # 单独处理 CentOS-Sources.repo sed -i "s/\$releasever/8.5.2111/g" CentOS-* + # 单独处理 CentOS-Linux-Sources.repo + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos-vault"}|g" CentOS-Linux-Sources.repo ;; 7) sed -i "s|mirror.centos.org/\$contentdir|mirror.centos.org/${SOURCE_BRANCH}|g" CentOS-* + sed -i "s|vault.centos.org/centos|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Sources.repo # 单独处理 CentOS-Sources.repo ;; esac sed -i "s|mirror.centos.org|${SOURCE}|g" CentOS-* @@ -1169,99 +1204,58 @@ function RedHatMirrors() { # CentOS Stream 9 使用的是 centos-stream 镜像,而 CentOS Stream 8 使用的是 centos 镜像 case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^metalink=|#metalink=|g' \ - centos.repo \ - centos-addons.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=https|baseurl=${WEB_PROTOCOL}|g" \ - centos.repo \ - centos-addons.repo - # 更换软件源 - sed -i "s|mirror.stream.centos.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=https|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^metalink=|#metalink=|g" \ + -e "s|mirror.stream.centos.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ centos.repo \ centos-addons.repo ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' CentOS-Stream-* - sed -i 's|vault.centos.org/$contentdir|mirror.centos.org/centos-vault|g' CentOS-Stream-Sources.repo # 单独处理 CentOS-Stream-Sources.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" CentOS-Stream-* - # 更换软件源 - sed -i "s|mirror.centos.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" CentOS-Stream-* + sed -i "s|vault.centos.org/\$contentdir|${SOURCE_VAULT:-"mirror.centos.org"}/${SOURCE_BRANCH_VAULT:-"centos"}|g" CentOS-Stream-Sources.repo # 单独处理 CentOS-Stream-Sources.repo + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|mirror.centos.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + CentOS-Stream-* ;; esac ;; "${SYSTEM_ROCKY}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - rocky.repo \ - rocky-addons.repo \ - rocky-devel.repo \ - rocky-extras.repo - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ rocky.repo \ rocky-addons.repo \ rocky-devel.repo \ rocky-extras.repo ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' Rocky-* - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" Rocky-* - # 更换软件源 - sed -i "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" Rocky-* + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|dl.rockylinux.org/\$contentdir|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + Rocky-* ;; esac ;; "${SYSTEM_ALMA}") case ${SYSTEM_VERSION_NUMBER:0:1} in 9) - sed -i 's|^mirrorlist=|#mirrorlist=|g' almalinux-* - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" almalinux-* - # 更换软件源 - sed -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ -e "s|repo.almalinux.org/vault|${SOURCE}/${SOURCE_BRANCH}-vault|g" \ - -i almalinux-* + -i \ + almalinux-* ;; 8) - sed -i 's|^mirrorlist=|#mirrorlist=|g' \ - almalinux-ha.repo \ - almalinux-nfv.repo \ - almalinux-plus.repo \ - almalinux-powertools.repo \ - almalinux-resilientstorage.repo \ - almalinux-rt.repo \ - almalinux-sap.repo \ - almalinux-saphana.repo \ - almalinux.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - almalinux-ha.repo \ - almalinux-nfv.repo \ - almalinux-plus.repo \ - almalinux-powertools.repo \ - almalinux-resilientstorage.repo \ - almalinux-rt.repo \ - almalinux-sap.repo \ - almalinux-saphana.repo \ - almalinux.repo - # 更换软件源 - sed -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^mirrorlist=|#mirrorlist=|g" \ + -e "s|^# baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|repo.almalinux.org/almalinux|${SOURCE}/${SOURCE_BRANCH}|g" \ -e "s|repo.almalinux.org/vault|${SOURCE}/${SOURCE_BRANCH}-vault|g" \ -i \ almalinux-ha.repo \ @@ -1277,24 +1271,10 @@ function RedHatMirrors() { esac ;; "${SYSTEM_FEDORA}") - sed -i 's|^metalink=|#metalink=|g' \ - fedora.repo \ - fedora-updates.repo \ - fedora-modular.repo \ - fedora-updates-modular.repo \ - fedora-updates-testing.repo \ - fedora-updates-testing-modular.repo - - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ - fedora.repo \ - fedora-updates.repo \ - fedora-modular.repo \ - fedora-updates-modular.repo \ - fedora-updates-testing.repo \ - fedora-updates-testing-modular.repo - # 更换软件源 - sed -i "s|download.example/pub/fedora/linux|${SOURCE}/${SOURCE_BRANCH}|g" \ + sed -e "s|^metalink=|#metalink=|g" \ + -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|download.example/pub/fedora/linux|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ fedora.repo \ fedora-updates.repo \ fedora-modular.repo \ @@ -1307,7 +1287,7 @@ function RedHatMirrors() { ## EPEL 附加软件包(安装/换源) case "${SYSTEM_JUDGMENT}" in "${SYSTEM_RHEL}" | "${SYSTEM_CENTOS}" | "${SYSTEM_CENTOS_STREAM}" | "${SYSTEM_ROCKY}" | "${SYSTEM_ALMA}") - [[ ${INSTALL_EPEL} == "True" ]] && EPELMirrors + [[ "${INSTALL_EPEL}" == "True" ]] && EPELMirrors ;; esac } @@ -1317,10 +1297,10 @@ function openEulerMirrors() { GenRepoFiles_openEuler cd $Dir_openEulerRepos - # 更换 WEB 协议(HTTP/HTTPS) - sed -i "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" openEuler.repo - # 更换软件源 - sed -i "s|repo.openeuler.org|${SOURCE}/${SOURCE_BRANCH}|g" openEuler.repo + sed -e "s|^#baseurl=http|baseurl=${WEB_PROTOCOL}|g" \ + -e "s|repo.openeuler.org|${SOURCE}/${SOURCE_BRANCH}|g" \ + -i \ + openEuler.repo } ## 更换基于 openSUSE 发行版的软件源 @@ -3955,7 +3935,7 @@ EOF ## 生成 openSUSE 官方 repo 源文件 function GenRepoFiles_openSUSE() { case $1 in - leap) + "leap") case $2 in 15.[0-2]) cat >$Dir_openSUSERepos/repo-debug-non-oss.repo <<\EOF @@ -4168,7 +4148,7 @@ EOF ;; esac ;; - tumbleweed) + "tumbleweed") cat >$Dir_openSUSERepos/repo-debug.repo <<\EOF [repo-debug] name=openSUSE-Tumbleweed-Debug @@ -4495,26 +4475,26 @@ function CommandOptions() { echo -e " 选项命令(参数名/含义/参数值): - --source 指定软件源地址 地址 - --branch 指定软件源分支 分支名 - --abroad 使用海外软件源 无 - --web-protocol 指定 WEB 协议 http 或 https - --intranet 使用内网地址 true 或 false - --install-epel 安装 EPEL 附加软件包 true 或 false - --close-firewall 关闭防火墙 true 或 false - --backup 备份原有软件源 true 或 false - --ignore-backup-tips 忽略覆盖备份提示 无 - --updata-software 更新软件包 true 或 false - --clean-cache 清理下载缓存 true 或 false - + --source 指定软件源地址 地址 + --source-security 指定 debian-security 软件源地址 地址 + --source-vault 指定 centos-vault 软件源地址 地址 + --branch 指定软件源分支(路径) 分支名 + --branch-security 指定 debian-security 软件源分支(路径) 分支名 + --branch-vault 指定 centos-vault 软件源分支(路径) 分支名 + --abroad 使用海外软件源 无 + --web-protocol 指定 WEB 协议 http 或 https + --intranet 优先使用内网地址 true 或 false + --install-epel 安装 EPEL 附加软件包 true 或 false + --only-epel 仅更换 EPEL 软件源模式 无 + --close-firewall 关闭防火墙 true 或 false + --backup 备份原有软件源 true 或 false + --ignore-backup-tips 忽略覆盖备份提示 无 + --updata-software 更新软件包 true 或 false + --clean-cache 清理下载缓存 true 或 false + 问题报告 https://github.com/SuperManito/LinuxMirrors/issues " } - ## 报错退出 - function Output_Command_Error() { - echo -e "\n$ERROR $1\n" - exit 1 - } ## 判断参数 while [ $# -gt 0 ]; do @@ -4528,13 +4508,39 @@ function CommandOptions() { if [ $2 ]; then echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" if [ $? -eq 0 ]; then - Output_Command_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" else SOURCE="$2" shift fi else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --source-security) + if [ $2 ]; then + echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" + if [ $? -eq 0 ]; then + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + else + SOURCE_SECURITY="$2" + shift + fi + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --source-vault) + if [ $2 ]; then + echo "$2" | grep -Eq "\-|\(|\)|\[|\]|\{|\}" + if [ $? -eq 0 ]; then + Output_Error "检测到无效参数值 ${BLUE}$2${PLAIN} ,请输入有效的地址!" + else + SOURCE_VAULT="$2" + shift + fi + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" fi ;; ## 指定软件源分支 @@ -4543,7 +4549,23 @@ function CommandOptions() { SOURCE_BRANCH="$2" shift else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --branch-security) + if [ $2 ]; then + SOURCE_BRANCH_SECURITY="$2" + shift + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" + fi + ;; + --branch-vault) + if [ $2 ]; then + SOURCE_BRANCH_VAULT="$2" + shift + else + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定软件源地址!" fi ;; ## 优先使用内网地址 @@ -4555,11 +4577,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## WEB 协议(HTTP/HTTPS) @@ -4571,11 +4593,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 http 或 https 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 http 或 https 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 WEB 协议(HTTP/HTTPS)!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 WEB 协议(HTTP/HTTPS)!" fi ;; ## 安装 EPEL 附加软件包 @@ -4587,13 +4609,17 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; + --only-epel) + ONLY_EPEL="true" + INSTALL_EPEL="true" + ;; ## 关闭防火墙 --close-firewall) if [ $2 ]; then @@ -4603,11 +4629,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 备份原有软件源 @@ -4619,11 +4645,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 忽略覆盖备份提示 @@ -4639,11 +4665,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; ## 清理下载缓存 @@ -4655,11 +4681,11 @@ function CommandOptions() { shift ;; *) - Output_Command_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$2${PLAIN} 为无效参数值,请在该参数后指定 true 或 false 作为参数值!" ;; esac else - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请在该参数后指定 true 或 false 作为参数值!" fi ;; --help) @@ -4667,11 +4693,15 @@ function CommandOptions() { exit ;; *) - Output_Command_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请确认后重新输入!" + Output_Error "检测到 ${BLUE}$1${PLAIN} 为无效参数,请确认后重新输入!" ;; esac shift done + ## 赋予部分命令参数默认值 + ONLY_EPEL="${ONLY_EPEL:-"false"}" + BACKUP="${BACKUP:-"true"}" + IGNORE_BACKUP_TIPS="${IGNORE_BACKUP_TIPS:-"false"}" } ## 组合函数 diff --git a/docs/use/command-options.md b/docs/use/command-options.md index b761fe7..4f70922 100644 --- a/docs/use/command-options.md +++ b/docs/use/command-options.md @@ -1,11 +1,16 @@ | 名称 | 含义 | 选项值 | | :-: | :-: | :-: | | `--source` | 指定软件源地址 | 地址 | -| `--branch` | 指定软件源分支 | 分支名 | +| `--source-security` | 指定 debian-security 软件源地址 | 地址 | +| `--source-vault` | 指定 centos-vault 软件源地址 | 地址 | +| `--branch` | 指定软件源分支(路径) | 分支名 | +| `--branch-security` | 指定 debian-security 软件源分支(路径) | 分支名 | +| `--branch-vault` | 指定 centos-vault 软件源分支(路径) | 分支名 | | `--abroad` | 使用海外软件源 | 无 | | `--web-protocol` | 指定 WEB 协议 | `http` 或 `https` | -| `--intranet` | 使用内网地址 | `true` 或 `false` | +| `--intranet` | 优先使用内网地址 | `true` 或 `false` | | `--install-epel` | 安装 EPEL 附加软件包 | `true` 或 `false` | +| `--only-epel` | 仅更换 EPEL 软件源模式 | 无 | | `--close-firewall` | 关闭防火墙 | `true` 或 `false` | | `--backup` | 备份原有软件源 | `true` 或 `false` | | `--ignore-backup-tips` | 忽略覆盖备份提示 | 无 | @@ -20,7 +25,8 @@ 若不想通过交互选择默认提供的软件源,你可以使用该命令选项指定软件源地址 ``` { .bash .no-copy } -bash ChangeMirrors.sh --source mirrors.ustc.edu.cn +bash <(curl -sSL https://linuxmirrors.cn/main.sh) \ + --source mirror.example.com ``` ### 指定软件源分支 @@ -48,7 +54,7 @@ bash ChangeMirrors.sh --source mirrors.ustc.edu.cn - + @@ -86,6 +92,24 @@ bash <(curl -sSL https://linuxmirrors.cn/main.sh) \ 阿里云镜像站的 Rocky Linux 镜像分支名称为 [`rockylinux`](https://mirrors.aliyun.com/rockylinux),不符合默认规则,但是可以通过命令选项绕过脚本默认规则来实现 +### 单独更换 EPEL 源 + +有些时候你会发现想使用的镜像站没有 epel 镜像仓库,那么你可以在第一次运行脚本时不安装或不更换 epel 源,然后再单独执行下面的命令 + +``` bash +bash <(curl -sSL https://linuxmirrors.cn/main.sh) --only-epel +``` + +### 自定义 Debian Security 源 + +如果你想提高服务器的安全性请尽可能使用官方源,因为镜像同步存在延迟 + +``` bash title="官方源" +bash <(curl -sSL https://linuxmirrors.cn/main.sh) \ + --source-security security.debian.org \ + --branch-security debian-security +``` + ## 无人值守 不通过交互完成换源操作,需要使用大量命令选项来实现,建议熟悉后再使用
 CentOScentos/centos-stream/centos-altarchcentos/centos-stream/centos-altarch/centos-vault
 Rocky Linux