#!/bin/bash
#此脚本实现部署本地minio仓库并拉取离线包至该本地minio的功能,请配置以下5个参数并执行该脚本.部署要求/data目录可用空间大于20G

#工作目录,ai-deployer源码实际所在路径
BASE=/opt/ai-deployer
#本地minio仓库IP地址
MINIO_IP=127.0.0.1
#本地minio仓库端口
MINIO_PORT=39000
#本地minio用户名
MINIO_ACCESS_KEY=minioadmin
#本地minio密码
MINIO_SECRET_KEY=minioadmin


#====================================================
MINIO_URL=https://minio.mopaas.com
REGISTRY_URL=https://registry.mopaas.com
REGISTRY_DOMAIN=${REGISTRY_URL#*//}
DOCKER_VER=19.03.14
HARBOR_VER=v1.8.0
REGISTRY_MIRROR=CN


function usage() {
    echo -e "\033[33mUsage:\033[0m make-local-minio.sh COMMAND"
    cat <<EOF
-------------------------------------------------------------------------------------
  minio-user minio-password       请输入线上minio仓库的用户名和密码
EOF
}


function logger() {
  TIMESTAMP=$(date +'%Y-%m-%d %H:%M:%S')
  case "$1" in
    debug)
      echo -e "$TIMESTAMP \033[36mDEBUG\033[0m $2"
      ;;
    info)
      echo -e "$TIMESTAMP \033[32mINFO\033[0m $2"
      ;;
    warn)
      echo -e "$TIMESTAMP \033[33mWARN\033[0m $2"
      ;;
    error)
      echo -e "$TIMESTAMP \033[31mERROR\033[0m $2"
      ;;
    *)
      ;;
  esac
}

function download_docker() {
  if [[ "$REGISTRY_MIRROR" == CN ]];then
    DOCKER_URL="$MINIO_URL/ai-deployer/docker-${DOCKER_VER}.tgz"
  else
    DOCKER_URL="$MINIO_URL/ai-deployer/docker-${DOCKER_VER}.tgz"
  fi

  if [[ -f "$BASE/down/docker-${DOCKER_VER}.tgz" ]];then
    logger info "docker离线包已下载"
  else
    logger info "正在下载docker离线包"
    if [[ -e /usr/bin/curl ]];then
      curl -C- -O --retry 3 "$DOCKER_URL" || { logger error "下载docker离线包失败"; exit 1; }
    else
      wget -c "$DOCKER_URL" || { logger error "下载docker离线包失败"; exit 1; }
    fi
    /bin/mv -f "./docker-$DOCKER_VER.tgz" "$BASE/down"
  fi

  tar zxf "$BASE/down/docker-$DOCKER_VER.tgz" -C "$BASE/down" && \
  /bin/cp -f "$BASE"/down/docker/* "$BASE/bin" && \
  /bin/mv -f "$BASE"/down/docker/* /opt/kube/bin && \
  ln -sf /opt/kube/bin/docker /bin/docker
}

function install_docker() {
  # check if a container runtime is already installed
  systemctl status docker|grep Active|grep -q running && { logger info "docker正在运行中"; return 0; }
  logger debug "生成docker service文件"
  cat > /etc/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
[Service]
Environment="PATH=/opt/kube/bin:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStartPre=/sbin/iptables -F
ExecStartPre=/sbin/iptables -X
ExecStartPre=/sbin/iptables -F -t nat
ExecStartPre=/sbin/iptables -X -t nat
ExecStartPre=/sbin/iptables -F -t raw
ExecStartPre=/sbin/iptables -X -t raw
ExecStartPre=/sbin/iptables -F -t mangle
ExecStartPre=/sbin/iptables -X -t mangle
ExecStart=/opt/kube/bin/dockerd
ExecStartPost=/sbin/iptables -P INPUT ACCEPT
ExecStartPost=/sbin/iptables -P OUTPUT ACCEPT
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
ExecReload=/bin/kill -s HUP \$MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
  
  # configuration for dockerd
  mkdir -p /etc/docker
  logger debug "生成docker配置文件: /etc/docker/daemon.json"
  if [[ "$REGISTRY_MIRROR" == CN ]];then
    cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries": ["__registry__local__", "__registry__domain__"],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF
    sed -i "s/__registry__local__/$MINIO_IP:38080/g" "/etc/docker/daemon.json"
    sed -i "s/__registry__domain__/$REGISTRY_DOMAIN/g" "/etc/docker/daemon.json"   
  else
    cat > /etc/docker/daemon.json << EOF
{
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF
  fi

  if [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then
    logger debug "关闭selinux in CentOS/Redhat"
    getenforce|grep Disabled || setenforce 0
    sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config
  fi

  logger debug "enable and start docker"
  systemctl enable docker
  systemctl daemon-reload && systemctl restart docker && sleep 4
}

function install_minio() {
  minio_status=$(docker ps -a|grep minio-local)
  if [[ $minio_status =~ minio-local ]];then
    logger info "本地minio仓库已安装"
  else
    logger info "正在安装本地minio仓库"
    /opt/kube/bin/docker run -itd --name=minio-local --restart=always -e "MINIO_ACCESS_KEY=$MINIO_ACCESS_KEY"  -e "MINIO_SECRET_KEY=$MINIO_SECRET_KEY" -p $MINIO_PORT:9000 -v /data/minio:/data minio/minio:RELEASE.2020-09-26T03-44-56Z server /data
  sleep 20
  fi
}

function get_packages() {
  #安装mc客户端
  if [[ -f /usr/bin/mc ]];then
    logger info "mc客户端已安装"
  else
    logger info "正在安装mc客户端"
    curl -C- -O --retry 3 "$MINIO_URL/ai-deployer/mc"
    /bin/mv -f ./mc /usr/bin/ && chmod +x /usr/bin/mc
  fi

  #配置线上minio
  mc config host add minio $MINIO_URL $MINIO_USER $MINIO_PASSWORD
  #配置本地minio-local
  mc config host add minio-local http://$MINIO_IP:$MINIO_PORT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
  
  #创建ai-deployer BUCKET
  logger info "正在创建buckets"
  mc mb minio-local/ai-deployer -p
  mc policy set download minio-local/ai-deployer

  #下载ai-deployer离线文件
  #创建子bucket
  OBJECTS=$(mc ls minio/ai-deployer/ -r|awk '{print $5}')
  for object in $OBJECTS
  do
    if [[ $object =~ / ]];then
      SUB_BUCKET=${object%%/*}
      mc mb minio-local/ai-deployer/$SUB_BUCKET -p
    fi
  done
  #下载离线包并上传至本地minio仓库
  for object in $OBJECTS
  do
    logger info "正在下载 $object 离线包"
    curl -C- -O --retry 3 "$MINIO_URL/ai-deployer/$object"
    if [[ $object =~ / ]];then
      filename=${object##*/}
      logger info "正在上传 $object 离线包"
      mc cp $filename minio-local/ai-deployer/$object
      rm -f $filename
    else
      filename=$object
      logger info "正在上传 $object 离线包"
      mc cp $filename minio-local/ai-deployer/$object
      rm -f $filename
    fi
  done
  
  logger info "本地minio仓库制作完成,地址为http://$MINIO_IP:$MINIO_PORT"
}

function main() {
  mkdir -p /opt/kube/bin "$BASE/down" "$BASE/bin" /data
  MINIO_USER=$1
  MINIO_PASSWORD=$2

  [ "$#" -gt 0 ] || { usage >&2; exit 2; }

  download_docker
  install_docker
  install_minio
  get_packages
}
main "$@"

