1f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice#!/usr/bin/env python2 2d8136e44d207a66fedf6682105aca8088881c715asharif# 30d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen# Copyright 2010~2015 Google Inc. All Rights Reserved. 4f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice"""Script to get past the login screen of ChromeOS.""" 5d8136e44d207a66fedf6682105aca8088881c715asharif 60d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shenfrom __future__ import print_function 7d8136e44d207a66fedf6682105aca8088881c715asharif 80d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shenimport argparse 9d8136e44d207a66fedf6682105aca8088881c715asharifimport os 10d8136e44d207a66fedf6682105aca8088881c715asharifimport sys 1154cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharifimport tempfile 120d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen 130d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shenfrom cros_utils import command_executer 14d8136e44d207a66fedf6682105aca8088881c715asharif 15d8136e44d207a66fedf6682105aca8088881c715asharifLOGIN_PROMPT_VISIBLE_MAGIC_FILE = '/tmp/uptime-login-prompt-visible' 16d8136e44d207a66fedf6682105aca8088881c715asharifLOGGED_IN_MAGIC_FILE = '/var/run/state/logged-in' 17d8136e44d207a66fedf6682105aca8088881c715asharif 18f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozanoscript_header = """ 19d8136e44d207a66fedf6682105aca8088881c715asharifimport os 20d8136e44d207a66fedf6682105aca8088881c715asharifimport autox 21d8136e44d207a66fedf6682105aca8088881c715asharifimport time 22d2ced689f8a7c2727c042a30dacb15a38ec42601asharif""" 23d2ced689f8a7c2727c042a30dacb15a38ec42601asharif 24f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozanowait_for_login_screen = """ 25d8136e44d207a66fedf6682105aca8088881c715asharif 26d8136e44d207a66fedf6682105aca8088881c715asharifwhile True: 27d8136e44d207a66fedf6682105aca8088881c715asharif print 'Waiting for login screen to appear...' 28d8136e44d207a66fedf6682105aca8088881c715asharif if os.path.isfile('%s'): 29d8136e44d207a66fedf6682105aca8088881c715asharif break 30d8136e44d207a66fedf6682105aca8088881c715asharif time.sleep(1) 31d8136e44d207a66fedf6682105aca8088881c715asharif print 'Done' 32d8136e44d207a66fedf6682105aca8088881c715asharif 33d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(20) 34d2ced689f8a7c2727c042a30dacb15a38ec42601asharif""" % LOGIN_PROMPT_VISIBLE_MAGIC_FILE 35d2ced689f8a7c2727c042a30dacb15a38ec42601asharif 36f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozanodo_login = """ 37d8136e44d207a66fedf6682105aca8088881c715asharifxauth_filename = '/home/chronos/.Xauthority' 38d8136e44d207a66fedf6682105aca8088881c715asharifos.environ.setdefault('XAUTHORITY', xauth_filename) 39d8136e44d207a66fedf6682105aca8088881c715asharifos.environ.setdefault('DISPLAY', ':0.0') 40d8136e44d207a66fedf6682105aca8088881c715asharif 41d8136e44d207a66fedf6682105aca8088881c715asharifprint 'Now sending the hotkeys for logging in.' 42d8136e44d207a66fedf6682105aca8088881c715asharifax = autox.AutoX() 43d8136e44d207a66fedf6682105aca8088881c715asharif# navigate to login screen 44d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Ctrl+Shift+q') 45d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Ctrl+Alt+l') 46d8136e44d207a66fedf6682105aca8088881c715asharif# escape out of any login screen menus (e.g., the network select menu) 47d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(2) 48d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Escape') 49d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(2) 50d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Tab') 51d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(0.5) 52d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Tab') 53d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(0.5) 54d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Tab') 55d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(0.5) 56d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Tab') 57d8136e44d207a66fedf6682105aca8088881c715ashariftime.sleep(0.5) 58d8136e44d207a66fedf6682105aca8088881c715asharifax.send_hotkey('Return') 59d8136e44d207a66fedf6682105aca8088881c715asharifprint 'Waiting for Chrome to appear...' 60d8136e44d207a66fedf6682105aca8088881c715asharifwhile True: 61d8136e44d207a66fedf6682105aca8088881c715asharif if os.path.isfile('%s'): 62d8136e44d207a66fedf6682105aca8088881c715asharif break 63d8136e44d207a66fedf6682105aca8088881c715asharif time.sleep(1) 64d8136e44d207a66fedf6682105aca8088881c715asharifprint 'Done' 65d2ced689f8a7c2727c042a30dacb15a38ec42601asharif""" % LOGGED_IN_MAGIC_FILE 66d8136e44d207a66fedf6682105aca8088881c715asharif 67f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano 68d2ced689f8a7c2727c042a30dacb15a38ec42601asharifdef RestartUI(remote, chromeos_root, login=True): 69d8136e44d207a66fedf6682105aca8088881c715asharif chromeos_root = os.path.expanduser(chromeos_root) 70d8136e44d207a66fedf6682105aca8088881c715asharif ce = command_executer.GetCommandExecuter() 71d8136e44d207a66fedf6682105aca8088881c715asharif # First, restart ui. 72d2ced689f8a7c2727c042a30dacb15a38ec42601asharif command = 'rm -rf %s && restart ui' % LOGIN_PROMPT_VISIBLE_MAGIC_FILE 73f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano ce.CrosRunCommand(command, machine=remote, chromeos_root=chromeos_root) 7454cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif host_login_script = tempfile.mktemp() 7554cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif device_login_script = '/tmp/login.py' 76d2ced689f8a7c2727c042a30dacb15a38ec42601asharif login_script_list = [script_header, wait_for_login_screen] 77d2ced689f8a7c2727c042a30dacb15a38ec42601asharif if login: 78d2ced689f8a7c2727c042a30dacb15a38ec42601asharif login_script_list.append(do_login) 79d2ced689f8a7c2727c042a30dacb15a38ec42601asharif 80f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano full_login_script_contents = '\n'.join(login_script_list) 81d2ced689f8a7c2727c042a30dacb15a38ec42601asharif 8254cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif with open(host_login_script, 'w') as f: 83d8136e44d207a66fedf6682105aca8088881c715asharif f.write(full_login_script_contents) 84f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice ce.CopyFiles( 85f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice host_login_script, 86f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice device_login_script, 87f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice dest_machine=remote, 88f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice chromeos_root=chromeos_root, 89f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice recursive=False, 90f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice dest_cros=True) 91f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice ret = ce.CrosRunCommand( 92f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice 'python %s' % device_login_script, 93f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice chromeos_root=chromeos_root, 94f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice machine=remote) 9554cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif if os.path.exists(host_login_script): 9654cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif os.remove(host_login_script) 9754cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif return ret 98d8136e44d207a66fedf6682105aca8088881c715asharif 99d8136e44d207a66fedf6682105aca8088881c715asharif 100d8136e44d207a66fedf6682105aca8088881c715asharifdef Main(argv): 101d8136e44d207a66fedf6682105aca8088881c715asharif """The main function.""" 1020d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen parser = argparse.ArgumentParser() 103f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice parser.add_argument( 104f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice '-r', '--remote', dest='remote', help='The remote ChromeOS box.') 105f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice parser.add_argument( 106f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice '-c', '--chromeos_root', dest='chromeos_root', help='The ChromeOS root.') 1070d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen 1080d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen options = parser.parse_args(argv) 109d8136e44d207a66fedf6682105aca8088881c715asharif 11054cf678a9308eef166c2dc0b6e8ff63a369e0ee9asharif return RestartUI(options.remote, options.chromeos_root) 111d8136e44d207a66fedf6682105aca8088881c715asharif 112f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano 113d8136e44d207a66fedf6682105aca8088881c715asharifif __name__ == '__main__': 1140d39863d8578fb1c6e7077b2c7cc5ca79edcf4ddHan Shen retval = Main(sys.argv[1:]) 1155ab1c7d242916355dda570153d1554e4c2963ce8asharif sys.exit(retval) 116