#!/bin/bash
set +x

G_INSPECT_MMLPATH="/opt/huawei/snas/script/inspect_mml"
source $G_INSPECT_MMLPATH/CheckItems
CurInspectNum="338"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="${G_TMP_INSPECT_PATH}tmpResult${CurInspectFun}"
>${RESULTFILE}
isPass=0
LOGFILE="/var/log/inspect.log"

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

function set_ifs
{
    IFS_OLD=$IFS
    IFS=$'\n'
}

function restore_ifs
{
    IFS=$IFS_OLD
}

function checkNofsWrMagnify()
{
    local snasmessage_file="${G_TMP_INSPECT_PATH}snasmessage_nofs_value"
    local poollist=""
    local poolname=""
    local apiLineCnt=0
    local IOTlineCnt=0
    local pool_NofsWio_file="${G_TMP_INSPECT_PATH}nofs_wio"
    local pool_nofsApiIo_file="${G_TMP_INSPECT_PATH}nofs_api_io"
    local writeMagnify=0

    obsfile=$( ls /var/log/backup/DFS_OBS/DFS_OBS.log.* |tail -1 )
    if [ X"${obsfile}" == X"" ]; then
        LOG "[$LINENO]failed to excute command:ls /var/log/backup/DFS_OBS/DFS_OBS.log.* |tail -1."
        echo "[ERR]INFO:failed to get DFS_OBS.log." >>${RESULTFILE} 2>&1
        isPass=1
        return
    fi

    poollist=$( /opt/huawei/snas/sbin/nofs-snas listpool 2>/dev/null |grep ^P |awk '{print $1}' |tr '\n' ' ' )
    LOG "listpool result:${poollist}"

    # 筛选数据，只获取NOFS_PrintApi和NOFS_IOT的数据
    zcat ${obsfile} |grep -a NOFS_PrintApi |grep -a meta >${snasmessage_file}_Api
    zcat ${obsfile} |grep -a NOFS_IOT >>${snasmessage_file}_IOT

    # 只能串行，对现网局点CPU和内存情况不清楚的情况下，尽量少去抢占，不能影响到正常业务。
    for poolname in ${poollist}
    do
        if [ X"${poolname}" == X"" ]; then
            continue
        fi
        poolWioSum=0
        poolApiIoSum=0

        >${pool_NofsWio_file}
        >${pool_nofsApiIo_file}

        # 一个小时NOFS_IOT和NOFS_PrintApi理论上来说是36条，那么半小时，理论值是18条
        cat ${snasmessage_file}_Api |grep -aw ${poolname} |tail -18 >${pool_nofsApiIo_file}
        cat ${snasmessage_file}_IOT |grep -aw ${poolname} |tail -18 >${pool_NofsWio_file}
        apiLineCnt=$( cat ${pool_nofsApiIo_file} |wc -l )
        IOTlineCnt=$( cat ${pool_NofsWio_file} |wc -l )
        if [ ${apiLineCnt} -ne ${IOTlineCnt} -o ${IOTlineCnt} -eq 0 ]; then
            continue
        fi

        # 计算当前磁盘wio的数据总和
        while read line
        do
            if [ X"${line}" == X"" ]; then
                continue
            fi

            wioVar=$( echo "$line" |awk -F "${poolname}:" '{print $2}' |awk -F/ '{print $6}' )
            poolWioSum=$( expr $poolWioSum + ${wioVar} )
        done <${pool_NofsWio_file}

        # 计算当前磁盘api io的数据总和
        while read line
        do
            if [ X"${line}" == X"" ]; then
                continue
            fi

            apiIoVar=$( echo "$line" |awk '{print $11}' |awk -F/ 'BEGIN {sum=0} {for (i=1;i<=NF;i++)sum+=$i;print $i}END{print sum}' )
            poolApiIoSum=$( expr $poolApiIoSum + ${apiIoVar} )
        done <${pool_nofsApiIo_file}

        if [ X"${poolApiIoSum}" == X"0" ]; then
            LOG "[$LINENO]ERR:poolApiIoSum:${poolApiIoSum},poolWioSum:${poolWioSum}."
            continue
        fi

        # 如果打印信息每次ApiIoPerTime 不大于500条，直接通过
        ApiIoPerTime=$( expr ${poolApiIoSum} / ${apiLineCnt} )
        iRet=$?
        if [ ${iRet} -ne 0 -o ${ApiIoPerTime} -lt 500 ]; then
            LOG "[$LINENO]ERR:ApiIoPerTime:${ApiIoPerTime},expr return:${iRet}."
            continue
        fi

        # 磁盘NOFS放大写的算法为A = poolWioSum / poolApiIoSum,如果poolApiIoSum大于500，且A>=10，建议优化
        writeMagnify=$( echo "${poolWioSum}*100/${poolApiIoSum}"|bc )
        if [ ${writeMagnify} -ge 1000 ]; then
            isPass=4
            echo "poolname:${poolname}||poolWioSum:${poolWioSum}||poolApiIoSum:${poolApiIoSum}||Wio/apiIO:${writeMagnify}%" >>${RESULTFILE} 2>&1
        fi
    done

    cat ${RESULTFILE} |grep "poolname" >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "poolname:all||poolWioSum:--||poolApiIoSum:--||Wio/apiIO:ok" >>${RESULTFILE} 2>&1
    fi

    [ -f "${pool_nofsApiIo_file}" ] && rm -f "${pool_nofsApiIo_file}"
    [ -f "${pool_NofsWio_file}" ] && rm -f "${pool_NofsWio_file}"
    rm -f "${snasmessage_file}*"

    return
}

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