o
    w7e"                     @   s   d dl Z d dlZd dlm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)log)
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 )Nr0   )r
   rstripr1   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childrenr3   r5   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 )Nr0   z&Duplicate key found in results from %s)rC   r   combine_urlr
   r*   rD   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   rD   r   s(   



z!MetadataMaterializer._materializer&   )r!   r"   r#   r/   rC   rE   rD   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   
rV   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   rF   	functoolspartialrV   SKIP_USERDATA_CODESread_file_or_urlr?   UrlErrorrR   r   logexcr   	Exception)api_versionmetadata_addressr[   r\   r]   r_   r`   r^   ud_url	user_dataresponser   r   r   r   get_instance_userdata   s<   
	

rm   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)r[   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   re   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   rF   ra   rb   rd   r%   r?   rE   
isinstancedictrg   r   rf   r   )treerh   ri   r[   r\   r]   r.   r_   r`   r^   rp   md_urlrq   rl   materializermdr   ro   r   _get_instance_metadata   s0   


rx   c
           
      C   s   t d| |||||||||	dS )Nz
meta-data/)rt   rh   ri   r[   r\   r]   r.   r`   r_   r^   rp   rx   )
rh   ri   r[   r\   r]   r.   r_   r`   r^   rp   r   r   r   get_instance_metadata   s   rz   c	           	      C   s   t d| ||||||||d
S )Nzdynamic/instance-identity)
rt   rh   ri   r[   r\   r]   r.   r`   r_   r^   ry   )	rh   ri   r[   r\   r]   r.   r_   r`   r^   r   r   r   get_instance_identity  s   r{   )rW   rX   NrY   rY   NNN)
rW   rX   NrY   rY   NNNNN)	rW   rX   NrY   rY   NNNN)ra   r   	cloudinitr   loggingr   r   	getLoggerr!   r   	frozenset	NOT_FOUNDrc   r   r%   rV   rm   rx   rz   r{   r   r   r   r   <module>   sd   
#T
)
4
