#!/bin/env bash
#5_tidb_create_mgruser.sh

# 1. 使用root用户连接数据库
# 2. 创建默认数据库用户并附权
# 3. 配置免密登陆

function f_syntax
{
    [ ! -z "$1" ] && echo ">>[$(date "+%Y%m%d.%H%M%S")] $1"
    echo " "
    echo "Syntax:"
    echo "bash ${ShellName} "
    echo "-cluster <n-prd> "
    echo " "
    echo " #Description:"
    echo " -cluster ,the tidb cluster name"
    echo " "
    echo " #sample:"
    echo " #sh ${ShellName} -cluster n-prd " 
    echo " "
    exit 22
}

function f_PrintLog
{
    _LogFlag=$(echo "$1"|tr "a-z" "A-Z")
    _LogMessage=$2
    [ $(echo "$1"|wc -L) -eq 4 ] && _LogFlag=$(echo "${_LogFlag}_")
    
    if [ -w "${LogFile}" ]
    then
        echo "$(date "+%Y%m%d.%H%M%S"):[${_LogFlag}]:${UserName}@${HostName}:${2}" | tee -a ${LogFile}
    else
        echo "$(date "+%Y%m%d.%H%M%S"):[${_LogFlag}]:${UserName}@${HostName}:${2}"
    fi

    [ "${_LogFlag}" = "ERROR" ] && exit 11 || return 0
}

###############################################################################


function f_runsql
{
    _connstr=$1
    _user=$2
    _pswd=$3
    _stmt=$4
    f_PrintLog "Info" "START TO RUN SQL STMT:${_stmt}, DBinfo:${_connstr}, User:${_user}"
    runSTMT=$(mysql ${_connstr} -u${_user} -p${_pswd} -NBe "${_stmt}" )
    _rt_code=$?
    if [ $_rt_code -ne 0 ]
    then
        f_PrintLog "Error" "Run stmt failed, exit"
        exit 1
    else
        echo ${runSTMT}
    fi
}

function f_crete_mgr_user
{
    f_PrintLog "Debug" "Start to run function f_tidb"
    _connstr=$1
    _user=$2
    _pswd=$3
    
    # create user and grant
    userlist=$(mysql ${_connstr} -u${_user} -p${_pswd} -NBe "select group_concat(user separator ',') from mysql.user;")
    f_PrintLog "Info" "User already created in database: ${userlist}!"

    if [ $(echo "${userlist}"| grep -w "tidb") ]
    then
        f_PrintLog "Info" "User tidb already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user tidb@'%' identified by '${DB_MYDBA_PASSWD}'"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "grant all privileges on *.* to tidb@'%' with grant option"
        f_test_connect "${_connstr}" "tidb" "${DB_MYDBA_PASSWD}"
    fi

    if [ $(echo "${userlist}"| grep -w "timon") ]
    then
        f_PrintLog "Info" "User timon already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user timon@'%' identified by '${DB_MYMON_PASSWD}'"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT SELECT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'timon'@'%'"
        f_test_connect "${_connstr}" "timon" "${DB_MYMON_PASSWD}"
    fi

    if [ $(echo "${userlist}"| grep -w "dsg") ]
    then
        f_PrintLog "Info" "User dsg already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user dsg@'%' identified by 'Dsg_1234'"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT SELECT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO 'dsg'@'%'"
        f_test_connect "${_connstr}" "dsg" "Dsg_1234"
    fi

    if [ $(echo "${userlist}"| grep -w "repl") ]
    then
        f_PrintLog "Info" "User repl already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user 'repl'@'%' identified by '${DB_MYREPL_PASSWD}'"
        if [ "${harole}" = "STANDBY" ]
        then
            f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT Select,Insert,Update,Delete,Create,Drop,Alter,Execute,Index ON *.* TO 'repl'@'%'"
        else
            f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT Select ON *.* TO 'repl'@'%'"
        fi
        f_test_connect "${_connstr}" "repl" "${DB_MYREPL_PASSWD}"
    fi

    if [ $(echo "${userlist}"| grep -w "applaud") ]
    then
        f_PrintLog "Info" "User applaud already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user 'applaud'@'${tidb_ip_grp}%' identified by '${DB_APPLAUD_PASSWD}'"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT Select ON *.* TO 'applaud'@'${tidb_ip_grp}%'"
        # f_test_connect "${_connstr}" "applaud" "${DB_APPLAUD_PASSWD}"
    fi

    if [ $(echo "${userlist}"| grep -w "nftsa") ]
    then
        f_PrintLog "Info" "User nftsa already create, skip!"
    else
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create database if not exists nftsa"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "create user 'nftsa'@'${tidb_ip_grp}%' identified by '${DB_NFTSA_PASSWD}'"
        f_runsql "${_connstr}" "${_user}" "${_pswd:-123}" "GRANT ALL PRIVILEGES ON nftsa.* TO 'nftsa'@'${tidb_ip_grp}%'"
        # f_test_connect "${_connstr}" "nftsa" "${DB_NFTSA_PASSWD}"
    fi

    f_PrintLog "Info" "select user,host,authentication_string from mysql.user"
    mysql ${_connstr} -u${_user} -p${_pswd} -e "select user,host,authentication_string from mysql.user"
}

function f_test_connect
{
    f_PrintLog "Debug" "Start to run function f_test_connect"
    local _connstr=$1
    local _user=$2
    local _pswd=$3

    local _stmt="select user()"
    f_PrintLog "Info" "START TO RUN SQL STMT:${_stmt}, DBinfo:${_connstr}, User:${_user}"
    runSTMT=$(mysql ${_connstr} -u${_user} -p${_pswd} -NBe "${_stmt}")
    local _rt_code=$?
    if [ ${_rt_code} -eq 0 -a "${runSTMT%@*}" = "${_user}" ]
    then
        f_PrintLog "Succ" "Connect db successfully, connect user:${runSTMT}."
    else
        f_PrintLog "Error" "Connect db failed, stmt return:${runSTMT}."
        exit 1
    fi
}

function f_set_loginpath
{
    f_PrintLog "Debug" "Start to run function f_set_loginpath"
    expect -c "
        spawn su -  $1 -c \"mysql_config_editor set --login-path=$4 -u$2 -h127.0.0.1 -P4900 -p --skip-warn\"
        expect -nocase \"Enter password:\" {send \"$3\r\"}
        interact
        "

    su - $1 -c "mysql_config_editor print --all"
    loginpath=$(su - $1 -c "mysql_config_editor print --all" | grep $4 | wc -l)
    loginuser=$(su - $1 -c "mysql --login-path=$4 -NBe \"select user()\"")
    if [ ${loginpath} -eq 1 -a "${loginuser%@*}" = "$2" ]
    then
        f_PrintLog "Succ" "Set login-path $4 successfully, connect user ${loginuser}"
    else
        f_PrintLog "Error" "Set login-path $4 failed, connect user ${loginuser}!!!"
        exit 1
    fi
}

###############################################################################
##Init##
export LANG=en_US
ShellName="$(echo $0|awk -F / '{print $NF}')";ShellOption="$@";
WorkDir="$(echo $0|sed s/${ShellName}//g)";[ -z "${WorkDir}" ] && WorkDir=${PWD};cd ${WorkDir};WorkDir=${PWD}
LogDir="${WorkDir}/logs";mkdir -p ${LogDir};chmod ugo+rwx ${LogDir} 2>/dev/null;
RunTs=$(date "+%Y%m%d.%H%M%S")
LogFile="${LogDir}/${ShellName}.${RunTs}.log";
touch ${LogFile} 2>/dev/null;chmod ugo+rw "${LogFile}" 2>/dev/null;
Shellcksum=$(cksum ${WorkDir%/}/${ShellName} 2>/dev/null|awk '{printf "%d",$1}')
CpuHardware=$(uname -m);CpuType=$(uname -p);OSType=$(uname -s)
declare -i UserID=$(id -u);declare UserName=$(whoami);declare HostName=$(hostname);
###############################################################################
##TiDB Var##
INSTALL_USER=""
TidbHome=$(awk -F: -v un="tidb" '{if($1==un){print $6;exit}}' /etc/passwd 2>/dev/null)
###############################################################################
###############################################################################
##Get inopt
# [ -z "${ShellOption}" ] && f_syntax;
for inopt in ${ShellOption}
do
    case $(echo $inopt|tr a-z A-Z) in
    -CLUSTER|-CLS) CurOpt="-CLUSTER";continue;;
    -HELP|--HELP|-H) f_syntax;;
    -*) CurOpt="";continue;;
    esac
    case "${CurOpt}" in
    -CLUSTER) declare clsname="${inopt}";continue;;
    esac
done

f_PrintLog "Info" "Start to run Script ${ShellName}, the Shellcksum is ${Shellcksum}"
f_PrintLog "Info" "Script Options:${ShellOption}"

###############################################################################
####Main####

function mgr_user_main
{
    # HA role: primary or standby 

    if [ ${UserID} -eq 0 ]
    then
        # run with tidb
        f_PrintLog "Debug" "su tidb -c sh ${WorkDir}/${ShellName} \"${ShellOption}\""
        su tidb -c "sh ${WorkDir}/${ShellName} ${ShellOption}" || exit $?
    elif [ "${UserName}" = "tidb" ]
    then
        # use tidb user
        source ${TidbHome}/.bash_profile
        DB_MYROOT_PASSWD=`echo "" |base64 -d`
        DB_MYDBA_PASSWD=`echo "" |base64 -d`
        DB_MYMON_PASSWD=`echo "" |base64 -d`
        DB_MYREPL_PASSWD=`echo "" |base64 -d`
        DB_APPLAUD_PASSWD=`echo "" |base64 -d`
        DB_NFTSA_PASSWD=`echo "" |base64 -d`

        # check cluster name 
        # if [ -z "${clsname}" ]
        # then
        #     tidb_ip="127.0.0.1"
        #     tidb_port="4000"
        #     clsName=$(tiup cluster list 2>/dev/null|awk '{if($3~"v" && $4~"tiup"){printf "%s\n",$1;exit}}') 
        #     f_PrintLog "Info" "Not get valid cluster or connect info, use default connect info ${tidb_ip}:${tidb_port}"
        # else
        # clsName=$(tiup cluster list 2>/dev/null|awk -v cn="${clsname}"  '{if($1==cn){printf "%s\n",$1;exit}}') 

        clsName=$(tiup cluster list 2>/dev/null|awk '{if($3~"v" && $4~"tiup"){printf "%s\n",$1;exit}}') 
        if [ -n "${clsName}" ]
        then
            tiup cluster display ${clsName}
        else
            f_PrintLog "Error"  "Cluster ${clsName} not exist, quit!"
            tiup cluster list
            exit 1
        fi

        tidb_id=$(tiup cluster display ${clsName} 2>/dev/null|awk '{if($2=="tidb")printf "%s ",$1}')
        tidb_ip="127.0.0.1"
        tidb_port="4900"
        tidb_ip_grp=${tidb_id%%.*}

        f_PrintLog "Info" "Get connect info from cluster, use connect info ${tidb_ip}:${tidb_port}"
        

        # [ $(echo "${clsName}"| grep "slave") ] && harole="STANDBY" || harole="PRIMARY"
        [ "${TidbHome:2:1}" = "1" ] && harole="PRIMARY" || harole="STANDBY"

        tidb_connstr="-h${tidb_ip} -P${tidb_port}"
        
        f_test_connect "${tidb_connstr}" "root" "${DB_MYROOT_PASSWD}"
        f_crete_mgr_user "${tidb_connstr}" "root" "${DB_MYROOT_PASSWD}"

    else
        f_PrintLog "Error" "Pls run script with user root or tidb, exit!!!"
    fi

    f_PrintLog "Succ" "Run function create_mgr_user_main finish!"
}

function set_loginpath_main
{
    # run with root
    if [ ${UserID} -eq 0 ]
    then
        DB_MYDBA_PASSWD=`echo "" |base64 -d`
        DB_MYMON_PASSWD=`echo "" |base64 -d`

        f_set_loginpath tidb tidb ${DB_MYDBA_PASSWD} tidgin
        f_set_loginpath tidb timon ${DB_MYMON_PASSWD} timogin
        f_set_loginpath sfmon timon ${DB_MYMON_PASSWD} timgin

        echo "alias ='mysql --login-path=-A'" >> ~tidb/.bash_profile
        echo "alias ='mysql --login-path=-A'" >> ~tidb/.bash_profile
        echo "alias ='mysql --login-path=-A'" >> ~sfmon/.bash_profile
    else
        f_PrintLog "Warn" "Pls run function with root user!"
        return 0
    fi

    f_PrintLog "Succ" "Run function set_loginpath_main finish!"

}


mgr_user_main
set_loginpath_main
