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

. /opt/node_type_recognize.sh
ofedConfigPath="/opt/driver/ib-driver"
ROCE_LIST=""
IB_LIST=""
OFED_VER=""

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

#获取OFED版本
function GetOFEDVersion()
{
    local ofedVersion=""
    ofedVersion=$(ofed_info -s | grep MLNX_OFED_LINUX | awk -F "-" '{print $2}')
    if [ "${ofedVersion}X" != "X" ];then
        echo "${ofedVersion}"
    else
        echo "NULL"
    fi
}

#检查RoCE卡匹配关系
function CheckRoceorIBFirmware()
{
    local mstInfo="$1"
    local idx=""
    local netType=""
    local netName=""
    local curfwVersion=""
    local tmpCardtype=""
    local flintInfo=""
    local businfo=""
    local tmpPSID=""
    local tmpinfo=""
    local linkinfo=""
    local iret=0
    local baseGUID=""
    local isRHV5=0

    IsRHV5Node
    if [ $? -eq 0 ]; then
        isRHV5=1
    fi

    for idx in ${ROCE_IB_LIST[@]}; do
        #获取网口名字，businfo
        tmpinfo=$(echo "${mstInfo}" | grep -A1 "${idx}" | grep "bus:dev.fn" | awk '{print $1}' | awk -F'=' '{print $2}')
        businfo=$(echo "${tmpinfo}" | awk -F':' '{print $2 ":" $3}')
        linkinfo=$(find /sys/class/net -maxdepth 1 -type l -exec readlink -e {} \; | grep "${tmpinfo}" | head -1)
        netName=$(basename ${linkinfo})

        #获取当前网卡固件版本与PSID
        flintInfo=$(flint -d ${idx} q 2>&1)
        if [ $? -ne 0 ];then
            ErrInfoCommon "INFO:BDF (${businfo}) NetName (${netName}). Get network adapter information failed." "${RESULTFILE}"
            isPass=1
            LOG "[${LINENO}] Get network adapter information failed,idx=[${idx}],businfo:${businfo},netName:${netName},flintInfo=[${flintInfo}]"
            continue
        fi
        curfwVersion=$(echo "${flintInfo}" | grep "FW Version:" | awk '{print $NF}')
        tmpPSID=$(echo "${flintInfo}" | grep PSID | awk '{print $NF}')
        baseGUID=$(echo "${flintInfo}" | grep '^Base GUID' | awk '{print $3}')

        #获取网卡类型，PSID为HUA0010110034的网卡做特殊处理，看实际工作是在10g,还是25g，其他类型的依据配置文件获取
        if [ "${tmpPSID}" == "HUA0010110034" ];then
            tmpinfo=$(ethtool "${netName}" 2>&1)
            iret=$?
            tmpCardtype=$(echo "${tmpinfo}" | grep "Speed:" | awk '{gsub("Mb/s","",$2);printf "%d",$2/1000}')
            if [ $? -eq 0 ] && [ "${tmpCardtype}" == "10" -o "${tmpCardtype}" == "25" ];then
                netType="${tmpCardtype}g RoCE(V3)"
            else
                netType="10g RoCE(V3)"
                LOG "[${LINENO}] actual speed ${tmpCardtype}, ethtool ${netName} return ${iret}"
            fi
        elif [ "${tmpPSID}" == "HUA0000000001" ];then
            #此卡为外购卡没有配套关系，不需要检查
            echo "Type:(${tmpPSID})No need to check||BDF:--||NetName:--||OFED_Version:--||Firmware_Version:--||BaseGUID:--" >>${RESULTFILE}
            LOG "[${LINENO}] skip it,idx=[${idx}],PSID:${tmpPSID}"
            continue
        elif [ "${tmpPSID}" == "HUA0000000023" ];then
            # mlx的RoCE卡-25g RoCE(V5)，已投到4.4使用，配置文件未更新，巡检规避
            netType=$(cat ${ofedConfigPath}/ofed*.conf|grep ";${tmpPSID};"| grep -v '^#' | head -1 |awk -F';' '{print $1}')
            echo "Type:${netType}||BDF:${businfo}||NetName:${netName}||OFED_Version:${OFED_VER}||Firmware_Version:${curfwVersion}||BaseGUID:${baseGUID}" >>${RESULTFILE}
            continue
        else
            netType=$(grep ";${tmpPSID};" "${ofedConfigPath}/ofed${OFED_VER}.conf" 2>&1 | grep -v '^#' | head -1 |awk -F';' '{print $1}')
            if [ "${netType}X" == "X" ];then
                ErrInfoCommon "INFO:BDF (${businfo}) NetName (${netName}). get network adapter type failed." "${RESULTFILE}"
                isPass=1
                LOG "[${LINENO}] cannot recognize the type of card,idx=[${idx}],PSID:${tmpPSID}"
                continue
            fi
        fi

        #拼接字符串(网卡类型;网卡PSID;网卡固件版本;OFED版本)
        tmpinfo="${netType};${tmpPSID};${curfwVersion};${OFED_VER}"
        #在配套表格中查询
        cat "${ofedConfigPath}/ofed${OFED_VER}.conf" | grep -v "^#" | grep "${tmpinfo}" >/dev/null
        iret=$?
        #判断是否与配置文件中固件配套关系匹配
        if [ ${iret} -ne 0 ];then
            isPass=1
            ErrInfoCommon "INFO:Type (${netType}) BDF (${businfo}) NetName (${netName}). The OFED (${OFED_VER}) version does not match the network adapter firmware version (${curfwVersion})." "${RESULTFILE}"
        fi

        if [ ${isRHV5} -eq 1 ] && [[ "${idx}" =~ mt4117_pciconf ]] && [ "${baseGUID}" = "N/A" ]; then
            isPass=1
            ErrInfoCommon "INFO:Type (${netType}) BDF (${businfo}) NetName (${netName}). The Base GUID is N/A." "${RESULTFILE}"
        fi

        echo "Type:${netType}||BDF:${businfo}||NetName:${netName}||OFED_Version:${OFED_VER}||Firmware_Version:${curfwVersion}||BaseGUID:${baseGUID}" >>${RESULTFILE}
        LOG "[${LINENO}]tmpPSID:${tmpPSID},Type:${netType},BDF:${businfo},NetName:${netName},OFED_Version:${OFED_VER},Firmware_Version:${curfwVersion},iret=[${iret}]."
    done

    return 0
}

function CheckVersion()
{
    local ofedVersion=""
    local mstinfo=""
    local iret=0
    local IsRoceFlag=0
    local IsIBFlag=0

    IsC72Node
    isC72=$?
    if [ "${isC72}" = 0 ];then
        echo "Type:Does not involve(C72)||BDF:--||NetName:--||OFED_Version:--||Firmware_Version:--||BaseGUID:--" >>${RESULTFILE}
        return 0
    fi

    mst start >/dev/null
    iret=$?
    if [ ${iret} -ne 0 ]; then
        ErrInfoCommon "INFO:Execute command (mst start) failed!" "${RESULTFILE}"
        isPass=1
        LOG "[${LINENO}]mst start exec failed,iret=$iret."
        return 1
    fi

    #列出当前系统设备上的ROCE与IB卡对应的MST设备
    mstinfo=$(mst status)
    iret=$?
    if [ ${iret} -ne 0 ]; then
        ErrInfoCommon "INFO:Execute command (mst status) failed!" "${RESULTFILE}"
        isPass=1
        LOG "[${LINENO}]mst status exec failed,iret=$iret."
        return 1
    fi

    ROCE_IB_LIST=$(echo "${mstinfo}" | grep -E "mt4117_pciconf|mt4099_pci_|mt4115_pciconf|mt4119_pciconf" | awk '{print $1}')
    if [ -z "${ROCE_IB_LIST}" ] ; then
        echo "Type:No IB/RoCE network||BDF:--||NetName:--||OFED_Version:--||Firmware_Version:--||BaseGUID:--"  >>${RESULTFILE}
        LOG "[${LINENO}]No check is required because no IB/RoCE network adapter exists."
        return 0
    fi

    #获取OFED版本号
    OFED_VER="$(GetOFEDVersion)"
    ofedVersion="${OFED_VER}"
    if [ "${ofedVersion}" = "NULL" ];then
        echo "[ERR]INFO:Get ofed version failed." >>${RESULTFILE}
        isPass=1
        LOG "[$LINENO]get ofed version error"
        return 1
    fi

    #检查配置文件是否存在
    if [ ! -f "${ofedConfigPath}/ofed${OFED_VER}.conf" ];then
        ErrInfoCommon "INFO:Get network adapter information failed." "${RESULTFILE}"
        isPass=1
        LOG "[${LINENO}]Get Congfig file(${ofedConfigPath}/ofed${OFED_VER}.conf) failed"
        return 1
    fi

    CheckRoceorIBFirmware "${mstinfo}"

    return 0
}

#入口函数
LOG "[$LINENO]start check network adapter."
CheckVersion
echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}
LOG "[LINENO]End check network adapter."
exit 0
