#!/usr/bin/env python
# Copyright 2014 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Fastboot in python.
Call it similar to how you call android's fastboot, but this only accepts usb paths and no serials.
.. rubric:: Contents
* :func:`_InfoCb`
* :func:`Devices`
"""
import argparse
import inspect
import logging
import sys
from adb import common_cli
from adb import fastboot
try:
import progressbar
except ImportError:
# progressbar is optional.
progressbar = None
[docs]def Devices():
"""Lists the available devices.
::
List of devices attached
015DB7591102001A device
.. seealso:: :meth:`adb.fastboot.FastbootCommands.Devices`
.. image:: _static/adb.fastboot_debug.Devices.CALLER_GRAPH.svg
Returns
-------
int
0
"""
for device in fastboot.FastbootCommands.Devices():
print('%s\tdevice' % device.serial_number)
return 0
[docs]def _InfoCb(message):
"""Print a message to stdout.
Parameters
----------
message : adb.fastboot.FastbootMessage
A :class:`~adb.fastboot.FastbootMessage` with ``header`` and ``message`` attributes
"""
# Use an unbuffered version of stdout.
if not message.message:
return
sys.stdout.write('%s: %s\n' % (message.header, message.message))
sys.stdout.flush()
[docs]def main():
"""TODO"""
common = common_cli.GetCommonArguments()
device = common_cli.GetDeviceArguments()
device.add_argument('--chunk_kb', type=int, default=1024, metavar='1024',
help='Size of packets to write in Kb. For older devices, it may be required to use 4.')
parents = [common, device]
parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__, parents=[common])
subparsers = parser.add_subparsers(title='Commands', dest='command_name')
subparser = subparsers.add_parser(name='help', help='Prints the commands available') # pylint: disable=unused-variable
subparser = subparsers.add_parser(name='devices', help='Lists the available devices', parents=[common]) # noqa: F841
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Continue)
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Download, {'source_file': 'Filename on the host to push'})
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Erase)
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Flash)
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Getvar)
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Oem)
common_cli.MakeSubparser(subparsers, parents, fastboot.FastbootCommands.Reboot)
if len(sys.argv) == 1:
parser.print_help()
return 2
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
if args.command_name == 'devices':
return Devices()
if args.command_name == 'help':
parser.print_help()
return 0
kwargs = {}
argspec = inspect.getfullargspec(args.method)
if 'info_cb' in argspec.args:
kwargs['info_cb'] = _InfoCb
if 'progress_callback' in argspec.args and progressbar:
bar = progressbar.ProgessBar(widgets=[progressbar.Bar(), progressbar.Percentage()]) # pylint: disable=blacklisted-name
bar.start()
def SetProgress(current, total):
bar.update(current / total * 100.0)
if current == total:
bar.finish()
kwargs['progress_callback'] = SetProgress
return common_cli.StartCli(
args,
fastboot.FastbootCommands,
chunk_kb=args.chunk_kb,
extra=kwargs)
if __name__ == '__main__':
sys.exit(main())