U
    w7e&                     @   s   d dl Z d dlZd dlmZ d dlmZ d dl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/d0Z&d3d1d2Z'dS )4    N)importer)log)
type_utilsutil)FREQUENCIES
PER_ALWAYSPER_INSTANCEztext/x-not-multipartzapplication/octet-streamZ__end__Z	__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>?       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__D   s    zHandler.__init__c                 C   s   dt | |  f S )Nz%s: [%s])r   Zobj_name
list_typesr   r   r   r   __repr__H   s    zHandler.__repr__c                 C   s,   t | dstdndd t| dD S d S )Nprefixesz#Missing prefixes subclass attributec                 S   s   g | ]}t | qS r   )INCLUSION_TYPES_MAP).0prefixr   r   r   
<listcomp>P   s   z&Handler.list_types.<locals>.<listcomp>)hasattrNotImplementedErrorgetattrr   r   r   r   r   K   s
    

zHandler.list_typesc                 O   s
   t  d S r   )r$   )r   argskwargsr   r   r   handle_partU   s    zHandler.handle_partN)r   )	__name__
__module____qualname__r   r   r   abcabstractmethodr(   r   r   r   r   r   C   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k
rR   d}Y nX |d }zxt	d| |||| |dkr| 
|||||| nB|dkr| 
||||| n&|dkr| 
|||| ntd| W n* tk
r   ttd| |||| Y nX d S )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   headersZmod_freqZmod_vercontent_typer   r   r   run_partZ   s^    
     r@   c                 C   s   dt i}t| |d d || d S Nr0   )CONTENT_STARTr@   r:   r;   r   r>   r   r   r   
call_begin   s     rD   c                 C   s   dt i}t| |d d || d S rA   )CONTENT_ENDr@   rC   r   r   r   call_end   s     rF   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 n$ tk
r   ttd|| Y nX d S )NZhandlercountr   Z
handlerdirz%sz.pyz%s.pyi  handlersr;   T)Zinitializedr/   z7Failed at registering python file: %s (part handler %s))PART_HANDLER_FN_TMPLospathjoinendswithr   Z
write_filefixup_handlerr   import_modulerD   registerr8   r9   r6   )
ZpdataZ_ctypeZ	_filenamer=   Zcurcountmodnamer   ZmodfnamerG   r:   r   r   r   walker_handle_handler   s(    
rQ   c                 C   s   z\t | tr| ddd }n$| d d|  jddddd }t||krZ|d | }W n  tk
r|   | d| }Y nX |S )N
r/   r      ignore)errors)
isinstancestrsplitdecoder   UnicodeDecodeError)Zblobsizestartr   r   r   _extract_first_or_bytes   s    
$r]   c                 C   sb   z|  dW S  ttfk
rJ   z|  dW  Y S  tk
rD   Y nX Y n tk
r\   Y nX | S )NZstring_escapeZunicode_escape)encodeLookupErrorr3   r5   )textr   r   r   _escape_string   s    
ra   c                 C   s   |d }||  dkr&td| d S |tkr@t| ||| d S | d }||krpt|| | d ||| d | nN|rt|d}dt| }|tkrt	d	|| qt	d
|| ntd| d S )Nr0   Zexcludedzcontent_type "%s" is excludedrG   r;   r      z'%s...'z)Unhandled non-multipart (%s) userdata: %sz0Unhandled unknown content-type (%s) userdata: %szEmpty payload of type %s)
getr6   r7   PART_CONTENT_TYPESrQ   r@   r]   ra   NOT_MULTIPART_TYPEwarning)r;   r<   r=   r>   r?   rG   r\   Zdetailsr   r   r   walker_callback   s@    
rg   c           	      C   s   d}|   D ]t}| dkrq| }|d kr2t}| }|sFt| }t|}t| ||d< t	
|}||||| |d }qd S )Nr   Z	multipartr0   r/   )walkZget_content_maintypeZget_content_type
OCTET_TYPEget_filenamePART_FN_TPLdictr6   r7   r   Zfully_decoded_payload)	msgcallbackr;   ZpartnumpartZctyper<   r>   r=   r   r   r   rh     s     

rh   c                 C   sR   t | dst| dd t | ds.t| d| n | j}|rN|tkrNtd| | | S )Nr   r/   r   z&Handler %s has an unknown frequency %s)r#   setattrr   r   r6   rf   )r:   Zdef_freqZfreqr   r   r   rM     s    

rM   c                 C   sX   zt |  }W n tk
r*   | Y S X | }tD ]}||r8t|   S q8|S r   )r   Zdecode_binarylowerrZ   lstripINCLUSION_SRCH
startswithr   )r=   defaultZ
payload_lcr`   r   r   r   type_from_starts_with$  s    

rv   )N)(r,   rI   Z	cloudinitr   r   Zloggingr   r   Zcloudinit.settingsr   r   r   Z	getLoggerr)   r6   re   ri   rE   rB   ZCONTENT_SIGNALSrd   rH   rk   r   sortedlistkeysrs   ABCMetar   r@   rD   rF   rQ   r]   ra   rg   rh   rM   rv   r   r   r   r   <module>   sT   

 0)