#!/bin/bash # 约定内容 NeedUploadFolder=99 IsUpload=99 UploadImageName="" ImageListName="" ImageTarName="" ImageName="" ImageTag="" InnerIPv4CIDR="" InnerIPv6CIDR="" InnerIPv4="" InnerIPv6="" CmiiImagePrefix="harbor.cdcyy.com.cn/cmii/" OSS_URL="https://oss.demo.uavcmlc.com/cmlc-installation/tmp/" Custom_Client_Harbor="REPLACE:8033" namespace=shls new_tag= app_name= custom_prefix= ####################################### # description # Globals: # ImageName # ImageTag # ImageTarName # RANDOM # UploadImageName # Arguments: # None ####################################### get_image_tar_name() { # harbor.cdcyy.com.cn/cmii/cmii-uav-oauth:4.1.6 ImageName=$(echo $UploadImageName | cut -d ":" -f1 | cut -d"/" -f3) ImageTag=$(echo $UploadImageName | cut -d ":" -f2) local currentDate=$(date +'%Y-%m-%d') local random_number=$((RANDOM % 900 + 100)) ImageTarName="$ImageName=$ImageTag=$currentDate=$random_number.tar.gz" } ####################################### # description # Globals: # ImageName # ImageTag # ImageTarName # UploadImageName # Arguments: # None ####################################### get_image_name_from_tar() { # cmii-uav-oauth_4.1.6-0918_20230918_123.tar.gz ImageName=$(echo $ImageTarName | cut -d "=" -f1) ImageTag=$(echo $ImageTarName | cut -d"=" -f2) UploadImageName="$ImageName:$ImageTag" } # 获取服务器的公网IP地址 get_Internal_IP_CIDR() { local interface_prefix=("[[:space:]]eth[0-9]{1,2}" "[[:space:]]ens[0-9]{1,3}" "[[:space:]]eno[0-9]{1,3}" "[[:space:]]enp[0-9]{1,2}") local real_interface="eth90" for interface in "${interface_prefix[@]}"; do echo $(ip link show) | grep -oE ${interface} | head -1 if [[ $? -eq 0 ]]; then real_interface=$(echo $(ip link show) | grep -oE ${interface} | head -1 | cut -d" " -f2) echo "当前主机的真实内网网卡为 => [$real_interface]" break fi done # 提取IPv4地址(CIDR格式) local ipv4_regex="inet[[:space:]](25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/[0-9]{1,2}" # 提取IPv6地址(CIDR格式) local ipv6_regex="inet6[[:space:]]([0-9a-fA-F]{0,4}(:[0-9a-fA-F]{0,4}){1,7})\/[0-9]{1,3}" # 查找IPv4地址 local inner_ipv4=$(echo $(ip addr show $real_interface) | grep -oE $ipv4_regex | cut -d" " -f2) InnerIPv4CIDR=$inner_ipv4 echo "Interface: $real_interface, IPv4 Address: $inner_ipv4" # 查找IPv6地址 local inner_ipv6=$(echo $(ip addr show $real_interface) | grep -oE $ipv6_regex | cut -d" " -f2) InnerIPv6CIDR=$inner_ipv6 echo "Interface: $real_interface, IPv4 Address: $inner_ipv6" } ####################################### # description # Globals: # InnerIPv4 # InnerIPv4CIDR # InnerIPv6 # InnerIPv6CIDR # Arguments: # None ####################################### get_Internal_IP() { # get_Internal_IP_CIDR InnerIPv4=103.0.180.201 InnerIPv6=$(echo $InnerIPv6CIDR | cut -d "/" -f1) echo "服务器的内网IPv4地址为 $InnerIPv4" echo "服务器的内网IPv6地址为 $InnerIPv6" } parse_args(){ if [ "$1" == "" ]; then echo "no zip file in error!" exit 233 fi local image_name="$1" # cmii-uav-surveillance=5.2.0-27031-cqga=2024-03-04=573.tar.gz # cmii-uav-mqtthandler=5.4.0-031201=2024-03-12=138.tar.gz app_name=$(echo $image_name | cut -d "=" -f1) new_tag=$(echo $image_name | cut -d "=" -f2) } update_image_tag(){ if [ "$new_tag" == "" ]; then echo "new tag error!" exit 233 fi local image_prefix=$(kubectl -n ${namespace} get deployment "${app_name}" -o=jsonpath='{.spec.template.spec.containers[*].image}' | cut -d":" -f1) echo "image grep is => ${image_prefix}" echo "start to update ${namespace} ${app_name} to ${new_tag} !" echo "" kubectl -n ${namespace} patch deployment "${app_name}" -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"${app_name}\",\"image\": \"${custom_prefix}$app_name:${new_tag}\"}]}}}}" echo "" echo "start to wait for 3 seconds!" sleep 3 local image_new=$(kubectl -n ${namespace} get deployment "${app_name}" -o=jsonpath='{.spec.template.spec.containers[*].image}') echo "" echo "new image are => $image_new" echo "" } ####################################### # description # Globals: # _m_opts # Arguments: # None ####################################### _math() { _m_opts="$@" printf "%s" "$((_m_opts))" } # 前文内容 while [[ $# -gt 0 ]]; do case "$1" in -fu | --fileupload) NeedUploadFolder=1 ImageListName=${2} shift # past argument ;; -fd | --filedownload) NeedUploadFolder=2 ImageListName=${2} shift # past argument ;; -u | --upload) IsUpload=1 UploadImageName="${2}" shift # past argument ;; -d | --download) IsUpload=2 ImageTarName="${2}" shift # past argument ;; -h | --harbor) Custom_Client_Harbor="${2}" shift # past argument ;; *) # unknown option ;; esac shift # past argument or value done ####################################### # description # Globals: # ImageTarName # UploadImageName # Arguments: # None ####################################### Download_Compress_OSS_Image() { # upload echo "【上传】 - 需要处理的镜像名称为 => $UploadImageName" echo "" echo "【上传】 - 开始下载镜像!" echo "" if docker pull "${UploadImageName}" >/dev/null 2>&1; then echo "下载-镜像下载成功! => $UploadImageName" else if docker inspect "${UploadImageName}" >/dev/null 2>&1; then echo "下载-镜像已经存在 => $UploadImageName" else echo "" echo "下载-镜像下载 失败! => $UploadImageName" echo "下载-镜像下载 失败! => $UploadImageName" echo "" return 233 fi fi echo "" get_image_tar_name echo "【上传】 - 将要把镜像压缩为 => $ImageTarName" docker save $UploadImageName | gzip --stdout >${ImageTarName} echo "【上传】 - 压缩成功 ! $(ls | grep ${ImageTarName})" echo"" echo "【上传】 - 开始上传至OSS中!" mc cp ./${ImageTarName} demo/cmlc-installation/tmp/ echo "【上传】 - 上传OSS成功 => $(mc ls demo/cmlc-installation/tmp/ | grep ${ImageTarName})" echo"" } ####################################### # description # Globals: # CmiiImagePrefix # ImageTarName # InnerIPv4 # OSS_URL # UploadImageName # custom_prefix # Arguments: # None # Returns: # ... ####################################### UnCompress_Upload_Harbor() { echo "【下载】 - 需要处理的压缩包名称为 => $ImageTarName" echo "【下载】 - 开始下载 ↓" curl -x socks5h://103.0.180.82:9997 "$OSS_URL$ImageTarName" -o ${ImageTarName} if [[ $? -ne 0 ]]; then echo "【下载】- 下载镜像失败!退出!" return fi echo "" echo "【下载】 - 开始解压压缩包 " docker load <"${ImageTarName}" echo "" get_Internal_IP echo "【下载】 - 开始上传镜像到本地的镜像仓库中 => $InnerIPv4:8033 " custom_prefix="$InnerIPv4:8033/cmii/" echo "" get_image_name_from_tar echo "【下载】 - 解析得到的 私有镜像地址为 => $custom_prefix$UploadImageName" docker tag "$CmiiImagePrefix${UploadImageName}" "$custom_prefix$UploadImageName" echo "【下载】 - 开始上传镜像到私有仓库 ↓" docker login -u admin -p V2ryStr@ngPss "$InnerIPv4:8033" echo "" echo "【下载】 - 开始推送到私有仓库! " docker push "$custom_prefix$UploadImageName" echo "" echo "" } if [[ $NeedUploadFolder == 1 ]]; then # 上传的是一个目录 echo "【上传】 - 上传的文件目录为 => ${ImageListName}" currentDate=$(date +'%Y-%m-%d') random_number=$((RANDOM % 900 + 100)) tar_image_txt_file="$currentDate-$random_number.txt" echo "【上传】 - 复制文件目录为临时文件 => $tar_image_txt_file" touch $tar_image_txt_file echo "" echo "" while IFS= read -r i; do [ -z "${i}" ] && continue UploadImageName=${i} Download_Compress_OSS_Image # 写入压缩文件名称 echo "$ImageTarName" >>"$tar_image_txt_file" echo "-------------------------------------------------" done <"${ImageListName}" echo "" echo "【上传】 - 上传压缩文件名称列表至OSS中 !" mc cp ./"$tar_image_txt_file" demo/cmlc-installation/tmp/ echo "【上传】 - 上传OSS成功 => $(mc ls demo/cmlc-installation/tmp/ | grep "${tar_image_txt_file}")" echo "" echo "【上传】 - 请在目标Master主机执行如下命令 ↓↓↓↓↓↓" echo "" echo "" echo "source <(curl -sL https://b2.107421.xyz/image-sync.sh) -fd "$OSS_URL$tar_image_txt_file"" echo "" echo "" elif [[ $NeedUploadFolder == 2 ]]; then echo "【下载】- 需要下载的压缩包文件为 => $ImageListName" tar_image_txt_file=$(echo ${ImageListName} | cut -d"/" -f6) curl -x socks5h://103.0.180.82:9997 ${ImageListName} -o ${tar_image_txt_file} image_count=0 while IFS= read -r i; do [ -z "${i}" ] && continue ImageTarName=${i} UnCompress_Upload_Harbor image_count="$(_math "$image_count" + 1)" echo "-------------------------------------------------" echo "stat to update image tag!" parse_args $ImageTarName update_image_tag done <"${tar_image_txt_file}" echo "" echo "【下载】 - 请等待流程结束 ↓" _sleep_c="500" for (( i=1; i<$image_count; i++ )) ; do _sleep_c="$(_math "$_sleep_c" + 500)" done echo "【下载】 - 共有 【 $image_count 】个镜像, 等待上传结束 => $_sleep_c 秒" while [ "$_sleep_c" -ge "0" ]; do printf "\r \r" printf -- "%b" "$_sleep_c" _sleep_c="$(_math "$_sleep_c" - 1)" sleep 1 done printf "\r" fi if [[ $IsUpload == 1 ]]; then Download_Compress_OSS_Image echo "【上传】 - 请在目标Master主机执行如下命令 ↓↓↓↓↓↓" echo "" echo "" echo "source <(curl -sL https://b2.107421.xyz/image-sync.sh) -d $ImageTarName" echo "" echo "" Client_Harbor_Address="$Custom_Client_Harbor/cmii/$ImageName:$ImageTag" echo "【上传】 - 手动命令执行如下, 目标镜像全程地址为 => $Client_Harbor_Address" echo "" echo "wget $OSS_URL$ImageTarName && docker load < $ImageTarName && docker tag ${UploadImageName} $Client_Harbor_Address && docker push $Client_Harbor_Address" echo "" echo "" elif [[ $IsUpload == 2 ]];then # download UnCompress_Upload_Harbor echo "【下载】 - 请等待流程结束 ↓" _sleep_c="500" while [ "$_sleep_c" -ge "0" ]; do printf "\r \r" printf -- "%b" "$_sleep_c" _sleep_c="$(_math "$_sleep_c" - 1)" sleep 1 done printf "\r" fi