#!/bin/bash
set +x
G_MML_FILE_PATH="/opt/huawei/snas/script/inspect_mml"
G_SCRIPT_PATH="/opt/inspect"
source $G_MML_FILE_PATH/CheckItems
CurInspectNum="116"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="/tmp/tmpResult${CurInspectFun}"
LOG_FILE="/var/log/inspect.log"
LOCAL_BACK_IP=""
. /opt/node_type_recognize.sh
source $G_MML_FILE_PATH/CommonFunc.sh
>${RESULTFILE}

isPass=0

function LOG
{
   time=$(date)
   echo [${time}][$$][${CurInspectFun}]$@ >> ${LOG_FILE}
}

#ÿڵECCϢ
function checkEcc_result()
{
    local isOK=0
    local ip="$1"
    local info="$2"
    local Result=""
    local uiDiMMCnt=0
    local uiLine=0
    local uiErrCount=0
    local uiLoop=0

    LOG "[$LINENO]ecc info:$info"
    if [ "${info}X" = "X" ];then
        #ʾ
        echo "Node:${ip}||INFO:No Ecc errors" >> ${RESULTFILE}
        return 0
    fi

    # get DIMM countȡDIMMĸ
    uiDiMMCnt=`echo "${info}" | grep "DIMM" | wc -l`
    LOG "[$LINENO]bit ecc Dimm num:$uiDiMMCnt"

    #parse 
    Result="INFO:bit ecc is ok"
    while [ $uiLoop -lt $uiDiMMCnt ]; do
        uiLine=`echo "5+$uiLoop*8"|bc`
        LOG "[$LINENO]bit ecc: $uiLoop,line: $uiLine"

        uiErrCount=`echo "$info" | awk NR==$uiLine| awk '{print $1}'`
        LOG "[$LINENO]bit ecc:out $uiErrCount"

        #threshold ֵΪ 25K
        if [ $uiErrCount -gt 25000 ];then
            isOK=1
            Result="INFO:bit ecc is too much"
        fi

        #uiLoop++ ȡһ
        uiLoop=$((uiLoop+1))
    done
    if [ $isOK -eq 1 ];then
        echo "[ERR]Node:$ip||${Result}" >> ${RESULTFILE}
    else
        echo "Node:$ip||${Result}" >> ${RESULTFILE}
    fi

    #ݽϸϢӡ
    Result=""
    set_ifs
    echo "Node: ||INFO:--------------detail--------------" >> ${RESULTFILE}
    for line in $info; do
        Result="INFO:${line}"
        echo "Node: ||${Result}" >> ${RESULTFILE}
    done

    restore_ifs
    return $isOK
}

function checkT3000()
{
    local cmdInfo=""
    cmdInfo=$(mcelog --client)
    if [ $? -ne 0 ];then
        isPass=1
        echo "[ERR]Node:${LOCAL_BACK_IP}||INFO:Failed to execute command(mcelog --client)" >>${RESULTFILE}
        return
    fi
    checkEcc_result "${LOCAL_BACK_IP}" "${cmdInfo}"
    if [ $? -ne 0 ]; then
        isPass=1
    fi
    return
}

function checkRHV5()
{
    local cmdInfo=""
    local iret=0
    local EccVal=0
    local slot=""
    local status=0
    cmdInfo=$(ipmitool sensor | grep "^DIMM")
    iret=$?
    if [ ${iret} -ne 0 ];then
        isPass=1
        echo "[ERR]Node:${LOCAL_BACK_IP}||INFO:Can not get DIMM information from command(ipmitool sensor)" >>${RESULTFILE}
        return
    fi
    set_ifs
    for line in ${cmdInfo}; do
        EccVal=$(echo "${line}" |  awk -F'|' '{gsub(/^ *| *$/,"",$4);print $4}')
        #ȡ13bitλֵ1ʾECC
        status=$[${EccVal} >>13 & 0x0001]
        if [ ${status} -eq 1 ];then
            isPass=1
            slot=$(echo "${line}" |  awk -F'|' '{gsub(/^ *| *$/,"",$1);print $1}')
            echo "[ERR]Node:${LOCAL_BACK_IP}||INFO:${slot} has ECC error." >> ${RESULTFILE}
        fi
    done
    if [ ${isPass} -eq 0 ];then
        echo "Node:${LOCAL_BACK_IP}||INFO:No Ecc errors" >> ${RESULTFILE}
    fi
    restore_ifs
}

function main()
{
    local isTs=0
    local isV5=0

    LOCAL_BACK_IP=`GetLocalIp`
    if [ "${LOCAL_BACK_IP}X" == "X" ];then
        echo "[ERR]Node:$(hostname)||INFO:Can't get backend IP." >> ${RESULTFILE} 2>&1
        isPass=1
        return
    fi

    IsTSNode
    isTs=$?
    IsRHV5Node
    isV5=$?

    if [ ${isTs} -eq 0 -o ${isV5} -eq 0 ];then
        checkRHV5
    else
        checkT3000
    fi
    return
}

main
echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}
exit 0