diff --git a/BMCsetup.py b/BMCsetup.py index f75843d..968866b 100644 --- a/BMCsetup.py +++ b/BMCsetup.py @@ -1,5 +1,6 @@ # BMC setup.py - setup the BMC for the host; check for brand and ensure redfish and ipmi over lan are enabled import time +import subprocess from wekapyutils.wekassh import RemoteServer @@ -49,6 +50,24 @@ def lenovo_parse_return(string): return trimmed +def get_ipmi_ip(channel=1): + # run 'ipmitool lan print' and extract the ip address from the output and return it + try: + # Run 'ipmitool lan print' + result = subprocess.run(['sudo', 'ipmitool', 'lan', 'print', str(channel)], + capture_output=True, text=True, check=True) + # Extract the IP address + for line in result.stdout.splitlines(): + if ":" in line: + key, val = line.split(":", 1) + if key.strip() == "IP Address": + return val.strip() + except Exception as e: + log.error(f"Failed to run ipmitool: {e}, {e.stderr}") + log.error("Are you not running as 'root' and don't have passwordless sudo?") + return None + + def bmc_setup(host, user, password): # check for brand and ensure redfish and ipmi over lan are enabled # enable redfish diff --git a/RedFishBMC.py b/RedFishBMC.py index bb718ba..5c0d556 100644 --- a/RedFishBMC.py +++ b/RedFishBMC.py @@ -5,7 +5,7 @@ from logging import getLogger -from setuptools.command.build_ext import if_dl +#from setuptools.command.build_ext import if_dl #from paramiko.util import log_to_file @@ -181,16 +181,10 @@ def change_settings(self, settings_dict): return False def check_settings(self, settings): - log.info(f"Checking BIOS settings on {self.name}") if settings is None: log.info(f"{self.name} There are no settings for this platform in the bios settings configuration file") return 0 - #if self.vendor == "Supermicro": - # settings = self.adjust_supermicro_settings(settings) - # if settings is None: - # return 0 - count = 0 for key, value in settings.items(): if key not in self.bios_data.obj.Attributes: diff --git a/bios_settings.yml b/bios_settings.yml index 874ba44..f5d1b48 100644 --- a/bios_settings.yml +++ b/bios_settings.yml @@ -1,3 +1,10 @@ +# bios_settings.yml +# This file contains BIOS settings for various systems. +# It is used to configure BIOS settings for optimal performance and functionality. +# Each section represents a specific system or system type, with nested settings for different components. +# +# THESE SETTINGS ARE WHAT BIOS_TOOL CHANGES ON THE SERVER(S). + WEKA: AMD: '*': @@ -17,7 +24,7 @@ WEKA: BootMode: Uefi SecureBoot: Disabled SerialComm: OnConRedir - IommuSupport: Disabled + IommuSupport: Enabled ProcX2Apic: Disabled WEKApod - R6615: LogicalProc: Disabled @@ -36,9 +43,20 @@ WEKA: BootMode: Uefi SecureBoot: Disabled SerialComm: OnConRedir - IommuSupport: Disabled + IommuSupport: Enabled ProcX2Apic: Disabled - + Intel: + WEKApod 2100C: + CpuInterconnectBusLinkPower: Disabled + EnergyEfficientTurbo: Disabled + EnergyPerformanceBias: MaxPower + PcieAspmL1: Disabled + ProcC1E: Disabled + ProcCStates: Disabled + ProcPwrPerf: MaxPerf + SriovGlobalEnable: Enabled + SysProfile: PerfOptimized + UncoreFrequency: MaxUFS Dell Inc.: AMD: PowerEdge R6615: @@ -165,13 +183,13 @@ Supermicro: DFCstates_7103: Disabled DeterminismControl_00F4: Manual GlobalC_stateControl_00CD: Disabled - IOMMU_00EA: Disabled + IOMMU_00EA: Enabled NUMANodesPerSocket_703E: NPS1 PowerProfileSelection_00F8: Maximum IO Performance Mode SMTControl_00CB: Disabled '*': ACPISRATL3CacheAsNUMADomain: Disabled - IOMMU: Disabled + IOMMU: Enabled NUMANodesPerSocket: NPS1 SMTControl: Disabled DFCstates: Disabled @@ -190,26 +208,26 @@ Supermicro: Lenovo: AMD: ThinkSystem SR635 V3: - Secured_Core_IOMMU: Disabled + Secured_Core_IOMMU: Enabled Processors_P_state1: Disabled Processors_P_state2: Disabled Processors_GlobalC_stateControl: Disabled Processors_DeterminismSlider: Performance Processors_DFC_States: Disabled - DevicesandIOPorts_IOMMU: Disabled + DevicesandIOPorts_IOMMU: Enabled Processors_SMTMode: Disabled Power_PCIePowerBrake: Disabled OperatingModes_ChooseOperatingMode: CustomMode LegacyBIOS_LegacyBIOS: Disabled Processors_SOCP_states: P0 '*': - Secured_Core_IOMMU: Disabled + Secured_Core_IOMMU: Enabled Processors_P_state1: Disabled Processors_P_state2: Disabled Processors_GlobalC_stateControl: Disabled Processors_DeterminismSlider: Performance Processors_DFC_States: Disabled - DevicesandIOPorts_IOMMU: Disabled + DevicesandIOPorts_IOMMU: Enabled Processors_SMTMode: Disabled Power_PCIePowerBrake: Disabled OperatingModes_ChooseOperatingMode: CustomMode diff --git a/bios_tool.py b/bios_tool.py index fd221c5..8f02050 100644 --- a/bios_tool.py +++ b/bios_tool.py @@ -1,25 +1,15 @@ import argparse import logging import sys -import traceback -from asyncore import dispatcher_with_send -from itertools import count -from logging import exception, setLogRecordFactory -from platform import architecture -from wsgiref.simple_server import server_version - import redfish import yaml -from ply.yacc import resultlimit from redfish.rest.v1 import RetriesExhaustedError from wekapyutils.wekalogging import configure_logging, register_module from RedFishBMC import RedFishBMC -from BMCsetup import bmc_setup +from BMCsetup import bmc_setup, get_ipmi_ip from tabulate import tabulate -# from paramiko.util import log_to_file - # get root logger log = logging.getLogger() @@ -52,7 +42,6 @@ def connect(self): except Exception as exc: log.error(f"Error opening connections to {self.hostname}: {exc}") - # print(traceback.format_exc()) return None @@ -68,29 +57,41 @@ def csv_load(f): :return: list of dictionaries """ import csv - reader = csv.DictReader(f) - #reader_list = list(reader) - #for row in reader: - # print(row) - return {"hosts":list(reader)} + reader = None + exc = None + try: + reader = csv.DictReader(f) + except Exception as exc: + #log.error(f"Error reading CSV file: {exc}") + return None, exc + return {"hosts":list(reader)}, exc +def yaml_load(f): + data = None + exc = None + try: + data = yaml.unsafe_load(f) + except Exception as exc: + pass + #log.error(f"Error reading YAML file: {exc}") + #raise + return data, exc # load a config file - either CSV or YAML def load_config(inputfile): + data = None try: f = open(inputfile) except Exception as exc: raise - with f: - try: - if inputfile.endswith(".csv"): - return csv_load(f) - return yaml.load(f, Loader=yaml.FullLoader) - except AttributeError: - return yaml.load(f) - except Exception as exc: - log.error(f"Error reading config file: {exc}") - raise + data, exc = yaml_load(f) + if type(data) is not dict: # yaml_load returns a dict; if not a dict, it's an error reading file + f.seek(0) # rewind the file + data, exc = csv_load(f) # try CSV + if type(data) is not dict: + log.error(f"Error reading config file: {exc}") + return None + return data def generate_config(bmc_ips, bmc_username, bmc_password): conf = dict() @@ -119,11 +120,6 @@ def save_bmc_db(redfish_list, defaults_database, force=False): manufacturer = server.manufacturer model = server.model architecture = server.arch - #bios_version = bmc.bios_version - #the_dict = server.bmc.bios_data.dict # not used anymore - #the_obj = server.bmc.bios_data.obj - #bios_settings = server.bmc.bios_data.dict['Attributes'] # should be server.bios_settings? - #bios_settings = server.bios_settings if manufacturer not in bmc_db: bmc_db[manufacturer] = dict() if architecture not in bmc_db[manufacturer]: @@ -147,6 +143,8 @@ def save_bmc_db(redfish_list, defaults_database, force=False): f.write('# This should contain the default/factory reset values\n') yaml.dump(bmc_db, f, default_flow_style=False) + return changes_made + # Generate the bios defs for a server model so we can later set the values on new servers def diff_defaults(defaults_database, redfish_list): bmc_db = None @@ -237,13 +235,6 @@ def bios_diff(hostlist): # This could be implemented by copying the hosta_bios and hostb_bios dictionaries and removing the _XXXX # from the keys. Then we could compare the two dictionaries. - #if hosta.manufacturer == "Supermicro": - # hosta_bios = trim_supermicro_dict(hostlist[0].bios_data.dict['Attributes']) - # hostb_bios = trim_supermicro_dict(hostlist[1].bios_data.dict['Attributes']) - #else: - # hosta_bios = hostlist[0].bios_data.dict['Attributes'] - # hostb_bios = hostlist[1].bios_data.dict['Attributes'] - hosta_bios = hostlist[0].bios_settings hostb_bios = hostlist[1].bios_settings @@ -298,21 +289,8 @@ def diff_dicts(dict1, dict2): def parallel_open_sessions(hostlist): - #def connect_host(server): - # try: - # server.bmc = RedFishBMC(server.hostname, username=server.username, password=server.password) - # return server - # except redfish.rest.v1.InvalidCredentialsError: - # log.error(f"Invalid credentials for {server.hostname}") - # return None - # except Exception as exc: - # log.error(f"Error opening connections to {server.hostname}: {exc}") - # print(traceback.format_exc()) - # return None - opened_list = list() with ThreadPoolExecutor(max_workers=10) as executor: - #futures = [executor.submit(connect_host, host) for host in hostlist] futures = [executor.submit(Server.connect, host) for host in hostlist] for future in futures: result = future.result() @@ -353,6 +331,7 @@ def trim_trailing_hex(s): # If there is no match for the server model, try finding one that matches closely? from rapidfuzz import process, fuzz def find_bios_settings(server, all_bios_settings, force=False): + base_settings = None wild = False if server.manufacturer in all_bios_settings: mfg = all_bios_settings[server.manufacturer] @@ -362,7 +341,7 @@ def find_bios_settings(server, all_bios_settings, force=False): if server.arch in mfg: arch = mfg[server.arch] else: - log.error(f"Server {server.hostname}: Unknown processor architecture: {server.architecture}. Aborting.") + log.error(f"Server {server.hostname}: Unknown processor architecture: {server.arch}. Aborting.") return None if server.model in arch: base_settings = arch[server.model] # exact match @@ -370,11 +349,10 @@ def find_bios_settings(server, all_bios_settings, force=False): base_settings = arch['*'] # wildcard entry - give it a try wild = True + if base_settings is None: + return None + derived_keys = dict() - #if server.manufacturer == "Supermicro": - # preprocessor = trim_trailing_hex - #else: - # preprocessor = None preprocessor = trim_trailing_hex if server.manufacturer == "Supermicro" else None log.debug(f"{server.manufacturer} using {preprocessor}") @@ -423,16 +401,17 @@ def find_bios_settings(server, all_bios_settings, force=False): return this_servers_settings + + def main(): # parse arguments progname = sys.argv[0] parser = argparse.ArgumentParser(description="View/Change BIOS Settings on servers") - # parser.add_argument("host", type=str, nargs="?", help="a host to talk to", default="localhost") - parser.add_argument("-c", "--hostconfigfile", type=str, nargs="?", help="filename of host config file", - default="host_config.csv") - parser.add_argument("-b", "--bios", type=str, nargs="?", help="bios configuration filename", - default="bios_settings.yml") + parser.add_argument("-c", "--hostconfigfile", type=str, nargs="?", default="host_config.csv", + help = "filename of host config file. Default is host_config.csv") + parser.add_argument("-b", "--bios", type=str, nargs="?", default="bios_settings.yml", + help="bios configuration filename. Default is bios_settings.yml") parser.add_argument("--bmc-config", dest="bmc_config", default=False, action="store_true", help="Configure the BMCs to allow RedFish access") parser.add_argument("--fix", dest="fix", default=False, action="store_true", @@ -440,11 +419,11 @@ def main(): parser.add_argument("--reboot", dest="reboot", default=False, action="store_true", help="Reboot server if changes have been made") parser.add_argument("--dump", dest="dump", default=False, action="store_true", - help="Print out BIOS settings only") + help="Print out current BIOS settings only") parser.add_argument("--save-defaults", dest="save", default=False, action="store_true", help="Save default BIOS settings to defaults-database - should be factory reset values") parser.add_argument("--defaults-database", dest="defaults_database", default="defaults-db.yml", - help="Filename of the factory defaults-database") + help="Filename of the factory defaults-database. Default is defaults-db.yml") parser.add_argument("-f", "--force", dest="force", default=False, action="store_true", help="Force overwriting existing BIOS settings and such") parser.add_argument("--reset-bios", dest="reset_bios", default=False, action="store_true", @@ -455,7 +434,7 @@ def main(): parser.add_argument("--version", dest="version", default=False, action="store_true", help="Display version number") parser.add_argument("--bmc-ips", dest="bmc_ips", type=str, nargs="*", - help="a list of hosts to configure, or none to use cluster beacons", default=None) + help="a list of hosts to configure instead of using the host_config.csv", default=None) parser.add_argument("--bmc-username", dest="bmc_username", type=str, nargs=1, help="a username to use on all hosts in --bmc_ips", default=None) parser.add_argument("--bmc-password", dest="bmc_password", type=str, nargs=1, @@ -465,7 +444,7 @@ def main(): args = parser.parse_args() if args.version: - print(f"{progname} version 2025.11.11") + print(f"{progname} version 2026.01.06") sys.exit(0) # local modules - override a module's logging level @@ -527,6 +506,23 @@ def main(): # all hosts hostlist = servers_list + if args.reboot: + this_hosts_ip = get_ipmi_ip() + + # if we're running on one of the servers we're looking at, most this server to the end of the list + # so that it would be rebooted last. + if this_hosts_ip is not None: + log.info(f"This host's IPMI IP is: {this_hosts_ip}") + + my_entry = None + for host in hostlist: + if host.hostname == this_hosts_ip: + my_entry = host + break + if my_entry is not None: + hostlist.remove(my_entry) + hostlist.append(my_entry) + # open connections to all the hosts - redfish_list is a list of RedFishBMC objects log.info("Opening sessions to hosts:") redfish_list = parallel_open_sessions(hostlist) @@ -561,8 +557,7 @@ def main(): continue else: settings = find_bios_settings(server, all_bios_settings) - # Vince left off here - #count = bmc.check_settings(desired_bios_settings[bmc.manufacturer][bmc.arch][bmc.model]) + log.info(f"Looking at {server.hostname}: {server.bmc.manufacturer}/{server.bmc.arch}/{server.bmc.model}:") count = server.bmc.check_settings(settings) #log.info(f"") if count > 0: diff --git a/defaults-db.yml b/defaults-db.yml index 289c5b5..59be7d2 100644 --- a/defaults-db.yml +++ b/defaults-db.yml @@ -1,5 +1,9 @@ # Bios Defaults Database -# This should contain the default/factory reset values +# This contains the default/factory reset values +# +# THIS FILE IS FOR REFERENCE ONLY. THESE SETTINGS ARE NOT SET BY BIOS_TOOL. +# Please see bios_settings.yml for the BIOS settings that are applied by BIOS_TOOL. + Dell Inc.: AMD: PowerEdge R6615: @@ -2420,3 +2424,506 @@ WEKA: VideoMem: 16 MB WorkloadProfile: NotConfigured WriteCache: Disabled + Intel: + WEKApod 2100C: + AcpiFpdt: Disabled + AesNi: Enabled + AssetTag: '' + AuthorizeDeviceFirmware: Disabled + AvxIccpPreGrantLicense: Disabled + BiosNvmeDriver: AllDrives + BootMode: Uefi + BootSeqRetry: Enabled + CECriticalSEL: Disabled + CXLMemoryAttribute: SpecialPurposeMemory + CXLMemoryMode: Homogeneous + ConTermType: Vt100Vt220 + ControlledTurbo: Disabled + ControlledTurboMinusBin: 0 + CorrEccSmi: Enabled + CpuInterconnectBusLinkPower: Enabled + CpuPaLimit: Disabled + CurrentCXLMemoryInterleaveMode: Heterogeneous + CurrentEmbVideoState: Enabled + CxlMemSize: 0 GB + Daylight: Disabled + DeadLineLlcAlloc: Enabled + DellAutoDiscovery: PlatformDefault + DellWyseP25BIOSAccess: Enabled + DimmSlot00: Enabled + DimmSlot01: Enabled + DimmSlot02: Enabled + DimmSlot03: Enabled + DimmSlot04: Enabled + DimmSlot05: Enabled + DimmSlot06: Enabled + DimmSlot07: Enabled + DimmSlot08: Enabled + DimmSlot09: Enabled + DimmSlot10: Enabled + DimmSlot11: Enabled + DimmSlot12: Enabled + DimmSlot13: Enabled + DimmSlot14: Enabled + DimmSlot15: Enabled + DimmSlot16: Enabled + DimmSlot17: Enabled + DimmSlot18: Enabled + DimmSlot19: Enabled + DimmSlot20: Enabled + DimmSlot21: Enabled + DimmSlot22: Enabled + DimmSlot23: Enabled + DimmSlot24: Enabled + DimmSlot25: Enabled + DimmSlot26: Enabled + DimmSlot27: Enabled + DimmSlot28: Enabled + DimmSlot29: Enabled + DimmSlot30: Enabled + DimmSlot31: Enabled + DirectoryAtoS: Disabled + DirectoryMode: Enabled + EmbVideo: Enabled + EnableTdx: Disabled + EnableTdxSeamldr: Disabled + EnergyEfficientTurbo: Enabled + EnergyPerformanceBias: BalancedPerformance + ErrPrompt: Enabled + ExtSerialConnector: Serial1 + FailSafeBaud: '115200' + GenericUsbBoot: Disabled + HddPlaceholder: Disabled + HostNqnMode: HostNqnModeDell + HttpDev1DhcpEnDis: Enabled + HttpDev1Dns1: '' + HttpDev1Dns2: '' + HttpDev1DnsDhcpEnDis: Enabled + HttpDev1EnDis: Disabled + HttpDev1Gateway: '' + HttpDev1Interface: NIC.Slot.2-1-1 + HttpDev1Ip: '' + HttpDev1Mask: '' + HttpDev1Protocol: IPv4 + HttpDev1TlsMode: OneWay + HttpDev1Uri: '' + HttpDev1VlanEnDis: Disabled + HttpDev1VlanId: 1 + HttpDev1VlanPriority: 0 + HttpDev2DhcpEnDis: Enabled + HttpDev2Dns1: '' + HttpDev2Dns2: '' + HttpDev2DnsDhcpEnDis: Enabled + HttpDev2EnDis: Disabled + HttpDev2Gateway: '' + HttpDev2Interface: NIC.Slot.2-1-1 + HttpDev2Ip: '' + HttpDev2Mask: '' + HttpDev2Protocol: IPv4 + HttpDev2TlsMode: OneWay + HttpDev2Uri: '' + HttpDev2VlanEnDis: Disabled + HttpDev2VlanId: 1 + HttpDev2VlanPriority: 0 + HttpDev3DhcpEnDis: Enabled + HttpDev3Dns1: '' + HttpDev3Dns2: '' + HttpDev3DnsDhcpEnDis: Enabled + HttpDev3EnDis: Disabled + HttpDev3Gateway: '' + HttpDev3Interface: NIC.Slot.2-1-1 + HttpDev3Ip: '' + HttpDev3Mask: '' + HttpDev3Protocol: IPv4 + HttpDev3TlsMode: OneWay + HttpDev3Uri: '' + HttpDev3VlanEnDis: Disabled + HttpDev3VlanId: 1 + HttpDev3VlanPriority: 0 + HttpDev4DhcpEnDis: Enabled + HttpDev4Dns1: '' + HttpDev4Dns2: '' + HttpDev4DnsDhcpEnDis: Enabled + HttpDev4EnDis: Disabled + HttpDev4Gateway: '' + HttpDev4Interface: NIC.Slot.2-1-1 + HttpDev4Ip: '' + HttpDev4Mask: '' + HttpDev4Protocol: IPv4 + HttpDev4TlsMode: OneWay + HttpDev4Uri: '' + HttpDev4VlanEnDis: Disabled + HttpDev4VlanId: 1 + HttpDev4VlanPriority: 0 + IioPcieDataLinkFeatureExchange: Enabled + IioPciePtm: Auto + InBandManageabilityInterface: Enabled + InFieldScan: Disabled + IntelSgx: 'Off' + IntelTxt: 'Off' + InternalUsb: 'On' + IscsiDev1Con1Auth: None + IscsiDev1Con1ChapName: '' + IscsiDev1Con1ChapSecret: null + IscsiDev1Con1ChapType: OneWay + IscsiDev1Con1DhcpEnDis: Disabled + IscsiDev1Con1EnDis: Disabled + IscsiDev1Con1Gateway: '' + IscsiDev1Con1Interface: NIC.Slot.2-1-1 + IscsiDev1Con1Ip: '' + IscsiDev1Con1IsId: '' + IscsiDev1Con1Lun: '0' + IscsiDev1Con1Mask: '' + IscsiDev1Con1Port: 3260 + IscsiDev1Con1Protocol: IPv4 + IscsiDev1Con1Retry: 3 + IscsiDev1Con1RevChapName: '' + IscsiDev1Con1RevChapSecret: null + IscsiDev1Con1TargetIp: '' + IscsiDev1Con1TargetName: '' + IscsiDev1Con1TgtDhcpEnDis: Disabled + IscsiDev1Con1Timeout: 10000 + IscsiDev1Con1VlanEnDis: Disabled + IscsiDev1Con1VlanId: 1 + IscsiDev1Con1VlanPriority: 0 + IscsiDev1Con2Auth: None + IscsiDev1Con2ChapName: '' + IscsiDev1Con2ChapSecret: null + IscsiDev1Con2ChapType: OneWay + IscsiDev1Con2DhcpEnDis: Disabled + IscsiDev1Con2EnDis: Disabled + IscsiDev1Con2Gateway: '' + IscsiDev1Con2Interface: NIC.Slot.2-1-1 + IscsiDev1Con2Ip: '' + IscsiDev1Con2IsId: '' + IscsiDev1Con2Lun: '0' + IscsiDev1Con2Mask: '' + IscsiDev1Con2Port: 3260 + IscsiDev1Con2Protocol: IPv4 + IscsiDev1Con2Retry: 3 + IscsiDev1Con2RevChapName: '' + IscsiDev1Con2RevChapSecret: null + IscsiDev1Con2TargetIp: '' + IscsiDev1Con2TargetName: '' + IscsiDev1Con2TgtDhcpEnDis: Disabled + IscsiDev1Con2Timeout: 10000 + IscsiDev1Con2VlanEnDis: Disabled + IscsiDev1Con2VlanId: 1 + IscsiDev1Con2VlanPriority: 0 + IscsiDev1ConOrder: Con1Con2 + IscsiDev1EnDis: Disabled + IscsiInitiatorName: '' + KernelDmaProtection: Disabled + KeySplit: '1' + LatencyOptimizedMode: Disabled + LlcPrefetch: Disabled + LmceEn: Enabled + MadtCoreEnumeration: RoundRobin + MaxPasswordAge: 60 + MemFrequency: MaxPerf + MemOpMode: OptimizerMode + MemPatrolScrub: Standard + MemRefreshRate: 1x + MemTest: Disabled + MemoryEncryption: Disabled + MemoryMappedIOH: 56TB + MemoryTraining: MemoryTrainingFast + MonitorMwait: Enabled + NodeInterleave: Disabled + NumLock: 'On' + NumberOfPxeDevices: '4' + NvmeMode: NonRaid + NvmeofEnDis: Disabled + NvmeofHostDellNqn: nqn.1988-11.com.dell:PowerEdge.R670.8G14XB4 + NvmeofHostId: 4C4C4544-0047-3110-8034-B8C04F584234 + NvmeofHostSecurityPath: '' + NvmeofSubsys1Address: '' + NvmeofSubsys1Auth: None + NvmeofSubsys1ConInterface: NIC.Slot.2-1-1 + NvmeofSubsys1ConProtocol: IPv4 + NvmeofSubsys1ControllerId: 0 + NvmeofSubsys1EnDis: Disabled + NvmeofSubsys1HostDhcp: Disabled + NvmeofSubsys1HostGateway: '' + NvmeofSubsys1HostIP: '' + NvmeofSubsys1HostMask: '' + NvmeofSubsys1InfoDhcp: Disabled + NvmeofSubsys1NameSpaceId: '' + NvmeofSubsys1Nqn: '' + NvmeofSubsys1Port: 4420 + NvmeofSubsys1Retry: 3 + NvmeofSubsys1Security: Disabled + NvmeofSubsys1SecurityKeyPath: '' + NvmeofSubsys1Timeout: 10000 + NvmeofSubsys1TransType: TCP + NvmeofSubsys1VlanEnDis: Disabled + NvmeofSubsys1VlanId: 1 + NvmeofSubsys1VlanPriority: 0 + NvmeofSubsys2Address: '' + NvmeofSubsys2Auth: None + NvmeofSubsys2ConInterface: NIC.Slot.2-1-1 + NvmeofSubsys2ConProtocol: IPv4 + NvmeofSubsys2ControllerId: 0 + NvmeofSubsys2EnDis: Disabled + NvmeofSubsys2HostDhcp: Disabled + NvmeofSubsys2HostGateway: '' + NvmeofSubsys2HostIP: '' + NvmeofSubsys2HostMask: '' + NvmeofSubsys2InfoDhcp: Disabled + NvmeofSubsys2NameSpaceId: '' + NvmeofSubsys2Nqn: '' + NvmeofSubsys2Port: 4420 + NvmeofSubsys2Retry: 3 + NvmeofSubsys2Security: Disabled + NvmeofSubsys2SecurityKeyPath: '' + NvmeofSubsys2Timeout: 10000 + NvmeofSubsys2TransType: TCP + NvmeofSubsys2VlanEnDis: Disabled + NvmeofSubsys2VlanId: 1 + NvmeofSubsys2VlanPriority: 0 + NvmeofSubsys3Address: '' + NvmeofSubsys3Auth: None + NvmeofSubsys3ConInterface: NIC.Slot.2-1-1 + NvmeofSubsys3ConProtocol: IPv4 + NvmeofSubsys3ControllerId: 0 + NvmeofSubsys3EnDis: Disabled + NvmeofSubsys3HostDhcp: Disabled + NvmeofSubsys3HostGateway: '' + NvmeofSubsys3HostIP: '' + NvmeofSubsys3HostMask: '' + NvmeofSubsys3InfoDhcp: Disabled + NvmeofSubsys3NameSpaceId: '' + NvmeofSubsys3Nqn: '' + NvmeofSubsys3Port: 4420 + NvmeofSubsys3Retry: 3 + NvmeofSubsys3Security: Disabled + NvmeofSubsys3SecurityKeyPath: '' + NvmeofSubsys3Timeout: 10000 + NvmeofSubsys3TransType: TCP + NvmeofSubsys3VlanEnDis: Disabled + NvmeofSubsys3VlanId: 1 + NvmeofSubsys3VlanPriority: 0 + NvmeofSubsys4Address: '' + NvmeofSubsys4Auth: None + NvmeofSubsys4ConInterface: NIC.Slot.2-1-1 + NvmeofSubsys4ConProtocol: IPv4 + NvmeofSubsys4ControllerId: 0 + NvmeofSubsys4EnDis: Disabled + NvmeofSubsys4HostDhcp: Disabled + NvmeofSubsys4HostGateway: '' + NvmeofSubsys4HostIP: '' + NvmeofSubsys4HostMask: '' + NvmeofSubsys4InfoDhcp: Disabled + NvmeofSubsys4NameSpaceId: '' + NvmeofSubsys4Nqn: '' + NvmeofSubsys4Port: 4420 + NvmeofSubsys4Retry: 3 + NvmeofSubsys4Security: Disabled + NvmeofSubsys4SecurityKeyPath: '' + NvmeofSubsys4Timeout: 10000 + NvmeofSubsys4TransType: TCP + NvmeofSubsys4VlanEnDis: Disabled + NvmeofSubsys4VlanId: 1 + NvmeofSubsys4VlanPriority: 0 + OneTimeBootMode: Disabled + OneTimeUefiBootSeqDev: Optical.iDRACVirtual.1-1 + OptimizerMode: Auto + PPROnUCE: Enabled + PagingPolicy: PagingAdaptive + PasswordHistory: 4 + PasswordRotation: Disabled + PasswordStatus: Unlocked + PcieAspmL1: Enabled + PcieResizableBar: Enabled + PowerCycleRequest: None + PrebootDmaProtection: Disabled + Proc0Brand: Intel(R) Xeon(R) 6710E + Proc0Id: 6-AF-3 + Proc0L2Cache: 64 MB + Proc0L3Cache: 96 MB + Proc0Microcode: '0x3000362' + Proc0NumCores: 64 + Proc1Brand: Intel(R) Xeon(R) 6710E + Proc1Id: 6-AF-3 + Proc1L2Cache: 64 MB + Proc1L3Cache: 96 MB + Proc1Microcode: '0x3000362' + Proc1NumCores: 64 + ProcAdjCacheLine: Enabled + ProcAvxP1: Normal + ProcBusSpeed: 16 GT/s + ProcC1E: Enabled + ProcCStates: Enabled + ProcCoreSpeed: 2.40 GHz + ProcCores: All + ProcHwPrefetcher: Enabled + ProcIssSetting: IssOp1 + ProcPwrPerf: SysDbpm + ProcTurboMode: Enabled + ProcVirtualization: Enabled + PwrButton: Enabled + PwrPerfSwitch: Enabled + PxeDev10Interface: NIC.Slot.2-1-1 + PxeDev10Protocol: IPv4 + PxeDev10VlanEnDis: Disabled + PxeDev10VlanId: 1 + PxeDev10VlanPriority: 0 + PxeDev11Interface: NIC.Slot.2-1-1 + PxeDev11Protocol: IPv4 + PxeDev11VlanEnDis: Disabled + PxeDev11VlanId: 1 + PxeDev11VlanPriority: 0 + PxeDev12Interface: NIC.Slot.2-1-1 + PxeDev12Protocol: IPv4 + PxeDev12VlanEnDis: Disabled + PxeDev12VlanId: 1 + PxeDev12VlanPriority: 0 + PxeDev13Interface: NIC.Slot.2-1-1 + PxeDev13Protocol: IPv4 + PxeDev13VlanEnDis: Disabled + PxeDev13VlanId: 1 + PxeDev13VlanPriority: 0 + PxeDev14Interface: NIC.Slot.2-1-1 + PxeDev14Protocol: IPv4 + PxeDev14VlanEnDis: Disabled + PxeDev14VlanId: 1 + PxeDev14VlanPriority: 0 + PxeDev15Interface: NIC.Slot.2-1-1 + PxeDev15Protocol: IPv4 + PxeDev15VlanEnDis: Disabled + PxeDev15VlanId: 1 + PxeDev15VlanPriority: 0 + PxeDev16Interface: NIC.Slot.2-1-1 + PxeDev16Protocol: IPv4 + PxeDev16VlanEnDis: Disabled + PxeDev16VlanId: 1 + PxeDev16VlanPriority: 0 + PxeDev1EnDis: Enabled + PxeDev1Interface: NIC.Slot.2-1-1 + PxeDev1Protocol: IPv4 + PxeDev1VlanEnDis: Disabled + PxeDev1VlanId: 1 + PxeDev1VlanPriority: 0 + PxeDev2EnDis: Disabled + PxeDev2Interface: NIC.Slot.2-1-1 + PxeDev2Protocol: IPv4 + PxeDev2VlanEnDis: Disabled + PxeDev2VlanId: 1 + PxeDev2VlanPriority: 0 + PxeDev3EnDis: Disabled + PxeDev3Interface: NIC.Slot.2-1-1 + PxeDev3Protocol: IPv4 + PxeDev3VlanEnDis: Disabled + PxeDev3VlanId: 1 + PxeDev3VlanPriority: 0 + PxeDev4EnDis: Disabled + PxeDev4Interface: NIC.Slot.2-1-1 + PxeDev4Protocol: IPv4 + PxeDev4VlanEnDis: Disabled + PxeDev4VlanId: 1 + PxeDev4VlanPriority: 0 + PxeDev5Interface: NIC.Slot.2-1-1 + PxeDev5Protocol: IPv4 + PxeDev5VlanEnDis: Disabled + PxeDev5VlanId: 1 + PxeDev5VlanPriority: 0 + PxeDev6Interface: NIC.Slot.2-1-1 + PxeDev6Protocol: IPv4 + PxeDev6VlanEnDis: Disabled + PxeDev6VlanId: 1 + PxeDev6VlanPriority: 0 + PxeDev7Interface: NIC.Slot.2-1-1 + PxeDev7Protocol: IPv4 + PxeDev7VlanEnDis: Disabled + PxeDev7VlanId: 1 + PxeDev7VlanPriority: 0 + PxeDev8Interface: NIC.Slot.2-1-1 + PxeDev8Protocol: IPv4 + PxeDev8VlanEnDis: Disabled + PxeDev8VlanId: 1 + PxeDev8VlanPriority: 0 + PxeDev9Interface: NIC.Slot.2-1-1 + PxeDev9Protocol: IPv4 + PxeDev9VlanEnDis: Disabled + PxeDev9VlanId: 1 + PxeDev9VlanPriority: 0 + RedundantOsBoot: Disabled + RedundantOsLocation: None + RedundantOsState: Visible + SHA256SetupPassword: '' + SHA256SetupPasswordSalt: '' + SHA256SystemPassword: '' + SHA256SystemPasswordSalt: '' + SecureBoot: Disabled + SecureBootMode: DeployedMode + SecureBootPolicy: Standard + SerialComm: 'Off' + SerialPortAddress: Com1 + SetBootOrderDis: '' + SetBootOrderDis2: '' + SetBootOrderEn: NIC.PxeDevice.1-1,PCIeSSD.Slot.3-0,Optical.iDRACVirtual.1-1 + SetBootOrderEn2: '' + SetBootOrderFqdd1: '' + SetBootOrderFqdd10: '' + SetBootOrderFqdd11: '' + SetBootOrderFqdd12: '' + SetBootOrderFqdd13: '' + SetBootOrderFqdd14: '' + SetBootOrderFqdd15: '' + SetBootOrderFqdd16: '' + SetBootOrderFqdd2: '' + SetBootOrderFqdd3: '' + SetBootOrderFqdd4: '' + SetBootOrderFqdd5: '' + SetBootOrderFqdd6: '' + SetBootOrderFqdd7: '' + SetBootOrderFqdd8: '' + SetBootOrderFqdd9: '' + SetupPassword: null + Slot1: Enabled + Slot1Bif: x16 + Slot2: Enabled + Slot2Bif: x16 + Slot3: Enabled + Slot4: Enabled + Slot4Bif: x16 + Slot5: Enabled + SmmSecurityMitigation: Enabled + SnoopHldOff: Roll2KCycles + SriovGlobalEnable: Disabled + StrongPassword: Disabled + StrongPasswordMinLength: 8 + SubNumaCluster: Disabled + SysMemSize: 512 GB + SysMemSpeed: 5600 MT/s + SysMemType: ECC DDR5 + SysMfrContactInfo: www.dell.com + SysPassword: null + SysPrepClean: None + SysProfile: PerfPerWattOptimizedDapc + SystemBiosVersion: 1.3.2 + SystemFpga2Version: 1.0.4 + SystemFpgaVersion: 1.2.0 + SystemManufacturer: Dell Inc. + SystemModelName: PowerEdge R670 + SystemServiceTag: 8G14XB4 + TimeZone: LOCAL + Tpm2Algorithm: SHA256 + Tpm2Hierarchy: Enabled + TpmFirmware: 7.2.3.1 + TpmInfo: 'Type: 2.0 NTC' + TpmPpiBypassClear: Disabled + TpmPpiBypassProvision: Disabled + TpmSecurity: 'On' + UefiCaCertScope: DeviceFirmwareAndOs + UefiComplianceVersion: '2.7' + UefiVariableAccess: Standard + UncoreFrequency: DynamicUFS + UpiPrefetch: Enabled + UsbManagedPort: 'On' + UsbPorts: AllOn + VideoMem: 16 MB + VirtualNuma: Disabled + WorkloadConfiguration: Balance + WorkloadProfile: NotConfigured + XptPrefetch: Enabled