#!/bin/bash

##############################################################
# File Name: mypull
# Version: V1.0.1
# Author: cnHeaven
# Modify: cnDongyan
# Blog Site: cnHeaven
# Created Time : 2024-10-14
# Environment: Synology DS918+
##############################################################

# 检查当前用户是否为root 
if [ "$EUID" -ne 0 ]; then 
  echo "请以root用户身份运行此脚本" 
  exit 1 
fi  

# 显示帮助信息的函数
show_help() {
    echo "Usage: $0 [--help] <image_name>"
    echo "  --help: 显示此帮助信息"
    echo "  <image_name>: 要拉取的Docker镜像名称，例如 myapp:1.0 或 myapp"
    exit 0
}

# 检查参数个数
if [ $# -eq 0 ] || [ "$1" == "--help" ]; then
    show_help
fi
if [ $# -eq 2 ]; then 
    prechoice=$2 
    echo "第二个参数是: $prechoice" 
else 
    prechoice=0 
fi 
# 从参数获取镜像名称
name="$1"

#镜像来自https://github.com/dongyubin/DockerHub?tab=readme-ov-file 
# 提示用户选择序号
# 定义镜像源数组
declare -A mirrors=(
    [1]="docker.1panel.dev"
    [2]="docker.ketches.cn"
    [3]="docker.m.daocloud.io"
    [4]="hub.geekery.cn"
    [5]="ghcr.geekery.cn"
    [6]="docker.rainbond.cc"
    [7]="docker.udayun.com"
    [8]="docker.fxxk.dedyn.io"
    [9]="docker.211678.top"
    [10]="dockerproxy.cn"
    [11]="dockerpull.com" 
    [12]="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io"
    [13]="docker.1panel.live"
    [14]="docker.zhai.cm"
    [15]="docker.1ms.run"
    #[16]=""    
)
 
# 显示可选的镜像列表
echo "请选择一个镜像源:"
# 将关联数组的键转换为数组 
keys=("${!mirrors[@]}") 
 
# 按数值顺序排序键 
sorted_keys=($(printf '%s\n' "${keys[@]}" | sort -n)) 
 
# 按数值顺序输出键和对应的值 
for key in "${sorted_keys[@]}"; do 
    echo "$key) ${mirrors[$key]}" 
done 
# 初始化默认值
choice=1

# 循环直到输入有效
while true; do
    # 提示用户输入
	if [ $prechoice -ne 0 ]; then 
        choice=$prechoice 
    else 
        read -p "输入镜像序号<回车默认1,q或0退出>: " choice 
    fi 
    # 如果用户直接按回车，使用默认值
    if [ -z "$choice" ]; then
        choice=1
    fi
	echo "你选择了...$choice"
	if [[ "$choice" == "q" || "$choice" == "0" ]]; then
		# 如果用户输入了q，退出脚本
		echo "退出脚本..."
		exit 0
	fi
    # 检查输入是否为有效的数字
    if [[ "$choice" =~ ^[0-9]+$ ]]; then
		# 检查用户输入是否有效
		if [[ -n "${mirrors[$choice]}" ]]; then
			#echo "你选择了: ${mirrors[$choice]}"
			variable=${mirrors[$choice]}
			break
		else
			echo "无效的选择，请输入有效的编号。"
		fi
    else
        echo "无效输入，请重新输入一个有效的编号。"
    fi
done
 
# 获取镜像名称和标签
# 获取镜像名称和标签
if [[ "$name" == *":"* ]]; then
    IMAGE_NAME=$(echo "$name" | cut -d ':' -f 1)
    TAG=$(echo "$name" | cut -d ':' -f 2-)
else
    IMAGE_NAME="$name"
    TAG="latest"
fi
FULL_IMAGE_NAME="$IMAGE_NAME:$TAG"
 
# 输出变量值
echo "你选择的代理是: $variable"
echo "需要拉取的镜像是: $FULL_IMAGE_NAME"
# 设置镜像源URL

MIRROR_URL=$variable
# 拉取镜像
echo "正在拉取镜像: $FULL_IMAGE_NAME"
docker pull "$MIRROR_URL/$FULL_IMAGE_NAME"
 
# 检查拉取是否成功
if [ $? -ne 0 ]; then
    echo "拉取镜像: $FULL_IMAGE_NAME 失败"
    exit 1
fi

# 检查镜像是否存在
docker images | grep "$MIRROR_URL/$IMAGE_NAME" | grep "$TAG" > /dev/null
if [ $? -ne 0 ]; then
    echo "拉取后找不到镜像: $FULL_IMAGE_NAME"
    exit 1
fi

# 为镜像打上新标签
echo "正在为镜像打标签: $TAG"
docker tag "$MIRROR_URL/$FULL_IMAGE_NAME" "$IMAGE_NAME:$TAG"

# 检查标签是否成功
if [ $? -eq 0 ]; then
    echo "镜像标签打标成功: $IMAGE_NAME:$TAG"
	 
    # 检查新标签是否存在
    docker images | grep "$IMAGE_NAME" | grep "$TAG" > /dev/null
	if [ $? -ne 0 ]; then
		echo "打标后找不到镜像: $IMAGE_NAME:$TAG"
		exit 1
	fi
    # 删除带镜像源的标签
    echo "移除镜像源标签: $MIRROR_URL"
    docker rmi "$MIRROR_URL/$FULL_IMAGE_NAME" > /dev/null
else
    echo "镜像标签打标失败: $IMAGE_NAME:$TAG"
    exit 1
fi
 
echo "脚本执行完成。"
 
 