本站镜像源 https://github.xyh.moe:8888/xian.yuheng/distro-mirror 同步脚本

#!/bin/bash

set -e
##########################################################################
#  rsync                                                                 #
#  -a 归档模式                                                           #
#  -v 详细输出                                                           #
#  -r 递归模式                                                           #
#  -t 保留修改时间                                                       #
#  -L 符号链接重定向为文件                                               #
#  --delete 删除多余文件                                                 #
#  --no-motd 忽略 rsync daemon 的 MOTD 信息                              #
#  --quiet, -q 不显示 error 之外的信息                                   #
#  --mkpath 在 DEST 上创建 DEST 指定的路径字符串中不存在的路径           #
##########################################################################

readonly MIRRORS_DIR='/mirrors'                        # 定义镜像根目录

#readonly TSINGHUA_URL='mirrors.tuna.tsinghua.edu.cn'     # 清华大学
#readonly JTU_URL='mirror.sjtu.edu.cn'                    # 上海交通大学
readonly NJU_URL='mirrors.nju.edu.cn'                    # 南京大学
readonly USTC_URL='rsync.mirrors.ustc.edu.cn'            # 中国科学技术大学 
########################################################################################################################
# Debian
function fn_debian() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "======== Debian  Trixie ========"
    echo -e "================================"
    printf "\e[0m"
    
    [[ -d $MIRRORS_DIR/debian/ ]] || mkdir -p $MIRRORS_DIR/debian/
    
    debmirror \
        --progress \
        --nosource \
        --no-check-gpg \
        --dist=trixie,trixie-updates \
        --arch=amd64 \
        --i18n \
        -e rsync \
        --host=rsync.mirrors.ustc.edu.cn \
        --root=debian \
        $MIRRORS_DIR/debian/
}
# Debian Security
function fn_debian-security() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "======= Debian  Security ======="
    echo -e "================================"
    printf "\e[0m"
    
    [[ -d $MIRRORS_DIR/debian/ ]] || mkdir -p $MIRRORS_DIR/debian-security/

    debmirror \
        --progress \
        --nosource \
        --no-check-gpg \
        --dist=trixie-security \
        --arch=amd64 \
        --i18n \
        -e rsync \
        --host=rsync.mirrors.ustc.edu.cn \
        --root=debian-security \
        $MIRRORS_DIR/debian-security/
}

# CentOS 7
function fn_centos_7() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/centos-vault/centos/7/os/x86_64/      $MIRRORS_DIR/centos/7/os/x86_64/         # os
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/centos-vault/centos/7/updates/x86_64/ $MIRRORS_DIR/centos/7/updates/x86_64/    # updates
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/centos-vault/centos/7/extras/x86_64/  $MIRRORS_DIR/centos/7/extras/x86_64/     # extras

    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/centos/RPM-GPG-KEY-CentOS-7           $MIRRORS_DIR/centos/RPM-GPG-KEY-CentOS-7 # GPG-KEY
}
# Almalinux 9
function fn_almalinux_9() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/AppStream/x86_64/os/Packages/        $MIRRORS_DIR/almalinux/9/AppStream/x86_64/os/Packages/            # AppStream
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/AppStream/x86_64/os/repodata/        $MIRRORS_DIR/almalinux/9/AppStream/x86_64/os/repodata/            # AppStream
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/BaseOS/x86_64/os/Packages/           $MIRRORS_DIR/almalinux/9/BaseOS/x86_64/os/Packages/               # BaseOS
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/BaseOS/x86_64/os/repodata/           $MIRRORS_DIR/almalinux/9/BaseOS/x86_64/os/repodata/               # BaseOS
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/extras/x86_64/os/Packages/           $MIRRORS_DIR/almalinux/9/extras/x86_64/os/Packages/               # extras
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/9/extras/x86_64/os/repodata/           $MIRRORS_DIR/almalinux/9/extras/x86_64/os/repodata/               # extras
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/RPM-GPG-KEY-AlmaLinux                  $MIRRORS_DIR/almalinux/RPM-GPG-KEY-AlmaLinux                      # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/RPM-GPG-KEY-AlmaLinux-9                $MIRRORS_DIR/almalinux/RPM-GPG-KEY-AlmaLinux-9                    # GPG-KEY
}
# Almalinux 10
function fn_almalinux_10() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/AppStream/x86_64/os/Packages/        $MIRRORS_DIR/almalinux/10/AppStream/x86_64/os/Packages/          # AppStream
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/AppStream/x86_64/os/repodata/        $MIRRORS_DIR/almalinux/10/AppStream/x86_64/os/repodata/          # AppStream
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/BaseOS/x86_64/os/Packages/           $MIRRORS_DIR/almalinux/10/BaseOS/x86_64/os/Packages/             # BaseOS
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/BaseOS/x86_64/os/repodata/           $MIRRORS_DIR/almalinux/10/BaseOS/x86_64/os/repodata/             # BaseOS
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/extras/x86_64/os/Packages/           $MIRRORS_DIR/almalinux/10/extras/x86_64/os/Packages/             # extras
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/10/extras/x86_64/os/repodata/           $MIRRORS_DIR/almalinux/10/extras/x86_64/os/repodata/             # extras
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/RPM-GPG-KEY-AlmaLinux                  $MIRRORS_DIR/almalinux/RPM-GPG-KEY-AlmaLinux                      # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/almalinux/RPM-GPG-KEY-AlmaLinux-10                $MIRRORS_DIR/almalinux/RPM-GPG-KEY-AlmaLinux-10                  # GPG-KEY
}
# EPEL 7
function fn_epel_7() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/fedora-archive/epel/7/x86_64/Packages/ $MIRRORS_DIR/epel/7/x86_64/Packages/
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/fedora-archive/epel/7/x86_64/repodata/ $MIRRORS_DIR/epel/7/x86_64/repodata/
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/epel/RPM-GPG-KEY-EPEL-7                $MIRRORS_DIR/epel/RPM-GPG-KEY-EPEL-7
}
# EPEL 9
function fn_epel_9() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/9/Everything/x86_64/Packages/ $MIRRORS_DIR/epel/9/Everything/x86_64/Packages/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/9/Everything/x86_64/repodata/ $MIRRORS_DIR/epel/9/Everything/x86_64/repodata/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/RPM-GPG-KEY-EPEL-9            $MIRRORS_DIR/epel/RPM-GPG-KEY-EPEL-9
}
# EPEL 10
function fn_epel_10() {
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/10/Everything/x86_64/Packages/ $MIRRORS_DIR/epel/10/Everything/x86_64/Packages/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/10/Everything/x86_64/repodata/ $MIRRORS_DIR/epel/10/Everything/x86_64/repodata/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/epel/RPM-GPG-KEY-EPEL-10            $MIRRORS_DIR/epel/RPM-GPG-KEY-EPEL-10
}

# Archlinux
function fn_archlinux() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "========   Archlinux    ========"
    echo -e "================================"
    printf "\e[0m"

    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/archlinux/core/      $MIRRORS_DIR/archlinux/core/         # core
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/archlinux/extra/     $MIRRORS_DIR/archlinux/extra/        # extra
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/archlinux/community/ $MIRRORS_DIR/archlinux/community/    # community
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/archlinux/multilib/  $MIRRORS_DIR/archlinux/multilib/     # multilib
}
# Archlinuxcn
function fn_archlinuxcn() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "========  Archlinux cn  ========"
    echo -e "================================"
    printf "\e[0m"

    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/archlinuxcn/x86_64/ $MIRRORS_DIR/archlinuxcn/x86_64/
}

# Docker-CE
function fn_dockerce_debian_bookworm() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "== Docker-CE Debian Bookworm  =="
    echo -e "================================"
    printf "\e[0m"
    
    # Debian 12
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/        $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/stable/binary-amd64/      $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/stable/binary-amd64/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64     $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64.bz2 $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64.bz2
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64.gz  $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/stable/Contents-amd64.gz
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/InRelease                 $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/InRelease
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/Release                   $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/Release
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/bookworm/Release.gpg               $MIRRORS_DIR/docker-ce/linux/debian/dists/bookworm/Release.gpg
    
    # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/gpg $MIRRORS_DIR/docker-ce/linux/debian/gpg
}
function fn_dockerce_debian_trixie() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "== Docker-CE Debian Trixie    =="
    echo -e "================================"
    printf "\e[0m"
    
    # Debian 13
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/pool/stable/amd64/        $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/pool/stable/amd64/
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/stable/binary-amd64/      $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/stable/binary-amd64/
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64     $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64.bz2 $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64.bz2
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64.gz  $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/stable/Contents-amd64.gz
    
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/InRelease                 $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/InRelease
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/Release                   $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/Release
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/dists/trixie/Release.gpg               $MIRRORS_DIR/docker-ce/linux/debian/dists/trixie/Release.gpg
    
    # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$USTC_URL/docker-ce/linux/debian/gpg $MIRRORS_DIR/docker-ce/linux/debian/gpg
}
function fn_dockerce_centos_7() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "====  Docker-CE CentOS  7   ===="
    echo -e "================================"
    printf "\e[0m"
    
    # CentOS 7
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/7/x86_64/stable/ $MIRRORS_DIR/docker-ce/linux/centos/7/x86_64/stable/
    
    # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/gpg $MIRRORS_DIR/docker-ce/linux/centos/gpg
}
function fn_dockerce_centos_9() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "====  Docker-CE CentOS  9   ===="
    echo -e "================================"
    printf "\e[0m"
    
    # CentOS 9
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/9/x86_64/stable/ $MIRRORS_DIR/docker-ce/linux/centos/9/x86_64/stable/
    
    # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/gpg $MIRRORS_DIR/docker-ce/linux/centos/gpg
}
function fn_dockerce_centos_10() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "====  Docker-CE CentOS 10   ===="
    echo -e "================================"
    printf "\e[0m"
    
    # CentOS 10
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/10/x86_64/stable/ $MIRRORS_DIR/docker-ce/linux/centos/10/x86_64/stable/
    
    # GPG-KEY
    rsync -avrtL --delete --mkpath --no-motd rsync://$NJU_URL/docker-ce/linux/centos/gpg $MIRRORS_DIR/docker-ce/linux/centos/gpg
}

# Kubernetes
function fn_kubernetes() {
    printf "\e[32m"
    echo -e "================================"
    echo -e "========   Kubernetes   ========"
    echo -e "================================"
    printf "\e[0m"
    
    rsync -avrtL \
        --exclude="*/*/arm64/"         \
        --exclude="*/*/ppc64el/"       \
        --exclude="*/*/s390x/"         \
        --exclude="*/*/aarch64/"       \
        --exclude="*/*/ppc64le/"       \
        --delete --mkpath --no-motd    \
        rsync://$USTC_URL/kubernetes/addons:/cri-o:/stable:/ $MIRRORS_DIR/kubernetes/addons:/cri-o:/stable:/

    rsync -avrtL \
        --exclude="*/*/arm64/"         \
        --exclude="*/*/ppc64el/"       \
        --exclude="*/*/s390x/"         \
        --exclude="*/*/aarch64/"       \
        --exclude="*/*/ppc64le/"       \
        --delete --mkpath --no-motd    \
        rsync://$USTC_URL/kubernetes/core:/stable:/ $MIRRORS_DIR/kubernetes/core:/stable:/
}

function fn_main() {
    # 记录开始时间
    start_time=$(date +%s)
    start_dt=$(date "+%Y-%m-%d %H:%M:%S")
    #================================================================
    [[ $DEBIAN == 1 ]]                     && fn_debian
    [[ $DEBIAN_SEC == 1 ]]                 && fn_debian-security
    
    [[ $CENTOS_7 == 1 ]]                   && fn_centos_7
    [[ $ALMALINUX_9 == 1 ]]                && fn_almalinux_9
    [[ $ALMALINUX_10 == 1 ]]               && fn_almalinux_10
    [[ $EPEL_7 == 1 ]]                     && fn_epel_7
    [[ $EPEL_9 == 1 ]]                     && fn_epel_9
    [[ $EPEL_10 == 1 ]]                    && fn_epel_10
    
    [[ $ARCHLINUX == 1 ]]                  && fn_archlinux
    [[ $ARCHLINUXCN == 1 ]]                && fn_archlinuxcn
    
    [[ $DOCKERCE_DEBIAN_BOOKWORM == 1 ]]   && fn_dockerce_debian_bookworm
    [[ $DOCKERCE_DEBIAN_TRIXIE == 1 ]]     && fn_dockerce_debian_trixie
    [[ $DOCKERCE_CENTOS_7 == 1 ]]          && fn_dockerce_centos_7
    [[ $DOCKERCE_CENTOS_9 == 1 ]]          && fn_dockerce_centos_9
    [[ $DOCKERCE_CENTOS_10 == 1 ]]         && fn_dockerce_centos_10
    
    [[ $KUBERNETES == 1 ]]                 && fn_kubernetes
    #================================================================
    # 记录结束时间
    end_time=$(date +%s)
    end_dt=$(date "+%Y-%m-%d %H:%M:%S")
    
    # 计算耗时
    elapsed=$((end_time - start_time))
    # 转换为时分秒
    hours=$((elapsed / 3600))
    minutes=$(((elapsed % 3600) / 60))
    seconds=$((elapsed % 60))
    formatted_elapsed=$(printf "%02d 小时 %02d 分 %02d 秒" "$hours" "$minutes" "$seconds")
    
    printf "\e[32m"
    echo "===================================="
    printf "%s%s%-19s%s\n"    "== " "开始时间 : " "$start_dt"          " =="
    printf "%s%s%-19s%s\n"    "== " "结束时间 : " "$end_dt"            " =="
    printf "%s%s%16s 秒%s\n"  "== " "总计耗时 : " "$elapsed"           " =="
    printf "%s%s%23s%s\n"     "== " "总计耗时 : " "$formatted_elapsed" " =="
    echo "===================================="
    printf "\e[0m"
}

fn_main