Chromium Code Reviews| Index: chrome/test/pyautolib/chromoting_helper.py |
| =================================================================== |
| --- chrome/test/pyautolib/chromoting_helper.py (revision 0) |
| +++ chrome/test/pyautolib/chromoting_helper.py (revision 0) |
| @@ -0,0 +1,163 @@ |
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +"""Chromoting helper script to install/uninstall/enable/disable host.""" |
| + |
| +import os |
| +import sys |
| +import subprocess |
| + |
| + |
| +class ChromotingHelper(object): |
|
Nirnimesh
2012/08/08 19:46:10
Create a base class with abstract methods: Install
yihongg
2012/08/10 20:42:52
Done.
|
| + """Chromting Helper class.""" |
|
Nirnimesh
2012/08/08 19:46:10
Chromoting
Nirnimesh
2012/08/08 19:46:10
Mention the purpose too
yihongg
2012/08/10 20:42:52
Done.
yihongg
2012/08/10 20:42:52
Done.
yihongg
2012/08/10 20:42:52
Done.
|
| + |
| + def InstallHostMac(self, bin_dir): |
| + """Installs host on Mac.""" |
| + assert os.geteuid() == 0, 'Need superuser privileges' |
| + |
| + # Run most of the steps here with login user |
| + login_uid = os.getuid() |
| + os.seteuid(login_uid) |
| + |
| + # Change the working dir to the dir that has the host zip file |
| + current_dir = os.getcwd() |
| + os.chdir(bin_dir) |
|
Nirnimesh
2012/08/08 19:46:10
Why is this necessary?
yihongg
2012/08/10 20:42:52
Some of the steps (do_signing) below only works if
|
| + host_dir = 'remoting-me2me-host-mac' |
| + output_dir = os.path.join(host_dir, 'output') |
| + |
| + # Remove remoting-me2me-host-mac dir just in case |
| + subprocess.call('rm -f -R ' + host_dir, shell=True) |
|
Nirnimesh
2012/08/08 19:46:10
use shutil.rmtree
yihongg
2012/08/10 20:42:52
Done.
|
| + |
| + # Unzip the host archive and prepare the files/dirs |
| + subprocess.call('unzip remoting-me2me-host-mac.zip', shell=True) |
|
Nirnimesh
2012/08/08 19:46:10
make the first arg a list.
Remove shell=True
Repe
yihongg
2012/08/10 20:42:52
Tried that and didn't work.
|
| + subprocess.call('mkdir ' + output_dir, shell=True) |
| + |
| + # Prepare security identity for code signing purpose |
| + os.seteuid(0) |
| + key_chain = '/Library/Keychains/ChromotingTest' |
| + password = '1111' |
| + chromoting_test_dir = os.path.join(current_dir, 'chrome', 'test', |
| + 'functional', 'chromoting') |
|
Nirnimesh
2012/08/08 19:46:10
Do not reach into the functional dir. If you need
yihongg
2012/08/10 20:42:52
Done.
|
| + key = os.path.join(chromoting_test_dir, 'chromoting_key.p12') |
| + cert = os.path.join(chromoting_test_dir, 'chromoting_cert.p12') |
| + subprocess.call(['security', 'delete-keychain', key_chain]) |
| + subprocess.call(['security', 'create-keychain', '-p', |
| + password, key_chain]) |
| + subprocess.call(['security', 'import', key, |
| + '-k', key_chain, '-P', password, '-A']) |
| + subprocess.call(['security', 'import', cert, |
| + '-k', key_chain, '-P', password]) |
| + os.seteuid(login_uid) |
| + |
| + # Sign the host |
| + do_signing = os.path.join(host_dir, 'do_signing.sh') |
| + subprocess.call(do_signing + ' ' + output_dir + ' ' + host_dir + ' ' + |
| + key_chain + ' "Chromoting Test"', shell=True) |
| + |
| + # Remove security identify |
| + os.seteuid(0) |
| + subprocess.call(['security', 'delete-keychain', key_chain]) |
| + os.seteuid(login_uid) |
| + |
| + # Figure out the dmg name |
| + version = "" |
| + for output_file in os.listdir(output_dir): |
| + if output_file.endswith('.dmg'): |
| + version = os.path.basename(output_file)[len('ChromotingHost-'):-4] |
| + |
| + # Mount before installation |
| + dmg = os.path.join(output_dir, 'ChromotingHost-' + version + '.dmg') |
| + subprocess.call('hdiutil' + ' mount ' + dmg, shell=True) |
| + |
| + # Install host |
| + os.seteuid(0) |
| + mpkg = os.path.join('/Volumes', 'Chromoting Host ' + version, |
| + 'Chromoting Host.mpkg') |
| + subprocess.call(['/usr/sbin/installer', '-pkg', |
| + mpkg, '-target', '/']) |
| + os.seteuid(login_uid) |
| + |
| + # Unmount after installation |
| + mounted = os.path.join('/Volumes', 'Chromoting Host ' + version) |
| + subprocess.call('hdiutil unmount "' + mounted + '"', shell=True) |
| + |
| + # Clean up remoting-me2me-host-mac dir |
| + subprocess.call('rm -f -R ' + host_dir, shell=True) |
| + |
| + # Resume the original working dir |
| + os.chdir(current_dir) |
| + |
| + def UninstallHostMac(self): |
| + """Uninstalls host on Mac.""" |
| + assert os.geteuid() == 0, 'Need superuser privileges' |
| + uninstall_app = os.path.join('/', 'Applications', |
| + 'Chromoting Host Uninstaller.app') |
| + subprocess.call(['open', '-a', uninstall_app]) |
| + |
| + def ReplacePrefPaneMac(self, operation): |
| + """Constructs mock pref pane to replace the actual pref pane on Mac.""" |
| + assert os.geteuid() == 0, 'Need superuser privileges' |
| + |
| + pref_pane_dir = os.path.join('/Library', 'PreferencePanes') |
| + |
| + mock_pref_pane = os.path.join(pref_pane_dir, 'mock_pref_pane') |
| + pref_pane = os.path.join(pref_pane_dir, 'org.chromium.chromoting.prefPane') |
| + mock_pref_pane_python = os.path.join(os.getcwd(), 'chrome', 'test', |
| + 'functional', 'chromoting', |
| + 'mock_pref_pane.py') |
| + |
| + subprocess.call(['rm', '-rf', mock_pref_pane]) |
| + |
| + mock_pref_pane_file = open(mock_pref_pane, 'w') |
| + mock_pref_pane_file.write('#!/bin/bash\n') |
| + mock_pref_pane_file.write('\n') |
| + mock_pref_pane_file.write('suid-python' + |
| + ' ' + mock_pref_pane_python + ' ' + operation) |
| + mock_pref_pane_file.close() |
| + |
| + subprocess.call(['chmod', 'a+x', mock_pref_pane]) |
| + subprocess.call(['rm', '-rf', pref_pane]) |
| + subprocess.call(['ln', '-s', mock_pref_pane, pref_pane]) |
| + |
| + def InstallHostWindows(self, bin_dir): |
| + """Installs host on Windows.""" |
| + host_msi = os.path.join(bin_dir, 'remoting-host.msi') |
| + subprocess.Popen(['msiexec', '/i', host_msi, '/passive']).wait() |
| + |
| + def UninstallHostWindows(self, bin_dir): |
| + """Uninstalls host on Windows.""" |
| + host_msi = os.path.join(bin_dir, 'remoting-host.msi') |
| + subprocess.Popen(['msiexec', '/x', host_msi, '/passive']).wait() |
| + |
| + |
| +def Main(): |
| + """Main function to dispatch operations.""" |
|
Nirnimesh
2012/08/08 19:46:10
assert IsMac() or IsWin()
yihongg
2012/08/10 20:42:52
Done.
|
| + helper = ChromotingHelper() |
| + |
| + if sys.argv[1] == 'install': |
| + if sys.platform.startswith('win'): |
| + helper.InstallHostWindows(sys.argv[2]) |
| + elif sys.platform.startswith('darwin'): |
| + helper.InstallHostMac(sys.argv[2]) |
| + else: |
| + print 'Nothing to be done for install' |
| + elif sys.argv[1] == 'uninstall': |
| + if sys.platform.startswith('win'): |
| + helper.UninstallHostWindows(sys.argv[2]) |
| + elif sys.platform.startswith('darwin'): |
| + helper.UninstallHostmac() |
| + else: |
| + print 'Nothing to be done for uninstall' |
| + elif sys.argv[1] in ['enable', 'disable', 'changepin']: |
| + if sys.platform.startswith('darwin'): |
| + helper.ReplacePrefPaneMac(sys.argv[1]) |
| + else: |
| + print 'Nothing to be done for enable' |
|
Nirnimesh
2012/08/08 19:46:10
enable -> sys.argv[1]
yihongg
2012/08/10 20:42:52
Done.
|
| + else: |
| + print >>sys.stderr, 'Invalid syntax' |
| + return 1 |
| + |
| + |
| +if __name__ == '__main__': |
| + sys.exit(Main()) |