1cb93a386Sopenharmony_ci# Copyright 2016 Google Inc. 2cb93a386Sopenharmony_ci# 3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 4cb93a386Sopenharmony_ci# found in the LICENSE file. 5cb93a386Sopenharmony_ci 6cb93a386Sopenharmony_cifrom __future__ import print_function 7cb93a386Sopenharmony_ciimport re 8cb93a386Sopenharmony_ciimport time 9cb93a386Sopenharmony_ciimport subprocess 10cb93a386Sopenharmony_ciimport sys 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ciclass Adb: 13cb93a386Sopenharmony_ci def __init__(self, device_serial=None, adb_binary=None, echo=False): 14cb93a386Sopenharmony_ci self.__invocation = [adb_binary] 15cb93a386Sopenharmony_ci if device_serial: 16cb93a386Sopenharmony_ci self.__invocation.extend(['-s', device_serial]) 17cb93a386Sopenharmony_ci self.__echo = echo 18cb93a386Sopenharmony_ci self.__is_root = None 19cb93a386Sopenharmony_ci self.__has_established_connection = False 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci def shell(self, cmd): 22cb93a386Sopenharmony_ci if self.__echo: 23cb93a386Sopenharmony_ci self.__echo_shell_cmd(cmd) 24cb93a386Sopenharmony_ci self.__invoke('shell', cmd) 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci def check(self, cmd): 27cb93a386Sopenharmony_ci if self.__echo: 28cb93a386Sopenharmony_ci self.__echo_shell_cmd(cmd) 29cb93a386Sopenharmony_ci self.__establish_connection() 30cb93a386Sopenharmony_ci result = subprocess.check_output(self.__invocation + ['shell', cmd]) 31cb93a386Sopenharmony_ci if self.__echo: 32cb93a386Sopenharmony_ci print(result, file=sys.stderr) 33cb93a386Sopenharmony_ci return result 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci def root(self): 36cb93a386Sopenharmony_ci if not self.is_root(): 37cb93a386Sopenharmony_ci self.__invoke('root') 38cb93a386Sopenharmony_ci self.__has_established_connection = False 39cb93a386Sopenharmony_ci self.__is_root = None 40cb93a386Sopenharmony_ci return self.is_root() 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci def is_root(self): 43cb93a386Sopenharmony_ci if self.__is_root is None: 44cb93a386Sopenharmony_ci self.__is_root = ('root' == self.check('whoami').strip()) 45cb93a386Sopenharmony_ci return self.__is_root 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci def remount(self): 48cb93a386Sopenharmony_ci self.__invoke('remount') 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci def reboot(self): 51cb93a386Sopenharmony_ci self.__is_root = None 52cb93a386Sopenharmony_ci self.shell('reboot') 53cb93a386Sopenharmony_ci self.__has_established_connection = False 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci def __echo_shell_cmd(self, cmd): 56cb93a386Sopenharmony_ci escaped = [re.sub(r'([^a-zA-Z0-9])', r'\\\1', x) 57cb93a386Sopenharmony_ci for x in cmd.strip().splitlines()] 58cb93a386Sopenharmony_ci self.__invoke('shell', 'echo', '$(whoami)@$(getprop ro.serialno)$', 59cb93a386Sopenharmony_ci " '\n>' ".join(escaped)) 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci def __invoke(self, *args): 62cb93a386Sopenharmony_ci self.__establish_connection() 63cb93a386Sopenharmony_ci subprocess.call(self.__invocation + list(args), stdout=sys.stderr) 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci def __establish_connection(self): 66cb93a386Sopenharmony_ci if self.__has_established_connection: 67cb93a386Sopenharmony_ci return 68cb93a386Sopenharmony_ci self.__has_established_connection = True 69cb93a386Sopenharmony_ci self.__invoke('wait-for-device') 70cb93a386Sopenharmony_ci while True: 71cb93a386Sopenharmony_ci time.sleep(1) 72cb93a386Sopenharmony_ci if '1' == self.check('getprop sys.boot_completed').strip(): 73cb93a386Sopenharmony_ci break 74