bcc6c64335
- Make DellEMC platform modules Python3 compliant. - Change return type of PSU Platform APIs in DellEMC Z9264, S5232 and Thermal Platform APIs in S5232 to 'float'. - Remove multiple copies of pcisysfs.py. - PEP8 style changes for utility scripts. - Build and install Python3 version of sonic_platform package. - Fix minor Platform API issues.
88 lines
2.6 KiB
Python
Executable File
88 lines
2.6 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
# dell staging fw updater script
|
|
|
|
import os
|
|
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/local/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])
|