#!/bin/bash
set +x

G_INSPECT_MMLPATH="/opt/huawei/snas/script/inspect_mml"
source $G_INSPECT_MMLPATH/CheckItems
CurInspectNum="340"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="/tmp/tmpResult${CurInspectFun}"
>${RESULTFILE}

CHECK_PASSED=0
CHECK_FAILED=1
isPass=0
LOGFILE="/var/log/inspect.log"
product_name=$( dmidecode -t 1 | grep "Product Name:" | awk -F: '{print $2}' | sed 's/^\s*//;s/\s*$//' )

function LOG()
{
    echo [${time}][$$][$CurInspectFun]$@ >> $LOGFILE
}

function IsRHV5Node()
{
    if [ "$product_name"X = "2288H V5"X -o "$product_name"X = "2288 V5"X -o "$product_name"X = "5288 V5"X -o "$product_name"X = "R521G10"X -o "$product_name"X = "RS221G1"X -o "$product_name"X = "2288X V5"X -o "$product_name"X = "5288X V5"X -o "$product_name"X = "DP4200"X -o "$product_name"X = "DP2200"X ] || [[ "$product_name" =~ "NW8220X" ]]; then
        return 0
    else
        return 1
    fi
}

function checkV5NvdimmFirmware()
{
    local isRhV5=0
    local isRH=0
    local checkPhase="${1}"
    local fwver_V24="V2.4"
    local fwver_V26="V2.6"
    local speed=2666   #λΪMHZ

    IsRHV5Node
    isRhV5=$?

    if [ ${isRhV5} -ne 0 ]; then
        LOG "[$LINENO]The server hardware type is not V5(${product_name}),no need to check."
        echo "HardwareType:${product_name}||NvdimmFwVer:--||NvdimmSpeed:--||EstimatedAlarmTime:--" >> ${RESULTFILE} 2>&1
        return
    fi

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

    if [ X"${NvdimmFwVer}" != X"${fwver_V24}" ]; then
        LOG "[$LINENO]nvdimm firmware version is:${NvdimmFwVer},not ${fwver_V24},no need to check."
        echo "HardwareType:${product_name}||NvdimmFwVer:${NvdimmFwVer}||NvdimmSpeed:--||EstimatedAlarmTime:--" >> ${RESULTFILE} 2>&1
        return
    fi

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

    if [ X"${NvdimmSpeed}" != X"${speed}" ]; then
        LOG "[$LINENO]nvdimm firmware speed is:${NvdimmSpeed},not ${speed} MHZ,no need to check."
        echo "HardwareType:${product_name}||NvdimmFwVer:${NvdimmFwVer}||NvdimmSpeed:${NvdimmSpeed}||EstimatedAlarmTime:--" >> ${RESULTFILE} 2>&1
        return
    fi

    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)"
        echo "[ERR]INFO:HardwareType:${product_name}||NvdimmFwVer:${NvdimmFwVer}||NvdimmSpeed:${NvdimmSpeed}||EstimatedAlarmTime:${EstimatedAlarmTime}">> ${RESULTFILE} 2>&1
        return
    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)"
        echo "[ERR]INFO:HardwareType:${product_name}||NvdimmFwVer:${NvdimmFwVer}||NvdimmSpeed:${NvdimmSpeed}||EstimatedAlarmTime:${EstimatedAlarmTime}" >> ${RESULTFILE} 2>&1
        return
    fi

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

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

    return
}

checkV5NvdimmFirmware $*
echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1

exit 0