#!/bin/bash
##################################################################################
#说明：这个脚本用于Hewlett-Packard Company Smart Array Gen8/9 Controllers的固件升级.
#功能：
#1. 支持多张卡更新.
#2. 支持不同固件类型更新
#3. 支持标卡、OEM卡的型号识别和固件更新。
#作者：Sky.Zhang
#脚本名：update.sh
#版本：1.0
#发布时间：2021/12/06
####################################################################################
#版本：1.1
#发布时间：2021/12/07
#作者：sky.zhang
#更新列表：
#1. 增加日志删除功能
#2. 修复主函数语法错误。
#3. 修复主函数文件内容是否为空判断问题。
#4. 修复主函数Gen9 变量赋值问题。
#5. 修复主函数变量字符串裁剪问题。
#6. 修复固件升级包目录名异常问题。
#7. 调整过滤条件为关键字。
####################################################################################

CURRENT_DIR="`cd $(dirname $0);pwd`"
cd ${CURRENT_DIR}
source "${CURRENT_DIR}/fw_update.conf"
GEN8_TEMP_FILE=gen8.temp
GEN9_TEMP_FILE=gen9.temp
GEN8_PCI_ADDRESS_TEMP=gen8_pci_address.temp
GEN9_PCI_ADDRESS_TEMP=gen9_pci_address.temp
FW_FILE_NAME=""


function clear_logs() {

	rm -rf "${CURRENT_DIR}/${GEN8_PCI_ADDRESS_TEMP}" "${CURRENT_DIR}/${GEN9_PCI_ADDRESS_TEMP}" "${CURRENT_DIR}/${GEN9_TEMP_FILE}" "${CURRENT_DIR}/${GEN8_TEMP_FILE}"
}

#HP Smart Array系列固件升级
function ctrl_fw_Update() {
	rpm -ivh ${CURRENT_DIR}/${1}*.rpm
        cd /usr/lib/x86_64-linux-gnu/${1}
        if [ -f setup ]; then
        	./setup -e -s -f 	
        fi

        sleep 20s
        
	rpm -e ${1}
}

#检测是否有未知设备
function ctrl_info_check() {
	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 "${SSID_PREFIX}:${SSID_STUFFIX}"
		#fw_info_check "${PCI_ADDRESS}"
		if [ "`grep "${SSID_PREFIX}:${SSID_STUFFIX}" ${CURRENT_DIR}/${SSID_LIB_FILE}`" == ""  ];then
			DEVICE_INFO="`lspci -v -s ${PCI_ADDRESS} | grep "Subsystem"  | cut -d ':'  -f 2 | sed 's/^ //g'` "
			SLOT_ID="`lspci -v -s ${PCI_ADDRESS} | grep "Physical Slot:" | awk '{print $NF}'`"
			echo -e "PCI地址:${PCI_ADDRESS}\t设备信息:${DEVICE_INFO}\t设备ID信息：${SSID_PREFIX}:${SSID_STUFFIX}\tSlot插槽编号:${SLOT_ID}" >> ${2}
		fi	
	done < ${1}
	
	if [ -f ${2} ];then
                echo -e "存在未知存${3}储控制器设备，请联系相关硬件业务负责人，进行排查确认。"  
       	fi
	
}


function main() {
	clear_logs

	#获取控制器数量

	lspci | grep  "${GEN8_KEYWORD}" | awk '{print $1}' > ${CURRENT_DIR}/${GEN8_PCI_ADDRESS_TEMP}
	lspci | grep  "${GEN9_KEYWORD}" | awk '{print $1}' > ${CURRENT_DIR}/${GEN9_PCI_ADDRESS_TEMP}
	
	#判断该系统是否有Gen8系列设备，有的话执行控制器信息检测和固件升级，没有，则报错。	
        if [ `wc -l ${CURRENT_DIR}/${GEN8_PCI_ADDRESS_TEMP} | awk '{print $1}'` -gt 0 ]; then
		ctrl_info_check "${CURRENT_DIR}/${GEN8_PCI_ADDRESS_TEMP}" "${CURRENT_DIR}/${GEN8_TEMP_FILE}" "Gen8"	
		FW_FILE_NAME="`echo ${GEN8_FW_FILE} | sed 's/.i386//g' | sed 's/.x86_64//g' | sed 's/.rpm//g'`"	
		ctrl_fw_Update "${FW_FILE_NAME}" 
        else
                echo -e "该系统下无Smart Array Gen8系列控制器设备."     
        fi
	
	#判断该系统是否有Gen9系列设备，有的话执行控制器信息检测和固件升级，没有，则报错。	
        if [ `wc -l ${CURRENT_DIR}/${GEN9_PCI_ADDRESS_TEMP} | awk '{print $1}'` -gt 0 ]; then
		ctrl_info_check "${CURRENT_DIR}/${GEN9_PCI_ADDRESS_TEMP}" "${CURRENT_DIR}/${GEN9_TEMP_FILE}" "Gen9"
		FW_FILE_NAME="`echo ${GEN9_FW_FILE} | sed 's/.i386//g' | sed 's/.x86_64//g' | sed 's/.rpm//g'`"
		ctrl_fw_Update "${FW_FILE_NAME}"
        else
                echo -e "该系统下无Smart Array Gen9系列控制器设备."     
        fi
	clear_logs
}

main
