1 # -*- coding: utf-8 -*- 2 # Copyright 2014 Google Inc. All Rights Reserved. 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 """Helper for cat and cp streaming download.""" 16 17 from __future__ import absolute_import 18 19 import sys 20 21 from gslib.exception import CommandException 22 from gslib.wildcard_iterator import StorageUrlFromString 23 24 25 class CatHelper(object): 26 27 def __init__(self, command_obj): 28 """Initializes the helper object. 29 30 Args: 31 command_obj: gsutil command instance of calling command. 32 """ 33 self.command_obj = command_obj 34 35 def CatUrlStrings(self, url_strings, show_header=False, start_byte=0, 36 end_byte=None): 37 """Prints each of the url strings to stdout. 38 39 Args: 40 url_strings: String iterable. 41 show_header: If true, print a header per file. 42 start_byte: Starting byte of the file to print, used for constructing 43 range requests. 44 end_byte: Ending byte of the file to print; used for constructing range 45 requests. If this is negative, the start_byte is ignored and 46 and end range is sent over HTTP (such as range: bytes -9) 47 Returns: 48 0 on success. 49 50 Raises: 51 CommandException if no URLs can be found. 52 """ 53 printed_one = False 54 # We manipulate the stdout so that all other data other than the Object 55 # contents go to stderr. 56 cat_outfd = sys.stdout 57 sys.stdout = sys.stderr 58 try: 59 for url_str in url_strings: 60 did_some_work = False 61 # TODO: Get only the needed fields here. 62 for blr in self.command_obj.WildcardIterator(url_str).IterObjects(): 63 did_some_work = True 64 if show_header: 65 if printed_one: 66 print 67 print '==> %s <==' % blr 68 printed_one = True 69 cat_object = blr.root_object 70 storage_url = StorageUrlFromString(blr.url_string) 71 if storage_url.IsCloudUrl(): 72 self.command_obj.gsutil_api.GetObjectMedia( 73 cat_object.bucket, cat_object.name, cat_outfd, 74 start_byte=start_byte, end_byte=end_byte, 75 object_size=cat_object.size, generation=storage_url.generation, 76 provider=storage_url.scheme) 77 else: 78 cat_outfd.write(open(storage_url.object_name, 'rb').read()) 79 if not did_some_work: 80 raise CommandException('No URLs matched %s' % url_str) 81 sys.stdout = cat_outfd 82 finally: 83 sys.stdout = cat_outfd 84 85 return 0 86