Dealing with iLO firmware updates

One of the key features of python_hpilo is that it makes iLO firmware updates painless. It can download the firmware for you, or you can feed it the .bin, .scexe or .fwpkg files HP ships.

Note that the newest versions of the firmware, as of August 2020, are shipped in a new format and you will need to use python-hpilo 4.4 or newer to extract and use them. If you cannot upgrade, you can manually extract the .bin file from the .fwpkg file (just open it with anything that can open zip files) and pass the .bin file to python-hpilo.

From the CLI

The method to call is update_rib_firmware(). To tell it which firmware version to install, you can specify a version or a filename. To install the latest version, you can use latest as version. Information about available version numbers can be found in firmware.conf.

Some example commands:

hpilo_cli example-server.int.kaarsemaker.net update_rib_firmware version=1.28
hpilo_cli example-server.int.kaarsemaker.net update_rib_firmware version=latest
hpilo_cli example-server.int.kaarsemaker.net update_rib_firmware filename=CP007684.scexe
hpilo_cli example-server.int.kaarsemaker.net update_rib_firmware filename=ilo2_225.bin

If you just want to download the firmware, you can make hpilo_cli do that too:

hpilo_cli download_rib_firmware all        # Download latest firmware for all iLO types
hpilo_cli download_rib_firmware ilo4       # Download latest iLO 4 firmware
hpilo_cli download_rib_firmware ilo4 1.50  # Download a specific firmware version
hpilo_cli download_rib_firmware ilo4 all   # Download all firmware versions for iLO 4
hpilo_cli download_rib_firmware all all    # Download all firmware versions for all iLO types

Using the API

As the CLI is merely a thin wrapper around the API, using the API is as expected:

ilo = hpilo.Ilo(hostname, login, password)
ilo.update_rib_firmware(version='latest')

But since firmware updates may take a while, the iLO can provide progress messages, which your code may in turn show to your users. To receive these progress message, pass a callable to the update_rib_firmware() function. It will be called with single-line messages about the progress of the firmware download, upload and flash processes. This example shows them to the user, constantly overwriting the previous message:

def print_progress(text):
    sys.stdout.write('\r\033[K' + text)
    sys.stdout.flush()

ilo = hpilo.Ilo(hostname, login, password)
ilo.update_rib_firmware(version='latest', progress=print_progress)
print("")

Of course the firmware downloader can be used from the API as well:

import hpilo_fw
hpilo_fw.download('ilo4', path='/var/cache/ilo_fw/', progress=print_progress)
hpilo_fw.download('ilo3 1.28', path='/var/cache/ilo_fw', progress=print_progress)

Using a local firmware mirror

The firmware download functions connect to the internet to download firmware. While they can be made to use a proxy, using the standard https_proxy and http_proxy variables, it may be desirable to only download data from inside your network.

To do this, you can set a variable in ilo.conf for the cli:

[firmware]
mirror = http://buildserver.example.com/ilo-firmware/

Or if you use the API, configure the firmware downloader, both the downloader and the updater will then use your mirror:

import hpilo, hpilo_fw
hpilo_fw.config(mirror='http://buildserver.example.com/ilo-firmware/')

ilo = hpilo.Ilo(hostname, login, password)
ilo.update_rib_firmware(version='latest', progress=print_progress)
print("")

hpilo_fw.download('ilo4', progress=print_progress)

Your mirror should contain both firmware.conf, and the bin files for all firmware versions you want to support. You can create (and auto-update via cron) such a mirror with a simple shellscript:

#!/bin/sh

cd /var/www/html/ilo-firmware
wget -q https://seveas.github.io/python-hpilo/firmware.conf
hpilo_cli -c /dev/null download_rib_firmware all all

This will download and extract the necessary files to /var/www/html/ilo-firmware.