blob: 717a0d8105f1bb4cda15abc23f951770786fff1c [file] [log] [blame]
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Create cros_gestures command line interface package for test machines.
Assemble the cros_gestures command line tool and gsutil into a package and/or
deploy it to a remote test machine for use.
"""
__version__ = '0.9.1'
import logging
import optparse
import os
import shutil
import subprocess
import sys
import tempfile
import cros_gestures_utils
color = cros_gestures_utils.Color()
LOG = logging.getLogger('create_install_package')
GESTURE_ARCHIVE = 'cros_gestures.tar.bz2'
def RunCommand(cmd):
"""Common command execution."""
LOG.debug('Running command (%s)', cmd)
rc = subprocess.call(cmd, shell=True)
if rc:
LOG.error('Command (%s) failed!', cmd)
sys.exit(1)
return rc
def CopyFilesToTempDir(argv):
"""Copy all the files in the package to a temp dir."""
gsutil_bin_dir, boto_config = cros_gestures_utils.FindDependencies()
LOG.debug('Using GSUTIL_BIN_DIR=%s and BOTO_CONFIG=%s.', gsutil_bin_dir,
boto_config)
temp_dir = tempfile.mkdtemp()
# Copy cros_gestures
shutil.copytree(os.path.dirname(os.path.abspath(argv[0])),
os.path.join(temp_dir, 'cros_gestures'))
# Copy gsutil
shutil.copytree(os.path.abspath(gsutil_bin_dir),
os.path.join(temp_dir, 'cros_gestures', 'gsutil'))
# Copy .boto if trusted - otherwise untrusted one already present.
if os.environ['BOTO_CONFIG'].find('untrusted') == -1:
shutil.copyfile(os.path.abspath(boto_config),
os.path.join(temp_dir, 'cros_gestures', '.boto'))
return temp_dir
def TarPkg(temp_dir, pkg_path, relative_file_path):
"""Create a .tar.bz2 package of the cros_gestures files."""
cmd = 'tar -j -C "%s" -cf "%s" "%s"' % (temp_dir, pkg_path,
relative_file_path)
rc = RunCommand(cmd)
shutil.rmtree(temp_dir)
return rc
def RemoteCopyAndInstall(remote_machine, package_path):
"""Copy package and install script then run install script."""
warning_msg = ('Accessing test machine (%s), you may be prompted for a '
'test machine password.' % remote_machine)
print color.Color(cros_gestures_utils.Color.YELLOW, warning_msg)
RunCommand('scp -q "%s" root@%s:/tmp' % (package_path, remote_machine))
install_script = 'install_cros_gestures.py'
print color.Color(cros_gestures_utils.Color.YELLOW, warning_msg)
RunCommand('scp -q "%s" root@%s:/tmp' % (os.path.join(
os.path.dirname(package_path), 'remote', install_script), remote_machine))
print color.Color(cros_gestures_utils.Color.YELLOW, warning_msg)
RunCommand('ssh root@%s "/tmp/%s -s /tmp"' % (remote_machine, install_script))
def ParseArgs(argv):
"""Process command line options."""
base_dir = os.path.dirname(os.path.abspath(argv[0]))
usage_string = (
'run_remote_tool\n\n'
'Creates and/or deploys a package of cros_gestures suitable for '
'test machine usage.')
parser = optparse.OptionParser(usage=usage_string)
parser.add_option('-d', '--debug',
help='Show output [default: %default]',
dest='debugout',
action='store_true',
default=False)
parser.add_option('-p', '--package-file',
help='cros_gestures packagea file [default: %default]',
dest='packagefile',
default=os.path.join(base_dir, GESTURE_ARCHIVE))
parser.add_option('', '--remote',
help='Deploy to remote machine [default: %default]',
dest='remoteip',
default=None)
options, args = parser.parse_args()
# Setup logging.
if options.debugout:
logging_level = logging.DEBUG
else:
logging_level = logging.INFO
logging.basicConfig(level=logging_level)
# Simple parameter checking.
if len(args) > 0:
output_and_exit('No arguments are expected to be passed.\n\n%s' %
usage_string)
return options, base_dir
def main(argv):
"""Create dir and then package in it."""
options, base_dir = ParseArgs(argv)
if not os.path.isfile(options.packagefile):
output_dir = CopyFilesToTempDir(argv)
TarPkg(output_dir, options.packagefile, 'cros_gestures')
print '%s created.' % options.packagefile
if options.remoteip:
RemoteCopyAndInstall(options.remoteip, options.packagefile)
print 'Deployed to %s.' % options.remoteip
if __name__ == '__main__':
main(sys.argv)