17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport logging 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport os 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport subprocess 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport tempfile 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport zipfile 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.subcommand import SubCommand 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfrom lib.symbol import SymbolDataSources 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLOGGER = logging.getLogger('dmprof') 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass UploadCommand(SubCommand): 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def __init__(self): 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch super(UploadCommand, self).__init__( 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 'Usage: %prog upload [--gsutil path/to/gsutil] ' 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch '<first-dump> <destination-gs-path>') 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self._parser.add_option('--gsutil', default='gsutil', 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch help='path to GSUTIL', metavar='GSUTIL') 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def do(self, sys_argv): 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch options, args = self._parse_args(sys_argv, 2) 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dump_path = args[1] 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gs_path = args[2] 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dump_files = SubCommand._find_all_dumps(dump_path) 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bucket_files = SubCommand._find_all_buckets(dump_path) 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch prefix = SubCommand._find_prefix(dump_path) 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch symbol_data_sources = SymbolDataSources(prefix) 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch symbol_data_sources.prepare() 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch symbol_path = symbol_data_sources.path() 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handle_zip, filename_zip = tempfile.mkstemp('.zip', 'dmprof') 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch os.close(handle_zip) 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch try: 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_zip = zipfile.ZipFile(filename_zip, 'w', zipfile.ZIP_DEFLATED) 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for filename in dump_files: 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_zip.write(filename, os.path.basename(os.path.abspath(filename))) 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for filename in bucket_files: 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_zip.write(filename, os.path.basename(os.path.abspath(filename))) 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch symbol_basename = os.path.basename(os.path.abspath(symbol_path)) 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for filename in os.listdir(symbol_path): 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if not filename.startswith('.'): 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_zip.write(os.path.join(symbol_path, filename), 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch os.path.join(symbol_basename, os.path.basename( 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch os.path.abspath(filename)))) 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch file_zip.close() 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch returncode = UploadCommand._run_gsutil( 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch options.gsutil, 'cp', '-a', 'public-read', filename_zip, gs_path) 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch finally: 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch os.remove(filename_zip) 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return returncode 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch @staticmethod 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def _run_gsutil(gsutil, *args): 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch """Run gsutil as a subprocess. 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Args: 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *args: Arguments to pass to gsutil. The first argument should be an 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch operation such as ls, cp or cat. 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Returns: 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch The return code from the process. 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch """ 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch command = [gsutil] + list(args) 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LOGGER.info("Running: %s", command) 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch try: 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return subprocess.call(command) 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch except OSError, e: 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LOGGER.error('Error to run gsutil: %s', e) 80