| #!/usr/bin/python |
| # |
| # Copyright (c) 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. |
| |
| import argparse |
| import logging |
| import os |
| import pipes |
| import sys |
| |
| import factory_common # pylint: disable=W0611 |
| from cros.factory.tools.mount_partition import MountPartition |
| from cros.factory.utils.process_utils import Spawn |
| |
| BUNDLE_MOUNT_POINT = '/mnt/factory_bundle' |
| |
| def MakeUpdateBundle(factory_image, output): |
| """Prepares an updater bundle. |
| |
| Args: |
| factory_image: Path to the image. |
| output: Path to the factory.tar.bz2 bundle. |
| |
| Returns: |
| The MD5SUM of the bundle. |
| """ |
| for line in open('/etc/mtab').readlines(): |
| if line.split()[2] == BUNDLE_MOUNT_POINT: |
| logging.error('%s is already mounted', BUNDLE_MOUNT_POINT) |
| sys.exit(1) |
| |
| # Make BUNDLE_MOUNT_POINT as root. |
| Spawn(['mkdir', '-p', BUNDLE_MOUNT_POINT], sudo=True, check_call=True) |
| with MountPartition(factory_image, 1, BUNDLE_MOUNT_POINT, |
| rw=True): |
| Spawn(['tar', 'cf', output, '-I', 'pbzip2', |
| '-C', os.path.join(BUNDLE_MOUNT_POINT, 'dev_image'), |
| '--exclude', 'factory/MD5SUM', |
| 'factory', 'autotest'], |
| check_call=True, log=True) |
| md5sum = (Spawn(['md5sum', output], check_output=True). |
| stdout_data.split()[0]) |
| logging.info('MD5SUM is %s', md5sum) |
| md5sum_file = os.path.join(BUNDLE_MOUNT_POINT, |
| 'dev_image', 'factory', 'MD5SUM') |
| # Use a shell, since we may need to be root to do this. |
| Spawn('echo %s > %s' % (md5sum, pipes.quote(md5sum_file)), |
| shell=True, sudo=True, log=True, check_call=True) |
| |
| return md5sum |
| |
| |
| def main(): |
| logging.basicConfig(level=logging.INFO) |
| parser = argparse.ArgumentParser( |
| description="Prepare an updater bundle.") |
| parser.add_argument('-i', '--factory_image', metavar='FILE', |
| dest='factory_image', |
| required=True, |
| help='factory image from which to create the bundle') |
| parser.add_argument('-o', '--output', metavar='BZFILE', |
| dest='output', |
| default='factory.tar.bz2', |
| help='output bundle') |
| args = parser.parse_args() |
| MakeUpdateBundle(args.factory_image, args.output) |
| |
| |
| if __name__ == '__main__': |
| main() |