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