#!/bin/bash

#检查踢盘后map是否正常
#1.nofs是否存在2个相同的disk：id
#2.检查是否nofs中存在SN，而cm数据库cm_diskmgmt.db中确没有
#3.检查数据库nofs的pool id是否一致

G_INSPECT_MMLPATH="/opt/huawei/snas/script/inspect_mml"
. $G_INSPECT_MMLPATH/CheckItems
CurInspectNum="293"
CurInspectFun=`GetInspectType $CurInspectNum`
RESULTFILE="/tmp/tmpResult${CurInspectFun}"
>$RESULTFILE

#BEGIN--全局变量定义--BEGIN
nofs_cmd="/opt/huawei/snas/sbin/nofs-snas getpoolinfo"
disk_sql="/opt/huawei/snas/etc/cm_diskmgmt.db"
g_nofsinfo_file=""
g_cmsqlinfo_file=""
LOGFILE="/var/log/inspect.log"
#END---全局变量定义---END

function LOG()
{
    echo [`date`][$$]$@ >> ${LOGFILE}
}
function get_pid
{
    echo $$
}

function GetNofsInfo
{
    local pid=$(get_pid)
    
    g_nofsinfo_file="/tmp/nofs-snas${pid}"
    ${nofs_cmd} > ${g_nofsinfo_file}
    if [ $? -ne 0 ];then
        echo "Get info from ${nofs_cmd} failed." >>${RESULTFILE}
        LOG "[$FUNCNAME]Get info from ${nofs_cmd} failed."
        return 1
    fi
    return 0
}
function GetCmSqlInfo
{
    local pid=$(get_pid)
    local step=0
    local maxretry=10
    local isok=1
    g_cmsqlinfo_file="/tmp/cmsqlinfo${pid}"
    
    for step in `seq 1 ${maxretry}`;do
        sqlite3 ${disk_sql} .dump | grep "INSERT INTO \"disk_mgmt_info\""> ${g_cmsqlinfo_file}
        if [ $? -eq 0 ];then
            isok=0
            break
        fi
        sleep 2
    done
    if [ $step -eq ${maxretry} -a $isok -eq 1 ];then
        echo "INFO:get sql info failed." >>${RESULTFILE}
        LOG "[$FUNCNAME]get sql info failed."
        return 1
    fi
    return 0
}

#nofs数据结构：  Name:P6 State:0 Type:2 disk:5
function checkNofsSameDisk
{
    local repet_info=$(cat $g_nofsinfo_file | sort -k 4 -t: |sed "/^$/d" |uniq  -f 3 -D|awk 'BEGIN{ORS=" "}{print $0}')
    if [ "X${repet_info}" != "X" ];then
        echo "INFO:nofs same info:${repet_info}." >>${RESULTFILE}
        LOG "[$FUNCNAME]nofs same info : ${repet_info}."
        return 1
    fi
    return 0
}
#1.对nofs中有的盘，而数据库中没有对应的SN报错
#2.对nofs中有的盘，其poolid与数据库中PoolID不一致的情况报错
function checkNofsInfoInCmSql
{
    local poolId=0
    local diskId=0
    local result=""
    local isPass=0
    g_cmsqlinfo_file_tmp="/tmp/tmpfilecmsqlinfo"
    sed "s/[\']//g" ${g_cmsqlinfo_file} >${g_cmsqlinfo_file_tmp}
    while read line ;do
        poolId=$(echo $line | awk '{print $1}' | awk -F":" '{print $2}')
        diskId=$(echo $line | awk '{print $4}' | awk -F":" '{print $2}')
        result=$(sed -n "/VALUES(${diskId},/p" ${g_cmsqlinfo_file_tmp} | awk -v poolId=$poolId \
                -v diskId=$diskId \
                -v diskIdTmp="VALUES(${diskId}" '{ \
                lens=split($4,T,",|)"); \
                if(T[1]==diskIdTmp) \
                { \
                    if(T[3]=="")printf("DiskId=%s,PoolId=%s,SN is null.",diskId,poolId); \
                    if(T[6]!=poolId)printf("DiskId=%s,PoolId=%s is not same with the NOFS database.\n",diskId,poolId); \
                } \
                }')
        if [ "X${result}" != "X" ];then
            echo "INFO:${result}" >>${RESULTFILE}
            LOG "[$FUNCNAME]nofs info in sql :${result}."
            isPass=1
        fi
    done < ${g_nofsinfo_file}
    return $isPass
}

function main
{
    local iRet=0
    GetNofsInfo && GetCmSqlInfo 
    if [ $? -ne 0 ];then
        return 
    fi
    
    for fun in checkNofsSameDisk checkNofsInfoInCmSql;do
        $fun
        if [ $? -ne 0 ];then
            iRet=1
        fi
    done
    if [ $iRet -eq 0 ];then
        echo "INFO:diskpool is ok." >>${RESULTFILE}
        echo "${CurInspectFun}_Pass 0" >>${RESULTFILE}
    else
        echo "${CurInspectFun}_Pass 1" >>${RESULTFILE}
    fi
    rm ${g_nofsinfo_file} ${g_cmsqlinfo_file} ${g_cmsqlinfo_file_tmp}
}

main
