d716c026b5e18013798a5e68cbdebaaf37a775bd
[WebKit-https.git] / Tools / BuildSlaveSupport / chromium / output-android-device-status
1 #!/usr/bin/env python
2 # Copyright (C) 2012 Google Inc. All Rights Reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7 # 1. Redistributions of source code must retain the above copyright
8 #    notice, this list of conditions and the following disclaimer.
9 # 2. Redistributions in binary form must reproduce the above copyright
10 #    notice, this list of conditions and the following disclaimer in the
11 #    documentation and/or other materials provided with the distribution.
12 #
13 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25 import re
26 import subprocess
27 import sys
28
29 def GetAttachedDevices():
30     re_device = re.compile('^([a-zA-Z0-9_:.-]+)\tdevice$', re.MULTILINE)
31     process = subprocess.Popen(['adb', 'devices'], stdout=subprocess.PIPE)
32     return re_device.findall(process.communicate()[0])
33
34
35 class AndroidDeviceStatus(object):
36     def __init__(self, device_serial):
37         self._device_serial = device_serial
38
39     def _run_adb_command(self, command):
40         full_command = ['adb', '-s', self._device_serial] + command
41         stdout, _ = subprocess.Popen(full_command, stdout=subprocess.PIPE).communicate()
42         return stdout.strip()
43
44     def device_type(self):
45         return self._run_adb_command(['shell', 'getprop', 'ro.build.product'])
46
47     def device_build(self):
48         return self._run_adb_command(['shell', 'getprop', 'ro.build.id'])
49
50     def device_fingerprint(self):
51         return self._run_adb_command(['shell', 'getprop', 'ro.build.fingerprint'])
52
53     def battery_level(self):
54         return self._run_adb_command(['shell', 'cat', '/sys/class/power_supply/battery/capacity'])
55
56     def battery_temperature(self):
57         temperature = self._run_adb_command(['shell', 'dumpsys', 'battery'])
58         re_temperature = re.compile('temperature:\s+(\d+)')
59         return re_temperature.findall(temperature)[0]
60
61     def username(self):
62         username = self._run_adb_command(['shell', 'id'])
63         re_username = re.compile('uid=\d+\((.+?)\)')
64         return re_username.findall(username)[0]
65
66
67 def main():
68     devices = GetAttachedDevices()
69     for device_serial in devices:
70         device_status = AndroidDeviceStatus(device_serial)
71
72         print 'Device %s (%s)' % (device_serial, device_status.device_type())
73         print '  Build: %s (%s)' % (device_status.device_build(), device_status.device_fingerprint())
74         print '  Battery: %s%%' % device_status.battery_level()
75         print '  Battery temp: %s' % device_status.battery_temperature()
76         print '  Username: %s' % device_status.username()
77         print ''
78
79
80 if __name__ == '__main__':
81     sys.exit(main())