#!/usr/bin/env bash
# 文  件: container_image_download.sh
# 作  者：树辉
# 功  能: 打包所需容器镜像包

set -o pipefail

txtbld=$(tput bold)             # Bold
bldred=${txtbld}$(tput setaf 1) # red
bldgre=${txtbld}$(tput setaf 2) # green
bldylw=${txtbld}$(tput setaf 3) # yellow
txtrst=$(tput sgr0)             # Reset
err=${bldred}ERROR${txtrst}
info=${bldgre}INFO${txtrst}
warn=${bldylw}WARNING${txtrst}

EXIT_CODE=67

PORT=$(( (RANDOM % (65535 - 30000 + 1)) + 30000 ))
#PORT=$(( ${RANDOM} +  32768 ))
CONTAINER_NAME=registry
IMAGE_TAG=2.8.2
IMAGE_FILE=${CONTAINER_NAME}-${IMAGE_TAG}.tar.xz
IMAGE_NAME=registry.cn-shenzhen.aliyuncs.com/shuhui/registry:${IMAGE_TAG}

IMAGE_DATA_DIR=/data/docker-registry
IMAGE_LIST_DIR=$(dirname $0)/image_lists
LOCAL_REGISTRY=127.0.0.1:${PORT}

imgSuccessful=0
imgFailed=0


if [[ ! -d ${IMAGE_LIST_DIR} ]]
then
    printf "$err: 目录不存在,异常退出!\n"
    exit ${EXIT_CODE}
fi

function container_startup() {

    docker ps -a |grep ${CONTAINER_NAME} >/dev/null && docker rm -f ${CONTAINER_NAME} >/dev/null 2>&1

    rm -rf ${IMAGE_DATA_DIR}
    docker run --name=${CONTAINER_NAME} \
               --detach \
               --hostname=${CONTAINER_NAME} \
               --publish=${PORT}:5000 \
               --volume=${IMAGE_DATA_DIR}:/var/lib/registry:rw \
               ${IMAGE_NAME} >/dev/null 2>/dev/null

    if [[ "$?" = "0" ]]
    then

        printf "$info: [ ${CONTAINER_NAME} ] 容器已启动,端口为: [ ${bldred}${PORT}${txtrst} ]\n"
    else
        printf "$err: [ ${CONTAINER_NAME} ] 容器启动失败,异常退出! && exit ${EXIT_CODE}"
    fi
}

function image_download() {

    find ${IMAGE_LIST_DIR} -name "*.list" -print0 | while read -d $'\0' file
    do
        for image in $(cat $file | sed -e "s/\"//g" -e "s/^#//g" -e "s/^$//g")
        do
            # 查询镜像架构类型
            arch=$(skopeo inspect docker://${image} | awk -F'"' '/Architecture/{print $4}')
            printf "$info: [ ${bldylw}${image##*/}${txtrst} ${bldgre}|${txtrst} ${bldred}${arch}${txtrst} ] 镜像开始下载中"
            skopeo copy --multi-arch=system docker://${image} docker://${LOCAL_REGISTRY}/${image#*/} >/dev/null 2>/dev/null || \
            skopeo copy --multi-arch=system --insecure-policy --dest-tls-verify=false docker://${image} docker://${LOCAL_REGISTRY}/${image#*/} >/dev/null 2>/dev/null

            if [[ "$?" -eq "0" ]]; then
                printf " | ${bldgre}√${txtrst}\n"
                let imgSuccessful=${imgSuccessful}+1
            else
                printf " | ${bldred}×${txtrst}\n"
                let imgFailed=${imgFailed}+1
            fi

        done

        printf "$info: 下载成功镜像数量： [ ${bldgre}${imgSuccessful}${txtrst} ]\n"

        if [[ "${imgFailed}" != "0" ]]
        then
            printf "$err: 下载失败镜像数量： [ ${bldred}${imgFailed}${txtrst} ]\n"
        fi
    done
}

function container_image_compression {
    cd ${IMAGE_DATA_DIR} && tar --use-compress-program=pigz -cf \
                                docker-registry.tar.gz \
                                docker/ \
                                --remove-files >/dev/null 2>/dev/null

    if [[ "$?" = "0" ]]
    then
        printf "$info: 容器镜像归档压缩成功： [ ${bldgre}${PWD}/docker-registry.tar.gz ${txtrst} ${bldgre}|${txtrst} ${bldred}$(du -sh docker-registry.tar.gz | awk '{print $1}' )${txtrst} ]\n"
    else
        printf "$err: 容器镜像归档压缩失败,异常退出!"
        exit ${EXIT_CODE}
    fi
}

container_startup
image_download
container_image_compression
