| Index: third_party/gsutil/boto/boto/roboto/awsqueryservice.py
|
| diff --git a/third_party/gsutil/boto/boto/roboto/awsqueryservice.py b/third_party/gsutil/boto/boto/roboto/awsqueryservice.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0ca78c2d7f9268733d59b7feaf237b14c3d21ed7
|
| --- /dev/null
|
| +++ b/third_party/gsutil/boto/boto/roboto/awsqueryservice.py
|
| @@ -0,0 +1,121 @@
|
| +import os
|
| +import urlparse
|
| +import boto
|
| +import boto.connection
|
| +import boto.jsonresponse
|
| +import boto.exception
|
| +import awsqueryrequest
|
| +
|
| +class NoCredentialsError(boto.exception.BotoClientError):
|
| +
|
| + def __init__(self):
|
| + s = 'Unable to find credentials'
|
| + boto.exception.BotoClientError.__init__(self, s)
|
| +
|
| +class AWSQueryService(boto.connection.AWSQueryConnection):
|
| +
|
| + Name = ''
|
| + Description = ''
|
| + APIVersion = ''
|
| + Authentication = 'sign-v2'
|
| + Path = '/'
|
| + Port = 443
|
| + Provider = 'aws'
|
| + EnvURL = 'AWS_URL'
|
| +
|
| + Regions = []
|
| +
|
| + def __init__(self, **args):
|
| + self.args = args
|
| + self.check_for_credential_file()
|
| + self.check_for_env_url()
|
| + if 'host' not in self.args:
|
| + if self.Regions:
|
| + region_name = self.args.get('region_name',
|
| + self.Regions[0]['name'])
|
| + for region in self.Regions:
|
| + if region['name'] == region_name:
|
| + self.args['host'] = region['endpoint']
|
| + if 'path' not in self.args:
|
| + self.args['path'] = self.Path
|
| + if 'port' not in self.args:
|
| + self.args['port'] = self.Port
|
| + try:
|
| + boto.connection.AWSQueryConnection.__init__(self, **self.args)
|
| + self.aws_response = None
|
| + except boto.exception.NoAuthHandlerFound:
|
| + raise NoCredentialsError()
|
| +
|
| + def check_for_credential_file(self):
|
| + """
|
| + Checks for the existance of an AWS credential file.
|
| + If the environment variable AWS_CREDENTIAL_FILE is
|
| + set and points to a file, that file will be read and
|
| + will be searched credentials.
|
| + Note that if credentials have been explicitelypassed
|
| + into the class constructor, those values always take
|
| + precedence.
|
| + """
|
| + if 'AWS_CREDENTIAL_FILE' in os.environ:
|
| + path = os.environ['AWS_CREDENTIAL_FILE']
|
| + path = os.path.expanduser(path)
|
| + path = os.path.expandvars(path)
|
| + if os.path.isfile(path):
|
| + fp = open(path)
|
| + lines = fp.readlines()
|
| + fp.close()
|
| + for line in lines:
|
| + if line[0] != '#':
|
| + if '=' in line:
|
| + name, value = line.split('=', 1)
|
| + if name.strip() == 'AWSAccessKeyId':
|
| + if 'aws_access_key_id' not in self.args:
|
| + value = value.strip()
|
| + self.args['aws_access_key_id'] = value
|
| + elif name.strip() == 'AWSSecretKey':
|
| + if 'aws_secret_access_key' not in self.args:
|
| + value = value.strip()
|
| + self.args['aws_secret_access_key'] = value
|
| + else:
|
| + print 'Warning: unable to read AWS_CREDENTIAL_FILE'
|
| +
|
| + def check_for_env_url(self):
|
| + """
|
| + First checks to see if a url argument was explicitly passed
|
| + in. If so, that will be used. If not, it checks for the
|
| + existence of the environment variable specified in ENV_URL.
|
| + If this is set, it should contain a fully qualified URL to the
|
| + service you want to use.
|
| + Note that any values passed explicitly to the class constructor
|
| + will take precedence.
|
| + """
|
| + url = self.args.get('url', None)
|
| + if url:
|
| + del self.args['url']
|
| + if not url and self.EnvURL in os.environ:
|
| + url = os.environ[self.EnvURL]
|
| + if url:
|
| + rslt = urlparse.urlparse(url)
|
| + if 'is_secure' not in self.args:
|
| + if rslt.scheme == 'https':
|
| + self.args['is_secure'] = True
|
| + else:
|
| + self.args['is_secure'] = False
|
| +
|
| + host = rslt.netloc
|
| + port = None
|
| + l = host.split(':')
|
| + if len(l) > 1:
|
| + host = l[0]
|
| + port = int(l[1])
|
| + if 'host' not in self.args:
|
| + self.args['host'] = host
|
| + if port and 'port' not in self.args:
|
| + self.args['port'] = port
|
| +
|
| + if rslt.path and 'path' not in self.args:
|
| + self.args['path'] = rslt.path
|
| +
|
| + def _required_auth_capability(self):
|
| + return [self.Authentication]
|
| +
|
|
|