#!/bin/bash
set +x

source /opt/huawei/snas/script/inspect_mml/CommonFunc.sh
LOGFILE="/var/log/inspect.log"
DISKTYPEFILE="/tmp/tmpfile_disk_typefile.tmp"
INVAILDNUMBER=4294967295
DISK_TYPE_SAS=1
DISK_TYPE_SATA=2
DISK_TYPE_SSD=3
DISK_TYPE_SMR_SATA=15
. /opt/node_type_recognize.sh
. /opt/install_os_common_func.sh

function log_file()
{
    echo [`date "+%Y-%m-%d %H:%M:%S"`][$$]$@ >> $LOGFILE
}

function GetDiskNameList()
{
    local tmpinfo=''
    local diskNum=`/usr/local/bin/disktool -s |grep sd- |wc -l`
    if [ $diskNum == 0 ]; then
        tmpinfo=`/usr/local/bin/disktool -f A |grep "System Device" | awk '{print $3}'`
    else
        tmpinfo=`/usr/local/bin/disktool -s | awk 'BEGIN{i=0}
        {
            if($1~/^\/dev\/sd-[0-9]+a$/)
            {
                #diskname: "/dev/sd-64a",get name of number "64"
                nameLen=length($1)
                sdLen=length("/dev/sd-")
                tmpname=substr($1,sdLen+1,nameLen-sdLen-1)
                if(tmpname >= 64)
                {
                    namelist[i]=$1
                    i++
                }
            }
        }
        END{
            namelistlen=length(namelist)
            for(i=0;i<namelistlen;i++){print namelist[i];}
        }'`
    fi
    echo ${tmpinfo}
}

function GetT3000SASCardWriteCache()
{
    local LSIUTIL_EXE="/opt/driver/lsisas-driver/lsiutil"
    local tmpfilename="/tmp/tmpqueryT3000SAScache"
    local tmpinfo=''
    chmod +x $LSIUTIL_EXE
    echo "1" > $tmpfilename
    echo "68" >> $tmpfilename
    echo "0" >> $tmpfilename
    echo "0" >> $tmpfilename
    ret=`$LSIUTIL_EXE<$tmpfilename | grep Caching | awk '{print $4}'`
    tmpinfo="ioc write cache is $ret."
    log_file "[$FUNCNAME][$LINENO] T3000 SAS info =($tmpinfo)" 
    
    if [ -f $tmpfilename ];then
        rm $tmpfilename
        log_file "[$FUNCNAME][$LINENO] rm $tmpfilename"
    fi
    
    echo "$tmpinfo" | grep "write cache" | grep -i Disabled > /dev/null
    if [ $? -eq 0 ];then
        log_file "[$FUNCNAME][$LINENO] SAS status =(Disabled)"
        echo "Device:SAS card||Write Cache Status:Disabled"
    else
        echo "$tmpinfo" | grep "write cache" | grep -i Enabled > /dev/null
        if [ $? -eq 0 ];then
            echo "[ERR]Device(SAS card),Write Cache Status(Enabled)"
        else
            echo "[ERR]Get SAS card write cache failed"  
            log_file "[$FUNCNAME][$LINENO] Get SAS card write cache failed"            
        fi
    fi
}
 
#获取节点场景: 1 - 节点上有SMR磁盘, 需要开启SAS写缓存; 0 - 节点上没有SMR磁盘, 需要关闭SAS写缓存
#(1)先从snas.ini中查看是否有SMR的标记字段DiskNodeType, 以这个字段为主;
#(2)如果查不到DiskNodeType, 那么利用lsscsi工具查看, 获取磁盘类型, 如果有SMR磁盘, 返回1
function GetDiskNodeType()
{
    snas_ini="/opt/huawei/snas/etc/snas.ini"
    if [ -f $sans_ini ]; then
        tmp=`sed -n '/DiskNodeType/p' $snas_ini`
    else
        tmp=""
    fi

    type=0
    if [ -z $tmp ]; then
        smr_cnt=`lsscsi -g | awk '{if ($2=="(0x14)") print $NF}'| wc -l`
        if [ $smr_cnt -gt 0 ]; then
            type=1
        fi
    else
        type=`grep -w DiskNodeType $snas_ini | awk -F '=' '{print $2}'`
    fi
    
    return $type
}

function GetRHSASCardWriteCache()
{
    local tmpinfo=''
    local lsiutil_path="/opt/driver/lsisas-mpt3sas-driver/"
    
    cd $lsiutil_path
    if [ $? -ne 0 ]; then
        log_file "[$FUNCNAME][$LINENO] Fail to go to lsiutil directory"
        echo "[ERR]Failed to go to lsiutil directory"
        return
    fi
    
    tmpinfo=`sh lsiutil_operateioc_writecache.sh query`
    cd - > /dev/null
    log_file "[$FUNCNAME][$LINENO] RH SAS info =($tmpinfo)" 
    
    GetDiskNodeType
    diskNodeType=$?
    log_file "[$FUNCNAME][$LINENO] node disk type =($diskNodeType)" 
    
    echo "$tmpinfo" | grep "write cache" | grep -i "Disabled" > /dev/null
    if [ $? -eq 0 ];then
        log_file "[$FUNCNAME][$LINENO] SAS status =(Disabled)"
        echo "Device:SAS card||Write Cache Status:Disabled"
        
        if [ $diskNodeType -eq 1 ]; then
            echo "[ERR]Node is SMR Scene or node has SRM disk, need to enable SAS Write Cache."
        fi 
    else
        echo "$tmpinfo" | grep "write cache" | grep -i "Enabled" > /dev/null
        if [ $? -eq 0 ];then
            echo "Device:SAS card||Write Cache Status:Enabled"
            if [ $diskNodeType -ne 1 ]; then
                echo "[ERR]Node is not SMR scene or node does not have SMR Disk, need to disable SAS Write Cache."
            fi
        else
            echo "[ERR]Get SAS card write cache failed"  
            log_file "[$FUNCNAME][$LINENO] Get SAS card write cache failed"            
        fi
    fi
}

function GetDiskWriteCache()
{
    local StatusInfo=''
    local isNodePass=0
    NameList=()
    NameList=`GetDiskNameList`
    log_file "[$FUNCNAME][$LINENO] NameList =($NameList)" 
    /usr/local/bin/MmlBatch 4016 "cm showdiskname" | grep "Disk_Type" |grep -v $INVAILDNUMBER | sed 's/.*\(Disk_Type:.*\)/\1/' > $DISKTYPEFILE
    dos2unix $DISKTYPEFILE > /dev/null 2>&1
    sed -i -e 's/\x1B\[0;[3-4][0-9]m//g' -e 's/\x0D//g' -e 's/\x00//g' $DISKTYPEFILE >/dev/null 2>&1
    log_file "[$FUNCNAME][$LINENO] result=(`cat $DISKTYPEFILE`)"
    if [ ! -s $DISKTYPEFILE ];then
        echo "[ERR]Exec disk command failed"
        log_file "[$FUNCNAME][$LINENO] exec command failed(/usr/local/bin/MmlBatch 4016 cm showdiskname)"
        return 1
    fi
    for item in ${NameList[*]};do
        grep "${item}" $DISKTYPEFILE > /dev/null 2>&1
        if [ $? -ne 0 ];then
            log_file "[$FUNCNAME][$LINENO] skip kicked or fault disk($item)"
            continue
        fi
        disktype=$(cat $DISKTYPEFILE | grep "$item" | awk -F '\\|\\|' '{print $1}' | tail -1 | awk -F':' '{print $2}')
        if [ "${disktype}" == "${DISK_TYPE_SSD}" ];then
            log_file "[$FUNCNAME][$LINENO] skip SSD disk($item),disktype=$disktype"
            continue
        fi
        StatusInfo=`/usr/local/bin/disktool -f o ${item}`
        if [ "${disktype}" == "${DISK_TYPE_SMR_SATA}" ];then
            #SMR盘的写缓存开关预期结果为开启
            echo ${StatusInfo} | grep -i "enable" > /dev/null
            if [ $? -eq 0 ];then
                log_file "[$FUNCNAME][$LINENO] disk($item) status =(Enabled)"
            else
                echo ${StatusInfo} | grep -i "disable" > /dev/null
                if [ $? -eq 0 ];then
                    echo "[ERR]Device(${item}) is SRM disk, Write Cache Status(Disabled)"
                    log_file "[$FUNCNAME][$LINENO] Get disk($item) Write Cache Status(Disabled)"
                else
                    echo "[ERR]Get disk($item) write cache failed "
                    log_file "[$FUNCNAME][$LINENO] Get disk($item) write cache failed"
                fi
                isNodePass=1
            fi
        else
            echo ${StatusInfo} | grep -i "disable" > /dev/null
            if [ $? -eq 0 ];then
                log_file "[$FUNCNAME][$LINENO] disk($item) status =(Disabled)"
            else
                echo ${StatusInfo} | grep -i "enable" > /dev/null
                if [ $? -eq 0 ];then
                    echo "[ERR]Device(${item}),Write Cache Status(Enabled)"
                    log_file "[$FUNCNAME][$LINENO] Get disk($item) Write Cache Status(Enabled)"
                else
                    echo "[ERR]Get disk($item) write cache failed "
                    log_file "[$FUNCNAME][$LINENO] Get disk($item) write cache failed"
                fi
                isNodePass=1
            fi
        fi
    done
    
    if [ $isNodePass -eq 0 ];then
        if [ "${disktype}" == "${DISK_TYPE_SMR_SATA}" ];then
            echo "Device:disk||Write Cache Status:Enabled"
        else
            echo "Device:disk||Write Cache Status:Disabled"
        fi
    fi
}

function GetAllWriteCache()
{
    local is3008SasFlag=0
    is3008SasCard
    is3008SasFlag=$?
    IsRHNode
    if [ $? -eq 0 -a ${is3008SasFlag} -eq 0 ]; then  
        log_file "[$FUNCNAME][$LINENO] Check RH SAS card write cache"
        GetRHSASCardWriteCache
    fi
    IsT3000Node
    if [ $? -eq 0 ];then
        log_file "[$FUNCNAME][$LINENO] Check T3000 SAS card write cache"
        GetT3000SASCardWriteCache
    fi
    log_file "[$FUNCNAME][$LINENO] Check Disk write cache"
    GetDiskWriteCache
}

GetAllWriteCache
if [ -f $DISKTYPEFILE ];then
    rm -f $DISKTYPEFILE
    log_file "[$FUNCNAME][$LINENO] delete tmp file"
fi
exit 0

