1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5"""Finds CrOS browsers that can be controlled by telemetry.""" 6 7import logging 8 9from telemetry.core import cros_interface 10from telemetry.core import platform as platform_module 11from telemetry.internal.backends.chrome import cros_browser_backend 12from telemetry.internal.backends.chrome import cros_browser_with_oobe 13from telemetry.internal.browser import browser 14from telemetry.internal.browser import browser_finder_exceptions 15from telemetry.internal.browser import possible_browser 16from telemetry.internal.platform import cros_device 17 18 19class PossibleCrOSBrowser(possible_browser.PossibleBrowser): 20 """A launchable CrOS browser instance.""" 21 def __init__(self, browser_type, finder_options, cros_platform, is_guest): 22 super(PossibleCrOSBrowser, self).__init__(browser_type, 'cros', True) 23 assert browser_type in FindAllBrowserTypes(finder_options), ( 24 'Please add %s to cros_browser_finder.FindAllBrowserTypes()' % 25 browser_type) 26 self._platform = cros_platform 27 self._platform_backend = ( 28 cros_platform._platform_backend) # pylint: disable=protected-access 29 self._is_guest = is_guest 30 31 def __repr__(self): 32 return 'PossibleCrOSBrowser(browser_type=%s)' % self.browser_type 33 34 def _InitPlatformIfNeeded(self): 35 pass 36 37 def Create(self, finder_options): 38 if finder_options.browser_options.output_profile_path: 39 raise NotImplementedError( 40 'Profile generation is not yet supported on CrOS.') 41 42 browser_options = finder_options.browser_options 43 browser_backend = cros_browser_backend.CrOSBrowserBackend( 44 self._platform_backend, browser_options, self._platform_backend.cri, 45 self._is_guest) 46 if browser_options.create_browser_with_oobe: 47 return cros_browser_with_oobe.CrOSBrowserWithOOBE( 48 browser_backend, 49 self._platform_backend, 50 self._credentials_path) 51 return browser.Browser( 52 browser_backend, self._platform_backend, self._credentials_path) 53 54 def SupportsOptions(self, browser_options): 55 return (len(browser_options.extensions_to_load) == 0) or not self._is_guest 56 57 def UpdateExecutableIfNeeded(self): 58 pass 59 60def SelectDefaultBrowser(possible_browsers): 61 if cros_device.IsRunningOnCrOS(): 62 for b in possible_browsers: 63 if b.browser_type == 'system': 64 return b 65 return None 66 67def CanFindAvailableBrowsers(finder_options): 68 return (cros_device.IsRunningOnCrOS() or 69 finder_options.cros_remote or 70 cros_interface.HasSSH()) 71 72def FindAllBrowserTypes(_): 73 return [ 74 'cros-chrome', 75 'cros-chrome-guest', 76 'system', 77 'system-guest', 78 ] 79 80def FindAllAvailableBrowsers(finder_options, device): 81 """Finds all available CrOS browsers, locally and remotely.""" 82 browsers = [] 83 if not isinstance(device, cros_device.CrOSDevice): 84 return browsers 85 86 if cros_device.IsRunningOnCrOS(): 87 browsers = [PossibleCrOSBrowser('system', finder_options, 88 platform_module.GetHostPlatform(), 89 is_guest=False), 90 PossibleCrOSBrowser('system-guest', finder_options, 91 platform_module.GetHostPlatform(), 92 is_guest=True)] 93 94 # Check ssh 95 try: 96 platform = platform_module.GetPlatformForDevice(device, finder_options) 97 except cros_interface.LoginException, ex: 98 if isinstance(ex, cros_interface.KeylessLoginRequiredException): 99 logging.warn('Could not ssh into %s. Your device must be configured', 100 finder_options.cros_remote) 101 logging.warn('to allow passwordless login as root.') 102 logging.warn('For a test-build device, pass this to your script:') 103 logging.warn(' --identity $(CHROMITE)/ssh_keys/testing_rsa') 104 logging.warn('') 105 logging.warn('For a developer-mode device, the steps are:') 106 logging.warn(' - Ensure you have an id_rsa.pub (etc) on this computer') 107 logging.warn(' - On the chromebook:') 108 logging.warn(' - Control-Alt-T; shell; sudo -s') 109 logging.warn(' - openssh-server start') 110 logging.warn(' - scp <this machine>:.ssh/id_rsa.pub /tmp/') 111 logging.warn(' - mkdir /root/.ssh') 112 logging.warn(' - chown go-rx /root/.ssh') 113 logging.warn(' - cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys') 114 logging.warn(' - chown 0600 /root/.ssh/authorized_keys') 115 raise browser_finder_exceptions.BrowserFinderException(str(ex)) 116 117 browsers.extend([PossibleCrOSBrowser('cros-chrome', finder_options, 118 platform, is_guest=False), 119 PossibleCrOSBrowser('cros-chrome-guest', 120 finder_options, platform, 121 is_guest=True)]) 122 return browsers 123