#!/bin/bash

LOG_FILE="/var/log/inspect.log"
function LOG 
{
    echo [`date`][$$]$@ >> $LOG_FILE
}


RH5288_BoardID=("ca" "cb")
RH2288_BoardID=("73" "75")

#ȡ汾һʽ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 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汾
    version_nvdimm=`rpm -qa |grep nvdimm |awk -F "-" '{print $6"-"$7}'`
    if [ -z "$version_nvdimm" ] ; then
        version_driver=$version_driver" nvdimm driver: null\n"
    else
        version_driver=$version_driver" nvdimm driver: $version_nvdimm\n"
    fi
    
    #ȡIB汾
    version_ibcard=`ofed_info -s |grep MLNX_OFED_LINUX |awk -F "-" '{print $2"-"$3}' |awk -F ":" '{print $1}'` 
    if [ -z "$version_ibcard" ] ; then
        version_driver=$version_driver" ibcard driver: null\n"
    else
        version_driver=$version_driver" ibcard driver: $version_ibcard\n"
    fi
    
    #ȡSAS汾
    IsRHNode
    if [ "$?" = "0" ]; then
        version_sascard=`rpm -qa |grep lsisas-mpt3sas |awk -F "-" '{print $7"-"$8}'`
    else   
        version_sascard=`rpm -qa |grep lsisas |awk -F "-" '{print $6"-"$7}'`
    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
    service ipmi start >/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 getbackcpld
{
    local verioncpld=""
    local FruValue=""
    local counts=0  
    local productstyle=$1
    local BackCplds=$2
    
    #ѯȷȡȷBoardID ʱʹõFruValue
    for((i=1;i<256;i++))
    do
        FruValue=`printf "0x%x" $i`       
        BoardID=`ipmitool raw 0x30 0x90 0x29 $FruValue 0x2 2>/dev/null`
        if [ "$BoardID" = "" ];then
            continue
        fi
        
        for item in ${BackCplds[*]}
        do  
            #ipmitoolԵһλǿո
            if [ " $item" = "$BoardID" ];then
               raw_version=`ipmitool raw 0x30 0x90 0x08 $FruValue 0x02 0x00 0x0e`
               version_exp=`RHhex2ascii "$raw_version"`
               version_exp=`echo $version_exp|awk -F ")" '{print $2}'`
               verioncpld="$verioncpld $version_exp"
               LOG "[FUNCTION]verioncpld=$version_exp,BoardID=$BoardID"
               counts=$((counts+1))
               break
            fi       
        done
        #5288鱳壬2288һ飬ҵֱ֮breakټѭ
        if [ "$productstyle" = "RH5288" -a "$counts" = "2" ] ;then
            break
        elif [ "$productstyle" = "RH2288" -a "$counts" = "1" ];then
            break
        fi
    done
    
    if [ "$verioncpld" = "" ];then
        verioncpld=null
    fi
    
    if [ "$productstyle" = "RH5288" ];then
        echo "EXP & CPLD(4U): $verioncpld"
    else
        echo "EXP & CPLD: $verioncpld"
    fi
}

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"
    nodetype=$(cat  /opt/huawei/deploy/etc/deploy.ini | grep devicetype |awk -F= '{print $2}')
    version_firmware=$version_firmware"    devicetype: $nodetype\n"
    IsRHtpyeNode
    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"
        getbackcpld "RH2288" "${RH2288_BoardID[*]}"
     
    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"
        getbackcpld "RH5288" "${RH5288_BoardID[*]}"
    fi   
}
function IsC72Node() 
{
    local bC72=0
    dmidecode -t 4 | grep -q "Family: Atom"
    if [ $? -eq 0 ];then
        bC72=1
    else
        bC72=0
    fi
    return $bC72
}

function IsRHtpyeNode
{
    local name=''
    name=$(dmidecode -t 1 | grep "Product Name:" | awk '{print $3}')
    if [ "$name" = "RH2288" -o "$name" = "RH2288H" ]; then
        return 0
    else
        return 1
    fi   
}

function IsRHNode() 
{
    local name=''
    name=$(dmidecode -t 1 | grep "Product Name:" | awk '{print $3}')
    if [ "$name" = "RH2288" -o "$name" = "5288" -o "$name" = "RH2288H" ]; then
        return 0
    else
        return 1
    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
}

IsC72Node
if [ "$?" = "0" ]; then
    version_all=`get_driver_version`
    IsRHNode
    if [ "$?" = "0" ]; then 
        version_all=$version_all"`get_RH_firmware_version`"
    else
        version_all=$version_all"`get_firmware_version`"
    fi
else
    version_all=`cat /OSM/conf/drv_version |grep PANGEA |sed 's/PANGEA/PANGEA_Version:/'`
fi

echo -e "$version_all"
cat /opt/huawei/deploy/package/version | grep ProductVersion | 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$3}'`
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"
