OLD | NEW |
| (Empty) |
1 #!/usr/bin/python | |
2 # | |
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 """A class to keep track of devices across builds and report state.""" | |
8 | |
9 import optparse | |
10 import os | |
11 import sys | |
12 | |
13 from android_commands import GetAttachedDevices | |
14 from cmd_helper import GetCmdOutput | |
15 | |
16 | |
17 def DeviceInfo(serial): | |
18 """Gathers info on a device via various adb calls. | |
19 | |
20 Args: | |
21 serial: The serial of the attached device to construct info about. | |
22 | |
23 Returns: | |
24 Tuple of device type, build id and report as a string. | |
25 """ | |
26 | |
27 def AdbShellCmd(cmd): | |
28 return GetCmdOutput('adb -s %s shell %s' % (serial, cmd), | |
29 shell=True).strip() | |
30 | |
31 device_type = AdbShellCmd('getprop ro.build.product') | |
32 device_build = AdbShellCmd('getprop ro.build.id') | |
33 | |
34 report = ['Device %s (%s)' % (serial, device_type), | |
35 ' Build: %s (%s)' % (device_build, | |
36 AdbShellCmd('getprop ro.build.fingerprint')), | |
37 ' Battery: %s%%' % AdbShellCmd('dumpsys battery | grep level ' | |
38 "| awk '{print $2}'"), | |
39 ' Battery temp: %s' % AdbShellCmd('dumpsys battery' | |
40 '| grep temp ' | |
41 "| awk '{print $2}'"), | |
42 ' IMEI slice: %s' % AdbShellCmd('dumpsys iphonesubinfo ' | |
43 '| grep Device' | |
44 "| awk '{print $4}'")[-6:], | |
45 ' Wifi IP: %s' % AdbShellCmd('getprop dhcp.wlan0.ipaddress'), | |
46 ''] | |
47 | |
48 return device_type, device_build, '\n'.join(report) | |
49 | |
50 | |
51 def CheckForMissingDevices(options, adb_online_devs): | |
52 """Uses file of previous online devices to detect broken phones. | |
53 | |
54 Args: | |
55 options: out_dir parameter of options argument is used as the base | |
56 directory to load and update the cache file. | |
57 adb_online_devs: A list of serial numbers of the currently visible | |
58 and online attached devices. | |
59 """ | |
60 | |
61 last_devices_path = os.path.abspath(os.path.join(options.out_dir, | |
62 '.last_devices')) | |
63 last_devices = [] | |
64 try: | |
65 with open(last_devices_path) as f: | |
66 last_devices = f.read().splitlines() | |
67 except IOError: | |
68 # Ignore error, file might not exist | |
69 pass | |
70 | |
71 missing_devs = list(set(last_devices) - set(adb_online_devs)) | |
72 if missing_devs: | |
73 print '@@@STEP_WARNINGS@@@' | |
74 print '@@@STEP_SUMMARY_TEXT@%s not detected.@@@' % missing_devs | |
75 print 'Current online devices: %s' % adb_online_devs | |
76 print '%s are no longer visible. Were they removed?\n' % missing_devs | |
77 print 'SHERIFF: See go/chrome_device_monitor' | |
78 print 'Cache file: %s\n\n' % last_devices_path | |
79 print 'adb devices' | |
80 print GetCmdOutput(['adb', 'devices']) | |
81 else: | |
82 new_devs = set(adb_online_devs) - set(last_devices) | |
83 if new_devs: | |
84 print '@@@STEP_WARNINGS@@@' | |
85 print '@@@STEP_SUMMARY_TEXT@New devices detected :-)@@@' | |
86 print ('New devices detected %s. And now back to your ' | |
87 'regularly scheduled program.' % list(new_devs)) | |
88 | |
89 # Write devices currently visible plus devices previously seen. | |
90 with open(last_devices_path, 'w') as f: | |
91 f.write('\n'.join(set(adb_online_devs + last_devices))) | |
92 | |
93 | |
94 def main(): | |
95 parser = optparse.OptionParser() | |
96 parser.add_option('', '--out-dir', | |
97 help='Directory where the device path is stored', | |
98 default=os.path.join(os.path.dirname(__file__), '..', | |
99 '..', 'out')) | |
100 | |
101 options, args = parser.parse_args() | |
102 if args: | |
103 parser.error('Unknown options %s' % args) | |
104 devices = GetAttachedDevices() | |
105 | |
106 types, builds, reports = [], [], [] | |
107 if devices: | |
108 types, builds, reports = zip(*[DeviceInfo(dev) for dev in devices]) | |
109 | |
110 unique_types = list(set(types)) | |
111 unique_builds = list(set(builds)) | |
112 | |
113 print ('@@@BUILD_STEP Device Status Check - ' | |
114 '%d online devices, types %s, builds %s@@@' | |
115 % (len(devices), unique_types, unique_builds)) | |
116 print '\n'.join(reports) | |
117 CheckForMissingDevices(options, devices) | |
118 | |
119 if __name__ == '__main__': | |
120 sys.exit(main()) | |
OLD | NEW |