#!/bin/bash
set +x

CurInspectNum="314"
LOG_FILE="/var/log/inspect.log"
G_INSPECT_MMLPATH="/opt/huawei/snas/script/inspect_mml"
. /opt/node_type_recognize.sh
. $G_INSPECT_MMLPATH/CheckItems
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="/tmp/tmpResult${CurInspectFun}"
>${RESULTFILE}

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

#检测内存碎片化
function CheckMemoryFragmentation()
{
    local MemFree=0
    local MinMem=1024           #1024M
    local ActualValue=0
    local ExpectValue=0         #期望值=（N-1）*8
    local Mem4M_X=0              #4M内存片个数
    local Mem2M_Y=0              #2M内存片个数
    local Node_Num=0            #节点个数N
    local tmpinfo=""
    local isPass=0
    
    #获取空闲内存
    MemFree=$(free -m | grep -w "Mem:" | awk '{print $4}')
    if [ "${MemFree}X" == "X" ];then
        isPass=4
        LOG "[$LINENO]Get memory information fail!"
        echo "[ERR]INFO:Failed to get memory information from command(free)." >>${RESULTFILE} 2>&1
        echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1 
        return 1
    fi
    
    if [ ${MemFree} -lt ${MinMem} ];then
        LOG "[$LINENO]Free memory(${MemFree}M) is less than ${MinMem}M!"
        echo "MemFree:${MemFree}||4M Num(X):--||2M Num(Y):--||NodeNum(N):--||ExpectValue:--" >>${RESULTFILE} 2>&1
        echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1
        return 0
    fi
    
    #获取4M ,2M内存碎片值X,Y
    tmpinfo=$(cat /proc/buddyinfo | grep -w "Normal")
    LOG "[$LINENO]tmpinfo=[${tmpinfo}]"
    if [ "${tmpinfo}X" != "X" ];then
        Mem4M_X=$(echo "${tmpinfo}" | awk 'BEGIN{X=0}{X+=$NF}END{print X}')
        Mem2M_Y=$(echo "${tmpinfo}" | awk 'BEGIN{Y=0}{Y+=$(NF-1)}END{print Y}')
        let ActualValue=2*${Mem4M_X}+${Mem2M_Y}
        LOG "[$LINENO]ActualValue=[${ActualValue}],Mem4M_X=[${Mem4M_X}],Mem2M_Y=[${Mem2M_Y}]"
    else
        isPass=4
        LOG "[$LINENO]exec cmd (cat /proc/buddyinfo) fail!"
        echo "[ERR]INFO:Failed to get memory information from command(cat /proc/buddyinfo)."  >>${RESULTFILE} 2>&1
        echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1
        return 1
    fi
    
    #获取节点个数N
    tmpinfo=$(sqlite3 /opt/huawei/snas/etc/cm_conf.db "select count(*) from CM_NODE_T" 2>&1)
    #检查是否合法
    echo "${tmpinfo}" | grep -E "^[0-9]+$" >/dev/null
    if [ $? -eq 0 ] && [ ${tmpinfo} -gt 0 ];then
        Node_Num=${tmpinfo}
        let ExpectValue=(Node_Num-1)*8
    else
        isPass=4
        echo "[ERR]INFO:Get count of nodes in cluster fail."  >>${RESULTFILE} 2>&1
        echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1
        LOG "[$LINENO]get node count fail,tmpinfo=[${tmpinfo}]"
        return 1
    fi
    
    echo "MemFree:${MemFree}||4M Num(X):${Mem4M_X}||2M Num(Y):${Mem2M_Y}||NodeNum(N):${Node_Num}||ExpectValue:${ExpectValue}" >>${RESULTFILE} 2>&1
    if [ ${ActualValue} -lt ${ExpectValue} ];then
        isPass=4
        echo "[ERR]INFO:Memory fragmentation is serious and does not meet the check standard." >>${RESULTFILE} 2>&1
        LOG "[$LINENO]Memory fragmentation is serious and does not meet the check standard.ActualValue=${ActualValue},ExpectValue=${ExpectValue}"
    fi
    echo "${CurInspectFun}_Pass ${isPass}" >>${RESULTFILE} 2>&1
}

CheckMemoryFragmentation
