Index: chrome/test/pyautolib/chromoting_helper.py |
=================================================================== |
--- chrome/test/pyautolib/chromoting_helper.py (revision 261231) |
+++ chrome/test/pyautolib/chromoting_helper.py (working copy) |
@@ -1,200 +0,0 @@ |
-# 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 |
- |
- @abc.abstractmethod |
- def UninstallHost(self, bin_dir): |
- """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() |
- pyautolib_dir = os.path.dirname(os.path.abspath(__file__)) |
- 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 |
- 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(pyautolib_dir, 'chromoting_key.p12') |
- cert = os.path.join(pyautolib_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.pkg') |
- 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 detach "' + mounted + '"', shell=True) |
- |
- # Clean up remoting-me2me-host-mac dir |
- 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', |
- 'Contents', 'MacOS', |
- 'remoting_host_uninstaller') |
- subprocess.call([uninstall_app, '--no-ui']) |
- |
- 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, |
- 'ChromeRemoteDesktop.prefPane') |
- mock_pref_pane_python = os.path.join( |
- os.path.dirname(os.path.abspath(__file__)), |
- 'mock_pref_pane.py') |
- |
- # When the symlink from real pref pane to mock pref pane exists, |
- # mock pref pane will be modified to be a dir when the host is installed. |
- # After the host is installed and mock pref pane is modified to be a file, |
- # it will be a file until next host installation. |
- if os.path.isdir(mock_pref_pane): |
- shutil.rmtree(mock_pref_pane, True) |
- elif os.path.isfile(mock_pref_pane): |
- os.remove(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]) |
- |
- # The real pref pane is a dir if the host is installed on a clean machine. |
- # Once the test is run on the machine, real pref pane will be replaced to |
- # a symlink. |
- if os.path.isdir(pref_pane): |
- shutil.rmtree(pref_pane, True) |
- elif os.path.isfile(pref_pane): |
- os.remove(pref_pane) |
- |
- subprocess.call(['ln', '-s', mock_pref_pane, pref_pane]) |
- |
- |
-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, 'chromoting.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, 'chromoting.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() |