o x[hM"@sddlZddlZddlZddlmZmZeeZe ej gZ GdddZ GdddZ ddZ ddd d dddd d dZ      dddZ      dddZ     dddZdS)N) url_helperutilc@s eZdZdZddZddZdS)MetadataLeafDecoderz.Decodes a leaf blob into something meaningful.cCs,|sdS|}|dr|drdSdS)NF{}T)strip startswithendswith)selftextr ?/usr/lib/python3/dist-packages/cloudinit/sources/helpers/ec2.py_maybe_json_objects z&MetadataLeafDecoder._maybe_json_objectc Cs|sdSzt|}Wn ty|YSw||r>zt|WSttfy=}z t d||WYd}~nd}~ww| ddkrI| S|S)Nz6Field %s looked like a json object, but it was not: %s ) r decode_binaryUnicodeDecodeErrorrjsonloads ValueError TypeErrorLOGwarningfind splitlines)r fieldblober r r __call__s*   zMetadataLeafDecoder.__call__N)__name__ __module__ __qualname____doc__rrr r r r rs rc@s.eZdZd ddZddZddZdd ZdS) MetadataMaterializerNcCs6||_d|_||_||_|durt|_dS||_dSN)_blob_md _base_url_callerr _leaf_decoder)r rbase_urlcaller leaf_decoderr r r __init__7s  zMetadataMaterializer.__init__c Csi}g}t|}|s||fSdd}dd}|D]G}|}||}|r)|s*q|dkr/q||r=||vr<||q|dd}|} t|dkr^|\} } t| } | dur^d| } | }| ||<q||fS) NcSs|drdSdS)N/TF)r itemr r r has_childrenIs z1MetadataMaterializer._parse..has_childrencSs|dr |dS|S)Nr/)r rstripr0r r r get_nameOs  z-MetadataMaterializer._parse..get_namezsecurity-credentials=z%s/openssh-key)rrrrappendsplitlensafe_int) r rleaveschildrenr2r4r field_namecontentsresourceident sub_contentsr r r _parseAs8       zMetadataMaterializer._parsecCs(|jdur|jS||j|j|_|jSr%)r' _materializer&r()r r r r materializels z MetadataMaterializer.materializecCs||\}}i}|D]}t||}|ds|d7}||}|||||<q i} |D]\} } t|| } || } || | | | <q0i}||| D]} | |vr`t d|qS| | || <qS|S)Nr/z&Duplicate key found in results from %s) rBr combine_urlr r)rCitemsr*updatekeysrr)r rr+r;r<child_contentsc child_url child_blob leaf_contentsrr?leaf_url leaf_blobjoinedr r r rCrs(       z!MetadataMaterializer._materializer%)r r!r"r.rBrDrCr r r r r$6s   + r$cCs |j|vS)z/Returns False if cause.code is in status_codes.)code) status_codescauser r r skip_retry_on_codess rTlatesthttp://169.254.169.254 ssl_detailstimeoutretries headers_cbheaders_redact exception_cbc Cst||}t|d}d} z|sttt}tj|||||||d} | j} W| StjyO} z| j tvrDt t d|WYd} ~ | SWYd} ~ | Sd} ~ wt y_t t d|Y| Sw)Nz user-data)rYrZr[r^r\r]z$Failed fetching userdata from url %s)rrE functoolspartialrTSKIP_USERDATA_CODESread_file_or_urlr>UrlErrorrQrlogexcr Exception) api_versionmetadata_addressrYrZr[r\r]r^ud_url user_dataresponserr r r get_instance_userdatas<     rlc  st|||} tjtj|||||| dfdd} z| } t| j| | |d}|}t|t s4i}|WSt yIt t d|| iYSw)NrXc sPz|jWStjy'}zr|std|WYd}~dSd}~ww)Nz&Skipped retrieval of the content of %sz (skipped))r>rrdrr)urlrr,retrieval_exception_ignore_cbr r mcallers  z'_get_instance_metadata..mcaller)r-zFailed fetching %s from url %s)rrEr`rarcr$r>rD isinstancedictrfrrer)treergrhrYrZr[r-r\r]r^romd_urlrprk materializermdr rnr _get_instance_metadatas0      rwc Cstd|||||||||| d S)Nz meta-data/) rsrgrhrYrZr[r-r]r\r^rorw) rgrhrYrZr[r-r\r]r^ror r r get_instance_metadatasryc Cstd|||||||||d S)Nzdynamic/instance-identity) rsrgrhrYrZr[r-r]r\r^rx) rgrhrYrZr[r-r\r]r^r r r get_instance_identitys rz)rUrV) rUrVNrWrWNNNNN) rUrVNrWrWNNNN)r`rlogging cloudinitrr getLoggerr r frozenset NOT_FOUNDrbrr$rTrlrwryrzr r r r sf  #T * 4