blob: fc3ec94f653bc4d4608227d816d5011fb7f20db2 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2015 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.
"""Determine which Android devices should be connected to a host machine."""
import base64
import os
import shlex
import socket
import subprocess
import sys
import urllib2
CHECKOUT_ROOT = os.path.realpath(os.path.join(
os.path.dirname(__file__), os.pardir))
sys.path.append(os.path.join(CHECKOUT_ROOT, 'site_config'))
import slave_hosts_cfg
USAGE = '''%s: List the Android devices which run on the given host.
If no hostname is provided, list the devices which run on this machine,
and whether or not they are currently connected.
USAGE: %s [hostname]
''' % (__file__, __file__)
def usage():
"""Print a usage message and exit."""
print >> sys.stderr, USAGE
sys.exit(1)
def find_slaves(host):
"""Get the list of slaves which run on the given host."""
slaves = slave_hosts_cfg.get_slave_host_config(host).slaves
return [s[0] for s in slaves]
def get_device_serials(slaves):
"""Get the serial numbers of the devices which run on the given slaves."""
ANDROID_DEVICES_URL = ('https://chromium.googlesource.com/chromium/tools/'
'build/+/master/scripts/slave/recipe_modules/skia/'
'android_devices.py?format=TEXT')
contents = base64.b64decode(urllib2.urlopen(ANDROID_DEVICES_URL).read())
env = {}
exec(contents, env)
slave_info = env['SLAVE_INFO']
rv = []
for slave in slaves:
if slave_info.get(slave):
rv.append((slave, slave_info[slave].serial))
return rv
def get_connected_devices():
"""Return the list of connected Android devices."""
output = subprocess.check_output(['adb', 'devices']).splitlines()
rv = []
for line in output:
if (line == '' or
'List of devices attached' in line or
line.startswith('*') or
'no permissions' in line):
continue
serial, status = shlex.split(line)
if status == 'device':
rv.append(serial)
return rv
def main():
"""List the Android devices that run the given host.
If the no host is requested, print the devices that run on this machine and
whether they are connected or not.
"""
argv = sys.argv[1:]
local = False
host = socket.gethostname()
if len(argv) == 0:
local = True
elif len(argv) == 1:
if argv[0] == '-h' or argv[0] == '--help':
usage()
host = argv[0]
else:
usage()
slaves = find_slaves(host)
device_serials = get_device_serials(slaves)
connected = {}
if local:
serial_list = get_connected_devices()
for serial in serial_list:
connected[serial] = True
print 'Devices for %s:' % host
for slave, serial in device_serials:
print '\t%s:\t%s' % (slave, serial),
if local:
print '\t%s' % ('connected' if connected.get(serial)
else 'not connected'),
print
if __name__ == '__main__':
main()