sonic-buildimage/platform/broadcom/sonic-platform-modules-dell/common/fw-updater
srideepDell 413f07820d [devices]: Firmware upgrade support for DellEMC platforms(s5248,s5232,z9100,s6100,z9264f) (#3743)
* This method is used to update firmware components such as CPLD,FPGA,BIOS,SMF
           * This uses ONIE firmware upgrade design to stage firmware update from NOS.

a) Copy latest firmware updater image to target running sonic.
b) Run “./fw-updater -u onie-firmware-x86_64-dellemc_s5200_c3538-r0.3.40.5.1-9.bin”.
c) This would automatically reboot ONIE into update mode and update firmware components to latest and reboot back to sonic without any user intervention.

Signed-off-by: Srideep Devireddy <srideep_devireddy@dell.com>
2019-11-14 00:08:15 -08:00

92 lines
2.6 KiB
Python
Executable File

#!/usr/bin/python
# dell staging fw updater script
import os
import sys
import subprocess
import argparse
onie_boot_folder = '/mnt/onie-boot/onie/tools/bin/onie-fwpkg'
onie_fwpkg_tool = '/mnt/onie-boot/onie/tools/bin/onie-fwpkg'
ONIE_BOOT_MODE_CMD = '/mnt/onie-boot/onie/tools/bin/onie-boot-mode'
HOST_GRUB_DIR = '/host'
HOST_GRUB_CFG = HOST_GRUB_DIR + '/grub/grub.cfg'
HOST_GRUB_ENV = HOST_GRUB_DIR + '/grub/grubenv'
HOST_GRUB_BOOT_DIR = '--boot-directory=' + HOST_GRUB_DIR
HOST_PLATFORM_INFO = HOST_GRUB_DIR + '/platform'
dell_reload_tool = '/usr/bin/reboot'
def set_onie_mode(option):
"""Select the ONIE boot mode, and set the next_entry to point to ONIE"""
_set_env_option('next_entry', 'ONIE')
subprocess.check_call([ONIE_BOOT_MODE_CMD, '-o', option])
def set_onie_fw_update_env():
"""Select the ONIE boot mode, and set the next_entry to point to ONIE"""
if not os.path.exists(onie_boot_folder):
os.makedirs(onie_boot_folder)
try:
subprocess.check_call(['mount','/dev/disk/by-label/ONIE-BOOT','/mnt/onie-boot'])
except:
print "onie-boot not able to mount"
def _set_env_option(option, value):
"""Set an option in the GRUB environment block. Pass None to value to
unset the option"""
if value is None:
action = 'unset'
key_value = option
else:
action = 'set'
key_value = '%s=%s' % (option, value)
subprocess.check_call(['grub-editenv', HOST_GRUB_ENV, action, key_value])
def dell_firmware_update_staging(image_name):
try:
p = subprocess.Popen([onie_fwpkg_tool,"purge"],stdout=subprocess.PIPE,stdin=subprocess.PIPE)
p.communicate("y")
except:
print "onie-fwpkg command not found for purging old fw updates"
try:
subprocess.check_call([onie_fwpkg_tool,"add", str(image_name)])
except:
print "onie-fwpkg is not found to stage fw updates"
try:
set_onie_mode("update")
except:
print "dell-image command not found"
try:
subprocess.check_call([dell_reload_tool])
except:
print "reload command not found"
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Dell HOST Firmware updates')
opts = parser.add_mutually_exclusive_group(required=True)
opts.add_argument('-u', '--update', nargs=1, metavar='IMAGE',
help='update specified image')
args = parser.parse_args()
if os.getuid() != 0:
parser.exit(127, 'ERROR: Must be root\n')
if args.update:
set_onie_fw_update_env()
dell_firmware_update_staging(args.update[0])