#!/bin/sh
set +x
G_MML_FILE_PATH="/opt/huawei/snas/script/inspect_mml"
source $G_MML_FILE_PATH/CheckItems
source /opt/node_type_recognize.sh > /dev/null 2>&1
CurInspectNum="115"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="${G_TMP_INSPECT_PATH}tmpResult${CurInspectFun}"
isPass=0
product_name=$( dmidecode -t 1 | grep "Product Name:" | awk -F: '{print $2}' | sed 's/^\s*//;s/\s*$//' )

>${RESULTFILE}

checkV5nvdimmfwver()
{
    local fwver_V24="V2.4"
    local fwver_V26="V2.6"
    local speed=2666

    NvdimmFwVer=$(/usr/local/nvdimm/nvdimm getfwver 2>/dev/null | grep "The FW Version" | awk -F: '{print $2}' | sed "s/ //g")
    if [[ -z "${NvdimmFwVer}" ]]; then
        LOG "[$LINENO]failed to get nvdimm firmware version by cmd:/usr/local/nvdimm/nvdimm getfwver."
        echo "[ERR]INFO:failed to get nvdimm firmware version by cmd(/usr/local/nvdimm/nvdimm getfwver)" >> ${RESULTFILE}
        isPass=1
    fi

    #  firmware 汾 2.4ýż
    if [ X"${NvdimmFwVer}" != X"${fwver_V24}" ]; then
        LOG "[$LINENO]nvdimm firmware version is:${NvdimmFwVer},not ${fwver_V24},no need to check."
        return
    fi

    # ȡNvdimmƵ
    NvdimmSpeed=$(dmidecode -t17 | grep "Synchronous Non-Volatile" -C 5 | grep "Speed:" | awk -F " " '{print$2}')
    if [[ -z "${NvdimmSpeed}" ]]; then
        LOG "[$LINENO]failed to get nvdimm firmware speed by cmd:dmidecode -t17 | grep \"Synchronous Non-Volatile\" -C 5 | grep \"Speed:\"."
        echo "[ERR]INFO:failed to get nvdimm firmware version by cmd(dmidecode -t17)" >> ${RESULTFILE}
        isPass=1
    fi

    #  speed  2666ýż
    if [ X"${NvdimmSpeed}" != X"${speed}" ]; then
        LOG "[$LINENO]nvdimm firmware speed is:${NvdimmSpeed},not ${speed} MHZ,no need to check."
        return
    fi

    # firmware 汾 2.4  speed  2666 => Ѳ첻ͨ
    echo "[ERR]INFO:Version of firmware is 2.4 and speed is 2666HZ" >> ${RESULTFILE}
    isPass=1
    # ȡֵnvdimmļڵֵ
    expiringThreshold=$( /usr/local/nvdimm/nvdimm readsmbus fpga 0 0 152 2>/dev/null | awk '{print $NF}' | sed "s/ //g" | awk -F. '{print $1}' )
    if [ X"${expiringThreshold}" == X"" ]; then
        LOG "[$LINENO]failed to get nvdimm expiring threshold by cmd:/usr/local/nvdimm/nvdimm readsmbus fpga 0 0 152."
        EstimatedAlarmTime="failed to get nvdimm expiring threshold by cmd(/usr/local/nvdimm/nvdimm readsmbus fpga 0 0 152)"
    fi
        
    expiringThreshold=$( printf "%d" ${expiringThreshold} )
    # ȡnvdimmʣֵ
    remainLife=$(/usr/local/nvdimm/nvdimm readsmbus fpga 0 0 192 2>/dev/null | awk '{print $NF}' | sed "s/ //g" | awk -F. '{print $1}' )
    if [ X"${remainLife}" == X"" ]; then
        LOG "[$LINENO]failed to get nvdimm remain life time by cmd:/usr/local/nvdimm/nvdimm readsmbus fpga 0 0 192."
        EstimatedAlarmTime="failed to get nvdimm remain life time by cmd(/usr/local/nvdimm/nvdimm readsmbus fpga 0 0 192)"
    fi

    remainLife=$( printf "%d" ${remainLife} )

    # remainLifeexpiringThresholdnvdimmĳʱָ澯Ԥ
    if [ ${remainLife} -gt ${expiringThreshold} ]; then
        EstimatedAlarmTime=$( echo "(${remainLife} - ${expiringThreshold})  * 5 * 12 / 100" | bc )"(Months)"
    # remainLifeСexpiringThresholdnvdimm澯ȻѾˣѲûиԤıҪ
    else
        EstimatedAlarmTime='v5 nvdimm firmware warning has been issued'
    fi


    return
}

main()
{
    local UVPFlag=0
    local isARMNode=0
    local tmpNvfile="${G_TMP_INSPECT_PATH}nvtmpfile$$"
    local tmpInfo=""
    NvdimmFwVer='---'
    NvdimmSpeed='---'
    EstimatedAlarmTime='---'
    #UVP漰
    IsStandardNode
    UVPFlag=$?

    IsTSNode
    isARMNode=$?


    #ARMnvdimm
    if [ ${isARMNode} -eq 0 ] || [ ${UVPFlag} -eq 0 ];then
        echo "NVDIMM NAME:Do not involve(ARM).||NVDIMM_STATUS:--||SAVE MODE:--||CAP TEMPERATUER(centigrade):--||CAP PRESENCE:--||FLASH_STATUS:--||CAP FULL CHARGE:--||CAP LIFE END:--||HardwareType:${product_name}||NvdimmFwVer:--||NvdimmSpeed:--||EstimatedAlarmTime:--" >> ${RESULTFILE}
        echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
        LOG "[$LINENO]no need to check."
        return 0
    fi

    IsRHV5Node
    isRhV5=$?

    if [ ${isRhV5} -ne 0 ]; then
        LOG "[$LINENO]The server hardware type is not V5(${product_name}),no need to check firmware."
        product_name="The server hardware type is not V5(${product_name}),no need to check firmware."
    else
        checkV5nvdimmfwver
    fi

    #ȡnvdimmϢ
    $G_MML_FILE_PATH/nvdimm_status_record > ${tmpNvfile}
    tmpInfo=$(cat ${tmpNvfile} | grep "NO NVDIMM FOUND")
    if [ "${tmpInfo}X" != "X" ];then
        isPass=1
        echo "[ERR]INFO:There is no Nvdimm." >> ${RESULTFILE}
        echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
        return 0

    fi

    tmpInfo=$(cat ${tmpNvfile} | grep "some wrong during Recording NVDIMM Status")
    if [ "${tmpInfo}X" != "X" ];then
        isPass=1
        echo "[ERR]INFO:Get Nvdimm Info Fail from command(/opt/product/snas/script/inspect_mml/nvdimm_status_record)." >> ${RESULTFILE}
        echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
        #
        tmpInfo=$(cat ${tmpNvfile})
        LOG "[$LINENO]info:${tmpInfo}"
        return 0
    fi

    #ȡnvdimmĸ
    set_ifs
    Nvdimm_NUM=`cat ${tmpNvfile} | grep "There are" | grep "found under system" |  awk '{print $3}'`
    if [ "$Nvdimm_NUM" -le 0 ];then
        isPass=1
        echo "[ERR]INFO:The number of Nvdimm is $Nvdimm_NUM." >> ${RESULTFILE}
        echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
        #
        tmpInfo=$(cat ${tmpNvfile})
        LOG "[$LINENO]info:${tmpInfo}"
        restore_ifs
        return 0
    fi

    #ѭʾnvdimmϢ
    index=1
    while [[ "$index" -le "$Nvdimm_NUM" ]]
    do
        #ȡNAME
        NVDIMM_NAME=`cat ${tmpNvfile} | grep "NVDIMM NAME" | awk NR==$index | awk '{print $3}'`

        #ȡģʽ
        SAVE_MODE=`cat ${tmpNvfile} | grep "SAVE MODE" | awk NR==$index | awk '{print $3}'`

        #ȡ¶
        TEMPERATUER=`cat ${tmpNvfile} | grep "CAP TEMPERATUER" | awk NR==$index | awk '{print $3}'`

        #ȡǷλ
        PRESENCE=`cat ${tmpNvfile} | grep "CAP PRESENCE" | awk NR==$index | awk '{print $3}'`

        #FLASH״̬
        FLASH_STATUS=`cat ${tmpNvfile} | grep "FLASH STATUS OK" | awk NR==$index | awk '{print $3}'| awk -F: '{print $2}'`

        #Ƿ
        FULL_CHARGE=`cat ${tmpNvfile} | grep "CAP FULL CHARGE" | awk NR==$index | awk '{print $4}'`

        #Ƿﵽʹ
        LIFE_END=`cat ${tmpNvfile} | grep "CAP LIFE END" | awk NR==$index | awk '{print $3}' | awk -F: '{print $2}'`

        if [ "$SAVE_MODE" != "CKE_MODE" ] || [ "$TEMPERATUER" -gt "60" ] || [ "$PRESENCE" != "TRUE" ] || 
           [ "$FLASH_STATUS" != "TRUE" ] || [ "$FULL_CHARGE" != "TRUE" ] || [ "$LIFE_END" != "FALSE" ]; then
            NVDIMM_STAT="FAULT"
            isPass=1
            echo "[ERR]INFO:The status of $NVDIMM_NAME is FAULT." >> ${RESULTFILE}
        else
            NVDIMM_STAT="NORMAL"
        fi

        Result="NVDIMM NAME:$NVDIMM_NAME||NVDIMM_STATUS:$NVDIMM_STAT||SAVE MODE:$SAVE_MODE||CAP TEMPERATUER(centigrade):$TEMPERATUER||CAP PRESENCE:$PRESENCE||FLASH_STATUS:$FLASH_STATUS||CAP FULL CHARGE:$FULL_CHARGE||CAP LIFE END:$LIFE_END||HardwareType:${product_name}||NvdimmFwVer:${NvdimmFwVer}||NvdimmSpeed:${NvdimmSpeed}||EstimatedAlarmTime:${EstimatedAlarmTime}"
        LOG "[$LINENO]:Result:$Result"
        echo "${Result}" >> ${RESULTFILE}

        #һѭ
        index=$((index + 1 ))
    done
    restore_ifs

    [ -f ${tmpNvfile} ] && rm -rf ${tmpNvfile}
    echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
}

main
exit 0
