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