| #!/usr/bin/python |
| # |
| # Copyright 2010 Google Inc. All Rights Reserved. |
| |
| """Script to get past the login screen of ChromeOS. |
| |
| """ |
| |
| __author__ = "asharif@google.com (Ahmad Sharif)" |
| |
| import datetime |
| import fcntl |
| import getpass |
| import glob |
| import optparse |
| import os |
| import pickle |
| import socket |
| import sys |
| import time |
| import tempfile |
| from utils import logger |
| from 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 = optparse.OptionParser() |
| parser.add_option('-r', |
| '--remote', |
| dest='remote', |
| help='The remote ChromeOS box.') |
| parser.add_option('-c', |
| '--chromeos_root', |
| dest='chromeos_root', |
| help='The ChromeOS root.') |
| |
| options, args = parser.parse_args(argv) |
| |
| return RestartUI(options.remote, options.chromeos_root) |
| |
| if __name__ == '__main__': |
| retval = Main(sys.argv) |
| sys.exit(retval) |