#!/bin/bash
#此脚本实现制作ubuntu20.04本地源功能,请配置以下5个参数并执行该脚本.镜像目录为/var/spool/apt-mirror,请确保/var/spool/有350G以上的存储空间

#工作目录,ai-deployer源码实际所在路径
BASE=/opt/ai-deployer
#本地源IP地址
REPO_IP=127.0.0.1
#本地源端口
REPO_PORT=38088
#AI平台本地镜像仓库的IP地址
HARBOR_NODE_IP=127.0.0.1
###使用域名部署可以解决主机IP变更时需要修改镜像仓库地址的问题,如果不使用域名可以将此参数的值配置为IP地址
HARBOR_DOMAIN=registry.local
###如果镜像仓库需要供局域网外部访问,需要配置为镜像仓库节点的外部IP,如无需要则配置成内网IP即可
HARBOR_EXTERNAL_DOMAIN=127.0.0.1

#AI平台本地镜像仓库的端口
HARBOR_NODE_PORT=38080

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



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() {
  logger debug "正在下载docker"
  /bin/cp -f "./docker-$DOCKER_VER.tgz" "$BASE/down"

  tar zxf "$BASE/down/docker-$DOCKER_VER.tgz" -C "$BASE/down" && \
  /bin/cp -f "$BASE"/down/docker/* "$BASE/bin" && \
  /bin/cp -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__external__domain__", "__registry__local__domain__", "__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__external__domain__/$HARBOR_EXTERNAL_DOMAIN:$HARBOR_NODE_PORT/g" "/etc/docker/daemon.json"
    sed -i "s/__registry__local__domain__/$HARBOR_DOMAIN:$HARBOR_NODE_PORT/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 get_mirrors() {
  logger info "正在解压本地源文件"
  tar zxf ./apt-mirror.tar.gz -C /var/spool
}


function make_repo() {
  apache_status=$(docker ps -a|grep ubuntu20.04-repo)
  if [[ $apache_status =~ ubuntu20.04-repo ]];then
    logger info "本地源已启动"
  else
    logger debug "正在导入本地源服务器镜像"
    /opt/kube/bin/docker load < ubuntu-repo-docker-image.tar
    logger info "正在启动本地源"
    /opt/kube/bin/docker run -itd --name=ubuntu20.04-repo --restart=always -p $REPO_PORT:80 -v /var/spool/apt-mirror/mirror/mirrors.aliyun.com:/usr/local/apache2/htdocs httpd:2.4
    logger info "本地源已制作完成,地址为$REPO_IP:$REPO_PORT/ubuntu"
  fi
}

function main() {
  mkdir -p /opt/kube/bin "$BASE/down" "$BASE/bin"
  echo "$HARBOR_NODE_IP $HARBOR_DOMAIN" >> /etc/hosts
  download_docker
  install_docker
  get_mirrors
  make_repo
}
main "$@"


