#!/usr/bin/env bash

# program : install_docker_server.sh
#  author : wangqijia@youzan.com
#    date : 2020-02-06
# version : 0.0.0.1


# exit shell with err_code
# $1 : err_code
# $2 : err_msg

INSTALL_MYSQL_FLAG=0
INSTALL_REDIS_FLAG=0

exit_on_err()
{
    [[ ! -z "${2}" ]] && echo "${2}" 1>&2
    exit ${1}
}

# display usage
function usage() {
echo "
usage: ${0} [h][a][m][r]

    -h : help
         Prints the ${0} help
    -a : all
         Install all component docker instances
    -m : mysql 
         Install mysql docker instance
    -r : redis
         Install redis docker instance
"
}

function version_ge() {
    test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"
}

function docker_install(){
    MIN_DOCKER_VERSION="17.03"

    echo "检查Docker......"
    DOCKER_VERSION_STR=`docker -v`

    if [ $? -eq 0 ]; then
        echo "检查到Docker本地已安装！"
        DOCKER_VERSION=`echo $DOCKER_VERSION_STR | grep -Eo '([0-9]+\.){1,2}[0-9]+'`
        if version_ge $DOCKER_VERSION $MIN_DOCKER_VERSION; then
            echo "当前Docker版本$DOCKER_VERSION, 检查Docker版本OK！"
        else
            exit_on_err 1 "当前Docker版本$DOCKER_VERSION, 请安装Docker CE 17.03及以上版本！"
        fi
    else
        exit_on_err 1 "请先安装Docker，安装指引请参考xxx"
    fi
}

 

# the main function
function main() {

    while getopts "hamr" ARG
    do
        case ${ARG} in
            h)
                usage
                exit
            ;;
            a)
                INSTALL_MYSQL_FLAG=1
                INSTALL_REDIS_FLAG=1
            ;;
            m)
                INSTALL_MYSQL_FLAG=1
            ;;
            r)
                INSTALL_REDIS_FLAG=1
            ;;
        esac
    done

    docker_install

    #安装mysql组件容器
    if [ $INSTALL_MYSQL_FLAG -eq 1 ]; then
        echo "准备本地安装mysql容器服务实例！"
        #拉取mysql镜像
        docker pull hub-mirror.c.163.com/library/mysql:5.6
        if [ $? -eq 0 ]; then
            echo "拉取mysql 5.6镜像成功！"
        else
            exit_on_err 1 "拉取mysql镜像失败，请检查网络连接并启用docker镜像加速功能，详见文档xxx。"
        fi

        #检查mysql容器服务是否已启动
        docker ps | grep "yz-mysql"
        if [ $? -eq 0 ]; then
            echo "mysql组件容器服务已启动！"
        else
            #检查mysql容器是否已创建
            docker ps -a | grep "yz-mysql"
            if [ $? -eq 0 ]; then
                echo "mysql组件容器服务已创建，尚未启动！"
		docker start yz-mysql
                if [ $? -eq 0 ]; then
                    echo "mysql组件容器服务重新启动成功！"
                else
                    exit_on_err 1 "mysql组件容器启动失败！"
                fi
            else
                #创建并启动mysql组件容器
                echo "准备创建并启动mysql组件容器服务..."
                docker run -d --name yz-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub-mirror.c.163.com/library/mysql:5.6
                if [ $? -eq 0 ]; then
                    echo "创建并启动mysql组件容器成功！！！"
                else
                    exit_on_err 1 "mysql组件容器创建并启动失败！"
                fi

            fi
        fi

        echo "检查mysql容器是否成功..."
        sleep 10
        
	count=0
        max_count=6
        while [ 1 ]
        do
            docker exec -t `docker inspect -f '{{.Id}}' yz-mysql` mysql -h localhost -uroot -p123456 -e "show databases;"
            if [ $? -eq 0 ]; then
                echo "mysql容器服务检测OK！！！"
                break
            fi
            sleep 3
            count=`expr $count + 1`
            if [ $count -eq $max_count ];then
                exit_on_err 1 "mysql组件服务检测失败！！"
            fi
        done

	#创建测试库yztest
	docker exec -t `docker inspect -f '{{.Id}}' yz-mysql` mysql -h localhost -uroot -p123456 -e "Create Database If Not Exists yztest Character Set UTF8;"
	if [ $? -eq 0 ]; then
	    echo "创建测试数据库yztest成功！！"
	else
	    exit_on_err 1 "创建测试数据库yztest失败！！"
	fi

        #输出mysql启动信息
        echo "mysql  Ver 14.14 Distrib 5.6.47"
        echo "mysql连接信息：host主机:localhost，端口:3306，密码：123456"
        echo "连接串: mysql -h localhost -uroot -p123456"
    fi

    #安装redis组件容器
    if [ $INSTALL_REDIS_FLAG -eq 1 ]; then
        echo "准备本地安装redis容器服务实例！"
        #拉取redis镜像
        docker pull hub-mirror.c.163.com/library/redis:3.2
        if [ $? -eq 0 ]; then
            echo "拉取redis 3.2镜像成功！"
        else
            exit_on_err 1 "拉取redis镜像失败，请检查网络连接并启用docker镜像加速功能，详见文档xxx。"
        fi

        #检查redis容器服务是否已启动
        docker ps | grep "yz-redis"
        if [ $? -eq 0 ]; then
            echo "redis组件容器服务已启动！"
        else
            #检查mysql容器是否已创建
            docker ps -a | grep "yz-redis"
            if [ $? -eq 0 ]; then
                echo "redis组件容器服务已创建，尚未启动！"
		docker start yz-redis
                if [ $? -eq 0 ]; then
                    echo "redis组件容器服务重新启动成功！"
                else
                    exit_on_err 1 "redis组件容器启动失败！"
                fi
            else
                #创建并启动redis组件容器
                echo "准备创建并启动redis组件容器服务..."
                    docker run -d -p 6379:6379  --name yz-redis hub-mirror.c.163.com/library/redis:3.2 redis-server --appendonly yes        
                if [ $? -eq 0 ]; then
                    echo "创建并启动redis组件容器成功！！！"
                else
                    exit_on_err 1 "redis组件容器创建并启动失败！"
                fi

            fi
        fi

        echo "检查redis容器是否成功..."
        sleep 10
        
	idx=0
	max_retry=6
	while [ 1 ]
	do
            local PING_RESPONSE=`docker exec -t \`docker inspect -f '{{.Id}}' yz-redis\` redis-cli ping`
            if [ $? -eq 0 ] && [ ${PING_RESPONSE:0:4} == "PONG" ]; then
            	echo "redis容器服务检测OK！！！"
		break
            fi
	    sleep 3
	    idx=`expr $idx + 1`
	    if [ $idx -eq $max_retry ];then
            	exit_on_err 1 "redis组件服务检测失败！！"
	    fi
        done

         #输出redis启动信息
        echo "redis 3.2.12"
        echo "redis连接信息：host主机:localhost，端口:6379"
    fi
}

main "${@}"
