#!/usr/bin/env python2 # # Copyright 2010~2015 Google Inc. All Rights Reserved. """Script to get past the login screen of ChromeOS.""" from __future__ import print_function import argparse import os import sys import tempfile from cros_utils import command_executer LOGIN_PROMPT_VISIBLE_MAGIC_FILE = '/tmp/uptime-login-prompt-visible' LOGGED_IN_MAGIC_FILE = '/var/run/state/logged-in' script_header = """ import os import autox import time """ wait_for_login_screen = """ while True: print 'Waiting for login screen to appear...' if os.path.isfile('%s'): break time.sleep(1) print 'Done' time.sleep(20) """ % LOGIN_PROMPT_VISIBLE_MAGIC_FILE do_login = """ xauth_filename = '/home/chronos/.Xauthority' os.environ.setdefault('XAUTHORITY', xauth_filename) os.environ.setdefault('DISPLAY', ':0.0') print 'Now sending the hotkeys for logging in.' ax = autox.AutoX() # navigate to login screen ax.send_hotkey('Ctrl+Shift+q') ax.send_hotkey('Ctrl+Alt+l') # escape out of any login screen menus (e.g., the network select menu) time.sleep(2) ax.send_hotkey('Escape') time.sleep(2) ax.send_hotkey('Tab') time.sleep(0.5) ax.send_hotkey('Tab') time.sleep(0.5) ax.send_hotkey('Tab') time.sleep(0.5) ax.send_hotkey('Tab') time.sleep(0.5) ax.send_hotkey('Return') print 'Waiting for Chrome to appear...' while True: if os.path.isfile('%s'): break time.sleep(1) print 'Done' """ % LOGGED_IN_MAGIC_FILE def RestartUI(remote, chromeos_root, login=True): chromeos_root = os.path.expanduser(chromeos_root) ce = command_executer.GetCommandExecuter() # First, restart ui. command = 'rm -rf %s && restart ui' % LOGIN_PROMPT_VISIBLE_MAGIC_FILE ce.CrosRunCommand(command, machine=remote, chromeos_root=chromeos_root) host_login_script = tempfile.mktemp() device_login_script = '/tmp/login.py' login_script_list = [script_header, wait_for_login_screen] if login: login_script_list.append(do_login) full_login_script_contents = '\n'.join(login_script_list) with open(host_login_script, 'w') as f: f.write(full_login_script_contents) ce.CopyFiles( host_login_script, device_login_script, dest_machine=remote, chromeos_root=chromeos_root, recursive=False, dest_cros=True) ret = ce.CrosRunCommand( 'python %s' % device_login_script, chromeos_root=chromeos_root, machine=remote) if os.path.exists(host_login_script): os.remove(host_login_script) return ret def Main(argv): """The main function.""" parser = argparse.ArgumentParser() parser.add_argument( '-r', '--remote', dest='remote', help='The remote ChromeOS box.') parser.add_argument( '-c', '--chromeos_root', dest='chromeos_root', help='The ChromeOS root.') options = parser.parse_args(argv) return RestartUI(options.remote, options.chromeos_root) if __name__ == '__main__': retval = Main(sys.argv[1:]) sys.exit(retval)