226 lines
7.2 KiB
Python
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() |