1cef7893435aa41160dd1255c43cb8498279738ccChris Craik#!/usr/bin/env python 2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2015 The Chromium Authors. All rights reserved. 3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be 4cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file. 5cef7893435aa41160dd1255c43cb8498279738ccChris Craik 6cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport argparse 7cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport logging 8cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os 9cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport sys 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 11cef7893435aa41160dd1255c43cb8498279738ccChris Craikif __name__ == '__main__': 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik sys.path.append(os.path.abspath(os.path.join( 13cef7893435aa41160dd1255c43cb8498279738ccChris Craik os.path.dirname(__file__), '..', '..', '..'))) 14cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import device_blacklist 15cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import device_utils 16cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android import fastboot_utils 17cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.android.tools import script_common 18cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.constants import exit_codes 19cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom devil.utils import run_tests_helper 20cef7893435aa41160dd1255c43cb8498279738ccChris Craik 21ee838d1c4002134ff5af32da272140586c4d31deJohn Recklogger = logging.getLogger(__name__) 22ee838d1c4002134ff5af32da272140586c4d31deJohn Reck 23cef7893435aa41160dd1255c43cb8498279738ccChris Craik 24cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef main(): 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser = argparse.ArgumentParser() 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser.add_argument('build_path', help='Path to android build.') 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser.add_argument('-d', '--device', dest='devices', action='append', 28cef7893435aa41160dd1255c43cb8498279738ccChris Craik help='Device(s) to flash.') 29cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser.add_argument('-v', '--verbose', default=0, action='count', 30cef7893435aa41160dd1255c43cb8498279738ccChris Craik help='Verbose level (multiple times for more)') 31cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser.add_argument('-w', '--wipe', action='store_true', 32cef7893435aa41160dd1255c43cb8498279738ccChris Craik help='If set, wipes user data') 33cef7893435aa41160dd1255c43cb8498279738ccChris Craik parser.add_argument('--blacklist-file', help='Device blacklist file.') 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik args = parser.parse_args() 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik run_tests_helper.SetLogLevel(args.verbose) 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik 37cef7893435aa41160dd1255c43cb8498279738ccChris Craik if args.blacklist_file: 38cef7893435aa41160dd1255c43cb8498279738ccChris Craik blacklist = device_blacklist.Blacklist(args.blacklist_file).Read() 39cef7893435aa41160dd1255c43cb8498279738ccChris Craik if blacklist: 40ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.critical('Device(s) in blacklist, not flashing devices:') 41cef7893435aa41160dd1255c43cb8498279738ccChris Craik for key in blacklist: 42ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.critical(' %s', key) 43cef7893435aa41160dd1255c43cb8498279738ccChris Craik return exit_codes.INFRA 44cef7893435aa41160dd1255c43cb8498279738ccChris Craik 45cef7893435aa41160dd1255c43cb8498279738ccChris Craik flashed_devices = [] 46cef7893435aa41160dd1255c43cb8498279738ccChris Craik failed_devices = [] 47cef7893435aa41160dd1255c43cb8498279738ccChris Craik 48cef7893435aa41160dd1255c43cb8498279738ccChris Craik def flash(device): 49cef7893435aa41160dd1255c43cb8498279738ccChris Craik fastboot = fastboot_utils.FastbootUtils(device) 50cef7893435aa41160dd1255c43cb8498279738ccChris Craik try: 51cef7893435aa41160dd1255c43cb8498279738ccChris Craik fastboot.FlashDevice(args.build_path, wipe=args.wipe) 52cef7893435aa41160dd1255c43cb8498279738ccChris Craik flashed_devices.append(device) 53cef7893435aa41160dd1255c43cb8498279738ccChris Craik except Exception: # pylint: disable=broad-except 54ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.exception('Device %s failed to flash.', str(device)) 55cef7893435aa41160dd1255c43cb8498279738ccChris Craik failed_devices.append(device) 56cef7893435aa41160dd1255c43cb8498279738ccChris Craik 57cef7893435aa41160dd1255c43cb8498279738ccChris Craik devices = script_common.GetDevices(args.devices, args.blacklist_file) 58cef7893435aa41160dd1255c43cb8498279738ccChris Craik device_utils.DeviceUtils.parallel(devices).pMap(flash) 59cef7893435aa41160dd1255c43cb8498279738ccChris Craik 60cef7893435aa41160dd1255c43cb8498279738ccChris Craik if flashed_devices: 61ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.info('The following devices were flashed:') 62ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.info(' %s', ' '.join(str(d) for d in flashed_devices)) 63cef7893435aa41160dd1255c43cb8498279738ccChris Craik if failed_devices: 64ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.critical('The following devices failed to flash:') 65ee838d1c4002134ff5af32da272140586c4d31deJohn Reck logger.critical(' %s', ' '.join(str(d) for d in failed_devices)) 66cef7893435aa41160dd1255c43cb8498279738ccChris Craik return exit_codes.INFRA 67cef7893435aa41160dd1255c43cb8498279738ccChris Craik return 0 68cef7893435aa41160dd1255c43cb8498279738ccChris Craik 69cef7893435aa41160dd1255c43cb8498279738ccChris Craikif __name__ == '__main__': 70cef7893435aa41160dd1255c43cb8498279738ccChris Craik sys.exit(main()) 71