#!/bin/bash
set +x

source /opt/huawei/snas/script/inspect_mml/CheckItems
G_REMOTE_TMP_FILE="/tmp/tmpfilecheckNodeDiskPhy"
G_SG=""
G_PHY_STATUS=0x00

LOG_FILE="/var/log/inspect.log"
SNAS_CONFIG_PATH=/opt/huawei/snas/etc/snas.ini
BakEndTaskRunOver="/tmp/tmpfilecheckNodeDiskPhyBakEndTaskRunOver"

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

function getsginfo()
{
    local num=0

    num=$(lsscsi -g |grep enclosu |awk '{print $8}' |wc -l)
    if [ "$num" -eq 1 ]; then
        G_SG=$(lsscsi -g |grep enclosu |awk '{print $8}')
    elif [ "$num" -eq 2 ]; then
        local sginfo=$(lsscsi -g |grep enclosu |awk '{print $8}')
        set_ifs
        local sgarr=($sginfo)

        if [[ "${sgarr[0]}" < "${sgarr[1]}" ]]; then
            G_SG="${sgarr[0]}"
        else
            G_SG="${sgarr[1]}"
        fi
        restore_ifs
    else
        G_SG=""
        return 1
    fi

    return 0
}

function transnumtostring()
{
    local info=$(cat "${G_REMOTE_TMP_FILE}" |grep phy)
    local phynum=""
    local status=""

    sed -i '/^phy.*/d' "${G_REMOTE_TMP_FILE}"
    echo "$info" |while read line
    do
        phynum=$(echo "$line" |awk -F= '{print $1}')
        status=$(echo "$line" |awk -F= '{print $2}')
        if [ "${status}" -eq 0 ]; then
            echo "${phynum}=open" >> "${G_REMOTE_TMP_FILE}"
        else
            echo "${phynum}=close" >> "${G_REMOTE_TMP_FILE}"
        fi
    done
}

function getphystatus()
{
    var1=0x$(sg_ses -p 0x94 $G_SG |awk 'NR==3' |awk '{print $6}') #phy24-phy31
    var2=0x$(sg_ses -p 0x94 $G_SG |awk 'NR==3' |awk '{print $(13)}') #phy32-phy35

    var=0x00

    let "var=(var1&0x10)>>4"     #phy28
    echo "phy28=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var1&0x20)>>5"     #phy29
    echo "phy29=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var1&0x40)>>6"     #phy30
    echo "phy30=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var1&0x80)>>7"     #phy31
    echo "phy31=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var2&0x01)"     #phy32
    echo "phy32=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var2&0x02)>>1"     #phy33
    echo "phy33=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var2&0x04)>>2"     #phy34
    echo "phy34=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)<<1"

    let "var=(var2&0x08)>>3"     #phy35
    echo "phy35=$var" >> "${G_REMOTE_TMP_FILE}"
    let "G_PHY_STATUS=(G_PHY_STATUS|var)"
}

function WaitTaskOrKillAllTasks()
{
    local bakUpTaskPid=${1}
    local timeInterVal=${2}
    local retryCnt=${3}
    local num=1
    
    while [ ${num} -le ${retryCnt} ]
    do
        if [ -f "${BakEndTaskRunOver}" ]; then
            rm -f "${BakEndTaskRunOver}"
            return 0
        else
            sleep ${timeInterVal}
            num=$( expr $num + 1 )
        fi
    done
    
    # 进程1不能干掉
    if [ ${bakUpTaskPid} -eq 1 ]; then
        LOG "[$FUNCNAME][$LINENO]The input background process cannot be killed because it is 1!"
        return 1
    fi
    
    # BakEndTaskRunOver没生成，说明后台任务挂死，干掉后台进程以及拉起的所有子进程
    pstree -p ${bakUpTaskPid} 2>/dev/null | awk -F "[()]" '
    {
        for (i=2;i<=NF;i++)
        {
            if (i%2==0)
            {
                print $i
            }
        }
    }' | xargs kill -9
    
    return 1
}

function checkNodeDiskPhy()
{
    local nodetype=""
    local nodedisktypes=""
    local diskchiptype=""
    local haveold=0
    #默认建议优化
    local inspecttype=1
    local havehssd=0
    local disktoolPID=""
    local timeCnt=0
    local tmpfile1="/tmp/tmpfilecheckNodeDiskPhyfile01"
    local tmpfile2="/tmp/tmpfilecheckNodeDiskPhyfile02"
    local tmpfile3="/tmp/tmpfilecheckNodeDiskPhyfile03"
    [ -f ${tmpfile1} ] && rm -f ${tmpfile1}
    [ -f ${tmpfile2} ] && rm -f ${tmpfile2}
    [ -f ${tmpfile3} ] && rm -f ${tmpfile3}
    > "${G_REMOTE_TMP_FILE}"
    rm -f "${BakEndTaskRunOver}"

    getsginfo
    if [ "${G_SG}_X" != "_X" ]; then
        echo "sginfo=0" >> "${G_REMOTE_TMP_FILE}"
    else
        echo "sginfo=1" >> "${G_REMOTE_TMP_FILE}"
        return
    fi

    getphystatus

    {
        #获得HSSD-D322XAM类型硬盘的/dev/sd*
        nodedisktypes=$(disktool -s |grep HSSD-D322XAM |awk '{print $1}')
        LOG "[$FUNCNAME][$LINENO] nodetype=$nodetype,nodedisktypes=($nodedisktypes)"
        if [ "${nodedisktypes}_X" != "_X" ]; then    #有HSSD-D322XAM硬盘
            for item in ${nodedisktypes}
            do
                diskchiptype=""
                diskchiptype=$(disktool -A o -z log4 $item |grep 181101 | grep Asic)
                if [ "${diskchiptype}_X" = "_X" ]; then    #HSSD-D322XAM芯片不是181101
                    haveold=1
                    echo "haveold=1" > ${tmpfile3}
                    LOG "[$FUNCNAME][$LINENO] item=$item,diskchiptype=($diskchiptype)"
                    break
                fi
            done
            havehssd=1
            echo "havehssd=1" > ${tmpfile2}
            if [ "$haveold" -eq 1 ]; then     #有旧盘，28-32为0，33-35，为1通过
                if [ "$G_PHY_STATUS" -eq 7 ]; then
                    echo "inspecttype=0" > ${tmpfile1}
                fi
            else                            #全是新盘，28-35为0通过
                if [ "$G_PHY_STATUS" -eq 0 ]; then
                echo "inspecttype=0" > ${tmpfile1}
                fi
            fi
        else                                    #没有HSSD-D322XAM硬盘
            #查询phy28-35 为0通过的状态
            if [ "$G_PHY_STATUS" -eq 0 ];then
                #通过
                echo "inspecttype=0" > ${tmpfile1}
            fi
        fi
        
        touch "${BakEndTaskRunOver}"
    } &
    
    disktoolPID=$!
    # disktool可能导致巡检项挂死，设置超时等待，如果超时，将后台进程及其拉起的子进程全部干掉
    WaitTaskOrKillAllTasks ${disktoolPID} 5 60
    if [ $? -eq 1 ]; then
        LOG "[$FUNCNAME][$LINENO]disktool:exec cmd 'disktool' timeout(${timeCnt}*5 s).The service may be busy, please Try again later!"
        echo "[ERR]INFO:exec cmd 'disktool' timeout(${timeCnt}*5 s).(${disktoolPID})The service may be busy, please try again later!" >> ${G_REMOTE_TMP_FILE}
        rm -f "${BakEndTaskRunOver}"
        return
    fi

    [ -f ${tmpfile1} ] && inspecttype=0 
    [ -f ${tmpfile2} ] && havehssd=1
    [ -f ${tmpfile3} ] && haveold=1

    echo "inspecttype=${inspecttype}" >> "${G_REMOTE_TMP_FILE}"
    echo "haveold=${haveold}" >> "${G_REMOTE_TMP_FILE}"
    echo "havehssd=${havehssd}" >> "${G_REMOTE_TMP_FILE}"
    LOG "[$FUNCNAME][$LINENO] no HSSD-D322XAM,havehssd=${havehssd},haveold=${haveold}, inspecttype=${inspecttype}, G_PHY_STATUS=$G_PHY_STATUS"

    transnumtostring

    [ -f ${tmpfile1} ] && rm -f ${tmpfile1}
    [ -f ${tmpfile2} ] && rm -f ${tmpfile2}
    [ -f ${tmpfile3} ] && rm -f ${tmpfile3}
    rm -f "${BakEndTaskRunOver}"
    
    return
}


checkNodeDiskPhy
