blob: 7e0254cc89847fd5085fe1d0460afa69863c2df4 [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2009-2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script updates given firmware in shellball and puts in an image.
This scripts mounts given image and copies chromeos-firmwareupdate file. Then
extracts chromeos-firmwareupdater and replaces given bios.bin in
chromeos-firmwareupdater, re-packs the file and enables firmare update.
At the end it unmounts the image.
This is useful for test team to test new firmware/coreboot.
Syntax:
update_firmware_image.py --imagedir <path to image> --image <image name>
--bios <path to bios>
e.g. update_firmware_image.py --imagedir /home/$USER/src/images/
--image chromiumos_test_image.bin
--bios /home/$USER/src/bios/bios.bin
"""
#__author__ = 'rchenna@google.com (Rajesh Chenna)'
# TODO(garnold) deprecated module, switch to using subprocess.
import commands
import logging
import optparse
import os
import re
import sys
# Constants
dev_keys = '$HOME/trunk/src/platform/vboot_reference/tests/devkeys'
mount_gpt_image = '$HOME/trunk/src/scripts/mount_gpt_image.sh'
image_signing_dir = ('$HOME/trunk/src/platform/vboot_reference/scripts/'
'image_signing')
def main():
parser = optparse.OptionParser()
parser.add_option('-b', '--bios', help='bios name including path')
parser.add_option('-d', '--imagedir', help='image directory')
parser.add_option('-i', '--image', help='image name')
(options, args) = parser.parse_args()
# Checking whether running inside chroot or not.
if not os.path.exists('/etc/debian_chroot'):
logging.fatal("Make sure you are inside chroot")
sys.exit(0)
# Conditions to check all arguments.
if not all([options.bios,
options.imagedir,
options.image]):
logging.fatal('Missing arguments.')
logging.fatal('Please provide bios, imagedir and image')
sys.exit(0)
# Verify bios.bin is passing.
#If not, copy the supplied bios to bios.bin.
if 'bios.bin' not in options.bios:
os.system('cp %s %s/bios.bin' %(options.bios,
options.bios[:options.bios.rfind('/')]))
# Step1: Mount the image.
os.system('sudo %s --from %s --image %s'
% (mount_gpt_image, options.imagedir,
options.image))
# Step2: copy shellball.
os.system('sudo cp /tmp/m/usr/sbin/chromeos-firmwareupdate /tmp/')
# Step3: Extract shellball.
extract = commands.getoutput('sudo /tmp/chromeos-firmwareupdate '
'--sb_extract')
extract_dir = re.match('Extracting to: (.+)', extract)
# Step4: copy bios.bin to extracted directory.
os.system('sudo cp %s/bios.bin %s/'
%(options.bios[:options.bios.rfind('/')], extract_dir.group(1)))
# Step5: repack shellball.
os.system('sudo /tmp/chromeos-firmwareupdate --sb_repack %s'
%(extract_dir.group(1)))
# Step6: copy shellball back to /tmp/m location.
os.system('sudo mv /tmp/chromeos-firmwareupdate /tmp/m/usr/sbin/')
# Step7: Unmount the image.
os.system('%s -u' %mount_gpt_image)
# Step 8: enable firmware update.
os.system('sudo %s/tag_image.sh --from=%s/%s --update_firmware=1'
%(image_signing_dir,
options.imagedir,
options.image))
# Step 9: Re-sign the image.
os.system('sudo %s/sign_official_build.sh usb %s/%s %s %s/resigned_%s'
%(image_signing_dir,
options.imagedir,
options.image,
dev_keys,
options.imagedir,
options.image))
if __name__ == '__main__':
main()