| Index: build/android/device_status_check.py
|
| diff --git a/build/android/device_status_check.py b/build/android/device_status_check.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..5b45628fdf9963677fe00db3d4a798b514b806e1
|
| --- /dev/null
|
| +++ b/build/android/device_status_check.py
|
| @@ -0,0 +1,120 @@
|
| +#!/usr/bin/python
|
| +#
|
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""A class to keep track of devices across builds and report state."""
|
| +
|
| +import optparse
|
| +import os
|
| +import sys
|
| +
|
| +from android_commands import GetAttachedDevices
|
| +from cmd_helper import GetCmdOutput
|
| +
|
| +
|
| +def DeviceInfo(serial):
|
| + """Gathers info on a device via various adb calls.
|
| +
|
| + Args:
|
| + serial: The serial of the attached device to construct info about.
|
| +
|
| + Returns:
|
| + Tuple of device type, build id and report as a string.
|
| + """
|
| +
|
| + def AdbShellCmd(cmd):
|
| + return GetCmdOutput('adb -s %s shell %s' % (serial, cmd),
|
| + shell=True).strip()
|
| +
|
| + device_type = AdbShellCmd('getprop ro.build.product')
|
| + device_build = AdbShellCmd('getprop ro.build.id')
|
| +
|
| + report = ['Device %s (%s)' % (serial, device_type),
|
| + ' Build: %s (%s)' % (device_build,
|
| + AdbShellCmd('getprop ro.build.fingerprint')),
|
| + ' Battery: %s%%' % AdbShellCmd('dumpsys battery | grep level '
|
| + "| awk '{print $2}'"),
|
| + ' Battery temp: %s' % AdbShellCmd('dumpsys battery'
|
| + '| grep temp '
|
| + "| awk '{print $2}'"),
|
| + ' IMEI slice: %s' % AdbShellCmd('dumpsys iphonesubinfo '
|
| + '| grep Device'
|
| + "| awk '{print $4}'")[-6:],
|
| + ' Wifi IP: %s' % AdbShellCmd('getprop dhcp.wlan0.ipaddress'),
|
| + '']
|
| +
|
| + return device_type, device_build, '\n'.join(report)
|
| +
|
| +
|
| +def CheckForMissingDevices(options, adb_online_devs):
|
| + """Uses file of previous online devices to detect broken phones.
|
| +
|
| + Args:
|
| + options: out_dir parameter of options argument is used as the base
|
| + directory to load and update the cache file.
|
| + adb_online_devs: A list of serial numbers of the currently visible
|
| + and online attached devices.
|
| + """
|
| +
|
| + last_devices_path = os.path.abspath(os.path.join(options.out_dir,
|
| + '.last_devices'))
|
| + last_devices = []
|
| + try:
|
| + with open(last_devices_path) as f:
|
| + last_devices = f.read().splitlines()
|
| + except IOError:
|
| + # Ignore error, file might not exist
|
| + pass
|
| +
|
| + missing_devs = list(set(last_devices) - set(adb_online_devs))
|
| + if missing_devs:
|
| + print '@@@STEP_WARNINGS@@@'
|
| + print '@@@STEP_SUMMARY_TEXT@%s not detected.@@@' % missing_devs
|
| + print 'Current online devices: %s' % adb_online_devs
|
| + print '%s are no longer visible. Were they removed?\n' % missing_devs
|
| + print 'SHERIFF: See go/chrome_device_monitor'
|
| + print 'Cache file: %s\n\n' % last_devices_path
|
| + print 'adb devices'
|
| + print GetCmdOutput(['adb', 'devices'])
|
| + else:
|
| + new_devs = set(adb_online_devs) - set(last_devices)
|
| + if new_devs:
|
| + print '@@@STEP_WARNINGS@@@'
|
| + print '@@@STEP_SUMMARY_TEXT@New devices detected :-)@@@'
|
| + print ('New devices detected %s. And now back to your '
|
| + 'regularly scheduled program.' % list(new_devs))
|
| +
|
| + # Write devices currently visible plus devices previously seen.
|
| + with open(last_devices_path, 'w') as f:
|
| + f.write('\n'.join(set(adb_online_devs + last_devices)))
|
| +
|
| +
|
| +def main():
|
| + parser = optparse.OptionParser()
|
| + parser.add_option('', '--out-dir',
|
| + help='Directory where the device path is stored',
|
| + default=os.path.join(os.path.dirname(__file__), '..',
|
| + '..', 'out'))
|
| +
|
| + options, args = parser.parse_args()
|
| + if args:
|
| + parser.error('Unknown options %s' % args)
|
| + devices = GetAttachedDevices()
|
| +
|
| + types, builds, reports = [], [], []
|
| + if devices:
|
| + types, builds, reports = zip(*[DeviceInfo(dev) for dev in devices])
|
| +
|
| + unique_types = list(set(types))
|
| + unique_builds = list(set(builds))
|
| +
|
| + print ('@@@BUILD_STEP Device Status Check - '
|
| + '%d online devices, types %s, builds %s@@@'
|
| + % (len(devices), unique_types, unique_builds))
|
| + print '\n'.join(reports)
|
| + CheckForMissingDevices(options, devices)
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main())
|
|
|