#!/bin/bash
set +x
G_INSPECT_MMLPATH="/opt/product/snas/script/inspect_mml"
source "${G_INSPECT_MMLPATH}/CheckItems"
curInspectNum="327"
curInspectFun="$(GetInspectType $curInspectNum)"
resultFile="/tmp/tmpResult${curInspectFun}"
>"${resultFile}"

function CheckCCDBDBConsistency()
{
    local dbfile=""
    local version=""
    local item=""

    dbfile=$([ -d "/opt/product/etc/ccdb/" ] && find /opt/product/etc/ccdb/ -type f | grep -vP '\-wal|\-shm|\.log|/ccdb_export/')
    if [ $? -eq 0 ] && [ "${dbfile}" != "" ];then
        for item in ${dbfile};do
            version=$(sqlite3 $item "select version from db_snapshot_version_tbl;")
            version=${version:-0}
            echo "$item $version"  >>${resultFile} 2>&1
        done
    else
        echo "No CCDB database file"  >>${resultFile} 2>&1
    fi
}

function CheckIfCcdbMasterSwitchOver()
{
    local ccdbMasterIp=""
    local ccdbEpoch=""
    local ccdbNewMasterIp=""
    local ccdbNewEpoch=""

    if [ ! -f "/proc/monc_ccdbmap" ]; then
        echo "Epoch: /proc/monc_ccdbmap is nonexist." >>${resultFile} 2>&1
        return
    fi

    ccdbEpoch=$( cat /proc/monc_ccdbmap | grep Epoch | awk -F: '{print $2}' | sed "s/^ *//g" | sed "s/ *$//g" )
    ccdbMasterIp=$( cat /proc/monc_ccdbmap | grep "Role: 0" | awk '{print $NF}' | sed "s/^ *//g" | sed "s/ *$//g" )
    if [ X"${ccdbEpoch}" == X"" -o X"${ccdbMasterIp}" == X"" ]; then
        echo "Epoch: faild to get epoch(${ccdbEpoch}) or ccdbmasterip(${ccdbMasterIp}) from /proc/monc_ccdbmap." >>${resultFile} 2>&1
        return
    fi

    sleep 60

    if [ ! -f "/proc/monc_ccdbmap" ]; then
        echo "Epoch: /proc/monc_ccdbmap is nonexist." >>${resultFile} 2>&1
        return
    fi

    ccdbNewEpoch=$( cat /proc/monc_ccdbmap | grep Epoch | awk -F: '{print $2}' | sed "s/^ *//g" | sed "s/ *$//g" )
    ccdbNewMasterIp=$( cat /proc/monc_ccdbmap | grep "Role: 0" | awk '{print $NF}' | sed "s/^ *//g" | sed "s/ *$//g" )
    if [ X"${ccdbNewEpoch}" == X"" -o X"${ccdbNewMasterIp}" == X"" ]; then
        echo "Epoch: faild to get epoch(${ccdbNewEpoch}) or ccdbmasterip(${ccdbNewMasterIp}) from /proc/monc_ccdbmap.." >>${resultFile} 2>&1
        return
    fi

    if [ ${ccdbEpoch} != ${ccdbNewEpoch} -a ${ccdbMasterIp} != ${ccdbNewMasterIp} ]; then
        echo "Epoch: The CCDB master node may be switching frequently.Epoch(${ccdbEpoch} --> ${ccdbNewEpoch}),ccdbMasterIp(${ccdbMasterIp} --> ${ccdbNewMasterIp})." >>${resultFile} 2>&1
        return
    fi

    return
}

function GetCcdbPaxosVersion()
{
    local dlm_path_name=$(ls /opt/huawei/etc/ccdb/ | grep "DLM" | awk -F ' ' '{print $NF}')
    local dlm_path="/opt/huawei/etc/ccdb/${dlm_path_name}"
    local dlm_paxos_list=$(ls ${dlm_path}/paxos_DLMDB_*magic.log)
    local max_version=0
    local min_check_node=""

    for each_line in ${dlm_paxos_list}
    do
        local paxos_version=$(echo "$each_line" | awk -F ' ' '{print $NF}' | awk -F '_' '{print $NF}' | awk -F '-' '{print $1}')
        if [ ${max_version} -lt ${paxos_version} ]; then
            max_version=${paxos_version}
        fi
    done

    echo "${max_version}"

    return
}

function GetCcdbSlaveNode()
{
    local ccdbSlaveNodeIp=""
    local nodeId=""
    local master_nodeid=$( cat /proc/monc_ccdbmap | grep "Role: 0" | awk -F ',' '{print $1}' |awk -F ' ' '{print $2}' )
    local ccdb_slave_node_list=""
    local min_nodeid=1000000
    local min_node_ip=""
    local min_check_node=""
    local version=""

    while read line
    do
        echo "${line}" | grep -q "^NodeId: "
        if [ $? -ne 0 ]; then
            continue
        fi

        echo "${line}" | grep -q "Role: 0"
        if [ $? -eq 0 ]; then
            continue
        fi

        ccdbSlaveNodeIp=$( echo "${line}" | awk '{print $NF}' | sed "s/^ *//g" | sed "s/ *$//g" )
        nodeId=$(echo "$line" | awk -F ',' '{print $1}' |awk -F ' ' '{print $2}')
        if [ ${master_nodeid} -gt ${nodeId} ]; then
            ccdb_slave_node_list="${ccdb_slave_node_list} ${ccdbSlaveNodeIp}"
        fi

        if [ ${master_nodeid} -lt ${nodeId} ]; then
            if [ ${nodeId} -lt ${min_nodeid} ]; then
                min_nodeid=${nodeId}
                min_node_ip="${ccdbSlaveNodeIp}"
            fi
        fi

    done </proc/monc_ccdbmap

    if [ X"${ccdb_slave_node_list}" == X"" ]; then
        ccdb_slave_node_list="${min_node_ip}"
    fi

    for item in "${ccdb_slave_node_list}"
    do
        ifconfig | grep -wq ${item}
        if [ $? -eq 0 ]; then
            version=$(GetCcdbPaxosVersion)

            # ݿеİ汾Ÿ󡣲ͳơݿ⵱ǰڱͳơ
            dbver=$( sqlite3 /opt/huawei/etc/ccdb/DLMDB_0/DLMDB --batch "select * from db_snapshot_version_tbl;" | awk -F "|" '{print $1}' )
            if [ X"${dbver}" == X"" -o  ${dbver} -gt ${version} ];then
                continue
            fi
            echo "paxos_version:ccdbslave:${version}" >>${resultFile} 2>&1
        fi
    done
}

function getCcdbMasterNodeSlaveNodeVersion()
{
    local ccdbMasterNodeIp=""
    local version=""

    # liteڵ㲻ô
    get_cluster_lite_deploy
    if [ $? -eq 0 ];then
        return
    fi

    # ccdbmasterڵ
    ccdbMasterNodeIp=$( cat /proc/monc_ccdbmap | grep "Role: 0" | awk '{print $NF}' | sed "s/^ *//g" | sed "s/ *$//g" )
    ifconfig | grep -wq ${ccdbMasterNodeIp}
    if [ $? -eq 0 ]; then
        version=$(GetCcdbPaxosVersion)
        echo "paxos_version:ccdbmaster:${version}" >>${resultFile} 2>&1
    else
        GetCcdbSlaveNode
    fi
}

CheckCCDBDBConsistency

# CCDB飺1ʹcat /proc/monc_ccdbmap鿴Epochţ2ȴ1ӣִв13Epoch仯CCDBƵҪccdbͬ²鿴
CheckIfCcdbMasterSwitchOver

# 7.1.1SPC1ȶccdbڵ汾ڵڱڵ汾pass
getCcdbMasterNodeSlaveNodeVersion