o
    x[h}&  ã                   @   s  d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
 e e¡ZdZdZdZdZeegZdgZd	Zd
ZdddddddddddddœZeee ¡ ƒdd„ d�ZG dd„ de jd�Zdd„ Zdd „ Zd!d"„ Zd#d$„ Z d%d&„ Z!d'd(„ Z"d)d*„ Z#d+d,„ Z$e
fd-d.„Z%d1d/d0„Z&dS )2é    N)ÚimporterÚ
type_utilsÚutil)ÚFREQUENCIESÚ
PER_ALWAYSÚPER_INSTANCEztext/x-not-multipartzapplication/octet-streamÚ__end__Ú	__begin__ztext/part-handlerzpart-handler-%03dz	part-%03dztext/x-include-urlztext/x-include-once-urlztext/x-shellscriptztext/cloud-configztext/cloud-boothookztext/cloud-config-archiveztext/cloud-config-jsonpztext/jinja2útext/x-shellscript-per-bootútext/x-shellscript-per-instanceútext/x-shellscript-per-once)z#includez#include-oncez#!z#cloud-configz#part-handlerz#cloud-boothookz#cloud-config-archivez#cloud-config-jsonpz## template: jinjar
   r   r   c                 C   s   dt | ƒ S )Nr   )Úlen)Úe© r   ú=/usr/lib/python3/dist-packages/cloudinit/handlers/__init__.pyÚ<lambda>>   s    r   )Úkeyc                   @   s4   e Zd Zddd„Zdd„ Zdd„ Zejdd	„ ƒZd
S )ÚHandleré   c                 C   s   || _ || _d S ©N)Úhandler_versionÚ	frequency)Úselfr   Úversionr   r   r   Ú__init__C   s   
zHandler.__init__c                 C   s   dt  | ¡|  ¡ f S )Nz%s: [%s])r   Úobj_nameÚ
list_types©r   r   r   r   Ú__repr__G   s   zHandler.__repr__c                 C   s&   t | dƒs	tdƒ‚dd„ t| dƒD ƒS )NÚprefixesz#Missing prefixes subclass attributec                 S   s   g | ]}t | ‘qS r   )ÚINCLUSION_TYPES_MAP)Ú.0Úprefixr   r   r   Ú
<listcomp>O   s    ÿÿz&Handler.list_types.<locals>.<listcomp>)ÚhasattrÚNotImplementedErrorÚgetattrr   r   r   r   r   J   s
   
þzHandler.list_typesc                 O   s   t ƒ ‚r   )r%   )r   ÚargsÚkwargsr   r   r   Úhandle_partT   s   zHandler.handle_partN)r   )	Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚabcÚabstractmethodr)   r   r   r   r   r   B   s    

r   )Ú	metaclassc           	      C   s  | j }|tks|tkr|tksd S z	| j}t|ƒ}W n tttfy(   d}Y nw |d }z@t 	d| ||||¡ |dkrI|  
||||||¡ W d S |dkrY|  
|||||¡ W d S |dkrh|  
||||¡ W d S td| ƒ‚ ty‚   t td| ||||¡ Y d S w )Né   úContent-Typez1Calling handler %s (%s, %s, %s) with frequency %sé   r   zUnknown module version %sz8Failed calling handler %s (%s, %s, %s) with frequency %s)r   r   r   r   ÚintÚ	TypeErrorÚ
ValueErrorÚAttributeErrorÚLOGÚdebugr)   Ú	Exceptionr   Úlogexc)	ÚmodÚdataÚfilenameÚpayloadr   ÚheadersÚmod_freqÚmod_verÚcontent_typer   r   r   Úrun_partY   sP   ÿú
ÿ
ùÿrC   c                 C   ó   dt i}t| |d d ||ƒ d S ©Nr1   )ÚCONTENT_STARTrC   ©r;   r<   r   r?   r   r   r   Ú
call_begin‰   ó   ÿrH   c                 C   rD   rE   )ÚCONTENT_ENDrC   rG   r   r   r   Úcall_end‘   rI   rK   c           
   	   C   sº   | d }t | }| d }tj | d d| ¡}| d¡s d| }t ||d¡ | d }ztt 	|¡ƒ}	t
|	| d	 |ƒ |j|	d
d� |d | d< W d S  ty\   t td||¡ Y d S w )NÚhandlercountr   Ú
handlerdirz%sz.pyz%s.pyi€  Úhandlersr<   T)Úinitializedr0   z7Failed at registering python file: %s (part handler %s))ÚPART_HANDLER_FN_TMPLÚosÚpathÚjoinÚendswithr   Ú
write_fileÚfixup_handlerr   Úimport_modulerH   Úregisterr9   r:   r7   )
ÚpdataÚ_ctypeÚ	_filenamer>   ÚcurcountÚmodnamer   ÚmodfnamerN   r;   r   r   r   Úwalker_handle_handler™   s*   

üÿr_   c                 C   s†   z2t | tƒr|  dd¡d }n| d d| … jdd� dd¡d }t|ƒ|kr0|d |… }W |S W |S  tyB   | d|… }Y |S w )NÚ
r0   r   é   Úignore)Úerrors)Ú
isinstanceÚstrÚsplitÚdecoder   ÚUnicodeDecodeError)ÚblobÚsizeÚstartr   r   r   Ú_extract_first_or_bytes³   s   
$ûýýrl   c                 C   sZ   z|   d¡W S  ttfy#   z|   d¡W  Y S  ty"   Y Y | S w  ty,   Y | S w )NÚstring_escapeÚunicode_escape)ÚencodeÚLookupErrorr4   r6   )Útextr   r   r   Ú_escape_stringÅ   s   øûrr   c                 C   sÈ   |d }||   d¡v rt d|¡ d S |tv r t| |||ƒ d S | d }||v r9t|| | d ||| d |ƒ d S |r\t|dƒ}dt|ƒ }|tkrSt 	d	||¡ d S t 	d
||¡ d S t d|¡ d S )Nr1   Úexcludedzcontent_type "%s" is excludedrN   r<   r   é   z'%s...'z)Unhandled non-multipart (%s) userdata: %sz0Unhandled unknown content-type (%s) userdata: %szEmpty payload of type %s)
Úgetr7   r8   ÚPART_CONTENT_TYPESr_   rC   rl   rr   ÚNOT_MULTIPART_TYPEÚwarning)r<   r=   r>   r?   rB   rN   rk   Údetailsr   r   r   Úwalker_callback×   s@   ú
ýýrz   c           	      C   s†   d}|   ¡ D ]:}| ¡ dkrq| ¡ }|d u rt}| ¡ }|s#t| }t|ƒ}t |¡ ||d< t	 
|¡}|||||ƒ |d }qd S )Nr   Ú	multipartr1   r0   )ÚwalkÚget_content_maintypeÚget_content_typeÚ
OCTET_TYPEÚget_filenameÚPART_FN_TPLÚdictr7   r8   r   Úfully_decoded_payload)	ÚmsgÚcallbackr<   ÚpartnumÚpartÚctyper=   r?   r>   r   r   r   r|      s"   


îr|   c                 C   sT   t | dƒst| ddƒ t | dƒst| d|ƒ | S | j}|r(|tvr(t d| |¡ | S )Nr   r0   r   z&Handler %s has an unknown frequency %s)r$   Úsetattrr   r   r7   rx   )r;   Údef_freqÚfreqr   r   r   rV     s   

ýrV   c                 C   sV   z	t  | ¡ ¡ }W n ty   | Y S w | ¡ }tD ]}| |¡r(t|   S q|S r   )r   Údecode_binaryÚlowerrh   ÚlstripÚINCLUSION_SRCHÚ
startswithr    )r>   ÚdefaultÚ
payload_lcrq   r   r   r   Útype_from_starts_with#  s   ÿ
ÿr“   r   )'r-   ÚloggingrQ   Ú	cloudinitr   r   r   Úcloudinit.settingsr   r   r   Ú	getLoggerr*   r7   rw   r   rJ   rF   ÚCONTENT_SIGNALSrv   rP   r�   r    ÚsortedÚlistÚkeysr�   ÚABCMetar   rC   rH   rK   r_   rl   rr   rz   r|   rV   r“   r   r   r   r   Ú<module>   sR   

ðÿ0)