#!/usr/bin/python

# Copyright(c) 2012 The Chromium OS Author. 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)'

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()
