Search
  • Nikhil Verma

Dell-Idrac-Firmware-Automation

In normal scenario , we need to manually perform dell Idrac firmware upgrade on production servers or we have pushed firmware's from Dell open manager and then perform Esxi host reboot after putting in Maintenance mode and later once completed we have to exit Maintenance mode.

This process is time consuming and here in this blog we are trying to automate this whole process using Python script.


FlowChart


Using this script we can upgrade Host Firmware with one click .

Dependencies :

Python 3.9.6

PIP install : pip install requests==2.22.0

pip install json5==0.8.5

pip install packaging==19.2

pip install pyvmomi==6.7.3

Minimum Idrac supported version : IDrac9 4.4

Here

Input File contains : IdracIP,Idracusername,vc_name,vc_hostname


fimware-version File contains : Bios,SSD Firmware,Integrated Dell Remote Access Controller,network firmware,Bios-exe-name,idrac-exe-name,ssd-exe-name,network-exe-name



Prerequisites


1) Enter details in inputfile.csv and firmware-version.csv

2) Copy Latest firmware setups in this folder : C:\idrac-version

3) After updating these two files, we need to execute script : open cmd as administrator and go to the path : c:\script and run python idrac-final-script.py

4) Wait for script completion.


Script

You can download from Github: https://github.com/vnikhil89/Dell-Idrac-Firmware-Automation

# _author_ = Nikhil Verma
# _version_ = 1.0

import requests, json, sys, re, time, warnings, argparse, os, csv, ssl, getpass, subprocess

from datetime import datetime
from pyVmomi import vim
from pyVim.connect import SmartConnect,Disconnect
from pyVim.task import WaitForTask
from packaging import version


warnings.filterwarnings("ignore")

def check_job_status():
    while True:
        req = requests.get('https://%s/redfish/v1/TaskService/Tasks/%s' % (idrac_ip, job_id), auth=(idrac_username, idrac_password), verify=False)
        statusCode = req.status_code
        data = req.json()
        if data["TaskState"] == "Completed":
            print("\n- PASS, job ID %s successfuly marked completed, detailed final job status results:\n" % data[u"Id"])
            for i in data['Oem']['Dell'].items():
                print("%s: %s" % (i[0],i[1]))
            print("\n- JOB ID %s completed in %s" % (job_id, current_time))
        current_time = str(datetime.now()-start_time)[0:7]   
        statusCode = req.status_code
        data = req.json()
        message_string=data["Messages"]
        if statusCode == 202 or statusCode == 200:
            pass
        else:
            print("Query job ID command failed, error code is: %s" % statusCode)
            sys.exit()
        if str(current_time)[0:7] >= "0:30:00":
            print("\n- FAIL: Timeout of 30 minutes has been hit, update job should of already been marked completed. Check the iDRAC job queue and LC logs to debug the issue\n")
            sys.exit()
        elif "failed" in data['Oem']['Dell']['Message'] or "completed with errors" in data['Oem']['Dell']['Message'] or "Failed" in data['Oem']['Dell']['Message']:
            print("- FAIL: Job failed, current message is: %s" % data["Messages"])
            sys.exit()
        elif "scheduled" in data['Oem']['Dell']['Message']:
            print("\n- PASS, job ID %s successfully marked as scheduled" % data["Id"])
            break
        elif "completed successfully" in data['Oem']['Dell']['Message']:
            print("\n- PASS, job ID %s successfully marked completed, detailed final job status results:\n" % data["Id"])
            for i in data['Oem']['Dell'].items():
                print("%s: %s" % (i[0],i[1]))
            print("\n- %s completed in: %s" % (job_id, str(current_time)[0:7]))
            break
        else:
            print("- Message: %s, current update execution time: %s" % (message_string[0]["Message"], current_time))
            time.sleep(1)
            continue

def esxi_mm():
    s = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    s.verify_mode = ssl.CERT_NONE
    vc = da['vc_name']
    hostname = da["vc_hostname"]
    try:
        c = SmartConnect(host=vc, user=u, pwd=p)
        print('Valid certificate')
    except:
        c = SmartConnect(host=vc, user=u, pwd=p, sslContext=s)
        print('Invalid or untrusted certificate')

    datacenter = c.content.rootFolder.childEntity[0]
    cluster = datacenter.hostFolder.childEntity[0]
    hostnames = cluster.host
    mm_mode=vim.vsan.host.DecommissionMode(objectAction='ensureObjectAccessibility')
    spec = vim.host.MaintenanceSpec(vsanMode=mm_mode)
    for h in hostnames:
        if h.name == hostname:
            print ("Putting Host in Maintenace Mode ... "),
            try:
                WaitForTask(h.EnterMaintenanceMode_Task(0,True,spec))
                print ("Completed")
                try:
                    h.RebootHost_Task(False)
                    print("Host Rebooting")
                    time.sleep(300)
                except:
                    print("Host Failed to reboot")
            except:
                print ('Failed')
            
    Disconnect(c)
    
def check_host_connection():
    count = 0
    hostname = da["vc_hostname"]
    ping_command="ping %s -n 5" % hostname
    print(ping_command)
    while True:
        if count == 11:
            print("- WARNING, unable to successfully ping Hostname after 10 attempts, script will exit.")
            sys.exit()
        try:
            ping_output = subprocess.Popen(ping_command, stdout = subprocess.PIPE, shell=True).communicate()[0]
            ping_results = re.search("Lost = .", ping_output).group()
            if ping_results == "Lost = 0":
                break
            else:
                print("\n- INFO, Host Still not reachable. Script will recheck Host connection in 2 minute")
                time.sleep(120)
                count+=1
        except:
            ping_output = subprocess.run(ping_command,universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            if "Lost = 0" in ping_output.stdout:
                break
            else:
                print("\n- INFO, Host Still not reachable. Script will recheck Host connection in 2 minute")
                time.sleep(120)
                count+=1
                
def esxi_exit_mm():
    s = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    s.verify_mode = ssl.CERT_NONE
    vc = da['vc_name']
    hostname = da["vc_hostname"]
    try:
        c = SmartConnect(host=vc, user=u, pwd=p)
        print('Valid certificate')
    except:
        c = SmartConnect(host=vc, user=u, pwd=p, sslContext=s)
        print('Invalid or untrusted certificate')

    datacenter = c.content.rootFolder.childEntity[0]
    cluster = datacenter.hostFolder.childEntity[0]
    hostnames = cluster.host
    for h in hostnames:
        if h.name == hostname:
            print ("Removing Host from Maintenace Mode ... "),
            while True:
                if h.overallStatus == 'red':
                    print(h.overallStatus)
                    time.sleep(60)
                else:
                    try:
                        WaitForTask(h.ExitMaintenanceMode_Task(0))
                        print ("Completed")
                    except:
                        print ('Failed')
                    break
            
    Disconnect(c)

fo = open(r"InputFile.csv")
data = list (csv.DictReader(fo))
result = []
device_list = {}
global u
u = input("Enter the user name:")
global p
p=getpass.getpass(prompt='Enter Username password:')
global Idracpassword
Idracpassword = getpass.getpass(prompt='Enter Idrac password:')
for da in data:
    idrac_ip = da['IdracIP']
    idrac_username = da['Idracusername']
    idrac_password = Idracpassword
    print("\n- INFO, current devices detected with firmware version and updateable status -\n")
    req = requests.get('https://%s/redfish/v1/UpdateService/FirmwareInventory/' % (idrac_ip), auth=(idrac_username, idrac_password), verify=False)
    statusCode = req.status_code
    installed_devices=[]
    data = req.json()
    for i in data['Members']:
        for ii in i.items():
            if "Installed" in ii[1]:
                installed_devices.append(ii[1])
    for i in installed_devices:
        req = requests.get('https://%s%s' % (idrac_ip, i), auth=(idrac_username, idrac_password), verify=False)
        statusCode = req.status_code
        data1 = req.json()
        data = data1['Name']
        ph = r"([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}"
        if(re.search(ph, data)):
            data=data.split(" - ")
            data=data[0]
        else:
            data=data
        if "PCIe SSD" in data:
            data = data.split(" in ")
            data=data[0]
        else:
            data=data
        if "Integrated Remote Access Controller" in data:
            data = data.replace('Integrated Remote Access Controller','Integrated Dell Remote Access Controller')
        else:
            data=data
        device_list[data] = data1['Version']

    print(len(device_list))
    bios_version = device_list['BIOS']
    ssd_version  = device_list['PCIe SSD']
    network_version= device_list['Broadcom Adv. Dual 25Gb Ethernet']
    idrac_version = device_list['Integrated Dell Remote Access Controller']
    print("Bios Version: %s" % (bios_version))
    print("SSD Version: %s" %(ssd_version))
    print("IDRAC Version: %s" %(idrac_version))
    filopen = open(r"firmware-version.csv")
    data1 = list (csv.DictReader(filopen))
    print("Comparing Firmware Version as per provided firmware-version.csv")
    for x in data1:
        biosver = x['Bios']
        if version.parse(bios_version) < version.parse(biosver):
            print("Installing New Bios version in %s" %(idrac_ip))
            result = biosver
            global start_time
            start_time=datetime.now()
            print("\n- INFO, downloading \"%s\" image, this may take a few minutes depending on the size of the image" % x["Bios-exe-name"])
            url = "https://%s/redfish/v1/UpdateService/MultipartUpload" % idrac_ip
            path_bios = 'C:\\idrac-version\\%s' % x["Bios-exe-name"]
            print(path_bios)
            payload = {"Targets": [], "@Redfish.OperationApplyTime": "OnReset", "Oem": {}}
            files = {
                'UpdateParameters': (None, json.dumps(payload), 'application/json'),
                'UpdateFile': (os.path.basename(path_bios), open(path_bios, 'rb'), 'application/octet-stream')
            }
            response = requests.post(url, files=files, auth = (idrac_username, idrac_password), verify=False)
            if response.status_code == 202:
                pass
            else:
                data = response.json()
                print("- FAIL, status code %s returned, detailed error is: %s" % (response.status_code,data))
                sys.exit()
            try:
                job_id = response.headers['Location'].split("/")[-1]
            except:
                print("- FAIL, unable to locate job ID in header")
                sys.exit()
            print("- PASS, update job ID %s successfully created, script will now loop polling the job status\n" % job_id)
            if __name__ == "__main__":
                check_job_status()
        else:
            print("Correct Bios Version installed")
        
        ssdver = x['SSD Firmware']
        if version.parse(ssd_version) < version.parse(ssdver):
            print("Installing New SSD version in %s" %(idrac_ip))
            result = ssdver
            start_time=datetime.now()
            print("\n- INFO, downloading \"%s\" image, this may take a few minutes depending on the size of the image" % x["ssd-exe-name"])
            url = "https://%s/redfish/v1/UpdateService/MultipartUpload" % idrac_ip
            path_ssd = 'C:\\idrac-version\\%s' % x["ssd-exe-name"]
            print(path_ssd)
            payload = {"Targets": [], "@Redfish.OperationApplyTime": "OnReset", "Oem": {}}
            files = {
                'UpdateParameters': (None, json.dumps(payload), 'application/json'),
                'UpdateFile': (os.path.basename(path_ssd), open(path_ssd, 'rb'), 'application/octet-stream')
            }
            response = requests.post(url, files=files, auth = (idrac_username, idrac_password), verify=False)
            if response.status_code == 202:
                pass
            else:
                data = response.json()
                print("- FAIL, status code %s returned, detailed error is: %s" % (response.status_code,data))
                sys.exit()
            try:
                job_id = response.headers['Location'].split("/")[-1]
            except:
                print("- FAIL, unable to locate job ID in header")
                sys.exit()
            print("- PASS, update job ID %s successfully created, script will now loop polling the job status\n" % job_id)
            if __name__ == "__main__":
                check_job_status()
        else:
            print("Correct SSD Version installed")
        networkver = x['network firmware']
        if version.parse(network_version) < version.parse(networkver):
            print("Installing New Network version in %s" %(idrac_ip))
            result = networkver
            start_time=datetime.now()
            print("\n- INFO, downloading \"%s\" image, this may take a few minutes depending on the size of the image" % x["network-exe-name"])
            url = "https://%s/redfish/v1/UpdateService/MultipartUpload" % idrac_ip
            path_ssd = 'C:\\idrac-version\\%s' % x["network-exe-name"]
            print(path_ssd)
            payload = {"Targets": [], "@Redfish.OperationApplyTime": "OnReset", "Oem": {}}
            files = {
                'UpdateParameters': (None, json.dumps(payload), 'application/json'),
                'UpdateFile': (os.path.basename(path_ssd), open(path_ssd, 'rb'), 'application/octet-stream')
            }
            response = requests.post(url, files=files, auth = (idrac_username, idrac_password), verify=False)
            if response.status_code == 202:
                pass
            else:
                data = response.json()
                print("- FAIL, status code %s returned, detailed error is: %s" % (response.status_code,data))
                sys.exit()
            try:
                job_id = response.headers['Location'].split("/")[-1]
            except:
                print("- FAIL, unable to locate job ID in header")
                sys.exit()
            print("- PASS, update job ID %s successfully created, script will now loop polling the job status\n" % job_id)
            if __name__ == "__main__":
                check_job_status()
        else:
            print("Correct Network Version installed")
        idracver = x['Integrated Dell Remote Access Controller']
        if version.parse(idrac_version) < version.parse(idracver):
            print("Installing New Idrac version in %s" %(idrac_ip))
            result = idracver
            start_time=datetime.now()
            print("\n- INFO, downloading \"%s\" image, this may take a few minutes depending on the size of the image" % x["idrac-exe-name"])
            url = "https://%s/redfish/v1/UpdateService/MultipartUpload" % idrac_ip
            path_idrac = 'C:\\idrac-version\\%s' % x["idrac-exe-name"]
            print(path_idrac)
            payload = {"Targets": [], "@Redfish.OperationApplyTime": "OnReset", "Oem": {}}
            files = {
                'UpdateParameters': (None, json.dumps(payload), 'application/json'),
                'UpdateFile': (os.path.basename(path_idrac), open(path_idrac, 'rb'), 'application/octet-stream')
            }
            response = requests.post(url, files=files, auth = (idrac_username, idrac_password), verify=False)
            if response.status_code == 202:
                pass
            else:
                data = response.json()
                print("- FAIL, status code %s returned, detailed error is: %s" % (response.status_code,data))
                sys.exit()
            try:
                job_id = response.headers['Location'].split("/")[-1]
            except:
                print("- FAIL, unable to locate job ID in header")
                sys.exit()
            print("- PASS, update job ID %s successfully created, script will now loop polling the job status\n" % job_id)
            if __name__ == "__main__":
                check_job_status()
        else:
            print("Correct Idrac Version installed")
        print("Firmware need to update :%s" % len(result))
        if __name__ == "__main__":
            if len(result) == 0:
                print("No changes needed")
                #sys.exit()
            else:
                esxi_mm()
                check_host_connection()
                print("Host Reboot completed")
                esxi_exit_mm()
                #sys.exit()


Output


Enter the user name:niks
Enter Username password:········
Enter Idrac password:········
- INFO, current devices detected with firmware version and updateable status -
18
Bios Version: 2.10.2
SSD Version: VDV1DP23
IDRAC Version: 4.40.10.00
Comparing Firmware Version as per provided firmware-version.csv
Installing New Bios version in xx.xx.xx.xx
- INFO, downloading "BIOS_92RFG_WN64_2.11.2.EXE" image, this may take a few minutes depending on the size of the image
C:\idrac-version\BIOS_92RFG_WN64_2.11.2.EXE
- PASS, update job ID JID_279011852512 successfully created, script will now loop polling the job status
- Message: New, current update execution time: 0:00:09
- Message: Downloading the BIOS_92RFG_WN64_2.11.2.EXE update package., current update execution time: 0:00:10
- Message: Downloading the BIOS_92RFG_WN64_2.11.2.EXE update package., current update execution time: 0:00:11
- Message: Downloading the BIOS_92RFG_WN64_2.11.2.EXE update package., current update execution time: 0:00:13
- Message: Downloading the BIOS_92RFG_WN64_2.11.2.EXE update package., current update execution time: 0:00:14
- Message: Package successfully downloaded., current update execution time: 0:00:15
- Message: Package successfully downloaded., current update execution time: 0:00:16
- Message: Package successfully downloaded., current update execution time: 0:00:18
- Message: Package successfully downloaded., current update execution time: 0:00:19
- Message: Package successfully downloaded., current update execution time: 0:00:20
- Message: Package successfully downloaded., current update execution time: 0:00:21
- Message: Package successfully downloaded., current update execution time: 0:00:23
- Message: Package successfully downloaded., current update execution time: 0:00:24
- Message: Package successfully downloaded., current update execution time: 0:00:25
- Message: Package successfully downloaded., current update execution time: 0:00:27
- Message: Package successfully downloaded., current update execution time: 0:00:28
- PASS, job ID JID_279011852512 successfully marked as scheduled
Installing New SSD version in xx.xx.xx.xx
- INFO, downloading "Express-Flash-PCIe-SSD_Firmware_GD4X4_WN64_VDV1DP25_A04.EXE" image, this may take a few minutes depending on the size of the image
C:\idrac-version\Express-Flash-PCIe-SSD_Firmware_GD4X4_WN64_VDV1DP25_A04.EXE
- PASS, update job ID JID_279012124059 successfully created, script will now loop polling the job status
- Message: New, current update execution time: 0:00:06
- Message: New, current update execution time: 0:00:07
- Message: New, current update execution time: 0:00:09
- Message: New, current update execution time: 0:00:10
- Message: Downloading the Express-Flash-PCIe-SSD_Firmware_GD4X4_WN64_VDV1DP25_A04.EXE update package., current update execution time: 0:00:11
- Message: Package successfully downloaded., current update execution time: 0:00:13
- Message: Package successfully downloaded., current update execution time: 0:00:14
- Message: Package successfully downloaded., current update execution time: 0:00:15
- Message: Package successfully downloaded., current update execution time: 0:00:16
- Message: Package successfully downloaded., current update execution time: 0:00:18
- Message: Package successfully downloaded., current update execution time: 0:00:19
- Message: Package successfully downloaded., current update execution time: 0:00:20
- Message: Package successfully downloaded., current update execution time: 0:00:22
- Message: Package successfully downloaded., current update execution time: 0:00:23
- PASS, job ID JID_279012124059 successfully marked as scheduled
Installing New Idrac version in xx.xx.xx.xx
- INFO, downloading "iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE" image, this may take a few minutes depending on the size of the image
C:\idrac-version\iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE
- PASS, update job ID JID_279012936340 successfully created, script will now loop polling the job status
- Message: New, current update execution time: 0:01:03
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:05
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:06
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:07
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:09
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:10
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:11
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:13
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:14
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:15
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:17
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:18
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:20
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:21
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:22
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:24
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:25
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:27
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:28
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:29
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:30
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:32
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:33
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:35
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:36
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:37
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:39
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:40
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:42
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:44
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:45
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:47
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:49
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:50
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:51
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:53
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:54
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:56
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:01:58
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:00
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:04
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:06
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:08
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:10
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:12
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:13
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:15
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:16
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:18
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:19
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:21
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:22
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:24
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:25
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:27
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:28
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:30
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:31
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:32
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:34
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:35
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:37
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:38
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:40
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:41
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:43
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:45
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:46
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:47
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:49
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:50
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:51
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:52
- Message: Downloading the iDRAC-with-Lifecycle-Controller_Firmware_F87RP_WN64_5.00.00.00_A00.EXE update package., current update execution time: 0:02:54
- Message: Downloading the iDRAC-with-Lifecycle-Control