nicsensor/tool/fru_parse/fru_parse.py
2025-01-06 09:10:08 +08:00

226 lines
7.2 KiB
Python

import os
import time
fru_file="frudata.txt"
internal = []
chassis = []
board = []
product = []
chassis_list = [ "NULL", "Others", "Unkownm", "Desktop", "Low Profile Desktop", "Pizza Box",
"Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Hand Held",
"Docking Station", "All in One", "Sub Notebook", "Space-saving", "Lunch Box",
"Main Server Chassis", "Expansion Chassis", "SubChassis", "Bus Expansion Chassis",
"Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis", "Sealed-case PC",
"Multi-system chassis", "Compact PCI", "Advanced TCA", "Blade", "Blade Enclosure",
"Tablet", "Convertible", "Detachable", "IoT Gateway", "Embedded PC", "Mini PC", "Stick PC"]
def array_to_string(arr):
result = ""
for element in arr:
result += chr(element)
return result
def parse_chassis():
print("")
print("Chassis Field")
chassis_type_num = chassis[2]
chassis_type = chassis_list[chassis_type_num]
cnt = 3
chassis_part_number_len = chassis[cnt] - 192
cnt += 1
chassis_part_number = chassis[cnt : cnt+chassis_part_number_len]
cnt += chassis_part_number_len
chassis_sn_len = chassis[cnt] - 192
cnt += 1
chassis_sn = chassis[cnt : cnt+chassis_sn_len]
cnt += chassis_sn_len
print("Chassis Type : " + chassis_type)
print("Chassis Part Number : " + array_to_string(chassis_part_number))
print("Chassis Serial Number : " + array_to_string(chassis_sn))
while chassis[cnt] != 193:
chassis_OEM_length=chassis[cnt]-192
cnt+=1
chassis_oem=chassis[cnt:cnt+chassis_OEM_length]
cnt=cnt+chassis_OEM_length
print("Chassis Extra : " + array_to_string(chassis_oem))
def parse_board():
print("")
print("Board Field")
pass_time = (board[3] + board[4]*256 + board[5]*256*256) * 60
pass_sec=pass_time + 820454400
board_mfg_time = time.ctime(pass_sec)
cnt=6
board_manufactor_length=board[cnt]-192
cnt+=1
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 Mfg Time : " + board_mfg_time)
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(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 chassis_offset > 0:
chassis_data_length = data[chassis_offset+1]*8
global chassis
chassis = data[chassis_offset : chassis_offset+chassis_data_length ]
print("chassis data")
print(chassis)
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()