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

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

function restore_ifs
{
    IFS=$IFS_OLD
}


function check_ipmi_info()
{
    bOK=0
    bC72=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
        fi
    done

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

    #ֻܿһCPU
    IsC72Node
    if [ $? -eq 0 ];then
        bC72=1
    else
        bC72=0
    fi

    if [ $bC72 -eq 1 ];then
        if [ "$count" != "1" ];then
            echo "[ERR]Error:C72 node cpu number($count) is not 1!"
            bOK=1
        fi
    else
        if [ "$count" != "2" ];then
            echo "[ERR]Error:cpu number($count) is not 2!"
            bOK=1
        fi
    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}'`

        if [ $bC72 -eq 1 ]; then
            Temperature=`expr $(echo $Temperature|awk -F'.' '{print $1}')`
        else
            Temperature=`expr $Temperature \+ 85`
        fi

        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 [ $bC72 -eq 1 ]; then
            if [ $Temperature -ge 97 ] && [ $Status != "0x80" ]; then
                echo "[ERR]Error:Temperature($Temperature) >= 97 and Status is not OK!||${errResult}"
                bOK=1
            elif [ $Temperature -ge 97 ];then
                 echo "[ERR]Error:Temperature($Temperature) >= 97||${errResult}"
                 bOK=1
            elif [ $Status != "0x80" ]; then
                 echo "[ERR]Error:Status is not OK!||${errResult}"
                 bOK=1
            fi
        else
            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
        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
    #12:P12E  15:C36E  21:P12X  25:C36X  27:F12X 47:F36B_C
    local SingleCpuList="12 15 21 25 27 47"
    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
        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_CPU_info()
{
    local iRet=0
    IsStandardNode
    if [ $? -eq 0 ];then
        echo "ID:--||Temperature(degrees):Does not involve||Status:--||CacheSize:--||CoresNumber:--||Speed(MHz):--||Type:--"
        return $iRet
    fi
    IsRHNode
    if [ $? -eq 0 ]; then
        check_RH_ipmi_info
    else
        check_ipmi_info
    fi
    iRet=$?
    return $iRet
}


check_CPU_info
exit 0


