#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright 2010 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Wrapper module for running gslib.__main__.main() from the command line.""" import os import sys import warnings # TODO: gsutil-beta: Distribute a pylint rc file. if not (2, 6) <= sys.version_info[:3] < (3,): sys.exit('gsutil requires python 2.6 or 2.7.') def UsingCrcmodExtension(crcmod_module): return (getattr(crcmod_module, 'crcmod', None) and getattr(crcmod_module.crcmod, '_usingExtension', None)) def OutputAndExit(message): sys.stderr.write('%s\n' % message) sys.exit(1) GSUTIL_DIR = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) if not GSUTIL_DIR: OutputAndExit('Unable to determine where gsutil is installed. Sorry, ' 'cannot run correctly without this.\n') # The wrapper script adds all third_party libraries to the Python path, since # we don't assume any third party libraries are installed system-wide. THIRD_PARTY_DIR = os.path.join(GSUTIL_DIR, 'third_party') # Filter out "module was already imported" warnings that get printed after we # add our bundled version of modules to the Python path. warnings.filterwarnings('ignore', category=UserWarning, message=r'.* httplib2 was already imported from') warnings.filterwarnings('ignore', category=UserWarning, message=r'.* oauth2client was already imported from') # List of third-party libraries. The first element of the tuple is the name of # the directory under third_party and the second element is the subdirectory # that needs to be added to sys.path. THIRD_PARTY_LIBS = [ ('oauth2client', ''), # oauth2client and dependencies must be before boto. ('pyasn1', ''), # oauth2client dependency ('pyasn1-modules', ''), # oauth2client dependency ('rsa', ''), # oauth2client dependency ('apitools', ''), ('boto', ''), ('gcs-oauth2-boto-plugin', ''), ('httplib2', 'python2'), ('python-gflags', ''), ('retry-decorator', ''), ('six', ''), ('socksipy-branch', ''), ] for libdir, subdir in THIRD_PARTY_LIBS: if not os.path.isdir(os.path.join(THIRD_PARTY_DIR, libdir)): OutputAndExit( 'There is no %s library under the gsutil third-party directory (%s).\n' 'The gsutil command cannot work properly when installed this way.\n' 'Please re-install gsutil per the installation instructions.' % ( libdir, THIRD_PARTY_DIR)) sys.path.insert(0, os.path.join(THIRD_PARTY_DIR, libdir, subdir)) # The wrapper script adds all third_party libraries to the Python path, since # we don't assume any third party libraries are installed system-wide. THIRD_PARTY_DIR = os.path.join(GSUTIL_DIR, 'third_party') CRCMOD_PATH = os.path.join(THIRD_PARTY_DIR, 'crcmod', 'python2') CRCMOD_OSX_PATH = os.path.join(THIRD_PARTY_DIR, 'crcmod_osx') try: # pylint: disable=g-import-not-at-top import crcmod except ImportError: crcmod = None if not UsingCrcmodExtension(crcmod): local_crcmod_path = (CRCMOD_OSX_PATH if 'darwin' in str(sys.platform).lower() else CRCMOD_PATH) sys.path.insert(0, local_crcmod_path) def RunMain(): # pylint: disable=g-import-not-at-top import gslib.__main__ sys.exit(gslib.__main__.main()) if __name__ == '__main__': RunMain()