2 # Copyright (C) 2012 Google Inc. All Rights Reserved.
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
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.
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.
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])
35 class AndroidDeviceStatus(object):
36 def __init__(self, device_serial):
37 self._device_serial = device_serial
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()
44 def device_type(self):
45 return self._run_adb_command(['shell', 'getprop', 'ro.build.product'])
47 def device_build(self):
48 return self._run_adb_command(['shell', 'getprop', 'ro.build.id'])
50 def device_fingerprint(self):
51 return self._run_adb_command(['shell', 'getprop', 'ro.build.fingerprint'])
53 def battery_level(self):
54 return self._run_adb_command(['shell', 'cat', '/sys/class/power_supply/battery/capacity'])
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]
62 username = self._run_adb_command(['shell', 'id'])
63 re_username = re.compile('uid=\d+\((.+?)\)')
64 return re_username.findall(username)[0]
68 devices = GetAttachedDevices()
69 for device_serial in devices:
70 device_status = AndroidDeviceStatus(device_serial)
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()
80 if __name__ == '__main__':