o
    x[hM"  ã                   @   sÜ   d dl Z d dlZd dlZd dlmZmZ e e¡Ze	ej
gƒZG dd„ dƒZG dd„ dƒZdd„ Z			
ddddddddœdd„Z			
								ddd„Z			
								ddd„Z			
							ddd„ZdS )é    N)Ú
url_helperÚutilc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚMetadataLeafDecoderz.Decodes a leaf blob into something meaningful.c                 C   s,   |sdS |  ¡ }| d¡r| d¡rdS dS )NFú{ú}T)ÚstripÚ
startswithÚendswith)ÚselfÚtext© r   ú?/usr/lib/python3/dist-packages/cloudinit/sources/helpers/ec2.pyÚ_maybe_json_object   s   z&MetadataLeafDecoder._maybe_json_objectc              
   C   s–   |sdS zt  |¡}W n ty   | Y S w |  |¡r>zt |¡W S  ttfy= } zt 	d||¡ W Y d }~nd }~ww | 
d¡dkrI| ¡ S |S )NÚ z6Field %s looked like a json object, but it was not: %sÚ
éÿÿÿÿ)r   Údecode_binaryÚUnicodeDecodeErrorr   ÚjsonÚloadsÚ
ValueErrorÚ	TypeErrorÚLOGÚwarningÚfindÚ
splitlines)r
   ÚfieldÚblobÚer   r   r   Ú__call__   s*   ÿ
ý€ÿzMetadataLeafDecoder.__call__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s    r   c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚMetadataMaterializerNc                 C   s6   || _ d | _|| _|| _|d u rtƒ | _d S || _d S ©N)Ú_blobÚ_mdÚ	_base_urlÚ_callerr   Ú_leaf_decoder)r
   r   Úbase_urlÚcallerÚleaf_decoderr   r   r   Ú__init__7   s   
zMetadataMaterializer.__init__c                 C   sÎ   i }g }t  |¡}|s||fS dd„ }dd„ }| ¡ D ]G}| ¡ }||ƒ}|r)|s*q|dkr/q||ƒr=||vr<| |¡ q| dd¡}|}	t|ƒdkr^|\}
}t  |
¡}
|
d ur^d|
 }	|}|	||< q||fS )	Nc                 S   s   |   d¡rdS dS )Nú/TF)r	   ©Úitemr   r   r   Úhas_childrenI   s   
z1MetadataMaterializer._parse.<locals>.has_childrenc                 S   s   |   d¡r
|  d¡S | S )Nr/   )r	   Úrstripr0   r   r   r   Úget_nameO   s   

z-MetadataMaterializer._parse.<locals>.get_namezsecurity-credentialsú=é   z%s/openssh-key)r   r   r   r   ÚappendÚsplitÚlenÚsafe_int)r
   r   ÚleavesÚchildrenr2   r4   r   Ú
field_nameÚcontentsÚresourceÚidentÚsub_contentsr   r   r   Ú_parseA   s8   

€

zMetadataMaterializer._parsec                 C   s(   | j d ur| j S |  | j| j¡| _ | j S r%   )r'   Ú_materializer&   r(   )r
   r   r   r   Úmaterializel   s   
z MetadataMaterializer.materializec                 C   sÒ   |   |¡\}}i }|D ]}t ||¡}| d¡s|d7 }|  |¡}|  ||¡||< qi }	| ¡ D ]\}
}t ||¡}|  |¡}|  |
|¡|	|
< q0i }| |¡ |	 	¡ D ]}
|
|v r`t
 d|¡ qS|	|
 ||
< qS|S )Nr/   z&Duplicate key found in results from %s)rB   r   Úcombine_urlr	   r)   rC   Úitemsr*   ÚupdateÚkeysr   r   )r
   r   r+   r;   r<   Úchild_contentsÚcÚ	child_urlÚ
child_blobÚleaf_contentsr   r?   Úleaf_urlÚ	leaf_blobÚjoinedr   r   r   rC   r   s(   



z!MetadataMaterializer._materializer%   )r    r!   r"   r.   rB   rD   rC   r   r   r   r   r$   6   s
    

+r$   c                 C   s
   |j | vS )z/Returns False if cause.code is in status_codes.)Úcode)Ústatus_codesÚcauser   r   r   Úskip_retry_on_codesŠ   s   
rT   Úlatestúhttp://169.254.169.254é   ©Ússl_detailsÚtimeoutÚretriesÚ
headers_cbÚheaders_redactÚexception_cbc             
   C   sÀ   t  || ¡}t  |d¡}d}	z|st tt¡}t j|||||||d�}
|
j}	W |	S  t jyO } z|j	tvrDt
 td|¡ W Y d }~|	S W Y d }~|	S d }~w ty_   t
 td|¡ Y |	S w )Nz	user-dataó    )rY   rZ   r[   r^   r\   r]   z$Failed fetching userdata from url %s)r   rE   Ú	functoolsÚpartialrT   ÚSKIP_USERDATA_CODESÚread_file_or_urlr>   ÚUrlErrorrQ   r   Úlogexcr   Ú	Exception)Úapi_versionÚmetadata_addressrY   rZ   r[   r\   r]   r^   Úud_urlÚ	user_dataÚresponser   r   r   r   Úget_instance_userdata�   s<   ÿù	û

ü€þþrl   c              	      s”   t  ||| ¡}tjt j||||||	d�‰ ‡ ‡fdd„}zˆ |ƒ}t|j|||d�}| ¡ }t|t	ƒs4i }|W S  t
yI   t td| |¡ i  Y S w )NrX   c              
      sP   zˆ | ƒj W S  tjy' } zˆrˆ|ƒs‚ t d| ¡ W Y d }~dS d }~ww )Nz&Skipped retrieval of the content of %sz	(skipped))r>   r   rd   r   r   )Úurlr   ©r,   Úretrieval_exception_ignore_cbr   r   ÚmcallerÏ   s   ÿþ€øz'_get_instance_metadata.<locals>.mcaller)r-   zFailed fetching %s from url %s)r   rE   r`   ra   rc   r$   r>   rD   Ú
isinstanceÚdictrf   r   re   r   )Útreerg   rh   rY   rZ   r[   r-   r\   r]   r^   ro   Úmd_urlrp   rk   ÚmaterializerÚmdr   rn   r   Ú_get_instance_metadata·   s0   ù

ÿ
þrw   c
           
      C   s   t d| |||||||||	d�S )Nz
meta-data/)rs   rg   rh   rY   rZ   r[   r-   r]   r\   r^   ro   ©rw   )
rg   rh   rY   rZ   r[   r-   r\   r]   r^   ro   r   r   r   Úget_instance_metadataê   s   õry   c	           	      C   s   t d| ||||||||d�
S )Nzdynamic/instance-identity)
rs   rg   rh   rY   rZ   r[   r-   r]   r\   r^   rx   )	rg   rh   rY   rZ   r[   r-   r\   r]   r^   r   r   r   Úget_instance_identity  s   örz   )rU   rV   )
rU   rV   NrW   rW   NNNNN)	rU   rV   NrW   rW   NNNN)r`   r   ÚloggingÚ	cloudinitr   r   Ú	getLoggerr    r   Ú	frozensetÚ	NOT_FOUNDrb   r   r$   rT   rl   rw   ry   rz   r   r   r   r   Ú<module>   sf   
#Tþ÷*
õ4
ö÷