#!/bin/bash
set +x
. /opt/node_type_recognize.sh
. /opt/node_devicename.sh

function set_ifs
{
    IFS_OLD=$IFS
    IFS=$'\n'
}

function restore_ifs
{
    IFS=$IFS_OLD
}

function check_ipmi_info()
{
    bOK=0
    ipmi_info=""
    #handle ipmitool failed
    for ((i=0;i<7;++i)); do
        ipmi_info=`ipmitool sdr|grep CPU`
        iRet=$?
        if [ $iRet -eq 0 ]; then
            break
        else
            echo "ipmitool sdr failed, return $iRet" 1>&2
            return ${iRet}
        fi
    done

    cpu_info=`echo "$ipmi_info"|grep "Status"| grep -v CPU3 | sed 's/^ *//g'|sed "/^$/d"`
    count=`echo "$ipmi_info"|grep "Status"|wc -l`

    if [ "$count" != "2" ];then
        echo "[ERR]Error:cpu number($count) is not 2!"
        bOK=1
    fi

    set_ifs
    for line in $cpu_info; do
        if [ "$line" = "" ];then
            continue;
        fi

        Id=`echo $line | awk '{print $1}' | sed 's/_Status//'`
        Status=`echo $line | awk '{print $3}'`
        Temperature=`echo "$ipmi_info" |grep "_Core_temp" |grep $Id | awk '{print $3}'`

        Temperature=`expr $Temperature \+ 85`

        IdNumber=`echo $Id |sed 's/CPU//'`
        CacheSize=`cat /proc/cpuinfo |grep -A3 -B4 "physical id.*: .*$IdNumber"| grep "cache size" |sed -n 'n;$p' | awk '{print $4 $5}'`
        CoresNum=`cat /proc/cpuinfo | grep -A3 -B4 "physical id.*: .*$IdNumber"| grep "cpu cores" |sed -n 'n;$p' | awk '{print $4}'`
        Speed=`cat /proc/cpuinfo | grep -A3 -B4 "physical id.*:.*$IdNumber"| grep "cpu MHz" |sed -n 'n;$p' | awk '{print $4}'`
        Type=`cat /proc/cpuinfo |grep -A3 -B5 "physical id.*:.*$IdNumber"| grep "model name" |sed -n 'n;$p' | awk -F: '{print $2}'`
        if [ "$Status" == "0x80" ];then
            resultStatus="OK"
        else
            resultStatus="Fault"
        fi

        if [ $Temperature -ge 80 ] && [ "$Status" != "0x80" ]; then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= 80 and Status is not OK!||${errResult}"
            bOK=1
        elif [ $Temperature -ge 80 ];then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= 80||${errResult}"
            bOK=1
        elif [ "$Status" != "0x80" ]; then
            echo "[ERR]Error:$Id,Status is not OK!||${errResult}"
            bOK=1
        fi

        echo "ID:$Id||Temperature(degrees):$Temperature||Status:$resultStatus||CacheSize:$CacheSize||CoresNumber:$CoresNum||Speed(MHz):$Speed||Type:$Type"
    done

    restore_ifs

    return $bOK
}

function check_RH_ipmi_info()
{
    local bOK=0
    local singularCPU=0
    local SingleCpuList=$(GetSingleCpuNodeList)
    local nodetype=""
    for ((i=0;i<7;++i)); do
        ipmi_info=`ipmitool sensor|grep CPU`
        iRet=$?
        if [ $iRet -eq 0 ]; then
            break
        else
            echo "ipmitool sensor failed, return $iRet" 1>&2
            return ${iRet}
        fi
    done

    nodetype=$(cat /opt/huawei/deploy/etc/deploy.ini | grep devicetype |awk -F= '{print $2}')
    echo "${SingleCpuList}" | grep -w "${nodetype}" >/dev/null
    if [ $? -eq 0 ];then
        singularCPU=1
    fi

    cpu_info=`echo "$ipmi_info"|grep "Status"|sed 's/^ *//g'|sed "/^$/d"`

    set_ifs
    for line in $cpu_info; do
        if [ "$line" = "" ];then
            continue;
        fi

        Id=`echo $line | awk '{print $1}' |tr -d ' '`
        Status=`echo $line | awk '{print $8}'|tr -d "|"`
        #жC36E cpuǷλ isExist=0(λ)isExist=1(λ)
        isExist=$((`echo ${Status:0:4}` & 0x80))
        if [ $singularCPU -eq 1 ] && [ $isExist -eq 0 ];then
            continue
        fi
        Temperature=`echo "$ipmi_info" |grep "DTS" |grep $Id | awk '{print $4}'|awk -F'.' '{print $1}'`
        Temperature=`expr $Temperature \+ 85`

        IdNumber=`echo $Id |sed 's/CPU//'`
        IdNumber=$((IdNumber-1))
        CacheSize=`cat /proc/cpuinfo |grep -A3 -B4 "physical id.*: .*$IdNumber"| grep "cache size" |sed -n 'n;$p' | awk '{print $4 $5}'`
        CoresNum=`cat /proc/cpuinfo | grep -A3 -B4 "physical id.*: .*$IdNumber"| grep "cpu cores" |sed -n 'n;$p' | awk '{print $4}'`
        Speed=`cat /proc/cpuinfo | grep -A3 -B4 "physical id.*:.*$IdNumber"| grep "cpu MHz" |sed -n 'n;$p' | awk '{print $4}'`
        Type=`cat /proc/cpuinfo |grep -A3 -B5 "physical id.*:.*$IdNumber"| grep "model name" |sed -n 'n;$p' | awk -F: '{print $2}'`
        if [ "$Status" == "0x8080" ];then
            resultStatus="OK"
        else
            resultStatus="Fault"
        fi

        if [ $Temperature -ge 84 ] && [ "$Status" != "0x8080" ]; then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= 84 and Status is not OK!||${errResult}"
            bOK=1
        elif [ $Temperature -ge 84 ];then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= 84||${errResult}"
            bOK=1
        elif [ "$Status" != "0x8080" ];then
            echo "[ERR]Error:$Id,Status is not OK!||${errResult}"
            bOK=1
        fi
        echo "ID:$Id||Temperature(degrees):$Temperature||Status:$resultStatus||CacheSize:$CacheSize||CoresNumber:$CoresNum||Speed(MHz):$Speed||Type:$Type"
    done

    restore_ifs

    return $bOK
}

function check_ARM_ipmi_info()
{
    local bOK=0
    local CpuThreshold=103
    PRODUCT_NAME=$(dmidecode -t 1 | grep "Product Name:" | awk -F: '{print $2}' | sed 's/^\s*//;s/\s*$//')
    if [ "$PRODUCT_NAME"X = "TaiShan 2280 V2"X -o "$PRODUCT_NAME"X = "TaiShan 5280 V2"X ]; then
        CpuThreshold=105 #Taishan 2280 V2?TaiShan 5280 V2
    fi
    for ((i=0;i<7;++i)); do
        ipmi_info=`ipmitool sensor|grep CPU`
        iRet=$?
        if [ $iRet -eq 0 ]; then
            break
        else
            echo "ipmitool sensor failed, return $iRet" 1>&2
            return ${iRet}
        fi
    done

    cpu_info=`echo "$ipmi_info"|grep "Status" | grep -v CPU3|sed 's/^ *//g'|sed "/^$/d"`

    set_ifs
    for line in $cpu_info; do
        if [ "$line" = "" ];then
            continue;
        fi

        Id=`echo $line | awk '{print $1}' |tr -d ' '`
        Status=`echo $line | awk '{print $8}'|tr -d "|"`
        Temperature=$(echo "$ipmi_info" |grep "Core Rem" | grep $Id | awk -F'|' '{printf("%d",$2)}')

        IdNumber=`echo $Id |sed 's/CPU//'`
        CacheNum=$(dmidecode |egrep -A45 "CPU ${IdNumber}|CPU0${IdNumber}"|grep "L3 Cache Handle:"|awk '{print $4}')
        CacheSize=$(dmidecode |grep -A9 "Handle ${CacheNum},"|grep "Installed Size"|awk '{print $3}')
        CoresNum=`dmidecode -t processor | egrep -A28 "CPU ${IdNumber}|CPU0${IdNumber}"|grep "Core Count"|uniq|awk -F ":" '{print $2}'`
        Speed=`dmidecode -t processor | egrep -A28 "CPU ${IdNumber}|CPU0${IdNumber}" |grep "Current Speed"|uniq|awk '{print $3}'`
        Type=`dmidecode -t processor|egrep -A28 "CPU ${IdNumber}|CPU0${IdNumber}"|grep "Version:"|uniq|awk -F ":" '{print $2}'`
        if [ "$Status" == "0x8080" ];then
            resultStatus="OK"
        else
            resultStatus="Fault"
        fi

        if [ $Temperature -ge ${CpuThreshold} ] && [ $Status != "0x8080" ]; then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= ${CpuThreshold} and Status is not OK!||${errResult}"
            bOK=1
        elif [ $Temperature -ge ${CpuThreshold} ];then
            echo "[ERR]Error:$Id,Temperature($Temperature) >= ${CpuThreshold}||${errResult}"
            bOK=1
        elif [ "$Status" != "0x8080" ];then
            echo "[ERR]Error:$Id,Status is not OK!||${errResult}"
            bOK=1
        fi
        echo "ID:$Id||Temperature(degrees):$Temperature||Status:$resultStatus||CacheSize:$CacheSize||CoresNumber:$CoresNum||Speed(MHz):$Speed||Type:$Type"
    done

    restore_ifs

    return $bOK
}

function check_CPU_info()
{
    local iRet=0
    local IsTS=0
    local IsRH=0
    IsStandardNode
    if [ $? -eq 0 ];then
        echo "ID:--||Temperature(degrees):Does not involve||Status:--||CacheSize:--||CoresNumber:--||Speed(MHz):--||Type:--"
        return $iRet
    fi
    IsRHNode
    IsRH=$?
    IsTSNode
    IsTS=$?
    if [ ${IsRH} -eq 0 ]; then
        check_RH_ipmi_info
    elif [ ${IsTS} -eq 0 ];then
        check_ARM_ipmi_info
    else
        check_ipmi_info
    fi
    iRet=$?
    return $iRet
}
check_CPU_info
exit 0


