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,186 @@ |
+#!/usr/bin/env python |
+# 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 to install/uninstall host and replace pref pane.""" |
+ |
+import abc |
+import os |
+import shutil |
+import sys |
+import subprocess |
+ |
+ |
+class ChromotingHelper(object): |
+ """Chromoting helper base class.""" |
+ __metaclass__ = abc.ABCMeta |
+ |
+ @abc.abstractmethod |
+ def InstallHost(self, bin_dir): |
+ """Installs the chromoting host""" |
+ return |
+ |
+ def UninstallHost(self, bin_dir): |
Nirnimesh
2012/08/14 22:09:30
this method isn't abstract?
yihongg
2012/08/15 17:48:38
Done.
|
+ """Uninstalls the chromoting host""" |
+ return |
+ |
+ |
+class ChromotingHelperMac(ChromotingHelper): |
+ """Chromoting Helper class for Mac. |
+ |
+ Installs/uninstalls host and replace the pref pane for testing purpose. |
+ """ |
+ |
+ def InstallHost(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) |
+ 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) |
+ shutil.rmtree(host_dir, True) |
+ |
+ # Unzip the host archive and prepare the files/dirs |
+ subprocess.call('unzip remoting-me2me-host-mac.zip', shell=True) |
+ subprocess.call('mkdir ' + output_dir, shell=True) |
+ |
+ # Prepare security identity for code signing purpose |
+ os.seteuid(0) |
+ key_chain = '/Library/Keychains/ChromotingTest' |
+ password = '1111' |
+ key = os.path.join(current_dir, 'chrome', 'test', |
+ 'pyautolib', 'chromoting_key.p12') |
+ cert = os.path.join(current_dir, 'chrome', 'test', |
+ 'pyautolib', '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) |
Nirnimesh
2012/08/14 22:09:30
remove commented out code
yihongg
2012/08/15 17:48:38
Done.
|
+ shutil.rmtree(host_dir, True) |
+ |
+ # Resume the original working dir |
+ os.chdir(current_dir) |
+ |
+ def UninstallHost(self, bin_dir): |
+ """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]) |
+ shutil.rmtree(mock_pref_pane, True) |
+ |
+ 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]) |
+ shutil.rmtree(pref_pane, True) |
+ subprocess.call(['ln', '-s', mock_pref_pane, pref_pane]) |
+ |
Nirnimesh
2012/08/14 22:09:30
need another blank line
yihongg
2012/08/15 17:48:38
Done.
|
+class ChromotingHelperWindows(ChromotingHelper): |
+ """Chromoting Helper class for Windows for installing/uninstalling host.""" |
+ |
+ def InstallHost(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 UninstallHost(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.""" |
+ assert sys.platform.startswith('win') or \ |
+ sys.platform.startswith('darwin'), \ |
+ 'Only support Windows and Mac' |
+ |
+ if sys.platform.startswith('win'): |
+ helper = ChromotingHelperWindows() |
+ elif sys.platform.startswith('darwin'): |
+ helper = ChromotingHelperMac() |
+ |
+ if sys.argv[1] == 'install': |
+ helper.InstallHost(sys.argv[2]) |
+ elif sys.argv[1] == 'uninstall': |
+ helper.UninstallHost(sys.argv[2]) |
+ elif sys.argv[1] in ['enable', 'disable', 'changepin']: |
+ assert sys.platform.startswith('darwin'), \ |
+ 'Replacing pref pane is Mac specific' |
+ helper.ReplacePrefPaneMac(sys.argv[1]) |
+ else: |
+ print >>sys.stderr, 'Invalid syntax' |
+ return 1 |
+ |
+ |
+if __name__ == '__main__': |
+ Main() |