194 lines
5.6 KiB
Python
194 lines
5.6 KiB
Python
|
|
import os
|
||
|
|
|
||
|
|
fru_file="frudata.txt"
|
||
|
|
internal = []
|
||
|
|
chassis = []
|
||
|
|
board = []
|
||
|
|
product = []
|
||
|
|
|
||
|
|
def array_to_string(arr):
|
||
|
|
result = ""
|
||
|
|
for element in arr:
|
||
|
|
result += chr(element)
|
||
|
|
return result
|
||
|
|
|
||
|
|
def parse_internal():
|
||
|
|
pass
|
||
|
|
|
||
|
|
def parse_chassis():
|
||
|
|
pass
|
||
|
|
|
||
|
|
def parse_board():
|
||
|
|
print("")
|
||
|
|
print("Board Field")
|
||
|
|
board_mfg_time = board[3:5]
|
||
|
|
|
||
|
|
cnt=5
|
||
|
|
board_manufactor_length=board[cnt+1]-192
|
||
|
|
cnt+=2
|
||
|
|
board_manufactor=board[cnt:cnt+board_manufactor_length]
|
||
|
|
cnt=cnt+board_manufactor_length
|
||
|
|
|
||
|
|
board_product_name_length=board[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
board_product_name=board[cnt:cnt+board_product_name_length]
|
||
|
|
cnt=cnt+board_product_name_length
|
||
|
|
|
||
|
|
board_sn_length=board[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
board_sn=board[cnt:cnt+board_sn_length]
|
||
|
|
cnt=cnt+board_sn_length
|
||
|
|
|
||
|
|
board_pn_length=board[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
board_pn=board[cnt:cnt+board_pn_length]
|
||
|
|
cnt=cnt+board_pn_length
|
||
|
|
|
||
|
|
board_id_length=board[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
board_id=board[cnt:cnt+board_id_length]
|
||
|
|
cnt=cnt+board_id_length
|
||
|
|
|
||
|
|
print("Board Manufacturer : " + array_to_string(board_manufactor))
|
||
|
|
print("Board Product Name : " + array_to_string(board_product_name))
|
||
|
|
print("Board Serial Number: " + array_to_string(board_sn))
|
||
|
|
print("Board Part Number : " + array_to_string(board_pn))
|
||
|
|
print("Board Fru File ID : " + array_to_string(board_id))
|
||
|
|
|
||
|
|
while board[cnt] != 193:
|
||
|
|
board_OEM_length=board[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
board_oem=board[cnt:cnt+board_OEM_length]
|
||
|
|
cnt=cnt+board_OEM_length
|
||
|
|
print("Board Extra : " + array_to_string(board_oem))
|
||
|
|
|
||
|
|
def parse_product():
|
||
|
|
print("")
|
||
|
|
print("Product Field")
|
||
|
|
|
||
|
|
cnt=3
|
||
|
|
|
||
|
|
product_manu_name_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_manu_name=product[cnt:cnt+product_manu_name_len]
|
||
|
|
cnt=cnt+product_manu_name_len
|
||
|
|
|
||
|
|
product_product_name_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_product_name=product[cnt:cnt+product_product_name_len]
|
||
|
|
cnt=cnt+product_product_name_len
|
||
|
|
|
||
|
|
product_pn_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_pn=product[cnt:cnt+product_pn_len]
|
||
|
|
cnt=cnt+product_pn_len
|
||
|
|
|
||
|
|
product_version_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_version=product[cnt:cnt+product_version_len]
|
||
|
|
cnt=cnt+product_version_len
|
||
|
|
|
||
|
|
product_sn_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_sn=product[cnt:cnt+product_sn_len]
|
||
|
|
cnt=cnt+product_sn_len
|
||
|
|
|
||
|
|
product_asset_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_asset=product[cnt:cnt+product_asset_len]
|
||
|
|
cnt=cnt+product_asset_len
|
||
|
|
|
||
|
|
product_id_len = product[cnt] - 192
|
||
|
|
cnt+=1
|
||
|
|
product_id=product[cnt:cnt+product_id_len]
|
||
|
|
cnt=cnt+product_id_len
|
||
|
|
|
||
|
|
print("Product Manufacturer : " + array_to_string(product_manu_name))
|
||
|
|
print("Product Name : " + array_to_string(product_product_name))
|
||
|
|
print("Product Part Number : " + array_to_string(product_pn))
|
||
|
|
print("Product Version : " + array_to_string(product_version))
|
||
|
|
print("Product Serial Numebr: " + array_to_string(product_sn))
|
||
|
|
print("Product Asset Tag : " + array_to_string(product_asset))
|
||
|
|
print("Product Fru File ID : " + array_to_string(product_id))
|
||
|
|
|
||
|
|
while product[cnt] != 193:
|
||
|
|
product_OEM_length=product[cnt]-192
|
||
|
|
cnt+=1
|
||
|
|
product_oem=product[cnt:cnt+product_OEM_length]
|
||
|
|
cnt=cnt+product_OEM_length
|
||
|
|
print("Product Extra : " + array_to_string(product_oem))
|
||
|
|
|
||
|
|
|
||
|
|
def parse_fru_data():
|
||
|
|
print("===> Start Parse Fru data")
|
||
|
|
if len(internal) > 0:
|
||
|
|
parse_internal()
|
||
|
|
|
||
|
|
if len(chassis) > 0:
|
||
|
|
parse_chassis()
|
||
|
|
|
||
|
|
if len(board) > 0:
|
||
|
|
parse_board()
|
||
|
|
|
||
|
|
if len(product) > 0:
|
||
|
|
parse_product()
|
||
|
|
|
||
|
|
def split_fru_data(data):
|
||
|
|
print("===> Start split fru data")
|
||
|
|
header = data[0:8]
|
||
|
|
internal_offset = header[1] * 8
|
||
|
|
chassis_offset = header[2] * 8
|
||
|
|
board_offset = header[3] * 8
|
||
|
|
product_offset = header[4] * 8
|
||
|
|
|
||
|
|
if internal_offset > 0:
|
||
|
|
internal_data_length = data[internal_offset+1]*8
|
||
|
|
global internal
|
||
|
|
internal = data[internal_offset : internal_offset+internal_data_length]
|
||
|
|
|
||
|
|
if chassis_offset > 0:
|
||
|
|
chassis_data_length = data[chassis_offset+1]*8
|
||
|
|
global chassis
|
||
|
|
chassis = data[chassis_offset : chassis_offset+chassis_data_length ]
|
||
|
|
|
||
|
|
if board_offset > 0:
|
||
|
|
board_data_length = data[board_offset+1]*8
|
||
|
|
global board
|
||
|
|
board = data[board_offset : board_offset+board_data_length]
|
||
|
|
print("board data")
|
||
|
|
print(board)
|
||
|
|
|
||
|
|
if product_offset > 0:
|
||
|
|
product_data_length = data[product_offset+1]*8
|
||
|
|
global product
|
||
|
|
product = data[product_offset : product_offset+product_data_length]
|
||
|
|
print("product data")
|
||
|
|
print(product)
|
||
|
|
|
||
|
|
print("<=== Complete split fru data")
|
||
|
|
|
||
|
|
|
||
|
|
def load_fru_txt_file():
|
||
|
|
if os.path.exists(fru_file):
|
||
|
|
print(f"{fru_file} exists.")
|
||
|
|
else:
|
||
|
|
print(f"{fru_file} does not exist.")
|
||
|
|
exit(1)
|
||
|
|
|
||
|
|
print("===> Start load fru file")
|
||
|
|
result = []
|
||
|
|
with open(fru_file, 'r') as file:
|
||
|
|
lines = file.readlines()
|
||
|
|
for line in lines:
|
||
|
|
hex_numbers = line.strip().split()
|
||
|
|
for hex_num in hex_numbers:
|
||
|
|
decimal_num = int(hex_num, 16)
|
||
|
|
result.append(decimal_num)
|
||
|
|
print(result)
|
||
|
|
print("<=== Complete load fru data")
|
||
|
|
return result
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
fru_data = load_fru_txt_file()
|
||
|
|
split_fru_data(fru_data)
|
||
|
|
parse_fru_data()
|