#!/bin/bash
set +x

LOG_FILE="/var/log/inspect.log"
. /opt/node_type_recognize.sh
. /opt/install_os_common_func.sh
. /opt/huawei/snas/script/inspect_mml/CommonFunc.sh

function LOG
{
    echo [`date`][$$]$@ >> $LOG_FILE
}

#ȡOFED汾
function get_ofed_version()
{
    local ofedVer=""
    local tmpInfo=""
    local iRet=0
    tmpInfo=$(ofed_info -s)
    iRet=$?
    if [ $? -ne 0 ];then
        LOG "[$FUNCNAME][$LINENO]get ofed info fail,iRet=${iRet},tmpInfo=${tmpInfo}"
        echo ${ofedVer}
        return 0
    fi

    if [[ "${tmpInfo}" =~ "MLNX_OFED_LINUX-3.2" ]];then
        ofedVer="3.2"
    elif [[ "${tmpInfo}" =~ "MLNX_OFED_LINUX-4.2" ]];then
        ofedVer="4.2"
    elif [[ "${tmpInfo}" =~ "OFED-internal-4.4" ]];then
        ofedVer="4.4"
    elif [[ "${tmpInfo}" =~ "OFA-LINUX-4.17" ]];then
        ofedVer="4.17"
    else
        ofedVer=""
        LOG "[$FUNCNAME][$LINENO]no match ofed info,tmpInfo=${tmpInfo}"
    fi

    echo ${ofedVer}
    return 0
}

#ȡ汾һʽversion: 2.10.1.2  version: 3.2-2.0.0-HW:2.0 (25 Feb 2016)
function get_back_card_version()
{
    local cm_db_file="/opt/huawei/snas/etc/cm_conf.db"
    local cm_conf_file="/opt/huawei/snas/etc/cm.ini"
    local cm_snas_file="/opt/huawei/snas/etc/snas.ini"
    local my_nid=""
    local back_card_name=""
    local version_netcard=""
    
    # ݿCM_NODE_NETCARD_Tлȡ,7.1.1.SPC2汾ļȺݵĽڵ㲻ὫϢдݿ
    my_nid=$( grep "^NID=" "${cm_conf_file}" | awk -F= '{print $2}' )
    if [ "X${my_nid}" == "X" ]
    then
        LOG "[$FUNCNAME][${LINENO}]failed to obtain node NID from ${cm_conf_file}."
    else
        back_card_name=$( /usr/bin/sqlite3 "${cm_db_file}" "select CARD_NAME from CM_NODE_NETCARD_T where SUBNET_ID=1 and NID=${my_nid}" 2>/dev/null | head -1 )
    fi
    
    # /opt/huawei/snas/etc/snas.iniȡڵĺϢdeploy_snas_ini.pyдĺ˱ǩsubnetwork_port_1subnetwork_port_3
    if [ "X${back_card_name}" == "X" -a -f "${cm_snas_file}" ]
    then
        back_card_name=$( egrep "(subnetwork_port_1=|subnetwork_port_3=)" "${cm_snas_file}" | awk -F= '{print $2}' | sed "s/ //g" |head -1 )
        # vlandeploy_snas_ini.pyдȡ־.ǰΪ
        if [[ "${back_card_name}" =~ "." ]]
        then
            LOG "[$FUNCNAME][${LINENO}]back card name(${back_card_name}) is a virtual Network Adapter Name."
            back_card_name=$( echo "${back_card_name}" | awk -F. '{print $1}')
        fi
    fi
    
    if [ "X${back_card_name}" == "X" ]
    then
        LOG "[$FUNCNAME][${LINENO}]failed to obtain node NID(${my_nid}) back card name from ${cm_db_file} and ${cm_snas_file}."
        echo ""
    else
        version_netcard=$( ethtool -i $back_card_name  2>/dev/null | grep -we ^version: | awk -F"version:" '{print $2}' | awk -F" " '{print $1}' | sed -e 's/\://' )
        echo ${version_netcard}
    fi
    
    return
}

#ȡ汾
function get_driver_version()
{    
    local isTS=0
    local version_driver=""
    local version_netcard=""
   
    version_netcard=$( get_back_card_version )
    if [ -z "$version_netcard" ] ; then
        version_driver=$version_driver"netcard driver: null\n"
    else
        version_driver=$version_driver"netcard driver: $version_netcard\n"
    fi

    #ȡnvdimm汾
    IsTSNode
    isTS=$?
    if [ ${isTS} -eq 0 ];then
        #ARMûnvdimm
        version_nvdimm=""
    else
        version_nvdimm=`rpm -qa |grep nvdimm |awk -F "-" '{print $(NF-1)}'`
    fi
    if [ -z "$version_nvdimm" ] ; then
        version_driver=$version_driver" nvdimm driver: null\n"
    else
        version_driver=$version_driver" nvdimm driver: $version_nvdimm\n"
    fi

    #ȡOFED汾
    ofedVer=$(get_ofed_version)

    if [ -z "$ofedVer" ] ; then
        version_driver=$version_driver" ofed driver: null\n"
    else
        version_driver=$version_driver" ofed driver: $ofedVer\n"
    fi

    #ȡSAS汾
    is3008SasCard
    is3008Sas=$?
    IsRHNode
    isrhNode=$?
    if [ "$isrhNode" = "0" -a "$is3008Sas" == "0" ]; then
        version_sascard=`rpm -qa |grep lsisas-mpt3sas |awk -F "-" '{print $6}'`
    elif [ "$isrhNode" = "0" -a "$is3008Sas" != "0" ]; then
        version_sascard=`storcli64 /c0 show | grep "Driver Version" | sed s/[[:space:]]//g | awk -F"=" '{print $2}'`
    elif [ ${isTS} -eq 0 ];then
        #ARM ûSAS
        version_sascard=""
    else
        version_sascard=`rpm -qa |grep lsisas |awk -F "-" '{print $(NF-1)}'`
    fi
    if [ -z "$version_sascard" ] ; then
        version_driver=$version_driver"sascard driver: null\n"
    else
        version_driver=$version_driver"sascard driver: $version_sascard\n"
    fi
    echo "$version_driver"
}

#16ַתΪASCIIַ
function hex2ascii()
{
    INPUT=$1
    OUTPUT=""
    for i in $INPUT ; do
        OUTPUT=$OUTPUT`echo -e "\\x$i"`
    done
    echo "$OUTPUT"
}
#RHǴӵڶֶοʼȡ
function RHhex2ascii()
{
    local idx=0
    local INPUT=$1
    local OUTPUT=""
    for i in $INPUT ; do
        idx=$((idx+1))
        if [ $idx -gt 1 ];then
            OUTPUT=$OUTPUT`echo -e "\\x$i"`
        fi
    done
    echo "$OUTPUT"
}

function exec_ipmitool()
{
    ipmitool $@
    if [ $? -eq 0 ]; then
    sleep 2
        return 0
    fi

    sleep 10
    ipmitool $@
    if [ $? -eq 0 ]; then
    sleep 2
        return 0
    fi

    sleep 10
    ipmitool $@
    sleep 2
}

#ȡ̼汾
function get_firmware_version()
{
    version_firmware=""

    #ipmi
    systemctl start ipmi >/dev/null

    #򿪿
    for i in `seq 3`
    do
        ipmitool raw 0x30 0x90 0x20 0x00 0x07 0xDB 0x01 >/dev/null

        iRet=$?
        if [ "${iRet}" != "0" ];then
            sleep 5
            LOG "[get_firmware_version]try ipmitool raw 0x30 0x90 0x20 0x00 0x07 0xDB 0x01 again"
        else
            break
        fi
    done

    #ȡBMC̼汾
    raw_version=`exec_ipmitool raw 0x30 0x90 0x08 0x00 0x01`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bmc="null"
    else
        version_bmc=`hex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"           BMC: $version_bmc\n"

    #ȡBIOS̼汾
    raw_version=`exec_ipmitool raw 0x30 0x90 0x08 0x00 0x06`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bios="null"
    else
        version_bios=`hex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"          BIOS: $version_bios\n"

    #ȡMB_CPLD̼汾
    raw_version=`exec_ipmitool raw 0x30 0x90 0x08 0x00 0x02`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_mb_cpld="null"
    else
        version_mb_cpld=`hex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"       MB_CPLD: $version_mb_cpld\n"

    #ȡBOOTROM̼汾
    raw_version=`exec_ipmitool raw 0x30 0x90 0x08 0x00 0x07`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bootrom="null"
    else
        version_bootrom=`hex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"       BOOTROM: $version_bootrom\n"

    #ȡEXPEXP_CPLD̼汾
    exp_type=`exec_ipmitool raw 0x30 0x4a`
    if [ "$exp_type" == " 02" ] ; then
        #2U12̿
        raw_version_exp1=`exec_ipmitool raw 0x30 0x90 0x08 0x04 0x01`
        raw_version_exp2=""

    elif [ "$exp_type" == " 01" ] ; then
        #2U25̿
        raw_version_exp1=`exec_ipmitool raw 0x30 0x90 0x08 0x06 0x01`
        raw_version_exp2=""

    elif [ "$exp_type" == " 06" ] ; then
        #4U36̿
        raw_version_exp1=`exec_ipmitool raw 0x30 0x90 0x08 0x08 0x01`
        raw_version_exp2=`exec_ipmitool raw 0x30 0x90 0x08 0x09 0x01`
    else
        raw_version_exp1=""
        raw_version_exp2=""
    fi

    raw_version_test=`echo $raw_version_exp1 |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version_exp1" ] || [ ! -z "$raw_version_test" ] ; then
        version_exp="null"
    else
        version_exp=`hex2ascii "$raw_version_exp1"`
    fi
    version_firmware=$version_firmware"    EXP & CPLD: $version_exp\n"

    if [ ! -z "$raw_version_exp2" ] ; then
        raw_version_test=`echo $raw_version_exp2 |grep -Ev ^[0-9,a-f,' ']+$`
        if [ ! -z "$raw_version_test" ] ; then
            version_exp="null"
        else
            version_exp=`hex2ascii "$raw_version_exp2"`
        fi
        version_firmware=$version_firmware"EXP & CPLD(4U): $version_exp\n"
    fi

    #رտ
    for i in `seq 3`
    do
        ipmitool raw 0x30 0x90 0x20 0x00 0x07 0xDB 0x00 >/dev/null

        iRet=$?
        if [ "${iRet}" != "0" ];then
            sleep 5
            LOG "[get_firmware_version]try ipmitool raw 0x30 0x90 0x20 0x00 0x07 0xDB 0x00 again"
        else
            break
        fi
    done
    echo "$version_firmware"
}

function get_RH_firmware_version
{
    version_firmware=""
    #ȡBMC̼汾
    raw_version=`ipmitool raw 0x30 0x90 0x08 0x0 0x01 0x00 0x0e`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bmc="null"
    else
        version_bmc=`RHhex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"           BMC: $version_bmc\n"
    #ȡBIOS̼汾
    raw_version=`ipmitool raw 0x30 0x90 0x08 0x00 0x06 0x00 0x0e`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bios="null"
    else
        version_bios=`RHhex2ascii "$raw_version"`
        version_bios=`echo $version_bios|awk -F ")" '{print $2}'`
    fi
    version_firmware=$version_firmware"          BIOS: $version_bios\n"
    IsRH2288Node
    if [ "$?" = "0" ]; then
        #ȡ2288 CPLD̼汾
        raw_version=`ipmitool raw 0x30 0x90 0x08 0x00 0x02 0x00 0x0e`
        raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
        if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
            version_mb_cpld="null"
        else
            version_mb_cpld=`RHhex2ascii "$raw_version"`
            version_mb_cpld=`echo $version_mb_cpld|awk -F ")" '{print $2}'`
        fi
        version_firmware=$version_firmware"       MB_CPLD: $version_mb_cpld\n"
        echo "$version_firmware"

    else
        raw_version=` ipmitool raw 0x30 0x90 0x08 0x00 0x02 0x00 0x0e`
        raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
        if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
            version_mb_cpld="null"
        else
            version_mb_cpld=`RHhex2ascii "$raw_version"`
            version_mb_cpld=`echo $version_mb_cpld|awk -F ")" '{print $2}'`
        fi
        version_firmware=$version_firmware"       MB_CPLD: $version_mb_cpld\n"
        echo "$version_firmware"
    fi
}

function get_TS_firmware_version
{
    local iobBordId="69"
    local retCheck=""
    version_firmware=""
    #ȡBMC̼汾
    raw_version=`ipmitool raw 0x30 0x90 0x08 0x0 0x01 0x00 0x0e`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bmc="null"
    else
        version_bmc=`RHhex2ascii "$raw_version"`
    fi
    version_firmware=$version_firmware"           BMC: $version_bmc\n"

    #ȡBIOS̼汾
    raw_version=`ipmitool raw 0x30 0x90 0x08 0x00 0x06 0x00 0x0e`
    raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
    if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
        version_bios="null"
    else
        version_bios=`RHhex2ascii "$raw_version"`
        version_bios=`echo $version_bios|awk -F ")" '{print $2}'`
    fi
    version_firmware=$version_firmware"          BIOS: $version_bios\n"


    IsTS5280Node
    if [ "$?" = "0" ]; then

        #ȡ5280 CPLD̼汾
        raw_version=`ipmitool raw 0x30 0x90 0x08 0x00 0x02 0x00 0x0e`
        raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
        if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
            version_mb_cpld="null"
        else
            version_mb_cpld=`RHhex2ascii "$raw_version"`
            version_mb_cpld=`echo $version_mb_cpld|awk -F ")" '{print $2}'`
        fi
        version_firmware=$version_firmware"       MB_CPLD: $version_mb_cpld\n"
        echo "$version_firmware"

    else
        raw_version=` ipmitool raw 0x30 0x90 0x08 0x00 0x02 0x00 0x0e`
        raw_version_test=`echo $raw_version |grep -Ev ^[0-9,a-f,' ']+$`
        if [ -z "$raw_version" ] || [ ! -z "$raw_version_test" ] ; then
            version_mb_cpld="null"
        else
            version_mb_cpld=`RHhex2ascii "$raw_version"`
            version_mb_cpld=`echo $version_mb_cpld|awk -F ")" '{print $2}'`
        fi
        version_firmware=$version_firmware"       MB_CPLD: $version_mb_cpld\n"
        echo "$version_firmware"
    fi
}

function checkUpgradeFlag()
{
    # ĽڵupgflagΪ0 ; ڵûfuncversion汾upgflagΪ 1; ڵfuncversion汾upgflagΪ2. ͬ汾upgflagΪ3
    local FuncVersion=$1
    local upgflag=0

    #´汾,򲻼,Ҫųа汾,Իͬ汾, Ӧòͬ汾.
    local upgrade_log=/var/log/upgrade.log
    local update_ver=$(cat ${upgrade_log} | grep -Po '(?<=pre_clusterVersion is )[0-9]+' | tail -n 1 | tr -d ' ')
    if [ "X$update_ver" == "X$FuncVersion" ];then
        upgflag=3
        echo $upgflag
        return
    fi
    #,ж
    old_svn_count=$(cat ${upgrade_log} | grep "mvx -s finish" | wc -l)
    if [ $old_svn_count -eq 0 ]  ;then
        upgflag=0
    else
        new_cluster_count=$(cat ${upgrade_log} | grep "new_cluster_version" | tail -n 1 |grep ${FuncVersion} | wc -l)
        if [ $new_cluster_count -eq 0 ];then
            if [ $old_svn_count -lt 2 ];then
                upgflag=0
            else
                upgflag=1
            fi
        else
            upgflag=2
        fi
    fi
    echo $upgflag
}

version_all=`get_driver_version`
IsRHNode
if [ $? -eq 0 ]; then
    version_all=$version_all"`get_RH_firmware_version`"
fi

IsT3000Node
if [ $? -eq 0 ]; then
    version_all=$version_all"`get_firmware_version`"
fi
#ARM
IsTSNode
if [ $? -eq 0 ]; then
    version_all=$version_all"`get_TS_firmware_version`"
fi

echo -e "$version_all"

nodetype=$(cat  /opt/huawei/deploy/etc/deploy.ini | grep devicetype |awk -F= '{print $2}')
echo "devicetype: $nodetype"
LOG "devicetype: $nodetype"

cat /opt/huawei/deploy/package/version | grep ExternalVersion | sed 's/=/: /'
#ȡ汾
ComponentVersion=`cat /var/huawei/patch/cur/version|grep ProductVersion|awk -F'=' '{print$2}'`
if [ "$ComponentVersion" != "" ];then
    echo "ComponentVersion:$ComponentVersion"
else
    echo "ComponentVersion:"
fi
LOG "ComponentVersion:$ComponentVersion"

#ȡȲ汾
SphVersion=`ls /var/huawei/patch/cur/sph |awk -F'_' '{print$NF}'`
if [ "$SphVersion" != "" ];then
    echo "SphVersion:$SphVersion"
else
    echo "SphVersion:"
fi
LOG "SphVersion: $SphVersion"

#ȡڵ汾
FuncVersion=$(cat /opt/huawei/snas/static/funcver.ini |tr -d " "|grep "NodeVersion=" |awk -F"=" '{print $2}')
echo "FuncVersion:$FuncVersion"
LOG "[GetNodeVersion][$LINENO]FuncVersion:$FuncVersion"

upgflag=$(checkUpgradeFlag $FuncVersion)
echo "UpgradeFlag:$upgflag"
LOG "[GetNodeVersion][$LINENO]UpgradeFlag:$upgflag"
ClusterUpdStatus=$(cat /opt/huawei/snas/etc/updresult.ini |grep ClusterUpdStatus | awk -F= '{print $2}'| sed 's/[^0-9]//g')
echo "ClusterUpdStatus:$ClusterUpdStatus"
ClusterVersion=$(cat /opt/huawei/snas/etc/clusterver.ini |tr -d " "|grep "ClusterVersion="|awk -F"=" '{print $2}')
echo "ClusterVersion:$ClusterVersion"
LOG "[GetNodeVersion][$LINENO]ClusterVersion:$ClusterVersion"
