o Qa@sddlmZddlZddlZddlZddlmZddlmZmZm Z m Z z ddl m m ZWney>ddlm ZYnwddlmZddlmZddlTdd lmZmZmZmZmZmZdd lmZmZmZmZm Z dd l!m"Z"dd l#m#Z#m$Z$dd l%m%Z%ddl&m&Z&ej'dkZ(dZ)dde)iZ*ddZ+ddZ,Gddde-Z.Gddde-Z/Gddde-Z0Gddde-Z1Gdd d e-Z2Gd!d"d"e-Z3Gd#d$d$e-Z4Gd%d&d&e-Z5Gd'd(d(e-Z6dS)))absolute_importN)datetime)debuginfowarningerror)S3)Config)*)getTreeFromXmlappendXmlTextNodegetDictFromTreedateS3toPython encode_to_s3decode_from_s3)getBucketFromHostnamegetHostnameFromBucket deunicodiseurlencode_stringconvertHeaderTupleListToDict)sign_string_v2)S3UriS3UriS3)ConnMan) SortedDict)rz 2010-11-01z/%(api_ver)s/distributionapi_vercCstj|ddS)N )sysstdoutwrite)messager#//usr/lib/python3/dist-packages/S3/CloudFront.pyoutput'sr%cCs"d|d}td||fdS)Nz%s:z%s %s)ljustr%)labelr"r#r#r$ pretty_output*sr)c@$eZdZddZddZddZdS)DistributionSummarycCs&|jdkr td|j||dS)Nr+z1Expected xml, got: <%s />)tag ValueErrorparseselftreer#r#r$__init__@s zDistributionSummary.__init__cCs\t||_|jddk|jd<d|jvr*t|jdtkr,|jdg|jd<dSdSdS)NEnabledtrueCNAME)rrlowertypelistr/r#r#r$r.Es zDistributionSummary.parsecCtd|jdSNzcf://%sIdrrr0r#r#r$uriKzDistributionSummary.uriN__name__ __module__ __qualname__r2r.r>r#r#r#r$r+/s r+c@seZdZddZddZdS)DistributionListcC.t|}|jdkrtd|j||dS)NrDz.Expected xml, got: <%s />r r,r-r.r0xmlr1r#r#r$r2Z zDistributionList.__init__cCsLt||_|jddk|jd<g|_|dD] }|jt|qdS)N IsTruncatedr4z.//DistributionSummary)rrr6 dist_summsfindallappendr+)r0r1 dist_summr#r#r$r.`s zDistributionList.parseN)rArBrCr2r.r#r#r#r$rDNs rDc@r*) DistributioncCrE)NrOz*Expected xml, got: <%s />rFrGr#r#r$r2vrIzDistribution.__init__cCs8t||_t|jd|jd<t|dd|jd<dS)NLastModifiedTimez.//DistributionConfig)r1DistributionConfig)rrrrQfindr/r#r#r$r.|s zDistribution.parsecCr9r:r<r=r#r#r$r>r?zDistribution.uriNr@r#r#r#r$rOis  rOc@sFeZdZdZddeiZdddZddZd d Zd d Z d dZ dS)rQzqtruez0http://cloudfront.amazonaws.com/doc/%(api_ver)s/rNcCsD|durtj}|durt|}|jdkrtd|j||dS)NrQz0Expected xml, got: <%s />)rQ EMPTY_CONFIGr r,r-r.rGr#r#r$r2s zDistributionConfig.__init__cCst||_|jddk|jd<d|jvrg|jd<t|jdtkr-|jdg|jd<dd|jdD|jd<d|jvrDd|jd<d|jvrNd|jd<|d }|rzt|d }t|d \|d <}|sotd |d td ||jd<dSd|jd<dS)Nr3r4r5cSsg|]}|qSr#)r6).0cnamer#r#r$ sz,DistributionConfig.parse..CommentDefaultRootObjectz .//LoggingrBucketz%Logging to unparsable bucket name: %szs3://%(Bucket)s/%(Prefix)sLogging) rrr6r7r8rLrrr)r0r1 logging_nodes logging_dictsuccessr#r#r$r.s&         zDistributionConfig.parsecCstd}tj|jd<tdd|}td|jdd|td|jd||jdD] }td||q*|jdrCtd|jd|td t|jd |t|jd rbtd t|jd ||jd rtd }td t |jd  |td |jd  || ||S)NrQxmlnsS3OriginrXDNSNameCallerReferencer5rWr3rYr[rZPrefix) ETElementrQr_attribr rr6strrbucketobjectrM)r0r1s3orgrU logging_elr#r#r$get_printable_trees$       z%DistributionConfig.get_printable_treecCtt|SNrrdtostringrlr=r#r#r$ __unicode__r?zDistributionConfig.__unicode__cC$tr tj|ddSt|SNunicode)encodingPY3rdrprlr=r#r#r$__str__zDistributionConfig.__str__)NN) rArBrCrScloudfront_api_versionr_r2r.rlrqrxr#r#r#r$rQs    rQc@r*) InvalidationcCrE)Nr{z*Expected xml, got: <%s />rFrGr#r#r$r2rIzInvalidation.__init__cCt||_dSrnrrr/r#r#r$r.zInvalidation.parsecC t|jSrnrgrr=r#r#r$rx zInvalidation.__str__NrArBrCr2r.rxr#r#r#r$r{s r{c@r*)InvalidationListcCrE)Nrz.Expected xml, got: <%s />rFrGr#r#r$r2rIzInvalidationList.__init__cCr|rnr}r/r#r#r$r. r~zInvalidationList.parsecCrrnrr=r#r#r$rxrzInvalidationList.__str__Nrr#r#r#r$rs rc@sDeZdZddgfddZddZddZdd Zd d Zd d ZdS)InvalidationBatchNcCsL|r||_n|s d}d|ttdtddf|_g|_||dS)N0z%s.%s.%sz %Y%m%d%H%M%Sii') referencerstrftimenowrandomrandintpaths add_objects)r0r distributionrr#r#r$r2s zInvalidationBatch.__init__cCs|j|dSrn)rextend)r0rr#r#r$r*szInvalidationBatch.add_objectscCs|jSrn)rr=r#r#r$ get_reference-szInvalidationBatch.get_referencecCsXtd}|jD]}t|dks|ddkrd|}tdt||qtd|j||S)Nrrr/Pathrb)rdrerlenr rr)r0r1pathr#r#r$rl0s  z$InvalidationBatch.get_printable_treecCrmrnror=r#r#r$rq9r?zInvalidationBatch.__unicode__cCrrrsrvr=r#r#r$rx<ryzInvalidationBatch.__str__) rArBrCr2rrrlrqrxr#r#r#r$rs   rc @seZdZdddddddddddddddddddd ddd ddd dd Zd Zd ZddZddZgd d d fddZggd d d d fddZ ddZ ddZ ddZ d0ddZ ddZd d!Zd"d#Zd d d d efd$d%Zd1d&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd S)2 CloudFrontPOSTrX)methodresourceDELETEz /%(dist_id)sGETz/%(dist_id)s/configPUTz/%(dist_id)s/invalidationz(/%(dist_id)s/invalidation/%(request_id)s) CreateDist DeleteDistGetList GetDistInfo GetDistConfig SetDistConfig Invalidate GetInvalList GetInvalInfoNcCs ||_dSrn)config)r0rr#r#r$r2UrzCloudFront.__init__cCs4|d}t|d|d<|djdrtd|S)Nrdata dist_listrJz3List is truncated. Ask s3cmd author to add support.) send_requestrDrNotImplementedError)r0responser#r#r$r\s zCloudFront.GetListc Cst}d|jd<||jdd<t||jd<||jd<|dkr)||jd<n||jd<|D]}|jd|d krD|jd|q0|rNt||jd <t|}td ||j d |d } t | d| d<| S)NTr3r`rarbrYrWr5rr[z&CreateDistribution(): request_body: %sr)bodyrr) rQr host_namerg public_urlcountrMrrrrO) r0r> cnames_addcommentloggingdefault_root_object dist_configrU request_bodyrr#r#r$CreateDistributionds&    zCloudFront.CreateDistributionc Cs|jdkr td|td|||}|d} |dkr#|| jd<|dkr,|| jd<|dkr5|| jd<|D]} | jd| d krK| jd| q7|D]} | jd| d krl| jd| | jd| d ksZqN|dkr|d kr{d | jd <nt|| jd <||| |d d }|S)NcfExpected CFUri instead of: %sChecking current status of %srr3rWrYr5rFr[headersetag) r7r-rrrrMremoverr) r0cfurir cnames_removerenabledrrrdcrUr#r#r$ModifyDistributionys4        zCloudFront.ModifyDistributioncCs|jdkr td|td|||}|djdrdtdd|djd<|||d|dd }td td  ||}|d }|jddkrZ|jddkrZtdn tdtdq>t d d}|dd |d<|j d| |d}|S)Nrrrrr3z)Distribution is ENABLED. Disabling first.Frrz,Waiting for Distribution to become disabled.z+This may take several minutes, please wait.TrStatusDeployedzDistribution is now disabledzStill waiting...  ignore_caseif-matchr)dist_idr) r7r-rrrrrtimesleeprrr)r0rrdrr#r#r$DeleteDistributions6          zCloudFront.DeleteDistributioncC<|jdkr td||jd|d}t|d|d<|S)Nrrrrrr)r7r-rrrOr0rrr#r#r$r  zCloudFront.GetDistInfocCr)Nrrrrrr)r7r-rrrQrr#r#r$rrzCloudFront.GetDistConfigcCsn|dkrtd||dd}td|t|}td|tdd}||d<|jd |||d }|S) Nz1SetDistConfig(): Etag not set. Fetching it first.rrzSetDistConfig(): Etag = %sz!SetDistConfig(): request_body: %sTrrr)rrr)rrrgrrr)r0rrrrrrr#r#r$rs    zCloudFront.SetDistConfigcCs|dur9|r|r9g}d|}|D]&}||s||kr1|r"|||r0||dt| q||q|}||} t|dkrz:t} tt| d} | td |dWdn1sgwYt dt|t d| Wt dt yYt dwg} | D]@} t | |d}td ||jd | t|d }| |d <|d dkrt|dj}|d|d<td|| |q| S)Nriwrz2Request to invalidate %d paths (max 999 supported)z"All the paths are now saved in: %szToo many paths to invalidate)rrz%InvalidateObjects(): request_body: %sr)rrrstatusrr; request_idz!InvalidateObjects(): response: %s)endswithrMrget_dist_name_for_bucketUtils mktmpfileopenrr!joinr ExceptionParameterErrorrrrrrgr{r)r0r>rdefault_index_fileinvalidate_default_index_on_cf#invalidate_default_index_root_on_cf new_pathsdefault_index_suffixrcfuris tmp_filenamefp responsesr invalbatchr inval_infor#r#r$InvalidateObjectssP            zCloudFront.InvalidateObjectscCr)Nrrrrr inval_list)r7r-rrrrr#r#r$rrzCloudFront.GetInvalListcCsV|jdkr td||durtd|jd||d}t|d|d<|S)NrrzExpected CFUri with Request IDrrrr inval_status)r7r-rrrr{rr#r#r$rs   zCloudFront.GetInvalInfoc CsZ|dur tdd}|j|}|rd|d<|||||}|} td|d|df| j|d|d||d| j} i} | j| d <| j | d <t | | d<| | d <t | td | | d d krt| } |rtd|tt| td||t|||j||||ddS| | d dks| d dkrt| | S)NTrz text/plainz content-typezsend_request(): %s %srrrrreasonrzCloudFront: response: %rizRetrying failed request: %szWaiting %d sec...r)retriesi+)r operationscreate_requestget_connectionrcrequest getresponserrr getheadersreadrputCloudFrontErrorrrt _fail_waitrrr) r0op_namerrrrr operationrconn http_responserer#r#r$rs:           zCloudFront.send_requestcCst|d||d}|stdd}d|vr#d|vr |d|d<|d=d|vr1tdt|d<t|jjdkrD|j|jj|d <| |}d |jj d ||d <i}||d<||d <|d|d<|S)NrrTrdate x-amz-datez%a, %d %b %Y %H:%M:%S +0000rzx-amz-security-tokenzAWS : Authorizationrr) cloudfront_resourcerrrgmtimerr access_token role_refresh sign_request access_key)r0rrrrr signaturerr#r#r$r2s*      zCloudFront.create_requestcCs,|d}ttt|}td||f|S)Nrz"CloudFront.sign_request('%s') = %s)rrrr)r0rstring_to_signrr#r#r$rOszCloudFront.sign_requestcCstj|jjdd}|S)NT)ssl)rgetrcloudfront_host)r0rr#r#r$rUszCloudFront.get_connectioncCs|j|ddS)Nrr) _max_retries)r0rr#r#r$rYszCloudFront._fail_waitc Cs6|jdkr|gS|jdkrtd|td|tjdur||}it_|djD]J}d}d|jvr?t|jddd }nd |jvrZt|jd dd }|dt | }nq*tj |ddurjt tj|<tj| |q*td tjztj| WSty}z t|td |d}~ww) Nrs3z,CloudFront or S3 URI required instead of: %sz_get_dist_name_for_bucket(%r)rrXr`rar CustomOriginz dist_list: %sz>Unable to translate S3 URI to CloudFront distribution name: %s)r7rrrrrrKrrrrhr setaddr>r)r0r>rr distListIndexrr#r#r$r]s6         z#CloudFront.get_dist_name_for_bucketrn)NNN)rArBrCrr rr2rrrrrrrrrrrrrrrrr#r#r#r$rDsB    . $ rc@sneZdZdZGdddeZeZeddZeddZ edd Z ed d Z ed d Z eddZ dS)Cmdz3 Class that implements CloudFront commands c@s4eZdZgZgZdZdZdZdZddZ ddZ dS)z Cmd.OptionsNcCsddt|DS)NcSsg|] }|dr|qS)cf_) startswith)rToptr#r#r$rVsz+Cmd.Options.option_list..)dirr=r#r#r$ option_listr?zCmd.Options.option_listcCsttj||dSrn)setattrroptions)r0optionvaluer#r#r$ update_optionr?zCmd.Options.update_option) rArBrC cf_cnames_addcf_cnames_remove cf_comment cf_enable cf_loggingcf_default_root_objectrrr#r#r#r$Optionss r$cCs4tt}g}|D]}|t|}||q |Srn)rr rrr)argsrrargurisr#r#r$ _parse_argss  zCmd._parse_argscCstt}|sn|}|djD][}d|jvr"t|jdd}nd|jvr1d|jdd}nd}td|td|td |jd d |jvrWtd d |jd td |jd td|jdt dqdSt |}|D]}| |}|d}|jd}d|jvrt|jdd}nd|jvrd|jdd}nd}td|td|td |jd d |jvrtd d |jd td |jd td|jdtd|jdtd|jdtd|jdpdtd|ddqudS)Nrr`rarz http://%s/z OriginDistId DomainNamer5CNAMEs, rr3rXrrQrWDfltRootObjectrYr[DisabledEtagrr)rr rrKrrhttpurl_to_s3urir)r>rr%rr(r)r%rrroriginrrrr#r#r$rsP             zCmd.infocCshtt}g}|D](}t|}|jdkrtd||r$td||s,td||q |s8td|D]w}td||j |t j j t j j t j jt j jd}|d}|jd }td td t|jd d td|td|jdtdd|jdtd|jdtd|jdtd|jdtd|jdtd|ddq:dS)Nrz@Distribution can only be created from a s3:// URI instead of: %sz4Use s3:// URI with a bucket name only instead of: %sz3CloudFront can only handle lowercase-named buckets.zNo valid bucket names foundzCreating distribution from: %s)rrrrrrQzDistribution created:r)r`rar*r+r,r-r5rWrr3rYr0rr)rr rr7rriis_dns_compatiblerMrrrrrr r"r#r%r)rr1r>r)r%rbucketsr&r>rrrr#r#r$createsB        z Cmd.createcCsXtt}t|}|D]}||}|ddkr#td||dftd|q dS)Nrz(Distribution %s could not be deleted: %srzDistribution %s deleted)rr rr(rrr%)r%rrrrr#r#r$deletes    z Cmd.deletec Csdtt}t|dkrtdz t|d}Wn ty#tdw|j|tjj tjj tjj tjj tjj tjjd}|ddkrLtd||d ftd |||}|d }|jd }td t|jddtd|td|jdtd|jdtdd|jdtd|jdtd|jdtd|jdtd|dddS)Nrz7Too many parameters. Modify one Distribution at a time.rz No valid Distribution URI found.)rrrrrrrr6z)Distribution %s could not be modified: %srzDistribution modified: %srrQr)r`rar*r+rr,r-r5rWr3rYr0rr)rr rrrr( IndexErrorrrrrr r!r"r#rr%rrr)rr1r>r)r%rrrrrr#r#r$modifys>       z Cmd.modifyc Cs&tt}t|}g}|D]7}|r|t|q||}z|djdD]}|d d| |dgq)Wqt yEYqw|D]H}t |}| |}|dj} | dd} t| trgt| nd } td t|td | d td | d td| td| ddtdqHdS)NrInvalidationSummaryrzcf:/r;rrrrURIrCreated CreateTimez Nr of paths ReferencerbrX)rr rr(rrMrgrrrrrrr isinstancer8rr)r%) r%rrrequestsrrireqrstr nr_of_pathsr#r#r$ invalinfos6          z Cmd.invalinfoN)rArBrC__doc__rir$r staticmethodr(rr5r7r9rEr#r#r#r$rs   + !  r)7 __future__rrrrrrrrrrxml.etree.ElementTreeetree ElementTreerd ImportErrorelementtree.ElementTreer r Exceptions BaseUtilsr r rrrrrrrrrrCryptorrrrr version_inforwrzrr%r)rir+rDrOrQr{rrrrr#r#r#r$sH           T1A