1# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/ 2# Copyright (c) 2010-2011, Eucalyptus Systems, Inc. 3# Copyright (c) 2011, Nexenta Systems Inc. 4# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. 5# Copyright (c) 2010, Google, Inc. 6# All rights reserved. 7# 8# Permission is hereby granted, free of charge, to any person obtaining a 9# copy of this software and associated documentation files (the 10# "Software"), to deal in the Software without restriction, including 11# without limitation the rights to use, copy, modify, merge, publish, dis- 12# tribute, sublicense, and/or sell copies of the Software, and to permit 13# persons to whom the Software is furnished to do so, subject to the fol- 14# lowing conditions: 15# 16# The above copyright notice and this permission notice shall be included 17# in all copies or substantial portions of the Software. 18# 19# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 21# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 22# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 25# IN THE SOFTWARE. 26# 27from boto.pyami.config import Config, BotoConfigLocations 28from boto.storage_uri import BucketStorageUri, FileStorageUri 29import boto.plugin 30import datetime 31import os 32import platform 33import re 34import sys 35import logging 36import logging.config 37 38from boto.compat import urlparse 39from boto.exception import InvalidUriError 40 41__version__ = '2.38.0' 42Version = __version__ # for backware compatibility 43 44# http://bugs.python.org/issue7980 45datetime.datetime.strptime('', '') 46 47UserAgent = 'Boto/%s Python/%s %s/%s' % ( 48 __version__, 49 platform.python_version(), 50 platform.system(), 51 platform.release() 52) 53config = Config() 54 55# Regex to disallow buckets violating charset or not [3..255] chars total. 56BUCKET_NAME_RE = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9\._-]{1,253}[a-zA-Z0-9]$') 57# Regex to disallow buckets with individual DNS labels longer than 63. 58TOO_LONG_DNS_NAME_COMP = re.compile(r'[-_a-z0-9]{64}') 59GENERATION_RE = re.compile(r'(?P<versionless_uri_str>.+)' 60 r'#(?P<generation>[0-9]+)$') 61VERSION_RE = re.compile('(?P<versionless_uri_str>.+)#(?P<version_id>.+)$') 62ENDPOINTS_PATH = os.path.join(os.path.dirname(__file__), 'endpoints.json') 63 64 65def init_logging(): 66 for file in BotoConfigLocations: 67 try: 68 logging.config.fileConfig(os.path.expanduser(file)) 69 except: 70 pass 71 72 73class NullHandler(logging.Handler): 74 def emit(self, record): 75 pass 76 77log = logging.getLogger('boto') 78perflog = logging.getLogger('boto.perf') 79log.addHandler(NullHandler()) 80perflog.addHandler(NullHandler()) 81init_logging() 82 83# convenience function to set logging to a particular file 84 85 86def set_file_logger(name, filepath, level=logging.INFO, format_string=None): 87 global log 88 if not format_string: 89 format_string = "%(asctime)s %(name)s [%(levelname)s]:%(message)s" 90 logger = logging.getLogger(name) 91 logger.setLevel(level) 92 fh = logging.FileHandler(filepath) 93 fh.setLevel(level) 94 formatter = logging.Formatter(format_string) 95 fh.setFormatter(formatter) 96 logger.addHandler(fh) 97 log = logger 98 99 100def set_stream_logger(name, level=logging.DEBUG, format_string=None): 101 global log 102 if not format_string: 103 format_string = "%(asctime)s %(name)s [%(levelname)s]:%(message)s" 104 logger = logging.getLogger(name) 105 logger.setLevel(level) 106 fh = logging.StreamHandler() 107 fh.setLevel(level) 108 formatter = logging.Formatter(format_string) 109 fh.setFormatter(formatter) 110 logger.addHandler(fh) 111 log = logger 112 113 114def connect_sqs(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 115 """ 116 :type aws_access_key_id: string 117 :param aws_access_key_id: Your AWS Access Key ID 118 119 :type aws_secret_access_key: string 120 :param aws_secret_access_key: Your AWS Secret Access Key 121 122 :rtype: :class:`boto.sqs.connection.SQSConnection` 123 :return: A connection to Amazon's SQS 124 """ 125 from boto.sqs.connection import SQSConnection 126 return SQSConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 127 128 129def connect_s3(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 130 """ 131 :type aws_access_key_id: string 132 :param aws_access_key_id: Your AWS Access Key ID 133 134 :type aws_secret_access_key: string 135 :param aws_secret_access_key: Your AWS Secret Access Key 136 137 :rtype: :class:`boto.s3.connection.S3Connection` 138 :return: A connection to Amazon's S3 139 """ 140 from boto.s3.connection import S3Connection 141 return S3Connection(aws_access_key_id, aws_secret_access_key, **kwargs) 142 143 144def connect_gs(gs_access_key_id=None, gs_secret_access_key=None, **kwargs): 145 """ 146 @type gs_access_key_id: string 147 @param gs_access_key_id: Your Google Cloud Storage Access Key ID 148 149 @type gs_secret_access_key: string 150 @param gs_secret_access_key: Your Google Cloud Storage Secret Access Key 151 152 @rtype: L{GSConnection<boto.gs.connection.GSConnection>} 153 @return: A connection to Google's Storage service 154 """ 155 from boto.gs.connection import GSConnection 156 return GSConnection(gs_access_key_id, gs_secret_access_key, **kwargs) 157 158 159def connect_ec2(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 160 """ 161 :type aws_access_key_id: string 162 :param aws_access_key_id: Your AWS Access Key ID 163 164 :type aws_secret_access_key: string 165 :param aws_secret_access_key: Your AWS Secret Access Key 166 167 :rtype: :class:`boto.ec2.connection.EC2Connection` 168 :return: A connection to Amazon's EC2 169 """ 170 from boto.ec2.connection import EC2Connection 171 return EC2Connection(aws_access_key_id, aws_secret_access_key, **kwargs) 172 173 174def connect_elb(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 175 """ 176 :type aws_access_key_id: string 177 :param aws_access_key_id: Your AWS Access Key ID 178 179 :type aws_secret_access_key: string 180 :param aws_secret_access_key: Your AWS Secret Access Key 181 182 :rtype: :class:`boto.ec2.elb.ELBConnection` 183 :return: A connection to Amazon's Load Balancing Service 184 """ 185 from boto.ec2.elb import ELBConnection 186 return ELBConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 187 188 189def connect_autoscale(aws_access_key_id=None, aws_secret_access_key=None, 190 **kwargs): 191 """ 192 :type aws_access_key_id: string 193 :param aws_access_key_id: Your AWS Access Key ID 194 195 :type aws_secret_access_key: string 196 :param aws_secret_access_key: Your AWS Secret Access Key 197 198 :rtype: :class:`boto.ec2.autoscale.AutoScaleConnection` 199 :return: A connection to Amazon's Auto Scaling Service 200 201 :type use_block_device_types bool 202 :param use_block_device_types: Specifies whether to return described Launch Configs with block device mappings containing 203 block device types, or a list of old style block device mappings (deprecated). This defaults to false for compatability 204 with the old incorrect style. 205 """ 206 from boto.ec2.autoscale import AutoScaleConnection 207 return AutoScaleConnection(aws_access_key_id, aws_secret_access_key, 208 **kwargs) 209 210 211def connect_cloudwatch(aws_access_key_id=None, aws_secret_access_key=None, 212 **kwargs): 213 """ 214 :type aws_access_key_id: string 215 :param aws_access_key_id: Your AWS Access Key ID 216 217 :type aws_secret_access_key: string 218 :param aws_secret_access_key: Your AWS Secret Access Key 219 220 :rtype: :class:`boto.ec2.cloudwatch.CloudWatchConnection` 221 :return: A connection to Amazon's EC2 Monitoring service 222 """ 223 from boto.ec2.cloudwatch import CloudWatchConnection 224 return CloudWatchConnection(aws_access_key_id, aws_secret_access_key, 225 **kwargs) 226 227 228def connect_sdb(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 229 """ 230 :type aws_access_key_id: string 231 :param aws_access_key_id: Your AWS Access Key ID 232 233 :type aws_secret_access_key: string 234 :param aws_secret_access_key: Your AWS Secret Access Key 235 236 :rtype: :class:`boto.sdb.connection.SDBConnection` 237 :return: A connection to Amazon's SDB 238 """ 239 from boto.sdb.connection import SDBConnection 240 return SDBConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 241 242 243def connect_fps(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 244 """ 245 :type aws_access_key_id: string 246 :param aws_access_key_id: Your AWS Access Key ID 247 248 :type aws_secret_access_key: string 249 :param aws_secret_access_key: Your AWS Secret Access Key 250 251 :rtype: :class:`boto.fps.connection.FPSConnection` 252 :return: A connection to FPS 253 """ 254 from boto.fps.connection import FPSConnection 255 return FPSConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 256 257 258def connect_mturk(aws_access_key_id=None, aws_secret_access_key=None, 259 **kwargs): 260 """ 261 :type aws_access_key_id: string 262 :param aws_access_key_id: Your AWS Access Key ID 263 264 :type aws_secret_access_key: string 265 :param aws_secret_access_key: Your AWS Secret Access Key 266 267 :rtype: :class:`boto.mturk.connection.MTurkConnection` 268 :return: A connection to MTurk 269 """ 270 from boto.mturk.connection import MTurkConnection 271 return MTurkConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 272 273 274def connect_cloudfront(aws_access_key_id=None, aws_secret_access_key=None, 275 **kwargs): 276 """ 277 :type aws_access_key_id: string 278 :param aws_access_key_id: Your AWS Access Key ID 279 280 :type aws_secret_access_key: string 281 :param aws_secret_access_key: Your AWS Secret Access Key 282 283 :rtype: :class:`boto.fps.connection.FPSConnection` 284 :return: A connection to FPS 285 """ 286 from boto.cloudfront import CloudFrontConnection 287 return CloudFrontConnection(aws_access_key_id, aws_secret_access_key, 288 **kwargs) 289 290 291def connect_vpc(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 292 """ 293 :type aws_access_key_id: string 294 :param aws_access_key_id: Your AWS Access Key ID 295 296 :type aws_secret_access_key: string 297 :param aws_secret_access_key: Your AWS Secret Access Key 298 299 :rtype: :class:`boto.vpc.VPCConnection` 300 :return: A connection to VPC 301 """ 302 from boto.vpc import VPCConnection 303 return VPCConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 304 305 306def connect_rds(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 307 """ 308 :type aws_access_key_id: string 309 :param aws_access_key_id: Your AWS Access Key ID 310 311 :type aws_secret_access_key: string 312 :param aws_secret_access_key: Your AWS Secret Access Key 313 314 :rtype: :class:`boto.rds.RDSConnection` 315 :return: A connection to RDS 316 """ 317 from boto.rds import RDSConnection 318 return RDSConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 319 320 321def connect_rds2(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 322 """ 323 :type aws_access_key_id: string 324 :param aws_access_key_id: Your AWS Access Key ID 325 326 :type aws_secret_access_key: string 327 :param aws_secret_access_key: Your AWS Secret Access Key 328 329 :rtype: :class:`boto.rds2.layer1.RDSConnection` 330 :return: A connection to RDS 331 """ 332 from boto.rds2.layer1 import RDSConnection 333 return RDSConnection( 334 aws_access_key_id=aws_access_key_id, 335 aws_secret_access_key=aws_secret_access_key, 336 **kwargs 337 ) 338 339 340def connect_emr(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 341 """ 342 :type aws_access_key_id: string 343 :param aws_access_key_id: Your AWS Access Key ID 344 345 :type aws_secret_access_key: string 346 :param aws_secret_access_key: Your AWS Secret Access Key 347 348 :rtype: :class:`boto.emr.EmrConnection` 349 :return: A connection to Elastic mapreduce 350 """ 351 from boto.emr import EmrConnection 352 return EmrConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 353 354 355def connect_sns(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 356 """ 357 :type aws_access_key_id: string 358 :param aws_access_key_id: Your AWS Access Key ID 359 360 :type aws_secret_access_key: string 361 :param aws_secret_access_key: Your AWS Secret Access Key 362 363 :rtype: :class:`boto.sns.SNSConnection` 364 :return: A connection to Amazon's SNS 365 """ 366 from boto.sns import SNSConnection 367 return SNSConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 368 369 370def connect_iam(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 371 """ 372 :type aws_access_key_id: string 373 :param aws_access_key_id: Your AWS Access Key ID 374 375 :type aws_secret_access_key: string 376 :param aws_secret_access_key: Your AWS Secret Access Key 377 378 :rtype: :class:`boto.iam.IAMConnection` 379 :return: A connection to Amazon's IAM 380 """ 381 from boto.iam import IAMConnection 382 return IAMConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 383 384 385def connect_route53(aws_access_key_id=None, aws_secret_access_key=None, 386 **kwargs): 387 """ 388 :type aws_access_key_id: string 389 :param aws_access_key_id: Your AWS Access Key ID 390 391 :type aws_secret_access_key: string 392 :param aws_secret_access_key: Your AWS Secret Access Key 393 394 :rtype: :class:`boto.dns.Route53Connection` 395 :return: A connection to Amazon's Route53 DNS Service 396 """ 397 from boto.route53 import Route53Connection 398 return Route53Connection(aws_access_key_id, aws_secret_access_key, 399 **kwargs) 400 401 402def connect_cloudformation(aws_access_key_id=None, aws_secret_access_key=None, 403 **kwargs): 404 """ 405 :type aws_access_key_id: string 406 :param aws_access_key_id: Your AWS Access Key ID 407 408 :type aws_secret_access_key: string 409 :param aws_secret_access_key: Your AWS Secret Access Key 410 411 :rtype: :class:`boto.cloudformation.CloudFormationConnection` 412 :return: A connection to Amazon's CloudFormation Service 413 """ 414 from boto.cloudformation import CloudFormationConnection 415 return CloudFormationConnection(aws_access_key_id, aws_secret_access_key, 416 **kwargs) 417 418 419def connect_euca(host=None, aws_access_key_id=None, aws_secret_access_key=None, 420 port=8773, path='/services/Eucalyptus', is_secure=False, 421 **kwargs): 422 """ 423 Connect to a Eucalyptus service. 424 425 :type host: string 426 :param host: the host name or ip address of the Eucalyptus server 427 428 :type aws_access_key_id: string 429 :param aws_access_key_id: Your AWS Access Key ID 430 431 :type aws_secret_access_key: string 432 :param aws_secret_access_key: Your AWS Secret Access Key 433 434 :rtype: :class:`boto.ec2.connection.EC2Connection` 435 :return: A connection to Eucalyptus server 436 """ 437 from boto.ec2 import EC2Connection 438 from boto.ec2.regioninfo import RegionInfo 439 440 # Check for values in boto config, if not supplied as args 441 if not aws_access_key_id: 442 aws_access_key_id = config.get('Credentials', 443 'euca_access_key_id', 444 None) 445 if not aws_secret_access_key: 446 aws_secret_access_key = config.get('Credentials', 447 'euca_secret_access_key', 448 None) 449 if not host: 450 host = config.get('Boto', 'eucalyptus_host', None) 451 452 reg = RegionInfo(name='eucalyptus', endpoint=host) 453 return EC2Connection(aws_access_key_id, aws_secret_access_key, 454 region=reg, port=port, path=path, 455 is_secure=is_secure, **kwargs) 456 457 458def connect_glacier(aws_access_key_id=None, aws_secret_access_key=None, 459 **kwargs): 460 """ 461 :type aws_access_key_id: string 462 :param aws_access_key_id: Your AWS Access Key ID 463 464 :type aws_secret_access_key: string 465 :param aws_secret_access_key: Your AWS Secret Access Key 466 467 :rtype: :class:`boto.glacier.layer2.Layer2` 468 :return: A connection to Amazon's Glacier Service 469 """ 470 from boto.glacier.layer2 import Layer2 471 return Layer2(aws_access_key_id, aws_secret_access_key, 472 **kwargs) 473 474 475def connect_ec2_endpoint(url, aws_access_key_id=None, 476 aws_secret_access_key=None, 477 **kwargs): 478 """ 479 Connect to an EC2 Api endpoint. Additional arguments are passed 480 through to connect_ec2. 481 482 :type url: string 483 :param url: A url for the ec2 api endpoint to connect to 484 485 :type aws_access_key_id: string 486 :param aws_access_key_id: Your AWS Access Key ID 487 488 :type aws_secret_access_key: string 489 :param aws_secret_access_key: Your AWS Secret Access Key 490 491 :rtype: :class:`boto.ec2.connection.EC2Connection` 492 :return: A connection to Eucalyptus server 493 """ 494 from boto.ec2.regioninfo import RegionInfo 495 496 purl = urlparse(url) 497 kwargs['port'] = purl.port 498 kwargs['host'] = purl.hostname 499 kwargs['path'] = purl.path 500 if not 'is_secure' in kwargs: 501 kwargs['is_secure'] = (purl.scheme == "https") 502 503 kwargs['region'] = RegionInfo(name=purl.hostname, 504 endpoint=purl.hostname) 505 kwargs['aws_access_key_id'] = aws_access_key_id 506 kwargs['aws_secret_access_key'] = aws_secret_access_key 507 508 return(connect_ec2(**kwargs)) 509 510 511def connect_walrus(host=None, aws_access_key_id=None, 512 aws_secret_access_key=None, 513 port=8773, path='/services/Walrus', is_secure=False, 514 **kwargs): 515 """ 516 Connect to a Walrus service. 517 518 :type host: string 519 :param host: the host name or ip address of the Walrus server 520 521 :type aws_access_key_id: string 522 :param aws_access_key_id: Your AWS Access Key ID 523 524 :type aws_secret_access_key: string 525 :param aws_secret_access_key: Your AWS Secret Access Key 526 527 :rtype: :class:`boto.s3.connection.S3Connection` 528 :return: A connection to Walrus 529 """ 530 from boto.s3.connection import S3Connection 531 from boto.s3.connection import OrdinaryCallingFormat 532 533 # Check for values in boto config, if not supplied as args 534 if not aws_access_key_id: 535 aws_access_key_id = config.get('Credentials', 536 'euca_access_key_id', 537 None) 538 if not aws_secret_access_key: 539 aws_secret_access_key = config.get('Credentials', 540 'euca_secret_access_key', 541 None) 542 if not host: 543 host = config.get('Boto', 'walrus_host', None) 544 545 return S3Connection(aws_access_key_id, aws_secret_access_key, 546 host=host, port=port, path=path, 547 calling_format=OrdinaryCallingFormat(), 548 is_secure=is_secure, **kwargs) 549 550 551def connect_ses(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 552 """ 553 :type aws_access_key_id: string 554 :param aws_access_key_id: Your AWS Access Key ID 555 556 :type aws_secret_access_key: string 557 :param aws_secret_access_key: Your AWS Secret Access Key 558 559 :rtype: :class:`boto.ses.SESConnection` 560 :return: A connection to Amazon's SES 561 """ 562 from boto.ses import SESConnection 563 return SESConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 564 565 566def connect_sts(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): 567 """ 568 :type aws_access_key_id: string 569 :param aws_access_key_id: Your AWS Access Key ID 570 571 :type aws_secret_access_key: string 572 :param aws_secret_access_key: Your AWS Secret Access Key 573 574 :rtype: :class:`boto.sts.STSConnection` 575 :return: A connection to Amazon's STS 576 """ 577 from boto.sts import STSConnection 578 return STSConnection(aws_access_key_id, aws_secret_access_key, **kwargs) 579 580 581def connect_ia(ia_access_key_id=None, ia_secret_access_key=None, 582 is_secure=False, **kwargs): 583 """ 584 Connect to the Internet Archive via their S3-like API. 585 586 :type ia_access_key_id: string 587 :param ia_access_key_id: Your IA Access Key ID. This will also look 588 in your boto config file for an entry in the Credentials 589 section called "ia_access_key_id" 590 591 :type ia_secret_access_key: string 592 :param ia_secret_access_key: Your IA Secret Access Key. This will also 593 look in your boto config file for an entry in the Credentials 594 section called "ia_secret_access_key" 595 596 :rtype: :class:`boto.s3.connection.S3Connection` 597 :return: A connection to the Internet Archive 598 """ 599 from boto.s3.connection import S3Connection 600 from boto.s3.connection import OrdinaryCallingFormat 601 602 access_key = config.get('Credentials', 'ia_access_key_id', 603 ia_access_key_id) 604 secret_key = config.get('Credentials', 'ia_secret_access_key', 605 ia_secret_access_key) 606 607 return S3Connection(access_key, secret_key, 608 host='s3.us.archive.org', 609 calling_format=OrdinaryCallingFormat(), 610 is_secure=is_secure, **kwargs) 611 612 613def connect_dynamodb(aws_access_key_id=None, 614 aws_secret_access_key=None, 615 **kwargs): 616 """ 617 :type aws_access_key_id: string 618 :param aws_access_key_id: Your AWS Access Key ID 619 620 :type aws_secret_access_key: string 621 :param aws_secret_access_key: Your AWS Secret Access Key 622 623 :rtype: :class:`boto.dynamodb.layer2.Layer2` 624 :return: A connection to the Layer2 interface for DynamoDB. 625 """ 626 from boto.dynamodb.layer2 import Layer2 627 return Layer2(aws_access_key_id, aws_secret_access_key, **kwargs) 628 629 630def connect_swf(aws_access_key_id=None, 631 aws_secret_access_key=None, 632 **kwargs): 633 """ 634 :type aws_access_key_id: string 635 :param aws_access_key_id: Your AWS Access Key ID 636 637 :type aws_secret_access_key: string 638 :param aws_secret_access_key: Your AWS Secret Access Key 639 640 :rtype: :class:`boto.swf.layer1.Layer1` 641 :return: A connection to the Layer1 interface for SWF. 642 """ 643 from boto.swf.layer1 import Layer1 644 return Layer1(aws_access_key_id, aws_secret_access_key, **kwargs) 645 646 647def connect_cloudsearch(aws_access_key_id=None, 648 aws_secret_access_key=None, 649 **kwargs): 650 """ 651 :type aws_access_key_id: string 652 :param aws_access_key_id: Your AWS Access Key ID 653 654 :type aws_secret_access_key: string 655 :param aws_secret_access_key: Your AWS Secret Access Key 656 657 :rtype: :class:`boto.cloudsearch.layer2.Layer2` 658 :return: A connection to Amazon's CloudSearch service 659 """ 660 from boto.cloudsearch.layer2 import Layer2 661 return Layer2(aws_access_key_id, aws_secret_access_key, 662 **kwargs) 663 664 665def connect_cloudsearch2(aws_access_key_id=None, 666 aws_secret_access_key=None, 667 sign_request=False, 668 **kwargs): 669 """ 670 :type aws_access_key_id: string 671 :param aws_access_key_id: Your AWS Access Key ID 672 673 :type aws_secret_access_key: string 674 :param aws_secret_access_key: Your AWS Secret Access Key 675 676 :type sign_request: bool 677 :param sign_request: whether or not to sign search and 678 upload requests 679 680 :rtype: :class:`boto.cloudsearch2.layer2.Layer2` 681 :return: A connection to Amazon's CloudSearch2 service 682 """ 683 from boto.cloudsearch2.layer2 import Layer2 684 return Layer2(aws_access_key_id, aws_secret_access_key, 685 sign_request=sign_request, 686 **kwargs) 687 688 689def connect_cloudsearchdomain(aws_access_key_id=None, 690 aws_secret_access_key=None, 691 **kwargs): 692 """ 693 :type aws_access_key_id: string 694 :param aws_access_key_id: Your AWS Access Key ID 695 696 :type aws_secret_access_key: string 697 :param aws_secret_access_key: Your AWS Secret Access Key 698 699 :rtype: :class:`boto.cloudsearchdomain.layer1.CloudSearchDomainConnection` 700 :return: A connection to Amazon's CloudSearch Domain service 701 """ 702 from boto.cloudsearchdomain.layer1 import CloudSearchDomainConnection 703 return CloudSearchDomainConnection(aws_access_key_id, 704 aws_secret_access_key, **kwargs) 705 706 707def connect_beanstalk(aws_access_key_id=None, 708 aws_secret_access_key=None, 709 **kwargs): 710 """ 711 :type aws_access_key_id: string 712 :param aws_access_key_id: Your AWS Access Key ID 713 714 :type aws_secret_access_key: string 715 :param aws_secret_access_key: Your AWS Secret Access Key 716 717 :rtype: :class:`boto.beanstalk.layer1.Layer1` 718 :return: A connection to Amazon's Elastic Beanstalk service 719 """ 720 from boto.beanstalk.layer1 import Layer1 721 return Layer1(aws_access_key_id, aws_secret_access_key, **kwargs) 722 723 724def connect_elastictranscoder(aws_access_key_id=None, 725 aws_secret_access_key=None, 726 **kwargs): 727 """ 728 :type aws_access_key_id: string 729 :param aws_access_key_id: Your AWS Access Key ID 730 731 :type aws_secret_access_key: string 732 :param aws_secret_access_key: Your AWS Secret Access Key 733 734 :rtype: :class:`boto.ets.layer1.ElasticTranscoderConnection` 735 :return: A connection to Amazon's Elastic Transcoder service 736 """ 737 from boto.elastictranscoder.layer1 import ElasticTranscoderConnection 738 return ElasticTranscoderConnection( 739 aws_access_key_id=aws_access_key_id, 740 aws_secret_access_key=aws_secret_access_key, 741 **kwargs) 742 743 744def connect_opsworks(aws_access_key_id=None, 745 aws_secret_access_key=None, 746 **kwargs): 747 from boto.opsworks.layer1 import OpsWorksConnection 748 return OpsWorksConnection( 749 aws_access_key_id=aws_access_key_id, 750 aws_secret_access_key=aws_secret_access_key, 751 **kwargs) 752 753 754def connect_redshift(aws_access_key_id=None, 755 aws_secret_access_key=None, 756 **kwargs): 757 """ 758 :type aws_access_key_id: string 759 :param aws_access_key_id: Your AWS Access Key ID 760 761 :type aws_secret_access_key: string 762 :param aws_secret_access_key: Your AWS Secret Access Key 763 764 :rtype: :class:`boto.redshift.layer1.RedshiftConnection` 765 :return: A connection to Amazon's Redshift service 766 """ 767 from boto.redshift.layer1 import RedshiftConnection 768 return RedshiftConnection( 769 aws_access_key_id=aws_access_key_id, 770 aws_secret_access_key=aws_secret_access_key, 771 **kwargs 772 ) 773 774 775def connect_support(aws_access_key_id=None, 776 aws_secret_access_key=None, 777 **kwargs): 778 """ 779 :type aws_access_key_id: string 780 :param aws_access_key_id: Your AWS Access Key ID 781 782 :type aws_secret_access_key: string 783 :param aws_secret_access_key: Your AWS Secret Access Key 784 785 :rtype: :class:`boto.support.layer1.SupportConnection` 786 :return: A connection to Amazon's Support service 787 """ 788 from boto.support.layer1 import SupportConnection 789 return SupportConnection( 790 aws_access_key_id=aws_access_key_id, 791 aws_secret_access_key=aws_secret_access_key, 792 **kwargs 793 ) 794 795 796def connect_cloudtrail(aws_access_key_id=None, 797 aws_secret_access_key=None, 798 **kwargs): 799 """ 800 Connect to AWS CloudTrail 801 802 :type aws_access_key_id: string 803 :param aws_access_key_id: Your AWS Access Key ID 804 805 :type aws_secret_access_key: string 806 :param aws_secret_access_key: Your AWS Secret Access Key 807 808 :rtype: :class:`boto.cloudtrail.layer1.CloudtrailConnection` 809 :return: A connection to the AWS Cloudtrail service 810 """ 811 from boto.cloudtrail.layer1 import CloudTrailConnection 812 return CloudTrailConnection( 813 aws_access_key_id=aws_access_key_id, 814 aws_secret_access_key=aws_secret_access_key, 815 **kwargs 816 ) 817 818 819def connect_directconnect(aws_access_key_id=None, 820 aws_secret_access_key=None, 821 **kwargs): 822 """ 823 Connect to AWS DirectConnect 824 825 :type aws_access_key_id: string 826 :param aws_access_key_id: Your AWS Access Key ID 827 828 :type aws_secret_access_key: string 829 :param aws_secret_access_key: Your AWS Secret Access Key 830 831 :rtype: :class:`boto.directconnect.layer1.DirectConnectConnection` 832 :return: A connection to the AWS DirectConnect service 833 """ 834 from boto.directconnect.layer1 import DirectConnectConnection 835 return DirectConnectConnection( 836 aws_access_key_id=aws_access_key_id, 837 aws_secret_access_key=aws_secret_access_key, 838 **kwargs 839 ) 840 841def connect_kinesis(aws_access_key_id=None, 842 aws_secret_access_key=None, 843 **kwargs): 844 """ 845 Connect to Amazon Kinesis 846 847 :type aws_access_key_id: string 848 :param aws_access_key_id: Your AWS Access Key ID 849 850 :type aws_secret_access_key: string 851 :param aws_secret_access_key: Your AWS Secret Access Key 852 853 rtype: :class:`boto.kinesis.layer1.KinesisConnection` 854 :return: A connection to the Amazon Kinesis service 855 """ 856 from boto.kinesis.layer1 import KinesisConnection 857 return KinesisConnection( 858 aws_access_key_id=aws_access_key_id, 859 aws_secret_access_key=aws_secret_access_key, 860 **kwargs 861 ) 862 863def connect_logs(aws_access_key_id=None, 864 aws_secret_access_key=None, 865 **kwargs): 866 """ 867 Connect to Amazon CloudWatch Logs 868 869 :type aws_access_key_id: string 870 :param aws_access_key_id: Your AWS Access Key ID 871 872 :type aws_secret_access_key: string 873 :param aws_secret_access_key: Your AWS Secret Access Key 874 875 rtype: :class:`boto.kinesis.layer1.CloudWatchLogsConnection` 876 :return: A connection to the Amazon CloudWatch Logs service 877 """ 878 from boto.logs.layer1 import CloudWatchLogsConnection 879 return CloudWatchLogsConnection( 880 aws_access_key_id=aws_access_key_id, 881 aws_secret_access_key=aws_secret_access_key, 882 **kwargs 883 ) 884 885 886def connect_route53domains(aws_access_key_id=None, 887 aws_secret_access_key=None, 888 **kwargs): 889 """ 890 Connect to Amazon Route 53 Domains 891 892 :type aws_access_key_id: string 893 :param aws_access_key_id: Your AWS Access Key ID 894 895 :type aws_secret_access_key: string 896 :param aws_secret_access_key: Your AWS Secret Access Key 897 898 rtype: :class:`boto.route53.domains.layer1.Route53DomainsConnection` 899 :return: A connection to the Amazon Route 53 Domains service 900 """ 901 from boto.route53.domains.layer1 import Route53DomainsConnection 902 return Route53DomainsConnection( 903 aws_access_key_id=aws_access_key_id, 904 aws_secret_access_key=aws_secret_access_key, 905 **kwargs 906 ) 907 908 909def connect_cognito_identity(aws_access_key_id=None, 910 aws_secret_access_key=None, 911 **kwargs): 912 """ 913 Connect to Amazon Cognito Identity 914 915 :type aws_access_key_id: string 916 :param aws_access_key_id: Your AWS Access Key ID 917 918 :type aws_secret_access_key: string 919 :param aws_secret_access_key: Your AWS Secret Access Key 920 921 rtype: :class:`boto.cognito.identity.layer1.CognitoIdentityConnection` 922 :return: A connection to the Amazon Cognito Identity service 923 """ 924 from boto.cognito.identity.layer1 import CognitoIdentityConnection 925 return CognitoIdentityConnection( 926 aws_access_key_id=aws_access_key_id, 927 aws_secret_access_key=aws_secret_access_key, 928 **kwargs 929 ) 930 931 932def connect_cognito_sync(aws_access_key_id=None, 933 aws_secret_access_key=None, 934 **kwargs): 935 """ 936 Connect to Amazon Cognito Sync 937 938 :type aws_access_key_id: string 939 :param aws_access_key_id: Your AWS Access Key ID 940 941 :type aws_secret_access_key: string 942 :param aws_secret_access_key: Your AWS Secret Access Key 943 944 rtype: :class:`boto.cognito.sync.layer1.CognitoSyncConnection` 945 :return: A connection to the Amazon Cognito Sync service 946 """ 947 from boto.cognito.sync.layer1 import CognitoSyncConnection 948 return CognitoSyncConnection( 949 aws_access_key_id=aws_access_key_id, 950 aws_secret_access_key=aws_secret_access_key, 951 **kwargs 952 ) 953 954 955def connect_kms(aws_access_key_id=None, 956 aws_secret_access_key=None, 957 **kwargs): 958 """ 959 Connect to AWS Key Management Service 960 961 :type aws_access_key_id: string 962 :param aws_access_key_id: Your AWS Access Key ID 963 964 :type aws_secret_access_key: string 965 :param aws_secret_access_key: Your AWS Secret Access Key 966 967 rtype: :class:`boto.kms.layer1.KMSConnection` 968 :return: A connection to the AWS Key Management Service 969 """ 970 from boto.kms.layer1 import KMSConnection 971 return KMSConnection( 972 aws_access_key_id=aws_access_key_id, 973 aws_secret_access_key=aws_secret_access_key, 974 **kwargs 975 ) 976 977 978def connect_awslambda(aws_access_key_id=None, 979 aws_secret_access_key=None, 980 **kwargs): 981 """ 982 Connect to AWS Lambda 983 984 :type aws_access_key_id: string 985 :param aws_access_key_id: Your AWS Access Key ID 986 987 :type aws_secret_access_key: string 988 :param aws_secret_access_key: Your AWS Secret Access Key 989 990 rtype: :class:`boto.awslambda.layer1.AWSLambdaConnection` 991 :return: A connection to the AWS Lambda service 992 """ 993 from boto.awslambda.layer1 import AWSLambdaConnection 994 return AWSLambdaConnection( 995 aws_access_key_id=aws_access_key_id, 996 aws_secret_access_key=aws_secret_access_key, 997 **kwargs 998 ) 999 1000 1001def connect_codedeploy(aws_access_key_id=None, 1002 aws_secret_access_key=None, 1003 **kwargs): 1004 """ 1005 Connect to AWS CodeDeploy 1006 1007 :type aws_access_key_id: string 1008 :param aws_access_key_id: Your AWS Access Key ID 1009 1010 :type aws_secret_access_key: string 1011 :param aws_secret_access_key: Your AWS Secret Access Key 1012 1013 rtype: :class:`boto.cognito.sync.layer1.CodeDeployConnection` 1014 :return: A connection to the AWS CodeDeploy service 1015 """ 1016 from boto.codedeploy.layer1 import CodeDeployConnection 1017 return CodeDeployConnection( 1018 aws_access_key_id=aws_access_key_id, 1019 aws_secret_access_key=aws_secret_access_key, 1020 **kwargs 1021 ) 1022 1023 1024def connect_configservice(aws_access_key_id=None, 1025 aws_secret_access_key=None, 1026 **kwargs): 1027 """ 1028 Connect to AWS Config 1029 1030 :type aws_access_key_id: string 1031 :param aws_access_key_id: Your AWS Access Key ID 1032 1033 :type aws_secret_access_key: string 1034 :param aws_secret_access_key: Your AWS Secret Access Key 1035 1036 rtype: :class:`boto.kms.layer1.ConfigServiceConnection` 1037 :return: A connection to the AWS Config service 1038 """ 1039 from boto.configservice.layer1 import ConfigServiceConnection 1040 return ConfigServiceConnection( 1041 aws_access_key_id=aws_access_key_id, 1042 aws_secret_access_key=aws_secret_access_key, 1043 **kwargs 1044 ) 1045 1046 1047def connect_cloudhsm(aws_access_key_id=None, 1048 aws_secret_access_key=None, 1049 **kwargs): 1050 """ 1051 Connect to AWS CloudHSM 1052 1053 :type aws_access_key_id: string 1054 :param aws_access_key_id: Your AWS Access Key ID 1055 1056 :type aws_secret_access_key: string 1057 :param aws_secret_access_key: Your AWS Secret Access Key 1058 1059 rtype: :class:`boto.cloudhsm.layer1.CloudHSMConnection` 1060 :return: A connection to the AWS CloudHSM service 1061 """ 1062 from boto.cloudhsm.layer1 import CloudHSMConnection 1063 return CloudHSMConnection( 1064 aws_access_key_id=aws_access_key_id, 1065 aws_secret_access_key=aws_secret_access_key, 1066 **kwargs 1067 ) 1068 1069 1070def connect_ec2containerservice(aws_access_key_id=None, 1071 aws_secret_access_key=None, 1072 **kwargs): 1073 """ 1074 Connect to Amazon EC2 Container Service 1075 rtype: :class:`boto.ec2containerservice.layer1.EC2ContainerServiceConnection` 1076 :return: A connection to the Amazon EC2 Container Service 1077 """ 1078 from boto.ec2containerservice.layer1 import EC2ContainerServiceConnection 1079 return EC2ContainerServiceConnection( 1080 aws_access_key_id=aws_access_key_id, 1081 aws_secret_access_key=aws_secret_access_key, 1082 **kwargs 1083 ) 1084 1085 1086def connect_machinelearning(aws_access_key_id=None, 1087 aws_secret_access_key=None, 1088 **kwargs): 1089 """ 1090 Connect to Amazon Machine Learning service 1091 rtype: :class:`boto.machinelearning.layer1.MachineLearningConnection` 1092 :return: A connection to the Amazon Machine Learning service 1093 """ 1094 from boto.machinelearning.layer1 import MachineLearningConnection 1095 return MachineLearningConnection( 1096 aws_access_key_id=aws_access_key_id, 1097 aws_secret_access_key=aws_secret_access_key, 1098 **kwargs 1099 ) 1100 1101 1102def storage_uri(uri_str, default_scheme='file', debug=0, validate=True, 1103 bucket_storage_uri_class=BucketStorageUri, 1104 suppress_consec_slashes=True, is_latest=False): 1105 """ 1106 Instantiate a StorageUri from a URI string. 1107 1108 :type uri_str: string 1109 :param uri_str: URI naming bucket + optional object. 1110 :type default_scheme: string 1111 :param default_scheme: default scheme for scheme-less URIs. 1112 :type debug: int 1113 :param debug: debug level to pass in to boto connection (range 0..2). 1114 :type validate: bool 1115 :param validate: whether to check for bucket name validity. 1116 :type bucket_storage_uri_class: BucketStorageUri interface. 1117 :param bucket_storage_uri_class: Allows mocking for unit tests. 1118 :param suppress_consec_slashes: If provided, controls whether 1119 consecutive slashes will be suppressed in key paths. 1120 :type is_latest: bool 1121 :param is_latest: whether this versioned object represents the 1122 current version. 1123 1124 We allow validate to be disabled to allow caller 1125 to implement bucket-level wildcarding (outside the boto library; 1126 see gsutil). 1127 1128 :rtype: :class:`boto.StorageUri` subclass 1129 :return: StorageUri subclass for given URI. 1130 1131 ``uri_str`` must be one of the following formats: 1132 1133 * gs://bucket/name 1134 * gs://bucket/name#ver 1135 * s3://bucket/name 1136 * gs://bucket 1137 * s3://bucket 1138 * filename (which could be a Unix path like /a/b/c or a Windows path like 1139 C:\a\b\c) 1140 1141 The last example uses the default scheme ('file', unless overridden). 1142 """ 1143 version_id = None 1144 generation = None 1145 1146 # Manually parse URI components instead of using urlparse because 1147 # what we're calling URIs don't really fit the standard syntax for URIs 1148 # (the latter includes an optional host/net location part). 1149 end_scheme_idx = uri_str.find('://') 1150 if end_scheme_idx == -1: 1151 scheme = default_scheme.lower() 1152 path = uri_str 1153 else: 1154 scheme = uri_str[0:end_scheme_idx].lower() 1155 path = uri_str[end_scheme_idx + 3:] 1156 1157 if scheme not in ['file', 's3', 'gs']: 1158 raise InvalidUriError('Unrecognized scheme "%s"' % scheme) 1159 if scheme == 'file': 1160 # For file URIs we have no bucket name, and use the complete path 1161 # (minus 'file://') as the object name. 1162 is_stream = False 1163 if path == '-': 1164 is_stream = True 1165 return FileStorageUri(path, debug, is_stream) 1166 else: 1167 path_parts = path.split('/', 1) 1168 bucket_name = path_parts[0] 1169 object_name = '' 1170 # If validate enabled, ensure the bucket name is valid, to avoid 1171 # possibly confusing other parts of the code. (For example if we didn't 1172 # catch bucket names containing ':', when a user tried to connect to 1173 # the server with that name they might get a confusing error about 1174 # non-integer port numbers.) 1175 if (validate and bucket_name and 1176 (not BUCKET_NAME_RE.match(bucket_name) 1177 or TOO_LONG_DNS_NAME_COMP.search(bucket_name))): 1178 raise InvalidUriError('Invalid bucket name in URI "%s"' % uri_str) 1179 if scheme == 'gs': 1180 match = GENERATION_RE.search(path) 1181 if match: 1182 md = match.groupdict() 1183 versionless_uri_str = md['versionless_uri_str'] 1184 path_parts = versionless_uri_str.split('/', 1) 1185 generation = int(md['generation']) 1186 elif scheme == 's3': 1187 match = VERSION_RE.search(path) 1188 if match: 1189 md = match.groupdict() 1190 versionless_uri_str = md['versionless_uri_str'] 1191 path_parts = versionless_uri_str.split('/', 1) 1192 version_id = md['version_id'] 1193 else: 1194 raise InvalidUriError('Unrecognized scheme "%s"' % scheme) 1195 if len(path_parts) > 1: 1196 object_name = path_parts[1] 1197 return bucket_storage_uri_class( 1198 scheme, bucket_name, object_name, debug, 1199 suppress_consec_slashes=suppress_consec_slashes, 1200 version_id=version_id, generation=generation, is_latest=is_latest) 1201 1202 1203def storage_uri_for_key(key): 1204 """Returns a StorageUri for the given key. 1205 1206 :type key: :class:`boto.s3.key.Key` or subclass 1207 :param key: URI naming bucket + optional object. 1208 """ 1209 if not isinstance(key, boto.s3.key.Key): 1210 raise InvalidUriError('Requested key (%s) is not a subclass of ' 1211 'boto.s3.key.Key' % str(type(key))) 1212 prov_name = key.bucket.connection.provider.get_provider_name() 1213 uri_str = '%s://%s/%s' % (prov_name, key.bucket.name, key.name) 1214 return storage_uri(uri_str) 1215 1216boto.plugin.load_plugins(config) 1217