#!/usr/bin/env bash

# program : redis_docker_start.sh
#  author : wangqijia@youzan.com
#    date : 2020-05-20
# version : 0.0.0.1


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

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

# display usage
function usage() {
echo "
usage: ${0}

    -h : help
         Prints the ${0} help
    -s : shutdown local redis 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，Docker CE 17.03及以上版本！"
    fi
}

 
SHUTDOWN_FLAG=0

# the main function
function main() {

    while getopts "hs" ARG
    do
        case ${ARG} in
            h)
                usage
                exit
            ;;
	    s)
		SHUTDOWN_FLAG=1
	    ;;
        esac
    done

    docker_install

    if [ $SHUTDOWN_FLAG -eq 1 ]; then
	docker ps | grep "yz-redis"
    	if [ $? -eq 0 ]; then
	    docker stop yz-redis
	    echo "redis组件容器服务已停止"
	else
	    echo "redis组件容器尚未启动"
	fi
	exit 0
    fi
   
    #安装redis组件容器
    echo "准备本地启动redis容器服务实例！"
    
    #检查本地redis镜像已存在
    docker images | grep hub-mirror.c.163.com/library/redis | grep 3.2
    if [ $? -ne 0 ]; then
        exit_on_err 1 "redis 3.2本地镜像不存在，请先下载镜像。"
    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"
    echo "redis连接信息：host主机:localhost，端口:6379"

}

main "${@}"
