#!/bin/env bash
##Description: run sqlfile or sql stmt

function f_syntax
{
    [ ! -z "$1" ] && echo ">>[$(date "+%Y%m%d.%H%M%S")] $1"
    echo " "
    echo "ksh ${ShellName}  [-clsname <clsname>] [-hostname <hostname>]"
    echo "  [-ip <ip>] [-port <port>] [-user <user>] [-passwd <passwd>]  "
    echo "  [-stmt <select ...>] "
    echo "  [-sqlfile <select.txt>] "
    echo "  [-run -check]"
    echo " "
    echo " #sample:"
    echo " #sh ${ShellName} -primaryip 172.16.xxx -primaryport 4100 -primaryuser abcuser1 -primarypasswd xxx -standbyip 172.16.xxx -standbyport 4000 -standbyuser abcuser1 -standbypasswd xxx -checkdatabase hersonsdb1,ts_coms  "
    exit 22
}

function f_PrintLog
{
    _LogFlag=$(echo "$1"|tr "a-z" "A-Z")
    [ $(echo "$1"|wc -L) -eq 4 ] && _LogFlag=$(echo "${_LogFlag}_")
    _LogMessage=$2
    declare LogFile="${LogFile:-"/tmp/${PShellName:-${ShellName}}.log"}"
    touch "${LogFile}" 2>/dev/null
    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
}


###############################################################################
##Init##
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
LogFile="${LogDir}/${ShellName}.$(date "+%Y%m%d.%H%M%S").log";LogLevel=3;
touch "${LogFile}" 2>/dev/null;chmod ugo+rw "${LogFile}" 2>/dev/null
declare Shellcksum=$(cksum ${WorkDir%/}/${ShellName} 2>/dev/null|awk '{printf "%d",$1}')
declare -i UserID=$(id -u);declare UserName=$(whoami);declare HostName=$(hostname);
###############################################################################
##Get inopt
[ -z "${ShellOption}" ] && f_syntax;
for inopt in ${ShellOption}
do
    case $(echo $inopt|tr a-z A-Z) in
    -HOSTNAME|-HOST) CurOpt="-HOSTNAME";continue;;
    -CLSNAME|-C) CurOpt="-CLSNAME";continue;;
    -PRIMARYIP) CurOpt="-PRIMARYIP";continue;;
    -PRIMARYPORT) CurOpt="-PRIMARYPORT";continue;;
    -PRIMARYUSER) CurOpt="-PRIMARYUSER";continue;;
    -PRIMARYPASSWORD|-PRIMARYPASSWD) CurOpt="-PRIMARYPASSWORD";continue;;
    -STANDBYIP) CurOpt="-STANDBYIP";continue;;
    -STANDBYPORT) CurOpt="-STANDBYPORT";continue;;
    -STANDBYUSER) CurOpt="-STANDBYUSER";continue;;
    -STANDBYPASSWORD|-STANDBYPASSWD) CurOpt="-STANDBYPASSWORD";continue;;
    -CHECKDATABASE) CurOpt="-CHECKDATABASE";continue;;
    -HELP|--HELP|-H) f_syntax;;
    -*) CurOpt="";continue;;
    esac
    case "${CurOpt}" in
    -HOSTNAME) declare LocalHost="${inopt}";continue;;
    -CLSNAME) declare LocalCluster="${inopt}";continue;;
    -IGNOREUSERS) declare ignoreusers=$(echo "${ignoreusers} ${inopt}");continue;;
    -PRIMARYIP) declare p_ip="${inopt}";continue;;
    -PRIMARYPORT) declare p_port="${inopt}";continue;;
    -PRIMARYUSER) declare p_user="${inopt}";continue;;
    -PRIMARYPASSWORD) declare p_passwd="${inopt}";continue;;
    -STANDBYIP) declare s_ip="${inopt}";continue;;
    -STANDBYPORT) declare s_port="${inopt}";continue;;
    -STANDBYUSER) declare s_user="${inopt}";continue;;
    -STANDBYPASSWORD) declare s_passwd="${inopt}";continue;;
    -CHECKDATABASE) declare checkdbs="${inopt}";continue;;
    esac
done

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

function f_generateconfig
{
    f_PrintLog "Info" "Start to run f_generateconfig."
    echo "${p_ip}" "${p_port}" "${p_user}" "${p_passwd}"  "${s_ip}" "${s_port}" "${s_user}" "${s_passwd}" "${checkdbs}" "${file_suffix}"
    file_suffix=$1
python -c "
import sys,time

args = sys.argv
primary_ip = args[1]
primary_port = args[2]
primary_user = args[3]
primary_passwd = args[4]
standby_ip = args[5]
standby_port = args[6]
standby_user = args[7]
standby_passwd = args[8]
file_suffix = args[9]
check_tabs = args[10]

tabs_lst = check_tabs.split(',')
tabs2_lst = []
for tab in tabs_lst:
    if '.' not in tab:
        tab = tab + '.*'
    tabs2_lst.append('\"%s\"' %(tab) )
checktabs_str = ','.join(tabs2_lst)

config_text = '''
# Sync Diff Configuration.
######################### Global config #########################
check-thread-count = 4
export-fix-sql = true
check-struct-only = false

######################### Tables config #########################
[data-sources]
[data-sources.tidb_primary] 
    host = '%s'
    port = %s
    user = '%s'
    password = '%s'

[data-sources.tidb_slave]
    host = '%s'
    port = %s
    user = '%s'
    password = '%s'

[task]
    source-instances = ['tidb_primary']
    target-instance = 'tidb_slave'
    target-check-tables = [%s]
    output-dir = './syncdiff_output_%s'
''' % (primary_ip, primary_port, primary_user, primary_passwd,  standby_ip, standby_port, standby_user, standby_passwd, checktabs_str, file_suffix)

config_file='./conf/syndiff_%s.toml' %(file_suffix)

with open(config_file, mode='w') as f:
     f.write(config_text)
" "${p_ip}" "${p_port}" "${p_user}" "${p_passwd}"  "${s_ip}" "${s_port}" "${s_user}" "${s_passwd}" "${file_suffix}" "${checkdbs}" 
    
    f_PrintLog "Info" "run sync diff f_generateconfig finished, pls check ${syncdiff_config}"
    ls -l ${syncdiff_config:-1}
    cat ${syncdiff_config:-1}
}

function f_runsyncdiff
{
    f_PrintLog "Info" "Start to run f_runsyncdiff."
    configfile=$1
    syncdiffpath=$2

    f_PrintLog "Info" "Start to run syncdiff. ${syncdiffpath}/sync_diff_inspector --config ${configfile}"
    ${syncdiffpath}/sync_diff_inspector --config ${configfile}
    return $?
}

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

# syncdiff_config="./syndiff_1.toml"
syncdiff_path="/home/tidb/toolkit/tidb-community-toolkit-v6.1.0-linux-amd64"
file_suffix=$(date "+%Y%m%d.%H%M%S")
syncdiff_config="./conf/syndiff_${file_suffix}.toml"
output_dir="./syncdiff_output_${file_suffix}"
mkdir conf

f_generateconfig "${file_suffix}"
f_runsyncdiff "${syncdiff_config}" "${syncdiff_path}" 
_rt_code=$?

[ -f "${output_dir}/summary.txt" ] && tail -20 ${output_dir}/summary.txt

if [ ${_rt_code} -eq 0 ]
then
    f_PrintLog "Info" "f_runsyncdiff finish, pls check summary log at ${output_dir}/summary.txt !"    
else
    f_PrintLog "Error" "f_runsyncdiff failed, return ${_rt_code}, pls check summary log at ${output_dir}/summary.txt !!!"
    exit 1
fi
