def FindBrowser(options): """Finds the best PossibleBrowser object given a BrowserOptions object. Args: A BrowserFinderOptions object. Returns: A PossibleBrowser object. None if browser does not exist in DUT. Raises: BrowserFinderException: Options improperly set, or an error occurred. """ if options.__class__.__name__ == '_FakeBrowserFinderOptions': return options.fake_possible_browser if options.browser_type == 'exact' and options.browser_executable is None: raise browser_finder_exceptions.BrowserFinderException( '--browser=exact requires --browser-executable to be set.') if options.browser_type != 'exact' and options.browser_executable != None: raise browser_finder_exceptions.BrowserFinderException( '--browser-executable requires --browser=exact.') if (not _IsCrosBrowser(options) and options.cros_remote != None): raise browser_finder_exceptions.BrowserFinderException( '--remote requires --browser=[la]cros-chrome[-guest].') devices = device_finder.GetDevicesMatchingOptions(options) browsers = [] default_browsers = [] browser_finders = _GetBrowserFinders(options.target_platforms) for device in devices: for finder in browser_finders: if (options.browser_type and options.browser_type != 'any' and options.browser_type not in finder.FindAllBrowserTypes()): continue curr_browsers = finder.FindAllAvailableBrowsers(options, device) new_default_browser = finder.SelectDefaultBrowser(curr_browsers) if new_default_browser: default_browsers.append(new_default_browser) browsers.extend(curr_browsers) if not browsers: return None if options.browser_type is None: if default_browsers: default_browser = max(default_browsers, key=lambda b: b.last_modification_time) logging.warning( '--browser omitted. Using most recent local build: %s', default_browser.browser_type) default_browser.UpdateExecutableIfNeeded() return default_browser if len(browsers) == 1: logging.warning( '--browser omitted. Using only available browser: %s', browsers[0].browser_type) browsers[0].UpdateExecutableIfNeeded() return browsers[0] raise browser_finder_exceptions.BrowserTypeRequiredException( '--browser must be specified. Available browsers:\n%s' % '\n'.join(sorted(set([b.browser_type for b in browsers])))) chosen_browser = None if options.browser_type == 'any': types = FindAllBrowserTypes(browser_finders) chosen_browser = min(browsers, key=lambda b: types.index(b.browser_type)) else: matching_browsers = [ b for b in browsers if b.browser_type == options.browser_type and b.SupportsOptions(options.browser_options) ] if not matching_browsers: logging.warning('Cannot find any matched browser') return None if len(matching_browsers) > 1: logging.warning('Multiple browsers of the same type found: %r', matching_browsers) chosen_browser = max(matching_browsers, key=lambda b: b.last_modification_time) if chosen_browser: logging.info('Chose browser: %r', chosen_browser) chosen_browser.UpdateExecutableIfNeeded() return chosen_browser
def FindBrowser(options): """Finds the best PossibleBrowser object given a BrowserOptions object. Args: A BrowserOptions object. Returns: A PossibleBrowser object. Raises: BrowserFinderException: Options improperly set, or an error occurred. """ if options.__class__.__name__ == '_FakeBrowserFinderOptions': return options.fake_possible_browser if options.browser_type == 'exact' and options.browser_executable == None: raise browser_finder_exceptions.BrowserFinderException( '--browser=exact requires --browser-executable to be set.') if options.browser_type != 'exact' and options.browser_executable != None: raise browser_finder_exceptions.BrowserFinderException( '--browser-executable requires --browser=exact.') if options.browser_type == 'cros-chrome' and options.cros_remote == None: raise browser_finder_exceptions.BrowserFinderException( 'browser_type=cros-chrome requires cros_remote be set.') if (options.browser_type != 'cros-chrome' and options.browser_type != 'cros-chrome-guest' and options.cros_remote != None): raise browser_finder_exceptions.BrowserFinderException( '--remote requires --browser=cros-chrome or cros-chrome-guest.') devices = device_finder.GetDevicesMatchingOptions(options) browsers = [] default_browsers = [] for device in devices: for finder in BROWSER_FINDERS: if (options.browser_type and options.browser_type != 'any' and options.browser_type not in finder.FindAllBrowserTypes(options)): continue curr_browsers = finder.FindAllAvailableBrowsers(options, device) new_default_browser = finder.SelectDefaultBrowser(curr_browsers) if new_default_browser: default_browsers.append(new_default_browser) browsers.extend(curr_browsers) if options.browser_type == None: if default_browsers: default_browser = sorted( default_browsers, key=lambda b: b.last_modification_time)[-1] logging.warning( '--browser omitted. Using most recent local build: %s', default_browser.browser_type) default_browser.UpdateExecutableIfNeeded() return default_browser if len(browsers) == 1: logging.warning( '--browser omitted. Using only available browser: %s', browsers[0].browser_type) browsers[0].UpdateExecutableIfNeeded() return browsers[0] raise browser_finder_exceptions.BrowserTypeRequiredException( '--browser must be specified. Available browsers:\n%s' % '\n'.join(sorted(set([b.browser_type for b in browsers])))) if options.browser_type == 'any': types = FindAllBrowserTypes(options) def CompareBrowsersOnTypePriority(x, y): x_idx = types.index(x.browser_type) y_idx = types.index(y.browser_type) return x_idx - y_idx browsers.sort(CompareBrowsersOnTypePriority) if len(browsers) >= 1: browsers[0].UpdateExecutableIfNeeded() return browsers[0] else: return None matching_browsers = [ b for b in browsers if b.browser_type == options.browser_type and b.SupportsOptions(options.browser_options) ] chosen_browser = None if len(matching_browsers) == 1: chosen_browser = matching_browsers[0] elif len(matching_browsers) > 1: logging.warning('Multiple browsers of the same type found: %s', repr(matching_browsers)) chosen_browser = sorted(matching_browsers, key=lambda b: b.last_modification_time)[-1] if chosen_browser: logging.info('Chose browser: %s', repr(chosen_browser)) chosen_browser.UpdateExecutableIfNeeded() return chosen_browser
# Check ssh try: platform = platform_module.GetPlatformForDevice(presentation.device, finder_options) except cros_interface.LoginException, ex: if isinstance(ex, cros_interface.KeylessLoginRequiredException): logging.warn('Could not ssh into %s. Your presentation.device must be configured', finder_options.cros_remote) logging.warn('to allow passwordless login as root.') logging.warn('For a test-build presentation.device, pass this to your script:') logging.warn(' --identity $(CHROMITE)/ssh_keys/testing_rsa') logging.warn('') logging.warn('For a developer-mode presentation.device, the steps are:') logging.warn(' - Ensure you have an id_rsa.pub (etc) on this computer') logging.warn(' - On the chromebook:') logging.warn(' - Control-Alt-T; shell; sudo -s') logging.warn(' - openssh-server start') logging.warn(' - scp <this machine>:.ssh/id_rsa.pub /tmp/') logging.warn(' - mkdir /root/.ssh') logging.warn(' - chown go-rx /root/.ssh') logging.warn(' - cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys') logging.warn(' - chown 0600 /root/.ssh/authorized_keys') raise browser_finder_exceptions.BrowserFinderException(str(ex)) browsers.extend([PossibleCrOSBrowser('cros-chrome', finder_options, platform, is_guest=False), PossibleCrOSBrowser('cros-chrome-guest', finder_options, platform, is_guest=True)]) return browsers