Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: download_from_google_storage.py

Issue 86123002: Adds SSO auth to gsutil (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Bug fix or -> and Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/download_from_google_storage_unittests.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Download files from Google Storage based on SHA1 sums.""" 6 """Download files from Google Storage based on SHA1 sums."""
7 7
8 8
9 import hashlib 9 import hashlib
10 import optparse 10 import optparse
(...skipping 18 matching lines...) Expand all
29 29
30 30
31 class InvalidFileError(IOError): 31 class InvalidFileError(IOError):
32 pass 32 pass
33 33
34 34
35 # Common utilities 35 # Common utilities
36 class Gsutil(object): 36 class Gsutil(object):
37 """Call gsutil with some predefined settings. This is a convenience object, 37 """Call gsutil with some predefined settings. This is a convenience object,
38 and is also immutable.""" 38 and is also immutable."""
39 def __init__(self, path, boto_path, timeout=None): 39 def __init__(self, path, boto_path, timeout=None, bypass_prodaccess=False):
40 if not os.path.exists(path): 40 if not os.path.exists(path):
41 raise FileNotFoundError('GSUtil not found in %s' % path) 41 raise FileNotFoundError('GSUtil not found in %s' % path)
42 self.path = path 42 self.path = path
43 self.timeout = timeout 43 self.timeout = timeout
44 self.boto_path = boto_path 44 self.boto_path = boto_path
45 self.bypass_prodaccess = bypass_prodaccess
45 46
46 def get_sub_env(self): 47 def get_sub_env(self):
47 env = os.environ.copy() 48 env = os.environ.copy()
48 if self.boto_path == os.devnull: 49 if self.boto_path == os.devnull:
49 env['AWS_CREDENTIAL_FILE'] = '' 50 env['AWS_CREDENTIAL_FILE'] = ''
50 env['BOTO_CONFIG'] = '' 51 env['BOTO_CONFIG'] = ''
51 elif self.boto_path: 52 elif self.boto_path:
52 env['AWS_CREDENTIAL_FILE'] = self.boto_path 53 env['AWS_CREDENTIAL_FILE'] = self.boto_path
53 env['BOTO_CONFIG'] = self.boto_path 54 env['BOTO_CONFIG'] = self.boto_path
54 else: 55 else:
55 custompath = env.get('AWS_CREDENTIAL_FILE', '~/.boto') + '.depot_tools' 56 custompath = env.get('AWS_CREDENTIAL_FILE', '~/.boto') + '.depot_tools'
56 custompath = os.path.expanduser(custompath) 57 custompath = os.path.expanduser(custompath)
57 if os.path.exists(custompath): 58 if os.path.exists(custompath):
58 env['AWS_CREDENTIAL_FILE'] = custompath 59 env['AWS_CREDENTIAL_FILE'] = custompath
59 60
60 return env 61 return env
61 62
62 def call(self, *args): 63 def call(self, *args):
63 return subprocess2.call((sys.executable, self.path) + args, 64 cmd = [sys.executable, self.path]
64 env=self.get_sub_env(), 65 if self.bypass_prodaccess:
65 timeout=self.timeout) 66 cmd.append('--bypass_prodaccess')
67 cmd.extend(args)
68 return subprocess2.call(cmd, env=self.get_sub_env(), timeout=self.timeout)
66 69
67 def check_call(self, *args): 70 def check_call(self, *args):
71 cmd = [sys.executable, self.path]
72 if self.bypass_prodaccess:
73 cmd.append('--bypass_prodaccess')
74 cmd.extend(args)
68 ((out, err), code) = subprocess2.communicate( 75 ((out, err), code) = subprocess2.communicate(
69 (sys.executable, self.path) + args, 76 cmd,
70 stdout=subprocess2.PIPE, 77 stdout=subprocess2.PIPE,
71 stderr=subprocess2.PIPE, 78 stderr=subprocess2.PIPE,
72 env=self.get_sub_env(), 79 env=self.get_sub_env(),
73 timeout=self.timeout) 80 timeout=self.timeout)
74 81
75 # Parse output. 82 # Parse output.
76 status_code_match = re.search('status=([0-9]+)', err) 83 status_code_match = re.search('status=([0-9]+)', err)
77 if status_code_match: 84 if status_code_match:
78 return (int(status_code_match.group(1)), out, err) 85 return (int(status_code_match.group(1)), out, err)
79 if ('You are attempting to access protected data with ' 86 if ('You are attempting to access protected data with '
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 if not re.match(options.platform, sys.platform): 327 if not re.match(options.platform, sys.platform):
321 if options.verbose: 328 if options.verbose:
322 print('The current platform doesn\'t match "%s", skipping.' % 329 print('The current platform doesn\'t match "%s", skipping.' %
323 options.platform) 330 options.platform)
324 return 0 331 return 0
325 332
326 # Set the boto file to /dev/null if we don't need auth. 333 # Set the boto file to /dev/null if we don't need auth.
327 if options.no_auth: 334 if options.no_auth:
328 options.boto = os.devnull 335 options.boto = os.devnull
329 336
330 # Make sure we can find a working instance of gsutil. 337 # Make sure gsutil exists where we expect it to.
331 if os.path.exists(GSUTIL_DEFAULT_PATH): 338 if os.path.exists(GSUTIL_DEFAULT_PATH):
332 gsutil = Gsutil(GSUTIL_DEFAULT_PATH, boto_path=options.boto) 339 gsutil = Gsutil(GSUTIL_DEFAULT_PATH,
340 boto_path=options.boto,
341 bypass_prodaccess=options.no_auth)
333 else: 342 else:
334 gsutil = None 343 parser.error('gsutil not found in %s, bad depot_tools checkout?' %
335 for path in os.environ["PATH"].split(os.pathsep): 344 GSUTIL_DEFAULT_PATH)
336 if os.path.exists(path) and 'gsutil' in os.listdir(path):
337 gsutil = Gsutil(os.path.join(path, 'gsutil'), boto_path=options.boto)
338 if not gsutil:
339 parser.error('gsutil not found in %s, bad depot_tools checkout?' %
340 GSUTIL_DEFAULT_PATH)
341 345
342 # Passing in -g/--config will run our copy of GSUtil, then quit. 346 # Passing in -g/--config will run our copy of GSUtil, then quit.
343 if options.config: 347 if options.config:
344 return gsutil.call('config') 348 return gsutil.call('config')
345 349
346 if not args: 350 if not args:
347 parser.error('Missing target.') 351 parser.error('Missing target.')
348 if len(args) > 1: 352 if len(args) > 1:
349 parser.error('Too many targets.') 353 parser.error('Too many targets.')
350 if not options.bucket: 354 if not options.bucket:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 return code 390 return code
387 391
388 return download_from_google_storage( 392 return download_from_google_storage(
389 input_filename, base_url, gsutil, options.num_threads, options.directory, 393 input_filename, base_url, gsutil, options.num_threads, options.directory,
390 options.recursive, options.force, options.output, options.ignore_errors, 394 options.recursive, options.force, options.output, options.ignore_errors,
391 options.sha1_file, options.verbose) 395 options.sha1_file, options.verbose)
392 396
393 397
394 if __name__ == '__main__': 398 if __name__ == '__main__':
395 sys.exit(main(sys.argv)) 399 sys.exit(main(sys.argv))
OLDNEW
« no previous file with comments | « no previous file | tests/download_from_google_storage_unittests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698