blob: ea41125d19576d1ae99630ddd8ecbac09f1b9983 [file] [log] [blame]
#!/usr/bin/env python
r"""
PLDM functions.
"""
import re
import var_funcs as vf
import func_args as fa
import bmc_ssh_utils as bsu
def pldmtool(option_string, parse_results=1, **bsu_options):
r"""
Run pldmtool on the BMC with the caller's option string and return the result.
Example:
${pldm_results}= Pldmtool base GetPLDMTypes
Rprint Vars pldm_results
pldm_results:
[supported_types]:
[raw]:
[0]: 0
[1]: 2
[2]: 3
[text]:
[0]: base
[1]: platform
[2]: bios
Description of argument(s):
option_string A string of options which are to be processed by the pldmtool command.
parse_results Parse the pldmtool results and return a dictionary rather than the raw
pldmtool output.
bsu_options Options to be passed directly to bmc_execute_command. See its prolog for
details.
"""
# This allows callers to specify arguments in python style (e.g. print_out=1 vs. print_out=${1}).
bsu_options = fa.args_to_objects(bsu_options)
stdout, stderr, rc = bsu.bmc_execute_command('pldmtool ' + option_string, **bsu_options)
if parse_results:
result = vf.key_value_outbuf_to_dict(stdout)
if 'supported_types' in result:
# 'supported types' begins like this:
# 0(base) 2(platform) 3(bios)
# Parsing it to look like it does in the example above.
supported_types = {'raw': [], 'text': []}
for entry in result['supported_types'].split(" "):
record = entry.split("(")
supported_types['raw'].append(record[0])
supported_types['text'].append(record[1].rstrip(")"))
result['supported_types'] = supported_types
elif 'supported_commands' in result:
commands = result['supported_commands'].split(":")[0].split(" ")
return commands
elif 'yyyy-mm-dd_hh' in result:
# Date & Time :
# YYYY-MM-DD HH:MM:SS - 2020-02-24 06:44:16
return result['yyyy-mm-dd_hh'].split(' - ')[1]
# Simplfying dict output for GetPDR with type PDREntityAssociation.
# Example :
# pldmtool platform GetPDR -d 10
# Entity Association
# nextRecordHandle: 0
# responseCount: 56
# recordHandle: 10
# PDRHeaderVersion: 1
# PDRType: 15
# recordChangeNumber: 0
# dataLength: 46
# containerID: 1
# associationType: Physical
# containerEntityType: System Board
# containerEntityInstanceNumber: 1
# containerEntityContainerID: 0
# containedEntityCount: 6
# containedEntityType[1]: Chassis front panel board (control panel)
# containedEntityInstanceNumber[1]: 1
# containedEntityContainerID[1]: 1
# containedEntityType[2]: Chassis front panel board (control panel)
# containedEntityInstanceNumber[2]: 2
# containedEntityContainerID[2]: 1
elif 'containerentitycontainerid' in result:
dict_data1, dict_data2 = vf.split_dict_on_key('containerentitycontainerid', result)
return dict_data1
elif 'entitytype' in result:
# Example :
# entityType: 24576(OEM)
# Note: OEM type number is dynamic
if 'OEM' in result['entitytype']:
result['entitytype'] = 'OEM'
# Collect bios strings from bios string table in to list.
# Example output for pldmtool GetBIOSTable --type stringTable
# PLDM StringTable:
# BIOSStringHandle : BIOSString
# 0 : Allowed
# 1 : Disabled
# 2 : Enabled
elif 'pldm_stringtable' in result:
result.pop('pldm_stringtable')
result.pop('biosstringhandle')
bios_string_list = []
for data in result:
bios_string_list.append(result[data])
# Example for bios_string_list:
# bios_string_list = ['Allowed', 'Disabled', 'Enabled']
return bios_string_list
# Check if parameter pldm_attributetable/pldm_attributevaluetable present for
# pldmtool GetBIOSTable --type AttributeTable/AttributeValueTable.
# Note: Output for AttributeTable/AttributeValueTable is huge and verification of
# table content is not available.
elif 'pldm_attributetable' in result:
result['pldm_attributetable'] = True
return result
elif 'pldm_attributevaluetable' in result:
result['pldm_attributevaluetable'] = True
return result
return result
return stdout