o
    fU"                     @   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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_request_argscauser   r   r   skip_retry_on_codes   s   
rU   latesthttp://169.254.169.254   c              
   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    )ssl_detailstimeoutretriesexception_cb
headers_cbheaders_redactz$Failed fetching userdata from url %s)r   rE   	functoolspartialrU   SKIP_USERDATA_CODESread_file_or_urlr>   UrlErrorrQ   r   logexcr   	Exception)api_versionmetadata_addressrZ   r[   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 )N)rZ   r[   r\   r^   r_   r]   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   rZ   r[   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   rZ   r[   r\   r-   r_   r^   r]   ro   rw   )
rg   rh   rZ   r[   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   rZ   r[   r\   r-   r_   r^   r]   rx   )	rg   rh   rZ   r[   r\   r-   r^   r_   r]   r   r   r   get_instance_identity  s   rz   )rV   rW   NrX   rX   NNN)
rV   rW   NrX   rX   NNNNN)	rV   rW   NrX   rX   NNNN)r`   r   logging	cloudinitr   r   	getLoggerr    r   	frozenset	NOT_FOUNDrb   r   r$   rU   rl   rw   ry   rz   r   r   r   r   <module>   sd   
#T
)
4
