#!/bin/bash
set +x

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

CHECK_PASSED=0
CHECK_FAILED=1
isPass=${CHECK_PASSED}

LOGFILE="/var/log/inspect.log"
NOFS_MOS_OBJECT_BEGIN=0
NOFS_MOS_OBJECT_END=7

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

# 检查非SMR盘，mos空间占比情况
function checkNofsMosObjectUsage()
{
    local poolname=""
    local listmemberinfo_f=""
    local result=""
    local loop=0
    local mosObject_prefix=/var/tmp/disk_nofs_mos_objext_
    local mos_object_ind=""
    local tmpfile=""
    local str=""
    local str_piect=""
    local disk_nofs_usage=0
    local freechuntcnt=0
    local isSmrFlag=0

    # 判断当前节点是SMR节点
    /opt/huawei/snas/sbin/nofs-snas dumpzoneleft |grep -v "NAME" |grep -w "^P.*" >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        isSmrFlag=1
    fi
    
    rm -f /var/tmp/nofs_pool_listmemberinfo*
    for pool in $( /opt/huawei/snas/sbin/nofs-snas listpool | awk '{print $1}' | grep P )
    do
        disk_nofs_usage=0
        freechuntcnt=0
        str="poolName:${pool}||(ObjType ChunkCount Sum Percent):"
        result=$( /opt/huawei/snas/sbin/nofs-snas listdiskmemberinfo ${pool} 2>/dev/null )
        if [ $? -ne 0 ]; then
            LOG "[$LINENO]failed to excute command:/opt/huawei/snas/sbin/nofs-snas listdiskmemberinfo ${pool}"
            continue
        fi

        listmemberinfo_f=$( echo "${result}" | awk -F 'file' '{print $2}' | sed -e "s/ *//g" -e "s/ *$//g" )
        if [ ! -f "${listmemberinfo_f}" -o ! -s "${listmemberinfo_f}" ]; then
            LOG "[$LINENO]failed to excute command:/opt/huawei/snas/sbin/nofs-snas listdiskmemberinfo ${pool}."
            continue
        fi

        cat "${listmemberinfo_f}" | grep -a index >${mosObject_prefix}_${pool}
        if [ ! -f "${mosObject_prefix}_${pool}" -o ! -s "${mosObject_prefix}_${pool}" ]; then
            LOG "[$LINENO]there is no index contents about P${pool}."
            continue
        fi

        RandomZoneTotalAlloc=0
        for ((loop=${NOFS_MOS_OBJECT_BEGIN};loop<=${NOFS_MOS_OBJECT_END};loop++))
        do
            str_piect=`awk '{if($3=='"$loop"')print}' ${mosObject_prefix}_${pool} | \
                awk '{sum+=$4}END{if(NR>0){printf "%d %d %d %1.2f\n", '$loop',NR,sum*4/1024,sum/NR/16384}else{printf "%d %d %d %1.2f\n", '$loop',0,0,0}}'`
            str="$str ($str_piect)"

            # type类型为4/5/6的对象是随机区对象 +type0
            if [ ${loop} -eq 4 -o ${loop} -eq 5 -o ${loop} -eq 6 -o ${loop} -eq 0 ]; then
                allocAll=$( echo "${str_piect}" | awk '{print $3}' )
                RandomZoneTotalAlloc=$((RandomZoneTotalAlloc+allocAll))
            fi

            if [ ${loop} -eq 6 ]; then
                disk_nofs_usage=$( echo "${str_piect}" | awk '{print $4}' | sed -e "s/^ *//g" -e "s/ *$//g" )
            fi

            if [ ${loop} -eq 7 ]; then
                freechuntcnt7=$( echo "${str_piect}" | awk '{print $2}' | sed -e "s/^ *//g" -e "s/ *$//g" )
            fi

            if [ ${loop} -eq 0 ]; then
                freechuntcnt0=$( echo "${str_piect}" | awk '{print $2}' | sed -e "s/^ *//g" -e "s/ *$//g" )
            fi
        done

        datacnt=$( cat ${mosObject_prefix}_${pool} | awk '{if($3==1||$3==2||$3==3)print}' | wc -l )
        metacnt=$( cat ${mosObject_prefix}_${pool} | awk '{if($3==4||$3==5||$3==6)print}' | wc -l )
        mixfree=$( cat ${mosObject_prefix}_${pool} | awk '{if($3==0||$3==7)print}' | wc -l )
        freechuntcnt=$((freechuntcnt7+freechuntcnt0))

        totalcnt=$[${datacnt}+${metacnt}+${mixfree}]
        datalimit=$[${totalcnt}*93/100+1]
        metalimit=$[${totalcnt}*8/100+1]

        str="${str}||dataCount(type1-3):${datacnt}||dataLimit:${datalimit}||metaCount(type4-6):${metacnt}||metalimit:${metalimit}||totalCount(type07):${totalcnt}||RandomZoneTotalAlloc:${RandomZoneTotalAlloc}"
        disk_nofs_use_digit=$( echo "${disk_nofs_usage} * 100" | bc | awk -F. '{print $1}' )
        # type为6的利用率≥0.80(这个使用率实际是磁盘的nofs文件系统元数据的使用率)，且type为7和type0的FreeChunk的个数低于32个，巡检不通过
        if [ X"${disk_nofs_use_digit}" != X"" -a ${disk_nofs_use_digit} -ge 80 -a ${freechuntcnt} -lt 32 ]; then
            isPass=$(check_pass ${isPass} 1)
            echo "[ERR]${str}" >> ${RESULTFILE} 2>&1

        # type为6的利用率≥0.75(这个使用率实际是磁盘的nofs文件系统元数据的使用率)，且type为7和type0的FreeChunk的个数低于32个，巡检建议优化
        elif [ X"${disk_nofs_use_digit}" != X"" -a ${disk_nofs_use_digit} -ge 75 -a ${freechuntcnt} -lt 32 ]; then
            isPass=$(check_pass ${isPass} 4)
            echo "[ERR]${str}" >> ${RESULTFILE} 2>&1
        else
            echo "${str}" >> ${RESULTFILE} 2>&1
        fi

        rm -f ${mosObject_prefix}_${pool}
        rm -f ${listmemberinfo_f}
    done

    rm -f /var/tmp/nofs_pool_listmemberinfo*

    return
}

checkNofsMosObjectUsage

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