#!/bin/bash
set +x

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

CHECK_PASSED=0
CHECK_FAILED=1
isPass=0
ARC_TYPE_X86=1
ARC_TYPE_ARM=2
INTEL_X86=0
HI1616=1
HISI1620=2
KUNPENG920=3
CPUMODEL_BUT=4
LOGFILE="/var/log/inspect.log"
tmpSmartctl="/tmp/tmpSmartctlFile"
tmpDisktool="/tmp/tmpDisktoolFile"
PRODUCT_NAME=$(dmidecode -t 1 | grep "Product Name:" | awk -F: '{print $2}' | sed 's/^\s*//;s/\s*$//')

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

function GetArcType()
{
    local CPU_TYPE
    CPU_TYPE=`arch`
    if [ "$CPU_TYPE"X = "x86_64"X ];then
        return $ARC_TYPE_X86
    else
        return $ARC_TYPE_ARM
    fi
}

function checksysdiskinfo()
{
    local sysdisklist="$*"
    local innername=""
    local iret=0
    local SingleHeader=0
    local line=""
    local HealthStatus=""
    local Vendor=""
    local Product=""
    local blockSize=""
    local speed=""
    local SN=""
    local PROTOCOL=""
    local CAPACITY=""
    local PowerOnTime=""
    local ReadErrCnt=""
    local WriteErrCnt=""
    local VerifyErrCnt=""
    local AllHeader=0
    local cnt=0
    local head=""
    local nopass=0

    for line in $sysdisklist; do
        nopass=0
        SingleHeader=0
        innername=$(lsscsi -g | grep -w "$line"|awk '{print $NF}')
        >${tmpSmartctl}
        >${tmpDisktool}
        cnt=0

        if [ X"${innername}" == X"" ]; then
            isPass=$( check_pass $isPass 1 )
            echo "[ERR]INFO:failed to get system disk innername about(${line})." >>${RESULTFILE} 2>&1
            continue
        fi

        smartctl -a ${innername} >${tmpSmartctl} 2>/dev/null
        iret=$?
        if [ ${iret} -ne 0 -o ! -s "${tmpSmartctl}" ]; then
            isPass=$( check_pass $isPass 1 )
            echo "[ERR]INFO:failed to excute command:smartctl -a ${innername}." >>${RESULTFILE} 2>&1
            LOG "[$LINENO]failed to execute smartctl -a ${innername}"
            continue
        fi

        /usr/local/bin/disktool -f a ${innername} >${tmpDisktool} 2>/dev/null
        iret=$?
        if [ ${iret} -ne  0  -o ! -s "${tmpDisktool}" ]; then
            isPass=$( check_pass $isPass 1 )
            echo "[ERR]INFO:failed to excute command:/usr/local/bin/disktool -f a ${innername}." >>${RESULTFILE} 2>&1
            LOG "[$LINENO]failed to execute /usr/local/bin/disktool -f -a ${innername}"
            continue
        fi

        HealthStatus=$( grep "SMART Health Status:" ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g"  )
        Vendor=$( grep "Vendor:" ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        Product=$( grep "Product:" ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        blockSize=$( grep "Logical block size: " ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        speed=$( grep "Rotation Rate:" ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        SN=$( grep "Serial number:" ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        PROTOCOL=$( grep "Transport protocol: " ${tmpSmartctl} | awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        CAPACITY=$( grep "User Capacity: " ${tmpSmartctl} | awk -F [ '{print $2}' | awk -F ] '{print $1}' )
        PowerOnTime=$( grep "Power on time:" ${tmpDisktool} |  awk -F: '{print $2}' | sed -e "s/^[ \t]*//g" -e "s/[ \t]*$//g" )
        ReadErrCnt=$( sed -n "/Error Counters (read) page/,/-------/p" ${tmpDisktool} | grep "Total uncorrected errors" | awk -F= '{print $2}' | grep -o "[0-9]"* )
        WriteErrCnt=$( sed -n "/Error Counters (write) page/,/-------/p" ${tmpDisktool} | grep "Total uncorrected errors" | awk -F= '{print $2}' | grep -o "[0-9]"*  )
        VerifyErrCnt=$( sed -n "/Error Counters (verify) page/,/-------/p" ${tmpDisktool} | grep "Total uncorrected errors" | awk -F= '{print $2}' | grep -o "[0-9]"*  )
       
        # ȱб
        grep "Grown Defect List is empty" ${tmpDisktool} >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            AllHeader=$( grep "^0x" ${tmpDisktool} | wc -l )
            grep "^0x" ${tmpDisktool} | awk -F "-" '{print $2}' | sort | uniq -c >${tmpDisktool}.count
            while read cnt head
            do
                if [ ${SingleHeader} -lt ${cnt} ]; then
                    SingleHeader=${cnt}
                fi
            done <${tmpDisktool}.count
        else
            SingleHeader=0
            AllHeader=0
        fi

        [ -f "${tmpDisktool}.count" ] && rm -f ${tmpDisktool}.count

        # ͳһȡ쳣
        [ X"${HealthStatus}" == X"" ] && HealthStatus="---"
        [ X"${Vendor}" == X"" ] && Vendor="---"
        [ X"${Product}" == X"" ] && Product="---"
        [ X"${blockSize}" == X"" ] && blockSize="---"
        [ X"${speed}" == X"" ] && speed="---"
        [ X"${SN}" == X"" ] && SN="---"
        [ X"${PROTOCOL}" == X"" ] && PROTOCOL="---"
        [ X"${CAPACITY}" == X"" ] && CAPACITY="---"
        [ X"${PowerOnTime}" == X"" ] && PowerOnTime="---"
        [ X"${ReadErrCnt}" == X"" ] && ReadErrCnt="---"
        [ X"${WriteErrCnt}" == X"" ] && WriteErrCnt="---"
        [ X"${VerifyErrCnt}" == X"" ] && VerifyErrCnt="---"

        if [ X"${ReadErrCnt}" != X"---" -a X"${ReadErrCnt}" != X"0" ];then
            nopass=1
        fi

        if [ X"${WriteErrCnt}" != X"---" -a X"${WriteErrCnt}" != X"0" ];then
            nopass=1
        fi

        if [ X"${AllHeader}" != X"---" -a X"${AllHeader}" != X"0" ];then
            nopass=1
        fi
        result="InnerName:${innername}||HealthStatus:$HealthStatus||Vendor:$Vendor||Product:$Product||blockSize:$blockSize||speed:$speed||SN:$SN||PROTOCOL:$PROTOCOL||CAPACITY:$CAPACITY||PowerOnTime:$PowerOnTime||ReadErrCnt:$ReadErrCnt||WriteErrCnt:$WriteErrCnt||VerifyErrCnt:$VerifyErrCnt||AllHeader:$AllHeader||SingleHeader:$SingleHeader"
        if [ ${nopass} -eq 0 ];then
            echo ${result} >> ${RESULTFILE} 2>&1
        else
            isPass=$( check_pass $isPass 4 )
            # V3R6C20汾ҪӡϢǰҪINFO:
            echo "[ERR]INFO:${result}" >> ${RESULTFILE} 2>&1
        fi
        LOG "[$LINENO]${result}"
    done
 
    [ -f "$tmpSmartctl" ] && rm -f "$tmpSmartctl"
    [ -f "${tmpDisktool}" ] && rm -f ${tmpDisktool}

    return
}

function is3416SasCard()
{
    lspci |grep SAS3416 >/dev/null 2>&1
    return $?
}

function GetCpuModel()
{
    GetArcType
    local ret=$?
    if [ $ARC_TYPE_X86 -eq $ret ];then
        return $INTEL_X86
    else
        local cpu_model=`dmidecode -t processor|egrep -A52 'CPU 1|CPU01'|grep 'Version:'|uniq|awk -F ":" '{print $2}'|sed -e 's/^[ \t]*//g'`
        if [[ "$cpu_model" =~ "Hi1616" ]];then
            return $HI1616
        elif [[ "$cpu_model" =~ "Hisilicon 1620" ]];then
            return $HISI1620
        elif [[ "$cpu_model" =~ "Kunpeng 920" ]];then
            return $KUNPENG920
        else
            return $CPUMODEL_BUT
        fi
    fi
}


# V3/V5/TSڵϵͳϢĻȡ
function CheckV3V5TSdiskinfo()
{
    local is3416Card=""
    local CpuMode=""
    local SingleHeader=0
    local sysdisklist=""

    is3416SasCard
    is3416Card=$?

    GetCpuModel
    CpuMode=$?
    if [ ${CpuMode} -eq $HISI1620 -o ${CpuMode} -eq $KUNPENG920 -o ${is3416Card} -eq 0 ];then
        sysdisklist=$(lsscsi -g |grep -we $(mdadm -D /dev/md1 |grep "/dev/sd*" |sed -n '1p' |awk '{print $NF}') -we $(mdadm -D /dev/md1 |grep "/dev/sd*" |sed -n '2p' |awk '{print $NF}') | awk '{print $1}' |sed 's/[][]//g')
    else
        #smr "[10:0:3:0]   (0x14)  ATA      HGST HSH721414AL TT03  /dev/sde   /dev/sg4"
        #HGST HSH721414AL мڿո,$6ȡ̷
        sysdisklist=$(lsscsi -g | awk '{if ($1!="[0:0:0:0]" && ($2=="disk" || $2=="(0x14)" || $2=="zbc") && $(NF-1)=="-") print $1}' |tr -d '[] ' |sed 's/^ *//g'|sed "/^$/d")
    fi

    checksysdiskinfo "${sysdisklist}"
    return
}

# T3000/C72ڵϵͳϢĻȡ
function CheckT3000C72info()
{
    local sysdisklist=""

    # Ҫϵͳ̸ǷΪ2
    sysdisklist=$( lsscsi -g | grep -v 'Logical Volume' | awk '{if ($2=="disk") print $NF}'| sort -n -k 2 -t g )

    checksysdiskinfo "${sysdisklist}"
    return
}

# UVP
function IsStandardNode()
{
    local name=''
    local saspci=''
    name=$(dmidecode -t 1 | grep "Product Name:" | awk '{print $3}')
    if [ "$name" = "Standard" -o "$name" = "OpenStack" ]; then
        saspci=$(lspci |grep "SAS")
        if [ "$saspci" != "" ]; then
            return 0
        else
            return 1
        fi
    else
        return 1
    fi
}

#жǷͨ÷RH2288 5288
function IsRHV3Node()
{
    if [ "$PRODUCT_NAME"X = "RH2288 V3"X -o "$PRODUCT_NAME"X = "5288 V3"X -o "$PRODUCT_NAME"X = "RH2288H V3"X ]; then
        #touch /opt/.tmp_RHNode_flag
        return 0
    else
        IsStandardNode
        if [ $? -eq 0 ]; then
            return 0
        else
            return 1
        fi
    fi
}

function IsRHV5Node()
{
    if [ "$PRODUCT_NAME"X = "2288H V5"X -o "$PRODUCT_NAME"X = "2288 V5"X -o "$PRODUCT_NAME"X = "5288 V5"X -o "$PRODUCT_NAME"X = "R521G10"X -o "$PRODUCT_NAME"X = "RS221G1"X -o "$PRODUCT_NAME"X = "2288X V5"X -o "$PRODUCT_NAME"X = "5288X V5"X -o "$PRODUCT_NAME"X = "DP4200"X -o "$PRODUCT_NAME"X = "DP2200"X ] || [[ "$PRODUCT_NAME" =~ "NW8220X" ]]; then
        return 0
    else
        return 1
    fi
}

function IsRHNode()
{
    IsRHV3Node
    local isV3=$?
    IsRHV5Node
    local isV5=$?
    if [ $isV3 -eq 0 -o $isV5 -eq 0 ];then
        return 0
    else
        return 1
    fi
}

function IsTSNode()
{
    if [[ "${PRODUCT_NAME}" =~ "TaiShan 5280" ]] ||
       [[ "${PRODUCT_NAME}" =~ "TaiShan 2280" ]] ||
       [[ "${PRODUCT_NAME}" =~ "TaiShan 5290" ]] ||
       [[ "${PRODUCT_NAME}" =~ "TaiShan 200 (Model 5280)" ]] ||
       [[ "${PRODUCT_NAME}" =~ "TaiShan 200 (Model 2280)" ]] ||
       [[ "${PRODUCT_NAME}" =~ "TaiShan 200 (Model 5290)" ]]; then
        return 0
    else
        return 1
    fi
}

function checkSysDiskHealth()
{
    local isTS=0
    local isRH=0

    LOG "[$LINENO]ProductName=CheckSysDiskHealth"
    IsStandardNode
    if [ $? -eq 0 ];then
        echo "UVP case, Does not involve." >> ${RESULTFILE} 2>&1
        isPass=3
        LOG "[$LINENO]UVP case, Does not involve"
        return 0
    fi
    IsRHNode
    isRH=$?
    IsTSNode
    isTS=$?
    if [ ${isRH} -eq 0 -o ${isTS} -eq 0 ]; then
        CheckV3V5TSdiskinfo
    else
        CheckT3000C72info
    fi

    return
}

checkSysDiskHealth
echo "${CurInspectFun}_Pass ${isPass}" >> ${RESULTFILE} 2>&1
[ -f "${tmpSmartctl}" ] && rm -f "${tmpSmartctl}"
[ -f "${tmpDisktool}" ] && rm -f "${tmpDisktool}"
exit 0