gcloud 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +4 -0
- data/Makefile +4 -0
- data/Manifest +760 -1
- data/bin/gcloud +7 -0
- data/bin/{gcutil → gcutil.symlink} +0 -0
- data/bin/gsutil-symlink +377 -0
- data/gcloud.gemspec +5 -5
- data/packages/gsutil/CHECKSUM +1 -0
- data/packages/gsutil/COPYING +202 -0
- data/packages/gsutil/LICENSE.third_party +295 -0
- data/packages/gsutil/MANIFEST.in +5 -0
- data/packages/gsutil/README +38 -0
- data/packages/gsutil/README.pkg +49 -0
- data/packages/gsutil/ReleaseNotes.txt +780 -0
- data/packages/gsutil/VERSION +1 -0
- data/packages/gsutil/boto/Changelog.rst +35 -0
- data/packages/gsutil/boto/LICENSE +18 -0
- data/packages/gsutil/boto/MANIFEST.in +12 -0
- data/packages/gsutil/boto/README.rst +163 -0
- data/packages/gsutil/boto/bin/asadmin +290 -0
- data/packages/gsutil/boto/bin/bundle_image +27 -0
- data/packages/gsutil/boto/bin/cfadmin +108 -0
- data/packages/gsutil/boto/bin/cq +89 -0
- data/packages/gsutil/boto/bin/cwutil +140 -0
- data/packages/gsutil/boto/bin/elbadmin +284 -0
- data/packages/gsutil/boto/bin/fetch_file +43 -0
- data/packages/gsutil/boto/bin/glacier +154 -0
- data/packages/gsutil/boto/bin/instance_events +145 -0
- data/packages/gsutil/boto/bin/kill_instance +35 -0
- data/packages/gsutil/boto/bin/launch_instance +252 -0
- data/packages/gsutil/boto/bin/list_instances +90 -0
- data/packages/gsutil/boto/bin/lss3 +77 -0
- data/packages/gsutil/boto/bin/mturk +465 -0
- data/packages/gsutil/boto/bin/pyami_sendmail +52 -0
- data/packages/gsutil/boto/bin/route53 +205 -0
- data/packages/gsutil/boto/bin/s3put +374 -0
- data/packages/gsutil/boto/bin/sdbadmin +194 -0
- data/packages/gsutil/boto/bin/taskadmin +116 -0
- data/packages/gsutil/boto/boto/__init__.py +793 -0
- data/packages/gsutil/boto/boto/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/auth.py +682 -0
- data/packages/gsutil/boto/boto/auth.pyc +0 -0
- data/packages/gsutil/boto/boto/auth_handler.py +58 -0
- data/packages/gsutil/boto/boto/auth_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/beanstalk/__init__.py +65 -0
- data/packages/gsutil/boto/boto/beanstalk/exception.py +64 -0
- data/packages/gsutil/boto/boto/beanstalk/layer1.py +1153 -0
- data/packages/gsutil/boto/boto/beanstalk/response.py +703 -0
- data/packages/gsutil/boto/boto/beanstalk/wrapper.py +29 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.py +22 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/cacerts/cacerts.txt +633 -0
- data/packages/gsutil/boto/boto/cloudformation/__init__.py +68 -0
- data/packages/gsutil/boto/boto/cloudformation/connection.py +364 -0
- data/packages/gsutil/boto/boto/cloudformation/stack.py +360 -0
- data/packages/gsutil/boto/boto/cloudformation/template.py +43 -0
- data/packages/gsutil/boto/boto/cloudfront/__init__.py +324 -0
- data/packages/gsutil/boto/boto/cloudfront/distribution.py +745 -0
- data/packages/gsutil/boto/boto/cloudfront/exception.py +26 -0
- data/packages/gsutil/boto/boto/cloudfront/identity.py +122 -0
- data/packages/gsutil/boto/boto/cloudfront/invalidation.py +216 -0
- data/packages/gsutil/boto/boto/cloudfront/logging.py +38 -0
- data/packages/gsutil/boto/boto/cloudfront/object.py +48 -0
- data/packages/gsutil/boto/boto/cloudfront/origin.py +150 -0
- data/packages/gsutil/boto/boto/cloudfront/signers.py +60 -0
- data/packages/gsutil/boto/boto/cloudsearch/__init__.py +45 -0
- data/packages/gsutil/boto/boto/cloudsearch/document.py +265 -0
- data/packages/gsutil/boto/boto/cloudsearch/domain.py +394 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer1.py +738 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer2.py +67 -0
- data/packages/gsutil/boto/boto/cloudsearch/optionstatus.py +248 -0
- data/packages/gsutil/boto/boto/cloudsearch/search.py +365 -0
- data/packages/gsutil/boto/boto/cloudsearch/sourceattribute.py +75 -0
- data/packages/gsutil/boto/boto/compat.py +28 -0
- data/packages/gsutil/boto/boto/compat.pyc +0 -0
- data/packages/gsutil/boto/boto/connection.py +1081 -0
- data/packages/gsutil/boto/boto/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/contrib/__init__.py +22 -0
- data/packages/gsutil/boto/boto/contrib/ymlmessage.py +52 -0
- data/packages/gsutil/boto/boto/core/README +58 -0
- data/packages/gsutil/boto/boto/core/__init__.py +23 -0
- data/packages/gsutil/boto/boto/core/auth.py +78 -0
- data/packages/gsutil/boto/boto/core/credentials.py +154 -0
- data/packages/gsutil/boto/boto/core/dictresponse.py +178 -0
- data/packages/gsutil/boto/boto/core/service.py +67 -0
- data/packages/gsutil/boto/boto/datapipeline/__init__.py +0 -0
- data/packages/gsutil/boto/boto/datapipeline/exceptions.py +42 -0
- data/packages/gsutil/boto/boto/datapipeline/layer1.py +546 -0
- data/packages/gsutil/boto/boto/dynamodb/__init__.py +66 -0
- data/packages/gsutil/boto/boto/dynamodb/batch.py +262 -0
- data/packages/gsutil/boto/boto/dynamodb/condition.py +170 -0
- data/packages/gsutil/boto/boto/dynamodb/exceptions.py +64 -0
- data/packages/gsutil/boto/boto/dynamodb/item.py +196 -0
- data/packages/gsutil/boto/boto/dynamodb/layer1.py +575 -0
- data/packages/gsutil/boto/boto/dynamodb/layer2.py +798 -0
- data/packages/gsutil/boto/boto/dynamodb/schema.py +112 -0
- data/packages/gsutil/boto/boto/dynamodb/table.py +540 -0
- data/packages/gsutil/boto/boto/dynamodb/types.py +326 -0
- data/packages/gsutil/boto/boto/ec2/__init__.py +96 -0
- data/packages/gsutil/boto/boto/ec2/address.py +103 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/__init__.py +781 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/activity.py +74 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/group.py +337 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/instance.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/launchconfig.py +209 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/policy.py +166 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/request.py +38 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/scheduled.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/tag.py +84 -0
- data/packages/gsutil/boto/boto/ec2/blockdevicemapping.py +141 -0
- data/packages/gsutil/boto/boto/ec2/bundleinstance.py +78 -0
- data/packages/gsutil/boto/boto/ec2/buyreservation.py +84 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/__init__.py +603 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/alarm.py +316 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/datapoint.py +40 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/dimension.py +38 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/listelement.py +31 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/metric.py +175 -0
- data/packages/gsutil/boto/boto/ec2/connection.py +3409 -0
- data/packages/gsutil/boto/boto/ec2/ec2object.py +107 -0
- data/packages/gsutil/boto/boto/ec2/elb/__init__.py +553 -0
- data/packages/gsutil/boto/boto/ec2/elb/healthcheck.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/instancestate.py +62 -0
- data/packages/gsutil/boto/boto/ec2/elb/listelement.py +36 -0
- data/packages/gsutil/boto/boto/ec2/elb/listener.py +75 -0
- data/packages/gsutil/boto/boto/ec2/elb/loadbalancer.py +324 -0
- data/packages/gsutil/boto/boto/ec2/elb/policies.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/securitygroup.py +38 -0
- data/packages/gsutil/boto/boto/ec2/group.py +39 -0
- data/packages/gsutil/boto/boto/ec2/image.py +350 -0
- data/packages/gsutil/boto/boto/ec2/instance.py +661 -0
- data/packages/gsutil/boto/boto/ec2/instanceinfo.py +51 -0
- data/packages/gsutil/boto/boto/ec2/instancestatus.py +207 -0
- data/packages/gsutil/boto/boto/ec2/keypair.py +113 -0
- data/packages/gsutil/boto/boto/ec2/launchspecification.py +105 -0
- data/packages/gsutil/boto/boto/ec2/networkinterface.py +247 -0
- data/packages/gsutil/boto/boto/ec2/placementgroup.py +51 -0
- data/packages/gsutil/boto/boto/ec2/regioninfo.py +34 -0
- data/packages/gsutil/boto/boto/ec2/reservedinstance.py +227 -0
- data/packages/gsutil/boto/boto/ec2/securitygroup.py +357 -0
- data/packages/gsutil/boto/boto/ec2/snapshot.py +170 -0
- data/packages/gsutil/boto/boto/ec2/spotdatafeedsubscription.py +63 -0
- data/packages/gsutil/boto/boto/ec2/spotinstancerequest.py +188 -0
- data/packages/gsutil/boto/boto/ec2/spotpricehistory.py +55 -0
- data/packages/gsutil/boto/boto/ec2/tag.py +87 -0
- data/packages/gsutil/boto/boto/ec2/vmtype.py +58 -0
- data/packages/gsutil/boto/boto/ec2/volume.py +293 -0
- data/packages/gsutil/boto/boto/ec2/volumestatus.py +200 -0
- data/packages/gsutil/boto/boto/ec2/zone.py +80 -0
- data/packages/gsutil/boto/boto/ecs/__init__.py +90 -0
- data/packages/gsutil/boto/boto/ecs/item.py +153 -0
- data/packages/gsutil/boto/boto/elasticache/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elasticache/layer1.py +1252 -0
- data/packages/gsutil/boto/boto/elastictranscoder/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elastictranscoder/exceptions.py +46 -0
- data/packages/gsutil/boto/boto/elastictranscoder/layer1.py +509 -0
- data/packages/gsutil/boto/boto/emr/__init__.py +73 -0
- data/packages/gsutil/boto/boto/emr/bootstrap_action.py +44 -0
- data/packages/gsutil/boto/boto/emr/connection.py +531 -0
- data/packages/gsutil/boto/boto/emr/emrobject.py +176 -0
- data/packages/gsutil/boto/boto/emr/instance_group.py +43 -0
- data/packages/gsutil/boto/boto/emr/step.py +281 -0
- data/packages/gsutil/boto/boto/exception.py +476 -0
- data/packages/gsutil/boto/boto/exception.pyc +0 -0
- data/packages/gsutil/boto/boto/file/README +49 -0
- data/packages/gsutil/boto/boto/file/__init__.py +28 -0
- data/packages/gsutil/boto/boto/file/bucket.py +112 -0
- data/packages/gsutil/boto/boto/file/connection.py +33 -0
- data/packages/gsutil/boto/boto/file/key.py +199 -0
- data/packages/gsutil/boto/boto/file/simpleresultset.py +30 -0
- data/packages/gsutil/boto/boto/fps/__init__.py +21 -0
- data/packages/gsutil/boto/boto/fps/connection.py +369 -0
- data/packages/gsutil/boto/boto/fps/exception.py +344 -0
- data/packages/gsutil/boto/boto/fps/response.py +175 -0
- data/packages/gsutil/boto/boto/glacier/__init__.py +57 -0
- data/packages/gsutil/boto/boto/glacier/concurrent.py +409 -0
- data/packages/gsutil/boto/boto/glacier/exceptions.py +58 -0
- data/packages/gsutil/boto/boto/glacier/job.py +152 -0
- data/packages/gsutil/boto/boto/glacier/layer1.py +637 -0
- data/packages/gsutil/boto/boto/glacier/layer2.py +93 -0
- data/packages/gsutil/boto/boto/glacier/response.py +48 -0
- data/packages/gsutil/boto/boto/glacier/utils.py +163 -0
- data/packages/gsutil/boto/boto/glacier/vault.py +387 -0
- data/packages/gsutil/boto/boto/glacier/writer.py +242 -0
- data/packages/gsutil/boto/boto/gs/__init__.py +22 -0
- data/packages/gsutil/boto/boto/gs/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/acl.py +304 -0
- data/packages/gsutil/boto/boto/gs/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucket.py +870 -0
- data/packages/gsutil/boto/boto/gs/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.py +64 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/connection.py +103 -0
- data/packages/gsutil/boto/boto/gs/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/cors.py +169 -0
- data/packages/gsutil/boto/boto/gs/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/key.py +704 -0
- data/packages/gsutil/boto/boto/gs/key.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.py +659 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/user.py +54 -0
- data/packages/gsutil/boto/boto/gs/user.pyc +0 -0
- data/packages/gsutil/boto/boto/handler.py +44 -0
- data/packages/gsutil/boto/boto/handler.pyc +0 -0
- data/packages/gsutil/boto/boto/https_connection.py +124 -0
- data/packages/gsutil/boto/boto/https_connection.pyc +0 -0
- data/packages/gsutil/boto/boto/iam/__init__.py +74 -0
- data/packages/gsutil/boto/boto/iam/connection.py +1317 -0
- data/packages/gsutil/boto/boto/iam/summarymap.py +42 -0
- data/packages/gsutil/boto/boto/jsonresponse.py +163 -0
- data/packages/gsutil/boto/boto/jsonresponse.pyc +0 -0
- data/packages/gsutil/boto/boto/manage/__init__.py +23 -0
- data/packages/gsutil/boto/boto/manage/cmdshell.py +241 -0
- data/packages/gsutil/boto/boto/manage/propget.py +64 -0
- data/packages/gsutil/boto/boto/manage/server.py +556 -0
- data/packages/gsutil/boto/boto/manage/task.py +175 -0
- data/packages/gsutil/boto/boto/manage/test_manage.py +34 -0
- data/packages/gsutil/boto/boto/manage/volume.py +420 -0
- data/packages/gsutil/boto/boto/mashups/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mashups/interactive.py +97 -0
- data/packages/gsutil/boto/boto/mashups/iobject.py +115 -0
- data/packages/gsutil/boto/boto/mashups/order.py +211 -0
- data/packages/gsutil/boto/boto/mashups/server.py +395 -0
- data/packages/gsutil/boto/boto/mturk/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mturk/connection.py +1027 -0
- data/packages/gsutil/boto/boto/mturk/layoutparam.py +55 -0
- data/packages/gsutil/boto/boto/mturk/notification.py +103 -0
- data/packages/gsutil/boto/boto/mturk/price.py +48 -0
- data/packages/gsutil/boto/boto/mturk/qualification.py +137 -0
- data/packages/gsutil/boto/boto/mturk/question.py +455 -0
- data/packages/gsutil/boto/boto/mws/__init__.py +21 -0
- data/packages/gsutil/boto/boto/mws/connection.py +813 -0
- data/packages/gsutil/boto/boto/mws/exception.py +75 -0
- data/packages/gsutil/boto/boto/mws/response.py +655 -0
- data/packages/gsutil/boto/boto/plugin.py +90 -0
- data/packages/gsutil/boto/boto/plugin.pyc +0 -0
- data/packages/gsutil/boto/boto/provider.py +337 -0
- data/packages/gsutil/boto/boto/provider.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/bootstrap.py +134 -0
- data/packages/gsutil/boto/boto/pyami/config.py +229 -0
- data/packages/gsutil/boto/boto/pyami/config.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/copybot.cfg +60 -0
- data/packages/gsutil/boto/boto/pyami/copybot.py +97 -0
- data/packages/gsutil/boto/boto/pyami/helloworld.py +28 -0
- data/packages/gsutil/boto/boto/pyami/installers/__init__.py +64 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/apache.py +43 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/ebs.py +238 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/installer.py +96 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/mysql.py +109 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/trac.py +139 -0
- data/packages/gsutil/boto/boto/pyami/launch_ami.py +178 -0
- data/packages/gsutil/boto/boto/pyami/scriptbase.py +44 -0
- data/packages/gsutil/boto/boto/pyami/startup.py +60 -0
- data/packages/gsutil/boto/boto/rds/__init__.py +1194 -0
- data/packages/gsutil/boto/boto/rds/dbinstance.py +357 -0
- data/packages/gsutil/boto/boto/rds/dbsecuritygroup.py +177 -0
- data/packages/gsutil/boto/boto/rds/dbsnapshot.py +108 -0
- data/packages/gsutil/boto/boto/rds/event.py +49 -0
- data/packages/gsutil/boto/boto/rds/parametergroup.py +201 -0
- data/packages/gsutil/boto/boto/rds/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/regioninfo.py +63 -0
- data/packages/gsutil/boto/boto/regioninfo.pyc +0 -0
- data/packages/gsutil/boto/boto/resultset.py +169 -0
- data/packages/gsutil/boto/boto/resultset.pyc +0 -0
- data/packages/gsutil/boto/boto/roboto/__init__.py +1 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryrequest.py +504 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryservice.py +121 -0
- data/packages/gsutil/boto/boto/roboto/param.py +147 -0
- data/packages/gsutil/boto/boto/route53/__init__.py +75 -0
- data/packages/gsutil/boto/boto/route53/connection.py +403 -0
- data/packages/gsutil/boto/boto/route53/exception.py +27 -0
- data/packages/gsutil/boto/boto/route53/hostedzone.py +56 -0
- data/packages/gsutil/boto/boto/route53/record.py +306 -0
- data/packages/gsutil/boto/boto/route53/status.py +42 -0
- data/packages/gsutil/boto/boto/route53/zone.py +412 -0
- data/packages/gsutil/boto/boto/s3/__init__.py +84 -0
- data/packages/gsutil/boto/boto/s3/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/acl.py +164 -0
- data/packages/gsutil/boto/boto/s3/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucket.py +1634 -0
- data/packages/gsutil/boto/boto/s3/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.py +139 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.py +83 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/connection.py +540 -0
- data/packages/gsutil/boto/boto/s3/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/cors.py +210 -0
- data/packages/gsutil/boto/boto/s3/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.py +55 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/key.py +1712 -0
- data/packages/gsutil/boto/boto/s3/key.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/keyfile.py +134 -0
- data/packages/gsutil/boto/boto/s3/keyfile.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.py +231 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multidelete.py +138 -0
- data/packages/gsutil/boto/boto/s3/multidelete.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multipart.py +315 -0
- data/packages/gsutil/boto/boto/s3/multipart.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/prefix.py +42 -0
- data/packages/gsutil/boto/boto/s3/prefix.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.py +339 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/tagging.py +71 -0
- data/packages/gsutil/boto/boto/s3/tagging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/user.py +49 -0
- data/packages/gsutil/boto/boto/s3/user.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/website.py +237 -0
- data/packages/gsutil/boto/boto/s3/website.pyc +0 -0
- data/packages/gsutil/boto/boto/sdb/__init__.py +67 -0
- data/packages/gsutil/boto/boto/sdb/connection.py +617 -0
- data/packages/gsutil/boto/boto/sdb/db/__init__.py +20 -0
- data/packages/gsutil/boto/boto/sdb/db/blob.py +75 -0
- data/packages/gsutil/boto/boto/sdb/db/key.py +59 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/__init__.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/sdbmanager.py +732 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/xmlmanager.py +517 -0
- data/packages/gsutil/boto/boto/sdb/db/model.py +294 -0
- data/packages/gsutil/boto/boto/sdb/db/property.py +703 -0
- data/packages/gsutil/boto/boto/sdb/db/query.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/sequence.py +226 -0
- data/packages/gsutil/boto/boto/sdb/db/test_db.py +231 -0
- data/packages/gsutil/boto/boto/sdb/domain.py +377 -0
- data/packages/gsutil/boto/boto/sdb/item.py +181 -0
- data/packages/gsutil/boto/boto/sdb/queryresultset.py +92 -0
- data/packages/gsutil/boto/boto/sdb/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/services/__init__.py +23 -0
- data/packages/gsutil/boto/boto/services/bs.py +179 -0
- data/packages/gsutil/boto/boto/services/message.py +58 -0
- data/packages/gsutil/boto/boto/services/result.py +136 -0
- data/packages/gsutil/boto/boto/services/service.py +161 -0
- data/packages/gsutil/boto/boto/services/servicedef.py +91 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.cfg +43 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.py +81 -0
- data/packages/gsutil/boto/boto/services/submit.py +88 -0
- data/packages/gsutil/boto/boto/ses/__init__.py +54 -0
- data/packages/gsutil/boto/boto/ses/connection.py +521 -0
- data/packages/gsutil/boto/boto/ses/exceptions.py +77 -0
- data/packages/gsutil/boto/boto/sns/__init__.py +78 -0
- data/packages/gsutil/boto/boto/sns/connection.py +431 -0
- data/packages/gsutil/boto/boto/sqs/__init__.py +56 -0
- data/packages/gsutil/boto/boto/sqs/attributes.py +46 -0
- data/packages/gsutil/boto/boto/sqs/batchresults.py +95 -0
- data/packages/gsutil/boto/boto/sqs/connection.py +417 -0
- data/packages/gsutil/boto/boto/sqs/jsonmessage.py +43 -0
- data/packages/gsutil/boto/boto/sqs/message.py +253 -0
- data/packages/gsutil/boto/boto/sqs/queue.py +478 -0
- data/packages/gsutil/boto/boto/sqs/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/storage_uri.py +835 -0
- data/packages/gsutil/boto/boto/storage_uri.pyc +0 -0
- data/packages/gsutil/boto/boto/sts/__init__.py +55 -0
- data/packages/gsutil/boto/boto/sts/connection.py +207 -0
- data/packages/gsutil/boto/boto/sts/credentials.py +215 -0
- data/packages/gsutil/boto/boto/swf/__init__.py +60 -0
- data/packages/gsutil/boto/boto/swf/exceptions.py +44 -0
- data/packages/gsutil/boto/boto/swf/layer1.py +1512 -0
- data/packages/gsutil/boto/boto/swf/layer1_decisions.py +287 -0
- data/packages/gsutil/boto/boto/swf/layer2.py +342 -0
- data/packages/gsutil/boto/boto/utils.py +927 -0
- data/packages/gsutil/boto/boto/utils.pyc +0 -0
- data/packages/gsutil/boto/boto/vpc/__init__.py +910 -0
- data/packages/gsutil/boto/boto/vpc/customergateway.py +54 -0
- data/packages/gsutil/boto/boto/vpc/dhcpoptions.py +72 -0
- data/packages/gsutil/boto/boto/vpc/internetgateway.py +72 -0
- data/packages/gsutil/boto/boto/vpc/routetable.py +109 -0
- data/packages/gsutil/boto/boto/vpc/subnet.py +57 -0
- data/packages/gsutil/boto/boto/vpc/vpc.py +54 -0
- data/packages/gsutil/boto/boto/vpc/vpnconnection.py +60 -0
- data/packages/gsutil/boto/boto/vpc/vpngateway.py +83 -0
- data/packages/gsutil/boto/docs/BotoCheatSheet.pdf +0 -0
- data/packages/gsutil/boto/docs/Makefile +89 -0
- data/packages/gsutil/boto/docs/make.bat +113 -0
- data/packages/gsutil/boto/docs/source/_templates/layout.html +3 -0
- data/packages/gsutil/boto/docs/source/autoscale_tut.rst +220 -0
- data/packages/gsutil/boto/docs/source/boto_config_tut.rst +125 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/boto.css_t +239 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/pygments.css +61 -0
- data/packages/gsutil/boto/docs/source/boto_theme/theme.conf +3 -0
- data/packages/gsutil/boto/docs/source/cloudfront_tut.rst +196 -0
- data/packages/gsutil/boto/docs/source/cloudsearch_tut.rst +411 -0
- data/packages/gsutil/boto/docs/source/cloudwatch_tut.rst +116 -0
- data/packages/gsutil/boto/docs/source/conf.py +32 -0
- data/packages/gsutil/boto/docs/source/contributing.rst +204 -0
- data/packages/gsutil/boto/docs/source/documentation.rst +59 -0
- data/packages/gsutil/boto/docs/source/dynamodb_tut.rst +339 -0
- data/packages/gsutil/boto/docs/source/ec2_tut.rst +86 -0
- data/packages/gsutil/boto/docs/source/elb_tut.rst +257 -0
- data/packages/gsutil/boto/docs/source/emr_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/index.rst +146 -0
- data/packages/gsutil/boto/docs/source/rds_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/ref/autoscale.rst +62 -0
- data/packages/gsutil/boto/docs/source/ref/beanstalk.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/boto.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/cloudformation.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/cloudfront.rst +68 -0
- data/packages/gsutil/boto/docs/source/ref/cloudsearch.rst +59 -0
- data/packages/gsutil/boto/docs/source/ref/cloudwatch.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/contrib.rst +32 -0
- data/packages/gsutil/boto/docs/source/ref/datapipeline.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/dynamodb.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ec2.rst +140 -0
- data/packages/gsutil/boto/docs/source/ref/ecs.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elasticache.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elastictranscoder.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/elb.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/emr.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/file.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/fps.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/glacier.rst +63 -0
- data/packages/gsutil/boto/docs/source/ref/gs.rst +72 -0
- data/packages/gsutil/boto/docs/source/ref/iam.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/index.rst +40 -0
- data/packages/gsutil/boto/docs/source/ref/manage.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/mturk.rst +54 -0
- data/packages/gsutil/boto/docs/source/ref/mws.rst +33 -0
- data/packages/gsutil/boto/docs/source/ref/pyami.rst +103 -0
- data/packages/gsutil/boto/docs/source/ref/rds.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/route53.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/s3.rst +111 -0
- data/packages/gsutil/boto/docs/source/ref/sdb.rst +45 -0
- data/packages/gsutil/boto/docs/source/ref/sdb_db.rst +83 -0
- data/packages/gsutil/boto/docs/source/ref/services.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ses.rst +21 -0
- data/packages/gsutil/boto/docs/source/ref/sns.rst +17 -0
- data/packages/gsutil/boto/docs/source/ref/sqs.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/sts.rst +25 -0
- data/packages/gsutil/boto/docs/source/ref/swf.rst +22 -0
- data/packages/gsutil/boto/docs/source/ref/vpc.rst +54 -0
- data/packages/gsutil/boto/docs/source/s3_tut.rst +450 -0
- data/packages/gsutil/boto/docs/source/security_groups.rst +82 -0
- data/packages/gsutil/boto/docs/source/ses_tut.rst +171 -0
- data/packages/gsutil/boto/docs/source/simpledb_tut.rst +188 -0
- data/packages/gsutil/boto/docs/source/sqs_tut.rst +246 -0
- data/packages/gsutil/boto/docs/source/vpc_tut.rst +100 -0
- data/packages/gsutil/boto/pylintrc +305 -0
- data/packages/gsutil/boto/requirements.txt +10 -0
- data/packages/gsutil/boto/setup.py +89 -0
- data/packages/gsutil/boto/tests/__init__.py +20 -0
- data/packages/gsutil/boto/tests/db/test_lists.py +96 -0
- data/packages/gsutil/boto/tests/db/test_password.py +128 -0
- data/packages/gsutil/boto/tests/db/test_query.py +152 -0
- data/packages/gsutil/boto/tests/db/test_sequence.py +109 -0
- data/packages/gsutil/boto/tests/devpay/__init__.py +0 -0
- data/packages/gsutil/boto/tests/devpay/test_s3.py +181 -0
- data/packages/gsutil/boto/tests/fps/__init__.py +0 -0
- data/packages/gsutil/boto/tests/fps/test.py +100 -0
- data/packages/gsutil/boto/tests/fps/test_verify_signature.py +12 -0
- data/packages/gsutil/boto/tests/integration/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/beanstalk/test_wrapper.py +209 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_connection.py +110 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/datapipeline/test_layer1.py +122 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer1.py +266 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer2.py +484 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_table.py +84 -0
- data/packages/gsutil/boto/tests/integration/ec2/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_connection.py +167 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_connection.py +277 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_connection.py +130 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_connection.py +192 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/test_connection.py +95 -0
- data/packages/gsutil/boto/tests/integration/elasticache/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elasticache/test_layer1.py +67 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_cert_verification.py +35 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_layer1.py +115 -0
- data/packages/gsutil/boto/tests/integration/emr/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/emr/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/__init__.py +22 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer1.py +44 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer2.py +45 -0
- data/packages/gsutil/boto/tests/integration/gs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/gs/cb_test_harness.py +71 -0
- data/packages/gsutil/boto/tests/integration/gs/test_basic.py +379 -0
- data/packages/gsutil/boto/tests/integration/gs/test_generation_conditionals.py +399 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_downloads.py +358 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_uploads.py +525 -0
- data/packages/gsutil/boto/tests/integration/gs/test_storage_uri.py +125 -0
- data/packages/gsutil/boto/tests/integration/gs/test_versioning.py +268 -0
- data/packages/gsutil/boto/tests/integration/gs/testcase.py +116 -0
- data/packages/gsutil/boto/tests/integration/gs/util.py +63 -0
- data/packages/gsutil/boto/tests/integration/iam/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/iam/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/mws/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/mws/test.py +100 -0
- data/packages/gsutil/boto/tests/integration/rds/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/rds/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/route53/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/test_zone.py +132 -0
- data/packages/gsutil/boto/tests/integration/s3/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/s3/mock_storage_service.py +589 -0
- data/packages/gsutil/boto/tests/integration/s3/other_cacerts.txt +70 -0
- data/packages/gsutil/boto/tests/integration/s3/test_bucket.py +263 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/s3/test_connection.py +245 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cors.py +78 -0
- data/packages/gsutil/boto/tests/integration/s3/test_encryption.py +115 -0
- data/packages/gsutil/boto/tests/integration/s3/test_https_cert_validation.py +141 -0
- data/packages/gsutil/boto/tests/integration/s3/test_key.py +375 -0
- data/packages/gsutil/boto/tests/integration/s3/test_mfa.py +95 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multidelete.py +181 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multipart.py +139 -0
- data/packages/gsutil/boto/tests/integration/s3/test_pool.py +246 -0
- data/packages/gsutil/boto/tests/integration/s3/test_versioning.py +158 -0
- data/packages/gsutil/boto/tests/integration/sdb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_connection.py +119 -0
- data/packages/gsutil/boto/tests/integration/ses/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ses/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ses/test_connection.py +38 -0
- data/packages/gsutil/boto/tests/integration/sns/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sns/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_connection.py +217 -0
- data/packages/gsutil/boto/tests/integration/sts/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sts/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sts/test_session_token.py +65 -0
- data/packages/gsutil/boto/tests/integration/swf/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/swf/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1.py +246 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1_workflow_execution.py +173 -0
- data/packages/gsutil/boto/tests/mturk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/mturk/_init_environment.py +28 -0
- data/packages/gsutil/boto/tests/mturk/all_tests.py +24 -0
- data/packages/gsutil/boto/tests/mturk/cleanup_tests.py +47 -0
- data/packages/gsutil/boto/tests/mturk/common.py +45 -0
- data/packages/gsutil/boto/tests/mturk/create_free_text_question_regex.doctest +100 -0
- data/packages/gsutil/boto/tests/mturk/create_hit.doctest +92 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_binary.doctest +94 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_external.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_from_hit_type.doctest +103 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_test.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_with_qualifications.py +16 -0
- data/packages/gsutil/boto/tests/mturk/hit_persistence.py +27 -0
- data/packages/gsutil/boto/tests/mturk/mocks.py +11 -0
- data/packages/gsutil/boto/tests/mturk/reviewable_hits.doctest +129 -0
- data/packages/gsutil/boto/tests/mturk/run-doctest.py +13 -0
- data/packages/gsutil/boto/tests/mturk/search_hits.doctest +16 -0
- data/packages/gsutil/boto/tests/mturk/selenium_support.py +61 -0
- data/packages/gsutil/boto/tests/mturk/support.py +7 -0
- data/packages/gsutil/boto/tests/mturk/test_disable_hit.py +11 -0
- data/packages/gsutil/boto/tests/test.py +59 -0
- data/packages/gsutil/boto/tests/unit/__init__.py +79 -0
- data/packages/gsutil/boto/tests/unit/auth/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/auth/test_sigv4.py +73 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/test_layer1.py +128 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_connection.py +605 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_stack.py +63 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_invalidation_list.py +113 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_signed_urls.py +354 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/__init__.py +1 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_connection.py +241 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_document.py +324 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_search.py +325 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_batch.py +103 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_layer2.py +119 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_types.py +82 -0
- data/packages/gsutil/boto/tests/unit/ec2/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/test_group.py +162 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_address.py +39 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_blockdevicemapping.py +79 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_connection.py +480 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_instance.py +243 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_networkinterface.py +140 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_volume.py +248 -0
- data/packages/gsutil/boto/tests/unit/emr/test_emr_responses.py +373 -0
- data/packages/gsutil/boto/tests/unit/glacier/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_concurrent.py +120 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_job.py +60 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer1.py +98 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer2.py +266 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_utils.py +116 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_vault.py +100 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_writer.py +185 -0
- data/packages/gsutil/boto/tests/unit/provider/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/provider/test_provider.py +176 -0
- data/packages/gsutil/boto/tests/unit/rds/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/rds/test_connection.py +131 -0
- data/packages/gsutil/boto/tests/unit/s3/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/s3/test_cors_configuration.py +77 -0
- data/packages/gsutil/boto/tests/unit/s3/test_key.py +75 -0
- data/packages/gsutil/boto/tests/unit/s3/test_keyfile.py +101 -0
- data/packages/gsutil/boto/tests/unit/s3/test_lifecycle.py +97 -0
- data/packages/gsutil/boto/tests/unit/s3/test_tagging.py +47 -0
- data/packages/gsutil/boto/tests/unit/s3/test_uri.py +257 -0
- data/packages/gsutil/boto/tests/unit/s3/test_website.py +188 -0
- data/packages/gsutil/boto/tests/unit/sns/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sns/test_connection.py +99 -0
- data/packages/gsutil/boto/tests/unit/sqs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_connection.py +98 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_queue.py +40 -0
- data/packages/gsutil/boto/tests/unit/sts/test_connection.py +74 -0
- data/packages/gsutil/boto/tests/unit/test_connection.py +60 -0
- data/packages/gsutil/boto/tests/unit/utils/test_utils.py +109 -0
- data/packages/gsutil/boto/tox.ini +8 -0
- data/packages/gsutil/gslib/README +5 -0
- data/packages/gsutil/gslib/__init__.py +22 -0
- data/packages/gsutil/gslib/__init__.pyc +0 -0
- data/packages/gsutil/gslib/addlhelp/__init__.py +15 -0
- data/packages/gsutil/gslib/addlhelp/acls.py +234 -0
- data/packages/gsutil/gslib/addlhelp/anon.py +57 -0
- data/packages/gsutil/gslib/addlhelp/command_opts.py +116 -0
- data/packages/gsutil/gslib/addlhelp/dev.py +139 -0
- data/packages/gsutil/gslib/addlhelp/metadata.py +186 -0
- data/packages/gsutil/gslib/addlhelp/naming.py +173 -0
- data/packages/gsutil/gslib/addlhelp/prod.py +160 -0
- data/packages/gsutil/gslib/addlhelp/projects.py +130 -0
- data/packages/gsutil/gslib/addlhelp/subdirs.py +110 -0
- data/packages/gsutil/gslib/addlhelp/support.py +86 -0
- data/packages/gsutil/gslib/addlhelp/versioning.py +242 -0
- data/packages/gsutil/gslib/addlhelp/wildcards.py +170 -0
- data/packages/gsutil/gslib/bucket_listing_ref.py +175 -0
- data/packages/gsutil/gslib/bucket_listing_ref.pyc +0 -0
- data/packages/gsutil/gslib/command.py +722 -0
- data/packages/gsutil/gslib/command.pyc +0 -0
- data/packages/gsutil/gslib/command_runner.py +101 -0
- data/packages/gsutil/gslib/command_runner.pyc +0 -0
- data/packages/gsutil/gslib/commands/__init__.py +15 -0
- data/packages/gsutil/gslib/commands/__init__.pyc +0 -0
- data/packages/gsutil/gslib/commands/cat.py +131 -0
- data/packages/gsutil/gslib/commands/cat.pyc +0 -0
- data/packages/gsutil/gslib/commands/chacl.py +532 -0
- data/packages/gsutil/gslib/commands/chacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/config.py +694 -0
- data/packages/gsutil/gslib/commands/config.pyc +0 -0
- data/packages/gsutil/gslib/commands/cp.py +1818 -0
- data/packages/gsutil/gslib/commands/cp.pyc +0 -0
- data/packages/gsutil/gslib/commands/disablelogging.py +101 -0
- data/packages/gsutil/gslib/commands/disablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/enablelogging.py +149 -0
- data/packages/gsutil/gslib/commands/enablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getacl.py +82 -0
- data/packages/gsutil/gslib/commands/getacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getcors.py +121 -0
- data/packages/gsutil/gslib/commands/getcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/getdefacl.py +86 -0
- data/packages/gsutil/gslib/commands/getdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getlogging.py +137 -0
- data/packages/gsutil/gslib/commands/getlogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getversioning.py +116 -0
- data/packages/gsutil/gslib/commands/getversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/getwebcfg.py +122 -0
- data/packages/gsutil/gslib/commands/getwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/help.py +218 -0
- data/packages/gsutil/gslib/commands/help.pyc +0 -0
- data/packages/gsutil/gslib/commands/ls.py +578 -0
- data/packages/gsutil/gslib/commands/ls.pyc +0 -0
- data/packages/gsutil/gslib/commands/mb.py +172 -0
- data/packages/gsutil/gslib/commands/mb.pyc +0 -0
- data/packages/gsutil/gslib/commands/mv.py +159 -0
- data/packages/gsutil/gslib/commands/mv.pyc +0 -0
- data/packages/gsutil/gslib/commands/perfdiag.py +903 -0
- data/packages/gsutil/gslib/commands/perfdiag.pyc +0 -0
- data/packages/gsutil/gslib/commands/rb.py +113 -0
- data/packages/gsutil/gslib/commands/rb.pyc +0 -0
- data/packages/gsutil/gslib/commands/rm.py +239 -0
- data/packages/gsutil/gslib/commands/rm.pyc +0 -0
- data/packages/gsutil/gslib/commands/setacl.py +138 -0
- data/packages/gsutil/gslib/commands/setacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setcors.py +145 -0
- data/packages/gsutil/gslib/commands/setcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/setdefacl.py +105 -0
- data/packages/gsutil/gslib/commands/setdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setmeta.py +428 -0
- data/packages/gsutil/gslib/commands/setmeta.pyc +0 -0
- data/packages/gsutil/gslib/commands/setversioning.py +114 -0
- data/packages/gsutil/gslib/commands/setversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/setwebcfg.py +190 -0
- data/packages/gsutil/gslib/commands/setwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/test.py +228 -0
- data/packages/gsutil/gslib/commands/test.pyc +0 -0
- data/packages/gsutil/gslib/commands/update.py +305 -0
- data/packages/gsutil/gslib/commands/update.pyc +0 -0
- data/packages/gsutil/gslib/commands/version.py +150 -0
- data/packages/gsutil/gslib/commands/version.pyc +0 -0
- data/packages/gsutil/gslib/exception.py +76 -0
- data/packages/gsutil/gslib/exception.pyc +0 -0
- data/packages/gsutil/gslib/help_provider.py +81 -0
- data/packages/gsutil/gslib/help_provider.pyc +0 -0
- data/packages/gsutil/gslib/name_expansion.py +550 -0
- data/packages/gsutil/gslib/name_expansion.pyc +0 -0
- data/packages/gsutil/gslib/no_op_auth_plugin.py +30 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.py +56 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.pyc +0 -0
- data/packages/gsutil/gslib/project_id.py +67 -0
- data/packages/gsutil/gslib/project_id.pyc +0 -0
- data/packages/gsutil/gslib/storage_uri_builder.py +56 -0
- data/packages/gsutil/gslib/storage_uri_builder.pyc +0 -0
- data/packages/gsutil/gslib/tests/__init__.py +15 -0
- data/packages/gsutil/gslib/tests/__init__.pyc +0 -0
- data/packages/gsutil/gslib/tests/test_chacl.py +236 -0
- data/packages/gsutil/gslib/tests/test_cp.py +267 -0
- data/packages/gsutil/gslib/tests/test_data/test.gif +0 -0
- data/packages/gsutil/gslib/tests/test_data/test.mp3 +0 -0
- data/packages/gsutil/gslib/tests/test_ls.py +66 -0
- data/packages/gsutil/gslib/tests/test_mv.py +69 -0
- data/packages/gsutil/gslib/tests/test_naming.py +989 -0
- data/packages/gsutil/gslib/tests/test_perfdiag.py +41 -0
- data/packages/gsutil/gslib/tests/test_plurality_checkable_iterator.py +67 -0
- data/packages/gsutil/gslib/tests/test_rm.py +143 -0
- data/packages/gsutil/gslib/tests/test_setacl.py +152 -0
- data/packages/gsutil/gslib/tests/test_setcors.py +168 -0
- data/packages/gsutil/gslib/tests/test_setmeta.py +91 -0
- data/packages/gsutil/gslib/tests/test_setversioning.py +44 -0
- data/packages/gsutil/gslib/tests/test_setwebcfg.py +63 -0
- data/packages/gsutil/gslib/tests/test_thread_pool.py +92 -0
- data/packages/gsutil/gslib/tests/test_wildcard_iterator.py +364 -0
- data/packages/gsutil/gslib/tests/testcase/__init__.py +18 -0
- data/packages/gsutil/gslib/tests/testcase/base.py +89 -0
- data/packages/gsutil/gslib/tests/testcase/integration_testcase.py +197 -0
- data/packages/gsutil/gslib/tests/testcase/unit_testcase.py +230 -0
- data/packages/gsutil/gslib/tests/util.py +125 -0
- data/packages/gsutil/gslib/tests/util.pyc +0 -0
- data/packages/gsutil/gslib/thread_pool.py +79 -0
- data/packages/gsutil/gslib/thread_pool.pyc +0 -0
- data/packages/gsutil/gslib/util.py +151 -0
- data/packages/gsutil/gslib/util.pyc +0 -0
- data/packages/gsutil/gslib/wildcard_iterator.py +492 -0
- data/packages/gsutil/gslib/wildcard_iterator.pyc +0 -0
- data/packages/gsutil/gsutil +377 -0
- data/packages/gsutil/gsutil.spec.in +75 -0
- data/packages/gsutil/oauth2_plugin/__init__.py +22 -0
- data/packages/gsutil/oauth2_plugin/__init__.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.py +642 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client_test.py +374 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.py +110 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.py +24 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.pyc +0 -0
- data/packages/gsutil/pkg_gen.sh +54 -0
- data/packages/gsutil/pkg_util.py +60 -0
- data/packages/gsutil/setup.py +141 -0
- data/packages/gsutil/third_party/__init__.py +0 -0
- data/packages/gsutil/third_party/__init__.pyc +0 -0
- data/packages/gsutil/third_party/fancy_urllib/README +21 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.py +398 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.pyc +0 -0
- data/tasks/rubygem.rake +3 -1
- metadata +770 -7
- metadata.gz.sig +0 -0
|
Binary file
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from boto.auth_handler import AuthHandler
|
|
2
|
+
from boto.auth_handler import NotReadyToAuthenticate
|
|
3
|
+
import oauth2_client
|
|
4
|
+
import oauth2_helper
|
|
5
|
+
|
|
6
|
+
class OAuth2Auth(AuthHandler):
|
|
7
|
+
|
|
8
|
+
capability = ['google-oauth2', 's3']
|
|
9
|
+
|
|
10
|
+
def __init__(self, path, config, provider):
|
|
11
|
+
if (provider.name == 'google'
|
|
12
|
+
and config.has_option('Credentials', 'gs_oauth2_refresh_token')):
|
|
13
|
+
|
|
14
|
+
self.oauth2_client = oauth2_helper.OAuth2ClientFromBotoConfig(config)
|
|
15
|
+
|
|
16
|
+
self.refresh_token = oauth2_client.RefreshToken(
|
|
17
|
+
self.oauth2_client,
|
|
18
|
+
config.get('Credentials', 'gs_oauth2_refresh_token'))
|
|
19
|
+
else:
|
|
20
|
+
raise NotReadyToAuthenticate()
|
|
21
|
+
|
|
22
|
+
def add_auth(self, http_request):
|
|
23
|
+
http_request.headers['Authorization'] = \
|
|
24
|
+
self.refresh_token.GetAuthorizationHeader()
|
|
Binary file
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
|
|
3
|
+
# Utility command to generate an rpm package file for gsutil.
|
|
4
|
+
# This tool takes no arguments and leaves the resulting rpm package
|
|
5
|
+
# file at this location under your home rpmbuild tree:
|
|
6
|
+
# $HOME/rpmbuild/RPMS/noarch/gsutil-$VERSION-<N>.noarch.rpm
|
|
7
|
+
# where <N> is the build number.
|
|
8
|
+
|
|
9
|
+
SPEC_FILE_IN=gsutil.spec.in
|
|
10
|
+
SPEC_FILE=gsutil.spec
|
|
11
|
+
|
|
12
|
+
# Pre-process the rpm spec file.
|
|
13
|
+
python pkg_util.py
|
|
14
|
+
|
|
15
|
+
# Get package name and version from spec file.
|
|
16
|
+
NAME=`awk <$SPEC_FILE '/^Name:/ {print $2}'`
|
|
17
|
+
if [ "$NAME" = "" ]
|
|
18
|
+
then
|
|
19
|
+
echo "Error: Name variable not set properly in $SPEC_FILE."
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
VERSION=`awk <$SPEC_FILE '/^Version:/ {print $2}'`
|
|
24
|
+
ROOT=$NAME-$VERSION
|
|
25
|
+
STAGING_DIR=$HOME/rpmbuild/SOURCES/$ROOT
|
|
26
|
+
|
|
27
|
+
# Update VERSION file to reflect current version.
|
|
28
|
+
echo $VERSION >VERSION
|
|
29
|
+
|
|
30
|
+
# Make sure STAGING_DIR is set so we don't do a recursive rm below
|
|
31
|
+
# on an indeterminate location.
|
|
32
|
+
if [ "$STAGING_DIR" = "" ]
|
|
33
|
+
then
|
|
34
|
+
echo "Can't proceed - STAGING_DIR not set properly."
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Create staging dir and copy package files there, filtering .svn dirs
|
|
39
|
+
# and .pyc files.
|
|
40
|
+
rm -rf $STAGING_DIR
|
|
41
|
+
mkdir -p $STAGING_DIR
|
|
42
|
+
find . -print | grep -v "\.svn" | grep -v "\.pyc$" | cpio -pud $STAGING_DIR
|
|
43
|
+
|
|
44
|
+
# Generate archive from staging area contents, then clean up staging area.
|
|
45
|
+
CUR_DIR=$PWD
|
|
46
|
+
cd $STAGING_DIR/..
|
|
47
|
+
zip -r $ROOT.zip $ROOT
|
|
48
|
+
|
|
49
|
+
cd $CUR_DIR
|
|
50
|
+
rm -rf $STAGING_DIR
|
|
51
|
+
|
|
52
|
+
# New build RPM package based on generated spec file and archive contents.
|
|
53
|
+
rpmbuild -ba gsutil.spec
|
|
54
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
# Utilities to facilitate maintaining one master list of package contents
|
|
4
|
+
# in MANIFEST.in and allow us to import that list into various packaging
|
|
5
|
+
# tools (e.g. rpmbuid and setup.py).
|
|
6
|
+
|
|
7
|
+
# Define the file in which we maintain package contents. Rather than
|
|
8
|
+
# hard-coding our package contents, to ease maintenance we read the
|
|
9
|
+
# manifest file to obtain the list of files and directories to include.
|
|
10
|
+
MANIFEST_IN = 'MANIFEST.in'
|
|
11
|
+
|
|
12
|
+
# Define input and output files for customizing the rpm package spec.
|
|
13
|
+
SPEC_IN = 'gsutil.spec.in'
|
|
14
|
+
SPEC_OUT = 'gsutil.spec'
|
|
15
|
+
|
|
16
|
+
# Root of rpmbuild tree for file enumeration in gsutil.spec file.
|
|
17
|
+
RPM_ROOT = '%{_datadir}/%{name}/'
|
|
18
|
+
|
|
19
|
+
def parse_manifest(files, dirs):
|
|
20
|
+
'''Parse contents of manifest file and append results to passed lists
|
|
21
|
+
of files and directories.
|
|
22
|
+
'''
|
|
23
|
+
f = open(MANIFEST_IN, 'r')
|
|
24
|
+
for line in f:
|
|
25
|
+
line = line.strip()
|
|
26
|
+
# Skip empty or comment lines.
|
|
27
|
+
if (len(line) <= 0) or (line[0] == '#'):
|
|
28
|
+
continue
|
|
29
|
+
tokens = line.split()
|
|
30
|
+
if len(tokens) >= 0:
|
|
31
|
+
if tokens[0] == 'include':
|
|
32
|
+
files.extend(tokens[1:])
|
|
33
|
+
elif tokens[0] == 'recursive-include' and tokens[2] == '*':
|
|
34
|
+
dirs.append(tokens[1])
|
|
35
|
+
else:
|
|
36
|
+
err = 'Unsupported type ' + tokens[0] + ' in ' + MANIFEST_IN + ' file.'
|
|
37
|
+
raise Exception(err)
|
|
38
|
+
f.close()
|
|
39
|
+
|
|
40
|
+
# When executed as a separate script, create a dynamically generated rpm
|
|
41
|
+
# spec file. Otherwise, when loaded as a module by another script, no
|
|
42
|
+
# specific actions are taken, other than making utility functions available
|
|
43
|
+
# to the loading script.
|
|
44
|
+
if __name__ == '__main__':
|
|
45
|
+
# Running as main so generate a new rpm spec file.
|
|
46
|
+
files = []
|
|
47
|
+
dirs = []
|
|
48
|
+
parse_manifest(files, dirs)
|
|
49
|
+
fin = open(SPEC_IN, 'r')
|
|
50
|
+
fout = open(SPEC_OUT, 'w')
|
|
51
|
+
for line in fin:
|
|
52
|
+
if line.strip() == '###FILES_GO_HERE###':
|
|
53
|
+
for file in files:
|
|
54
|
+
fout.write(RPM_ROOT + file + '\n')
|
|
55
|
+
for dir in dirs:
|
|
56
|
+
fout.write(RPM_ROOT + dir + '/\n')
|
|
57
|
+
else:
|
|
58
|
+
fout.write(line)
|
|
59
|
+
fout.close()
|
|
60
|
+
fin.close()
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding=utf8
|
|
3
|
+
# Copyright 2011 Google Inc.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
'''Distutils setup.py script for Google Cloud Storage command line tool.'''
|
|
18
|
+
|
|
19
|
+
import glob
|
|
20
|
+
import sys
|
|
21
|
+
import os
|
|
22
|
+
import platform
|
|
23
|
+
from distutils.core import setup
|
|
24
|
+
from pkg_util import parse_manifest
|
|
25
|
+
|
|
26
|
+
print '''
|
|
27
|
+
NOTE: Enterprise mode (installing gsutil via setup.py) is no longer officially
|
|
28
|
+
supported - unpacking the zip file into a directory is the preferred method
|
|
29
|
+
for installing gsutil for both shared and private configurations. See README
|
|
30
|
+
and README.pkg for further details.
|
|
31
|
+
'''
|
|
32
|
+
|
|
33
|
+
# Command name and target directory.
|
|
34
|
+
NAME = 'gsutil'
|
|
35
|
+
TARGET = '/usr/share/gsutil'
|
|
36
|
+
BINDIR = '/usr/bin'
|
|
37
|
+
|
|
38
|
+
# Enterprise mode (shared/central) installation is not supported
|
|
39
|
+
# on Windows.
|
|
40
|
+
system = platform.system()
|
|
41
|
+
if system.lower().startswith('windows'):
|
|
42
|
+
error = 'ERROR: enterprise (shared/central) installation is not ' \
|
|
43
|
+
'supported on Windows.'
|
|
44
|
+
exit(error)
|
|
45
|
+
|
|
46
|
+
def walk(dir, paths):
|
|
47
|
+
'''Do a recursive file tree walk, adding files found to passed dict.'''
|
|
48
|
+
for file in os.listdir(dir):
|
|
49
|
+
# Skip "dot files".
|
|
50
|
+
if file[0] == '.':
|
|
51
|
+
continue
|
|
52
|
+
path = dir + '/' + file
|
|
53
|
+
if os.path.isdir(path):
|
|
54
|
+
walk(path, paths)
|
|
55
|
+
else:
|
|
56
|
+
if dir not in paths:
|
|
57
|
+
paths[dir] = []
|
|
58
|
+
paths[dir].append(path)
|
|
59
|
+
|
|
60
|
+
def first_token(filename):
|
|
61
|
+
'''Open file, read first line, parse & return first token to caller.'''
|
|
62
|
+
token = None
|
|
63
|
+
f = open(filename, 'r')
|
|
64
|
+
line = f.readline().strip()
|
|
65
|
+
tokens = line.split()
|
|
66
|
+
token = tokens[0]
|
|
67
|
+
f.close()
|
|
68
|
+
return token
|
|
69
|
+
|
|
70
|
+
# Validate python version.
|
|
71
|
+
if sys.version_info <= (2, 6):
|
|
72
|
+
error = 'ERROR: gsutil requires Python Version 2.6 or above...exiting.'
|
|
73
|
+
exit(error)
|
|
74
|
+
|
|
75
|
+
# Rather than hard-coding package contents here, we read the manifest
|
|
76
|
+
# file to obtain the list of files and directories to include.
|
|
77
|
+
files = []
|
|
78
|
+
dirs = []
|
|
79
|
+
parse_manifest(files, dirs)
|
|
80
|
+
|
|
81
|
+
# Build list of data files dynamically.
|
|
82
|
+
data_files = [(TARGET, files)]
|
|
83
|
+
paths = {}
|
|
84
|
+
for dir in dirs:
|
|
85
|
+
walk(dir, paths)
|
|
86
|
+
for path in paths:
|
|
87
|
+
data_files += (os.path.join(TARGET, path), paths[path]),
|
|
88
|
+
|
|
89
|
+
long_desc = '''
|
|
90
|
+
GSUtil is a Python application that lets you access Google Cloud Storage
|
|
91
|
+
from the command line. You can use GSUtil to do a wide range of bucket and
|
|
92
|
+
object management tasks, including:
|
|
93
|
+
- Creating and deleting buckets.
|
|
94
|
+
- Uploading, downloading, and deleting objects.
|
|
95
|
+
- Listing buckets and objects.
|
|
96
|
+
- Moving, copying, and renaming objects.
|
|
97
|
+
- Setting object and bucket ACLs.
|
|
98
|
+
'''
|
|
99
|
+
|
|
100
|
+
VERSION = first_token('VERSION')
|
|
101
|
+
if not VERSION:
|
|
102
|
+
error = 'ERROR: can\'t find gsutil version...exiting.'
|
|
103
|
+
exit(error)
|
|
104
|
+
|
|
105
|
+
# This is the main function call that installs the gsutil package. See
|
|
106
|
+
# distutil documentation for details on this function and its arguments.
|
|
107
|
+
setup(name = NAME,
|
|
108
|
+
version = VERSION,
|
|
109
|
+
license = 'Apache 2.0',
|
|
110
|
+
author = 'Google',
|
|
111
|
+
author_email = 'gs-team@google.com',
|
|
112
|
+
url = 'http://code.google.com/apis/storage/docs/gsutil.html',
|
|
113
|
+
description = 'gsutil - command line utility for Google Cloud Storage',
|
|
114
|
+
long_description = long_desc,
|
|
115
|
+
data_files = data_files,
|
|
116
|
+
# Dependency on boto commented out for now because initially we plan to
|
|
117
|
+
# bundle boto with this package, however, when we're ready to depend on
|
|
118
|
+
# a separate boto rpm package, this line should be uncommented.
|
|
119
|
+
#requires = ['boto (>=2.0)'],
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Create symlink from /usr/bin/gsutil to /usr/share/gsutil/gsutil but
|
|
123
|
+
# only run directly in enterprise mode (see README.pkg). When run by
|
|
124
|
+
# rpmbuild we don't want to create this link because it's done by the
|
|
125
|
+
# rpm spec file slightly differently (using a relative link). Same story
|
|
126
|
+
# for permission setting, which is only needed if not run by rpmbuild.
|
|
127
|
+
if not os.environ.get('RPM_BUILD_ROOT'):
|
|
128
|
+
link = os.path.join(BINDIR, NAME)
|
|
129
|
+
dest = os.path.join(TARGET, NAME)
|
|
130
|
+
if not os.path.exists(link):
|
|
131
|
+
os.symlink(dest, link)
|
|
132
|
+
# Make all files and dirs in install area readable by other
|
|
133
|
+
# and make all directories executable by other. These steps
|
|
134
|
+
# are performed in support of the enterprise (shared/central)
|
|
135
|
+
# installation mode, in which users with different user/group
|
|
136
|
+
# than the installation user/group must be able to run gsutil.
|
|
137
|
+
os.system('chmod -R o+r ' + TARGET)
|
|
138
|
+
os.system('find ' + TARGET + ' -type d | xargs chmod o+x')
|
|
139
|
+
# Make main gsutil script readable and executable by other.
|
|
140
|
+
os.system('chmod o+rx ' + os.path.join(TARGET, NAME))
|
|
141
|
+
|
|
File without changes
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The fancy_urllib library was obtained from
|
|
2
|
+
http://googleappengine.googlecode.com/svn/trunk/python/lib/fancy_urllib/fancy_urllib/__init__.py
|
|
3
|
+
under the following license (http://googleappengine.googlecode.com/svn/trunk/python/LICENSE):
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
GOOGLE APP ENGINE SDK
|
|
7
|
+
=====================
|
|
8
|
+
Copyright 2008 Google Inc.
|
|
9
|
+
All rights reserved.
|
|
10
|
+
|
|
11
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
you may not use this file except in compliance with the License.
|
|
13
|
+
You may obtain a copy of the License at
|
|
14
|
+
|
|
15
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
|
|
17
|
+
Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
See the License for the specific language governing permissions and
|
|
21
|
+
limitations under the License.
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software
|
|
4
|
+
# Foundation; All Rights Reserved
|
|
5
|
+
|
|
6
|
+
"""A HTTPSConnection/Handler with additional proxy and cert validation features.
|
|
7
|
+
|
|
8
|
+
In particular, monkey patches in Python r74203 to provide support for CONNECT
|
|
9
|
+
proxies and adds SSL cert validation if the ssl module is present.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
__author__ = "{frew,nick.johnson}@google.com (Fred Wulff and Nick Johnson)"
|
|
13
|
+
|
|
14
|
+
import base64
|
|
15
|
+
import httplib
|
|
16
|
+
import logging
|
|
17
|
+
import re
|
|
18
|
+
import socket
|
|
19
|
+
import urllib2
|
|
20
|
+
|
|
21
|
+
from urllib import splittype
|
|
22
|
+
from urllib import splituser
|
|
23
|
+
from urllib import splitpasswd
|
|
24
|
+
|
|
25
|
+
class InvalidCertificateException(httplib.HTTPException):
|
|
26
|
+
"""Raised when a certificate is provided with an invalid hostname."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, host, cert, reason):
|
|
29
|
+
"""Constructor.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
host: The hostname the connection was made to.
|
|
33
|
+
cert: The SSL certificate (as a dictionary) the host returned.
|
|
34
|
+
"""
|
|
35
|
+
httplib.HTTPException.__init__(self)
|
|
36
|
+
self.host = host
|
|
37
|
+
self.cert = cert
|
|
38
|
+
self.reason = reason
|
|
39
|
+
|
|
40
|
+
def __str__(self):
|
|
41
|
+
return ('Host %s returned an invalid certificate (%s): %s\n'
|
|
42
|
+
'To learn more, see '
|
|
43
|
+
'http://code.google.com/appengine/kb/general.html#rpcssl' %
|
|
44
|
+
(self.host, self.reason, self.cert))
|
|
45
|
+
|
|
46
|
+
def can_validate_certs():
|
|
47
|
+
"""Return True if we have the SSL package and can validate certificates."""
|
|
48
|
+
try:
|
|
49
|
+
import ssl
|
|
50
|
+
return True
|
|
51
|
+
except ImportError:
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
def _create_fancy_connection(tunnel_host=None, key_file=None,
|
|
55
|
+
cert_file=None, ca_certs=None):
|
|
56
|
+
# This abomination brought to you by the fact that
|
|
57
|
+
# the HTTPHandler creates the connection instance in the middle
|
|
58
|
+
# of do_open so we need to add the tunnel host to the class.
|
|
59
|
+
|
|
60
|
+
class PresetProxyHTTPSConnection(httplib.HTTPSConnection):
|
|
61
|
+
"""An HTTPS connection that uses a proxy defined by the enclosing scope."""
|
|
62
|
+
|
|
63
|
+
def __init__(self, *args, **kwargs):
|
|
64
|
+
httplib.HTTPSConnection.__init__(self, *args, **kwargs)
|
|
65
|
+
|
|
66
|
+
self._tunnel_host = tunnel_host
|
|
67
|
+
if tunnel_host:
|
|
68
|
+
logging.debug("Creating preset proxy https conn: %s", tunnel_host)
|
|
69
|
+
|
|
70
|
+
self.key_file = key_file
|
|
71
|
+
self.cert_file = cert_file
|
|
72
|
+
self.ca_certs = ca_certs
|
|
73
|
+
try:
|
|
74
|
+
import ssl
|
|
75
|
+
if self.ca_certs:
|
|
76
|
+
self.cert_reqs = ssl.CERT_REQUIRED
|
|
77
|
+
else:
|
|
78
|
+
self.cert_reqs = ssl.CERT_NONE
|
|
79
|
+
except ImportError:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
def _tunnel(self):
|
|
83
|
+
self._set_hostport(self._tunnel_host, None)
|
|
84
|
+
logging.info("Connecting through tunnel to: %s:%d",
|
|
85
|
+
self.host, self.port)
|
|
86
|
+
self.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (self.host, self.port))
|
|
87
|
+
response = self.response_class(self.sock, strict=self.strict,
|
|
88
|
+
method=self._method)
|
|
89
|
+
(_, code, message) = response._read_status()
|
|
90
|
+
|
|
91
|
+
if code != 200:
|
|
92
|
+
self.close()
|
|
93
|
+
raise socket.error, "Tunnel connection failed: %d %s" % (
|
|
94
|
+
code, message.strip())
|
|
95
|
+
|
|
96
|
+
while True:
|
|
97
|
+
line = response.fp.readline()
|
|
98
|
+
if line == "\r\n":
|
|
99
|
+
break
|
|
100
|
+
|
|
101
|
+
def _get_valid_hosts_for_cert(self, cert):
|
|
102
|
+
"""Returns a list of valid host globs for an SSL certificate.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
cert: A dictionary representing an SSL certificate.
|
|
106
|
+
Returns:
|
|
107
|
+
list: A list of valid host globs.
|
|
108
|
+
"""
|
|
109
|
+
if 'subjectAltName' in cert:
|
|
110
|
+
return [x[1] for x in cert['subjectAltName'] if x[0].lower() == 'dns']
|
|
111
|
+
else:
|
|
112
|
+
# Return a list of commonName fields
|
|
113
|
+
return [x[0][1] for x in cert['subject']
|
|
114
|
+
if x[0][0].lower() == 'commonname']
|
|
115
|
+
|
|
116
|
+
def _validate_certificate_hostname(self, cert, hostname):
|
|
117
|
+
"""Validates that a given hostname is valid for an SSL certificate.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
cert: A dictionary representing an SSL certificate.
|
|
121
|
+
hostname: The hostname to test.
|
|
122
|
+
Returns:
|
|
123
|
+
bool: Whether or not the hostname is valid for this certificate.
|
|
124
|
+
"""
|
|
125
|
+
hosts = self._get_valid_hosts_for_cert(cert)
|
|
126
|
+
for host in hosts:
|
|
127
|
+
# Convert the glob-style hostname expression (eg, '*.google.com') into a
|
|
128
|
+
# valid regular expression.
|
|
129
|
+
host_re = host.replace('.', '\.').replace('*', '[^.]*')
|
|
130
|
+
if re.search('^%s$' % (host_re,), hostname, re.I):
|
|
131
|
+
return True
|
|
132
|
+
return False
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def connect(self):
|
|
136
|
+
# TODO(frew): When we drop support for <2.6 (in the far distant future),
|
|
137
|
+
# change this to socket.create_connection.
|
|
138
|
+
self.sock = _create_connection((self.host, self.port))
|
|
139
|
+
|
|
140
|
+
if self._tunnel_host:
|
|
141
|
+
self._tunnel()
|
|
142
|
+
|
|
143
|
+
# ssl and FakeSocket got deprecated. Try for the new hotness of wrap_ssl,
|
|
144
|
+
# with fallback.
|
|
145
|
+
try:
|
|
146
|
+
import ssl
|
|
147
|
+
self.sock = ssl.wrap_socket(self.sock,
|
|
148
|
+
keyfile=self.key_file,
|
|
149
|
+
certfile=self.cert_file,
|
|
150
|
+
ca_certs=self.ca_certs,
|
|
151
|
+
cert_reqs=self.cert_reqs)
|
|
152
|
+
|
|
153
|
+
if self.cert_reqs & ssl.CERT_REQUIRED:
|
|
154
|
+
cert = self.sock.getpeercert()
|
|
155
|
+
hostname = self.host.split(':', 0)[0]
|
|
156
|
+
if not self._validate_certificate_hostname(cert, hostname):
|
|
157
|
+
raise InvalidCertificateException(hostname, cert,
|
|
158
|
+
'hostname mismatch')
|
|
159
|
+
except ImportError:
|
|
160
|
+
ssl = socket.ssl(self.sock,
|
|
161
|
+
keyfile=self.key_file,
|
|
162
|
+
certfile=self.cert_file)
|
|
163
|
+
self.sock = httplib.FakeSocket(self.sock, ssl)
|
|
164
|
+
|
|
165
|
+
return PresetProxyHTTPSConnection
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# Here to end of _create_connection copied wholesale from Python 2.6"s socket.py
|
|
169
|
+
_GLOBAL_DEFAULT_TIMEOUT = object()
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT):
|
|
173
|
+
"""Connect to *address* and return the socket object.
|
|
174
|
+
|
|
175
|
+
Convenience function. Connect to *address* (a 2-tuple ``(host,
|
|
176
|
+
port)``) and return the socket object. Passing the optional
|
|
177
|
+
*timeout* parameter will set the timeout on the socket instance
|
|
178
|
+
before attempting to connect. If no *timeout* is supplied, the
|
|
179
|
+
global default timeout setting returned by :func:`getdefaulttimeout`
|
|
180
|
+
is used.
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
msg = "getaddrinfo returns an empty list"
|
|
184
|
+
host, port = address
|
|
185
|
+
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
|
|
186
|
+
af, socktype, proto, canonname, sa = res
|
|
187
|
+
sock = None
|
|
188
|
+
try:
|
|
189
|
+
sock = socket.socket(af, socktype, proto)
|
|
190
|
+
if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
|
|
191
|
+
sock.settimeout(timeout)
|
|
192
|
+
sock.connect(sa)
|
|
193
|
+
return sock
|
|
194
|
+
|
|
195
|
+
except socket.error, msg:
|
|
196
|
+
if sock is not None:
|
|
197
|
+
sock.close()
|
|
198
|
+
|
|
199
|
+
raise socket.error, msg
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class FancyRequest(urllib2.Request):
|
|
203
|
+
"""A request that allows the use of a CONNECT proxy."""
|
|
204
|
+
|
|
205
|
+
def __init__(self, *args, **kwargs):
|
|
206
|
+
urllib2.Request.__init__(self, *args, **kwargs)
|
|
207
|
+
self._tunnel_host = None
|
|
208
|
+
self._key_file = None
|
|
209
|
+
self._cert_file = None
|
|
210
|
+
self._ca_certs = None
|
|
211
|
+
|
|
212
|
+
def set_proxy(self, host, type):
|
|
213
|
+
saved_type = None
|
|
214
|
+
|
|
215
|
+
if self.get_type() == "https" and not self._tunnel_host:
|
|
216
|
+
self._tunnel_host = self.get_host()
|
|
217
|
+
saved_type = self.get_type()
|
|
218
|
+
urllib2.Request.set_proxy(self, host, type)
|
|
219
|
+
|
|
220
|
+
if saved_type:
|
|
221
|
+
# Don't set self.type, we want to preserve the
|
|
222
|
+
# type for tunneling.
|
|
223
|
+
self.type = saved_type
|
|
224
|
+
|
|
225
|
+
def set_ssl_info(self, key_file=None, cert_file=None, ca_certs=None):
|
|
226
|
+
self._key_file = key_file
|
|
227
|
+
self._cert_file = cert_file
|
|
228
|
+
self._ca_certs = ca_certs
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
class FancyProxyHandler(urllib2.ProxyHandler):
|
|
232
|
+
"""A ProxyHandler that works with CONNECT-enabled proxies."""
|
|
233
|
+
|
|
234
|
+
# Taken verbatim from /usr/lib/python2.5/urllib2.py
|
|
235
|
+
def _parse_proxy(self, proxy):
|
|
236
|
+
"""Return (scheme, user, password, host/port) given a URL or an authority.
|
|
237
|
+
|
|
238
|
+
If a URL is supplied, it must have an authority (host:port) component.
|
|
239
|
+
According to RFC 3986, having an authority component means the URL must
|
|
240
|
+
have two slashes after the scheme:
|
|
241
|
+
|
|
242
|
+
>>> _parse_proxy('file:/ftp.example.com/')
|
|
243
|
+
Traceback (most recent call last):
|
|
244
|
+
ValueError: proxy URL with no authority: 'file:/ftp.example.com/'
|
|
245
|
+
|
|
246
|
+
The first three items of the returned tuple may be None.
|
|
247
|
+
|
|
248
|
+
Examples of authority parsing:
|
|
249
|
+
|
|
250
|
+
>>> _parse_proxy('proxy.example.com')
|
|
251
|
+
(None, None, None, 'proxy.example.com')
|
|
252
|
+
>>> _parse_proxy('proxy.example.com:3128')
|
|
253
|
+
(None, None, None, 'proxy.example.com:3128')
|
|
254
|
+
|
|
255
|
+
The authority component may optionally include userinfo (assumed to be
|
|
256
|
+
username:password):
|
|
257
|
+
|
|
258
|
+
>>> _parse_proxy('joe:password@proxy.example.com')
|
|
259
|
+
(None, 'joe', 'password', 'proxy.example.com')
|
|
260
|
+
>>> _parse_proxy('joe:password@proxy.example.com:3128')
|
|
261
|
+
(None, 'joe', 'password', 'proxy.example.com:3128')
|
|
262
|
+
|
|
263
|
+
Same examples, but with URLs instead:
|
|
264
|
+
|
|
265
|
+
>>> _parse_proxy('http://proxy.example.com/')
|
|
266
|
+
('http', None, None, 'proxy.example.com')
|
|
267
|
+
>>> _parse_proxy('http://proxy.example.com:3128/')
|
|
268
|
+
('http', None, None, 'proxy.example.com:3128')
|
|
269
|
+
>>> _parse_proxy('http://joe:password@proxy.example.com/')
|
|
270
|
+
('http', 'joe', 'password', 'proxy.example.com')
|
|
271
|
+
>>> _parse_proxy('http://joe:password@proxy.example.com:3128')
|
|
272
|
+
('http', 'joe', 'password', 'proxy.example.com:3128')
|
|
273
|
+
|
|
274
|
+
Everything after the authority is ignored:
|
|
275
|
+
|
|
276
|
+
>>> _parse_proxy('ftp://joe:password@proxy.example.com/rubbish:3128')
|
|
277
|
+
('ftp', 'joe', 'password', 'proxy.example.com')
|
|
278
|
+
|
|
279
|
+
Test for no trailing '/' case:
|
|
280
|
+
|
|
281
|
+
>>> _parse_proxy('http://joe:password@proxy.example.com')
|
|
282
|
+
('http', 'joe', 'password', 'proxy.example.com')
|
|
283
|
+
|
|
284
|
+
"""
|
|
285
|
+
scheme, r_scheme = splittype(proxy)
|
|
286
|
+
if not r_scheme.startswith("/"):
|
|
287
|
+
# authority
|
|
288
|
+
scheme = None
|
|
289
|
+
authority = proxy
|
|
290
|
+
else:
|
|
291
|
+
# URL
|
|
292
|
+
if not r_scheme.startswith("//"):
|
|
293
|
+
raise ValueError("proxy URL with no authority: %r" % proxy)
|
|
294
|
+
# We have an authority, so for RFC 3986-compliant URLs (by ss 3.
|
|
295
|
+
# and 3.3.), path is empty or starts with '/'
|
|
296
|
+
end = r_scheme.find("/", 2)
|
|
297
|
+
if end == -1:
|
|
298
|
+
end = None
|
|
299
|
+
authority = r_scheme[2:end]
|
|
300
|
+
userinfo, hostport = splituser(authority)
|
|
301
|
+
if userinfo is not None:
|
|
302
|
+
user, password = splitpasswd(userinfo)
|
|
303
|
+
else:
|
|
304
|
+
user = password = None
|
|
305
|
+
return scheme, user, password, hostport
|
|
306
|
+
|
|
307
|
+
def proxy_open(self, req, proxy, type):
|
|
308
|
+
# This block is copied wholesale from Python2.6 urllib2.
|
|
309
|
+
# It is idempotent, so the superclass method call executes as normal
|
|
310
|
+
# if invoked.
|
|
311
|
+
orig_type = req.get_type()
|
|
312
|
+
proxy_type, user, password, hostport = self._parse_proxy(proxy)
|
|
313
|
+
if proxy_type is None:
|
|
314
|
+
proxy_type = orig_type
|
|
315
|
+
if user and password:
|
|
316
|
+
user_pass = "%s:%s" % (urllib2.unquote(user), urllib2.unquote(password))
|
|
317
|
+
creds = base64.b64encode(user_pass).strip()
|
|
318
|
+
# Later calls overwrite earlier calls for the same header
|
|
319
|
+
req.add_header("Proxy-authorization", "Basic " + creds)
|
|
320
|
+
hostport = urllib2.unquote(hostport)
|
|
321
|
+
req.set_proxy(hostport, proxy_type)
|
|
322
|
+
# This condition is the change
|
|
323
|
+
if orig_type == "https":
|
|
324
|
+
return None
|
|
325
|
+
|
|
326
|
+
return urllib2.ProxyHandler.proxy_open(self, req, proxy, type)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class FancyHTTPSHandler(urllib2.HTTPSHandler):
|
|
330
|
+
"""An HTTPSHandler that works with CONNECT-enabled proxies."""
|
|
331
|
+
|
|
332
|
+
def do_open(self, http_class, req):
|
|
333
|
+
# Intentionally very specific so as to opt for false negatives
|
|
334
|
+
# rather than false positives.
|
|
335
|
+
try:
|
|
336
|
+
return urllib2.HTTPSHandler.do_open(
|
|
337
|
+
self,
|
|
338
|
+
_create_fancy_connection(req._tunnel_host,
|
|
339
|
+
req._key_file,
|
|
340
|
+
req._cert_file,
|
|
341
|
+
req._ca_certs),
|
|
342
|
+
req)
|
|
343
|
+
except urllib2.URLError, url_error:
|
|
344
|
+
try:
|
|
345
|
+
import ssl
|
|
346
|
+
if (type(url_error.reason) == ssl.SSLError and
|
|
347
|
+
url_error.reason.args[0] == 1):
|
|
348
|
+
# Display the reason to the user. Need to use args for python2.5
|
|
349
|
+
# compat.
|
|
350
|
+
raise InvalidCertificateException(req.host, '',
|
|
351
|
+
url_error.reason.args[1])
|
|
352
|
+
except ImportError:
|
|
353
|
+
pass
|
|
354
|
+
|
|
355
|
+
raise url_error
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
# We have to implement this so that we persist the tunneling behavior
|
|
359
|
+
# through redirects.
|
|
360
|
+
class FancyRedirectHandler(urllib2.HTTPRedirectHandler):
|
|
361
|
+
"""A redirect handler that persists CONNECT-enabled proxy information."""
|
|
362
|
+
|
|
363
|
+
def redirect_request(self, req, *args, **kwargs):
|
|
364
|
+
new_req = urllib2.HTTPRedirectHandler.redirect_request(
|
|
365
|
+
self, req, *args, **kwargs)
|
|
366
|
+
# Same thing as in our set_proxy implementation, but in this case
|
|
367
|
+
# we"ve only got a Request to work with, so it was this or copy
|
|
368
|
+
# everything over piecemeal.
|
|
369
|
+
#
|
|
370
|
+
# Note that we do not persist tunneling behavior from an http request
|
|
371
|
+
# to an https request, because an http request does not set _tunnel_host.
|
|
372
|
+
#
|
|
373
|
+
# Also note that in Python < 2.6, you will get an error in
|
|
374
|
+
# FancyHTTPSHandler.do_open() on an https urllib2.Request that uses an http
|
|
375
|
+
# proxy, since the proxy type will be set to http instead of https.
|
|
376
|
+
# (FancyRequest, and urllib2.Request in Python >= 2.6 set the proxy type to
|
|
377
|
+
# https.) Such an urllib2.Request could result from this redirect
|
|
378
|
+
# if you are redirecting from an http request (since an an http request
|
|
379
|
+
# does not have _tunnel_host set, and thus you will not set the proxy
|
|
380
|
+
# in the code below), and if you have defined a proxy for https in, say,
|
|
381
|
+
# FancyProxyHandler, and that proxy has type http.
|
|
382
|
+
if hasattr(req, "_tunnel_host") and isinstance(new_req, urllib2.Request):
|
|
383
|
+
if new_req.get_type() == "https":
|
|
384
|
+
if req._tunnel_host:
|
|
385
|
+
# req is proxied, so copy the proxy info.
|
|
386
|
+
new_req._tunnel_host = new_req.get_host()
|
|
387
|
+
new_req.set_proxy(req.host, "https")
|
|
388
|
+
else:
|
|
389
|
+
# req is not proxied, so just make sure _tunnel_host is defined.
|
|
390
|
+
new_req._tunnel_host = None
|
|
391
|
+
new_req.type = "https"
|
|
392
|
+
if hasattr(req, "_key_file") and isinstance(new_req, urllib2.Request):
|
|
393
|
+
# Copy the auxiliary data in case this or any further redirect is https
|
|
394
|
+
new_req._key_file = req._key_file
|
|
395
|
+
new_req._cert_file = req._cert_file
|
|
396
|
+
new_req._ca_certs = req._ca_certs
|
|
397
|
+
|
|
398
|
+
return new_req
|