#!/bin/bash
################################################################
#说明：这个脚本用于PMC PM8060卡的固件升级.
#功能：
#1. 支持多张卡更新.
#2. 支持不同固件类型更新
#3. 支持标卡、OEM卡的型号识别和固件更新。
#作者：Sky.Zhang
#脚本名：update.sh
#版本：1.0
#发布时间：2021/12/02
##############################################################
#版本：1.1
#发布时间：2021/12/07
#作者：sky.zhang
#修改列表：
#1. 修复固件命名异常问题。
#2. 增加日志删除功能。
#3. 增加管理工具版本检测功能，并指定工具版本：3.07.00 (23971)
#4. 调整过滤条件为关键字。
#############################################################

CURRENT_DIR="`cd $(dirname $0);pwd`"
cd ${CURRENT_DIR}
source "${CURRENT_DIR}/fw_update.conf"
TEMP_FILE=PMC8060.temp
PCI_ADDRESS_TEMP=pci_address.temp
FW_FILE=""
FW_VERSION=""


function clear_logs() {
	rm -rf ${CURRENT_DIR}/${TEMP_FILE} rm -rf ${CURRENT_DIR}/${PCI_ADDRESS_TEMP}
}

##判断存储控制器工具类型、是否安装，没有安装，则yum安装
function flash_tools_check() {

	cd ${CURRENT_DIR}
       
	if [ ! -f "${FW_FLASH_TOOL}" ]; then
    		yum install Arcconf -y
		FW_FLASH_TOOL="/usr/sbin/arcconf"
	elif [ "`${FW_FLASH_TOOL} | grep "3.07.00 (23971)"`" == "" ];then
    		yum update Arcconf -y
		FW_FLASH_TOOL="/usr/sbin/arcconf"
	fi

        #再次判断是否DELL存储控制器工具是否安装，没有代表上一步安装失败，退出固件升级进程
        if [ ! -f "${FW_FLASH_TOOL}" ]; then
                echo -e "缺少控制器固件升级工具，停止固件升级。"
                exit 0x01
        fi
}

function fw_info_check() {
	#符合标准的厂商/设备的主/子ID的设备，方可以执行固件升级，否则反馈设备和固件类型不匹配。
	if [ "`grep -i "${1}" ${CURRENT_DIR}/${SSID_LIB_FILE} | grep -i "Adaptec Series 8 12G SAS/PCIe 3" | grep -i PMC8060`" != "" ];then
		FW_FILE="${H3C_PM8060_FW_FILE}"
		FW_VERSION="${H3C_PM8060_FW_VERSION}"
	else 
		echo -e "存储控制器${CTRL_ID}和固件类型不匹配,停止更新。"
		exit 0x02
	fi
}


function fw_check_update() {
	cd ${CURRENT_DIR}

	#查询控制器数量	
	CONTROLLER_COUNT=`${FW_FLASH_TOOL} list | grep -c "Controllers found:"`
		
	for((CTRL_ID=1;CTRL_ID<=${CONTROLLER_COUNT};CTRL_ID++))
	do
		SLOT_ID=`lspci -v -s ${1} | grep "Physical Slot" | awk '{print $NF}'`
		#判断当前控制器的插槽位置和要执行固件升级的设备的位置是否一致，一致执行固件升级，不一致，退出固件升级。
		
		if [ `${FW_FLASH_TOOL} list ${CTRL_ID} | grep "Controller ${CTRL_ID}:" | cut -d ',' -f 2| awk '{print $NF}'` -eq ${SLOT_ID} ];then	
			CURRENT_FW_VERSION="`${FW_FLASH_TOOL} getversion ${CTRL_ID} | grep "^Firmware" | cut -d ':' -f 2 | sed 's/^ //g'`"
			if [ "${CURRENT_FW_VERSION}" != "${FW_VERSION}" ]; then
				${FW_FLASH_TOOL} romupdate ${CTRL_ID} "${CURRENT_DIR}/${FW_FILE}" force noprompt
			        
				sleep 5s
				echo -e "存储控制器固件版本已完成升级，重启生效。"
			else
				echo -e "存储控制器${CTRL_ID}当前固件版本已为标准版本:${CURRENT_FW_VERSION}，不需要再更新。"
			fi
			
			#还原默认设置值
			sleep 20s
			${FW_FLASH_TOOL} setcache ${CTRL_ID} deviceall drivespecific noprompt
                        sleep 3s
                        ${FW_FLASH_TOOL} setbiosparams ${CTRL_ID} backplanemode 1
                        sleep 3s
                       	${FW_FLASH_TOOL} setcontrollermode ${CTRL_ID} 0
                        sleep 3s
                        ${FW_FLASH_TOOL} CONSISTENCYCHECK ${CTRL_ID} period 14 noprompt

		else
			echo -e "固件和存储控制器${CTRL_ID}型号不匹配。"
			exit 0x03
		fi
		
		rm -rf ${CURRENT_DIR}/${TEMP_FILE}
	done
}


function main() {
	
	clear_logs
	#获取控制器数量
	lspci | grep "${KEYWORD}" | awk '{print $1}' > ${PCI_ADDRESS_TEMP}	

	while read PCI_ADDRESS
	do
		SSID_PREFIX="`lspci -n -s ${PCI_ADDRESS} | awk '{print $(NF-2)}'`"
		SSID_STUFFIX="`lspci -vn -s ${PCI_ADDRESS} | grep 'Subsystem:' | awk '{print $NF}'`"
		flash_tools_check

		fw_info_check "${SSID_PREFIX}:${SSID_STUFFIX}"
			
		fw_check_update "${PCI_ADDRESS}"
		
	done < ${PCI_ADDRESS_TEMP}
	clear_logs
}


main
