Implement review comments

Update --apply --edit to allow the eeprom image to be specified.
Add some error checking around chmod in rpi-eeprom-update

TODO: Test this on NFS
This commit is contained in:
Tim Gover
2020-09-25 09:58:07 +01:00
parent 55ece6bab5
commit ccd8444501
2 changed files with 46 additions and 33 deletions

View File

@@ -34,10 +34,10 @@ def exit_handler():
Delete any temporary files.
"""
if TEMP_DIR is not None and os.path.exists(TEMP_DIR):
tmp_image = '%s/pieeprom.upd' % TEMP_DIR
tmp_image = os.path.join(TEMP_DIR, 'pieeprom.upd')
if os.path.exists(tmp_image):
os.remove(tmp_image)
tmp_conf = '%s/boot.conf' % TEMP_DIR
tmp_conf = os.path.join(TEMP_DIR, 'boot.conf')
if os.path.exists(tmp_conf):
os.remove(tmp_conf)
os.rmdir(TEMP_DIR)
@@ -56,15 +56,20 @@ def exit_error(msg):
sys.exit(1)
def shell_cmd(args):
"""
Executes a shell command waits for completion returning STDOUT. If an
error occurs then exit and output the subprocess stdout, stderr messages
for debug.
"""
start = time.time()
arg_str = ' '.join(args)
result = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
result = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while time.time() - start < 5:
if result.poll() is not None:
break
if result.poll is None:
if result.poll() is None:
exit_error("%s timeout" % arg_str)
if result.returncode != 0:
@@ -82,25 +87,28 @@ def get_latest_eeprom():
exit_error("EEPROM image '%s' not found" % latest)
return latest
def apply_update(config):
def apply_update(config, eeprom=None):
"""
Applies the config file to the latest available EEPROM image and spawns
rpi-eeprom-update to schedule the update at the next reboot.
"""
latest = get_latest_eeprom()
if eeprom is not None:
eeprom_image = eeprom
else:
eeprom_image = get_latest_eeprom()
create_tempdir()
tmp_update = "%s/%s" % (TEMP_DIR, 'pieeprom.upd')
image = BootloaderImage(latest, tmp_update)
tmp_update = os.path.join(TEMP_DIR, 'pieeprom.upd')
image = BootloaderImage(eeprom_image, tmp_update)
image.write(config)
config_str = open(config).read()
sys.stdout.write("Updating bootloader EEPROM\n image: %s\nconfig: %s\n%s\n" %
(latest, config, config_str))
(eeprom_image, config, config_str))
args = ['sudo', 'rpi-eeprom-update', '-d', '-f', tmp_update]
resp = shell_cmd(args)
sys.stdout.write(resp)
def edit_config():
def edit_config(eeprom=None):
"""
Implements something like visudo for editing EEPROM configs.
"""
@@ -108,7 +116,7 @@ def edit_config():
exit_error('EDITOR environment variable not defined')
create_tempdir()
current_config = read_current_config()
tmp_conf = "%s/boot.conf" % TEMP_DIR
tmp_conf = os.path.join(TEMP_DIR, 'boot.conf')
out = open(tmp_conf, 'w')
out.write(current_config)
out.close()
@@ -120,7 +128,7 @@ def edit_config():
new_config = open(tmp_conf, 'r').read()
if len(new_config.splitlines()) < 2:
exit_error("Aborting update because \'%s\' appears to be empty." % tmp_conf)
apply_update(tmp_conf)
apply_update(tmp_conf, eeprom)
def read_current_config():
"""
@@ -221,15 +229,15 @@ def main():
Bootloader EEPROM configuration tool for the Raspberry Pi 4.
Operating modes:
1. Output the current bootloader to configuration STDOUT if no arguments are
1. Outputs the current bootloader configuration to STDOUT if no arguments are
specified OR the given output file if --out is specified.
rpi-eeprom-config (--out boot.conf)
rpi-eeprom-config [--out boot.conf]
2. Extracts the configuration file from the given \'eeprom\' file and outputs
the result to STDOUT or the output file if --output is specified.
rpi-eeprom-config pieeprom.bin (--out boot.conf)
rpi-eeprom-config pieeprom.bin [--out boot.conf]
3. Writes a new EEPROM image replacing the configuration file with the contents
of the file specified by --config.
@@ -239,23 +247,24 @@ Operating modes:
The new image file can be installed via rpi-eeprom-update
rpi-eeprom-update -d -f newimage.bin
4. Applies a given config file to the latest available EEPROM image and
invokes rpi-eeprom-update to update the bootloader when the system is
rebooted.
4. Applies a given config file an EEPROM image and invokes rpi-eeprom-update
to schedule an update of the bootloader when the system is rebooted.
rpi-eeprom-config --apply boot.conf
rpi-eeprom-config --apply boot.conf [pieeprom.bin]
The latest available image is determined by querying \'rpi-eeprom-update -l\'
and depends on the rpi-eeprom-update configuration.
If the \'eeprom\' argument is not specified then the latest available image
is selected by calling \'rpi-eeprom-update -l\'.
5. Launches the default text editor ($EDITOR) to edit the current EEPROM
configuration and then invokes rpi-eeprom-update to apply the updated
configuration to the latest available EEPROM image and schedule an update
at the next reboot.
5. The `--edit` parameter behaves the same as `--apply` except that instead of
applying a predefined configuration file the default text editor ($EDITOR) is
launched with the contents of the current EEPROM configuration.
N.B. The 'current' EEPROM configuration is read via 'vcgencmd bootloader_config'
and is the configuration that the system was booted with. It does NOT reflect
any pending updates.
and is the configuration that the system was booted with. It does not reflect any
pending updates so invoking this a second time without rebooting would discard
any previous edits.
rpi-eeprom-config --edit [pieeprom.bin]
See 'rpi-eeprom-update -h' for more information about the available EEPROM
images.
@@ -272,11 +281,11 @@ images.
args = parser.parse_args()
if args.edit:
edit_config()
edit_config(args.eeprom)
elif args.apply is not None:
if not os.path.exists(args.apply):
exit_error("config file '%s' not found" % args.apply)
apply_update(args.apply)
apply_update(args.apply, args.eeprom)
elif args.eeprom is not None:
image = BootloaderImage(args.eeprom, args.out)
if args.config is not None:

View File

@@ -170,16 +170,20 @@ applyRecoveryUpdate()
|| die "Failed to copy ${TMP_EEPROM_IMAGE} to ${BOOTFS}"
# For NFS mounts ensure that the files are readable to the TFTP user
chmod -f go+r "${BOOTFS}/pieeprom.upd" "${BOOTFS}/pieeprom.sig"
chmod -f go+r "${BOOTFS}/pieeprom.upd" "${BOOTFS}/pieeprom.sig" \
|| die "Failed to set permissions on eeprom update files"
fi
if [ -n "${VL805_UPDATE_IMAGE}" ]; then
sha256sum "${VL805_UPDATE_IMAGE}" | awk '{print $1}' > "${BOOTFS}/vl805.sig" \
|| die "Failed to create ${BOOTFS}/vl805.sig"
cp -f "${VL805_UPDATE_IMAGE}" "${BOOTFS}/vl805.bin"
cp -f "${VL805_UPDATE_IMAGE}" "${BOOTFS}/vl805.bin" \
|| die "Failed to copy ${VL805_UPDATE_IMAGE} to ${BOOTFS/vl805.bin}"
# For NFS mounts ensure that the files are readable to the TFTP user
chmod -f go+r "${BOOTFS}/vl805.bin" "${BOOTFS}/vl805.sig"
chmod -f go+r "${BOOTFS}/vl805.bin" "${BOOTFS}/vl805.sig" \
|| die "Failed to set permissions on eeprom update files"
fi
cp -f "${RECOVERY_BIN}" "${BOOTFS}/recovery.bin" \