#!/bin/bash
set +x

G_INSPECT_MMLPATH="/opt/huawei/snas/script/inspect_mml"
source $G_INSPECT_MMLPATH/CheckItems
source $G_INSPECT_MMLPATH/CheckRoCE
CurInspectNum="155"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="/tmp/tmpResult${CurInspectFun}"
if [ -L "$RESULTFILE" ]; then
    rm -f "$RESULTFILE"
fi
>"${RESULTFILE}"
LOG_FILE="/var/log/inspect.log"
CM_DB="/opt/huawei/snas/etc/cm_swm_conf.db"

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

# 交换机的PFC配置检查
function CheckRoCEPfcCfg()
{
    local isPass=3
    LOG "[$FUNCNAME][${LINENO}]CheckRoCEPfcCfg start!"
    ROCE_LIST=$(GetRoCECardNum)
    RoCENum=$?

    if [ ${RoCENum} -eq 0 ];then
        # 后端不是ROCE，返回“不涉及”
        LOG "[$FUNCNAME][${LINENO}]There is no RoCE on the node, so 'not involve'."
        echo "INFO:Node is without RoCE card, is not involved." >> "${RESULTFILE}" 2>&1
        return ${isPass}
    fi

    # 正常情况后端都是2个网卡，所以记录2个结果
    for portname in $(sort -u <<< "$ROCE_LIST" || echo "${ROCE_LIST}")
    do
        PhyPortName="${portname//\.[1-9]/}"
        ret=0
        LswPortInfo=$(/opt/huawei/snas/script/health_check/snas_get_lswinfo_snmp.sh "${PhyPortName}")
        if [ $? -eq 0 ];then
            # 如果获得LswPortInfo，那么说明该设备已经具备检查条件，那么我们预期必须包含pfc配置，否则返回“不通过”。
            LOG "[${LINENO}]LswPortInfo=${LswPortInfo}"
            echo "${LswPortInfo}" | grep 'PfcQueueId4=1' >/dev/null 2>&1
            if [ $? -ne 0 ];then
                isPass=$(check_pass $isPass 1)
                LOG "[${LINENO}]No PFC configuration!"
                echo  "[ERR]INFO:PFC is not configured on ${PhyPortName}." >> "${RESULTFILE}" 2>&1
            else
                isPass=$(check_pass $isPass 0)
                echo "INFO: ${PhyPortName} PFC is configured." >> "${RESULTFILE}" 2>&1
            fi
        fi
    done

    #如果没有获得LswPortInfo，那么说明该局点没有配置通过SNMP监控交换机，不具备检查条件, 只能返回不涉及
    if [ ${isPass} -eq 3 ]; then
        echo "INFO:Checking PFC requires SNMP. Please configure." >> "${RESULTFILE}" 2>&1
    fi

    return ${isPass}
}


function main()
{
    local isPass=3
    local retPfcChk=0
    local checkPFCPass=3

    #用交换机Id的来区分多个交换机
    local switchIdArray=$(/usr/bin/sqlite3 "${CM_DB}" "select szSwId from CM_SWM_T")
    if [ -z "${switchIdArray}" ]; then
        LOG "[$FUNCNAME][${LINENO}]no switch info!"
        echo "INFO:No switch info." >> "${RESULTFILE}" 2>&1
        echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1
        return
    fi

    local tmpswitchInfo=""
    for switchId in $switchIdArray
    do
        local switchInfo=$(/usr/bin/sqlite3 "${CM_DB}" "select szSwDscrpt from CM_SWM_T where szSwId=${switchId}"|grep Version|awk -F '(' '{print $3}'|awk -F ' ' '{print $1}')
        local version=$(/usr/bin/sqlite3 "${CM_DB}" "select szSwDscrpt from CM_SWM_T where szSwId=${switchId}"|grep Version|awk -F '(' '{print $3}'|awk -F ' ' '{print $2}'|awk -F ')' '{print $1}')
        if [ -z "${switchInfo}" -o -z "${version}" ]; then
            continue
        fi
        #检查交换机的型号，“所有”交换机都是 FM6857/FM6865/CE6810/CE6855/CE6857/CE6865/CE8861 交换机才检查PFC，出现其他型号返回不涉及
        if [[ "${switchInfo}" =~ "CE6810" ]] || \
           [[ "${switchInfo}" =~ "CE6855" ]] || \
           [[ "${switchInfo}" =~ "CE6857" ]] || \
           [[ "${switchInfo}" =~ "CE6865" ]] || \
           [[ "${switchInfo}" =~ "CE8861" ]] || \
           [[ "${switchInfo}" =~ "FM6857" ]] || \
           [[ "${switchInfo}" =~ "FM6865" ]]; then
            local tmpPfcChk=0
        else
            retPfcChk=$((${retPfcChk} + 1))
            tmpswitchInfo="${switchInfo}"
            break
        fi

    done
    #“所有”交换机都能识别，检查PFC
    if [ ${retPfcChk} -eq 0 ]; then
        CheckRoCEPfcCfg
        checkPFCPass=$?
        isPass=$(check_pass $isPass ${checkPFCPass})
    else
        echo "INFO:${tmpswitchInfo} is not FM6857/FM6865/CE6810/CE6855/CE6857/CE6865/CE8861 switch, no need to check PFC." >>${RESULTFILE} 2>&1
    fi


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

main

exit 0