U
    L¬÷d™A  ã                   @   s  d dl Z d dlZd dlmZmZmZ d dlmZ d dlmZ d dl	m
Z d dl	mZmZmZ d dlmZmZmZmZ e e¡ZG dd	„ d	eƒZG d
d„ dƒZG dd„ dƒZG dd„ dƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZ G dd„ dej!ƒZ"G dd„ deƒZ#dS )é    N)ÚNoOptionErrorÚNoSectionErrorÚRawConfigParser)ÚStringIO)Útime)Úlog)ÚpersistenceÚ
type_utilsÚutil)ÚCFG_ENV_NAMEÚ
PER_ALWAYSÚPER_INSTANCEÚPER_ONCEc                   @   s   e Zd ZdS )ÚLockFailureN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr      s   r   c                   @   s   e Zd ZdS )Ú	DummyLockNr   r   r   r   r   r      s   r   c                   @   s4   e Zd Zdd„ Zejddd„ƒZdd„ Zdd	„ Zd
S )ÚDummySemaphoresc                 C   s   d S ©Nr   ©Úselfr   r   r   Ú__init__!   s    zDummySemaphores.__init__Fc                 c   s   t ƒ V  d S r   )r   )r   Ú_nameÚ_freqZ_clear_on_failr   r   r   Úlock$   s    zDummySemaphores.lockc                 C   s   dS )NFr   ©r   r   r   r   r   r   Úhas_run(   s    zDummySemaphores.has_runc                 C   s   dS )NTr   r   r   r   r   Úclear+   s    zDummySemaphores.clearN)F)	r   r   r   r   Ú
contextlibÚcontextmanagerr   r    r!   r   r   r   r   r       s
   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFileLockc                 C   s
   || _ d S r   )Úfn)r   r%   r   r   r   r   0   s    zFileLock.__init__c                 C   s   dt  | ¡| jf S )Nz<%s using file %r>)r	   Zobj_namer%   r   r   r   r   Ú__str__3   s    zFileLock.__str__N)r   r   r   r   r&   r   r   r   r   r$   /   s   r$   c                 C   s   |   dd¡S )Nú-Ú_)Úreplace)Únamer   r   r   Úcanon_sem_name7   s    r+   c                   @   sD   e Zd Zdd„ Zejddd„ƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚFileSemaphoresc                 C   s
   || _ d S r   )Úsem_path)r   r-   r   r   r   r   <   s    zFileSemaphores.__init__Fc                 c   sF   t |ƒ}z|  ||¡V  W n& tk
r@   |r:|  ||¡ ‚ Y nX d S r   )r+   Ú_acquireÚ	Exceptionr!   )r   r*   ÚfreqÚclear_on_failr   r   r   r   ?   s    zFileSemaphores.lockc              	   C   sP   t |ƒ}|  ||¡}zt |¡ W n( ttfk
rJ   t td|¡ Y dS X dS )NzFailed deleting semaphore %sFT)r+   Ú	_get_pathr
   Zdel_fileÚIOErrorÚOSErrorÚlogexcÚLOG)r   r*   r0   Úsem_filer   r   r   r!   I   s    zFileSemaphores.clearc              	   C   sp   |   ||¡rd S |  ||¡}dt ¡ tƒ f }zt ||¡ W n( ttfk
rf   t 	t
d|¡ Y d S X t|ƒS )Nz%s: %s
z Failed writing semaphore file %s)r    r2   ÚosÚgetpidr   r
   Z
write_filer3   r4   r5   r6   r$   )r   r*   r0   r7   Úcontentsr   r   r   r.   S   s    zFileSemaphores._acquirec                 C   sf   |r|t krdS t|ƒ}|  ||¡}tj |¡r4dS ||krbtj |  ||¡¡rbt d||¡ dS dS )NFTzœ%s has run without canonicalized name [%s].
likely the migrator has not yet run. It will run next boot.
run manually with: cloud-init single --name=migrator)r   r+   r2   r8   ÚpathÚexistsr6   Úwarning)r   r*   r0   Zcnamer7   r   r   r   r    c   s    úzFileSemaphores.has_runc                 C   s:   | j }|r|tkr tj ||¡S tj |d||f ¡S d S )Nz%s.%s)r-   r   r8   r;   Újoin)r   r*   r0   r-   r   r   r   r2   }   s    zFileSemaphores._get_pathN)F)r   r   r   r   r"   r#   r   r!   r.   r    r2   r   r   r   r   r,   ;   s   	
r,   c                   @   s&   e Zd Zdd„ Zdd„ Zd	dd„ZdS )
ÚRunnersc                 C   s   || _ i | _d S r   )ÚpathsÚsems)r   r@   r   r   r   r   †   s    zRunners.__init__c                 C   sh   |t ks|sd S d }|tkr*| j d¡}n|tkr>| j d¡}|sFd S || jkr^t|ƒ| j|< | j| S )NÚsem)r   r   r@   Ú	get_ipathr   Ú	get_cpathrA   r,   )r   r0   r-   r   r   r   Ú_get_semŠ   s    
zRunners._get_semNFc           	   
   C   sª   |   |¡}|stƒ }|sg }| ||¡r:t d||¡ dS | |||¡X}|s\td| ƒ‚n@t d||¡ t|tƒr€|f |Ž}n||Ž }d|fW  5 Q R £ S W 5 Q R X d S )Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)T)	rE   r   r    r6   Údebugr   r   Ú
isinstanceÚdict)	r   r*   ZfunctorÚargsr0   r1   rB   ZlkZresultsr   r   r   Úrun   s     

zRunners.run)NF)r   r   r   r   rE   rJ   r   r   r   r   r?   …   s   r?   c                   @   sH   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zedœdd„Ze	dd„ ƒZ
dS )ÚConfigMergerNTc                 C   s(   || _ || _|| _|| _|| _d | _d S r   )Ú_pathsÚ_dsÚ_fnsÚ	_base_cfgÚ_include_vendorÚ_cfg)r   r@   Ú
datasourceZadditional_fnsZbase_cfgZinclude_vendorr   r   r   r   ³   s    zConfigMerger.__init__c                 C   sZ   g }| j rVz&| j  ¡ }|r.t|tƒr.| |¡ W n$ tk
rT   t td| j ¡ Y nX |S )Nz2Failed loading of datasource config object from %s)	rM   Zget_config_objrG   rH   Úappendr/   r
   r5   r6   )r   Zd_cfgsZds_cfgr   r   r   Ú_get_datasource_configsÃ   s    
ý
z$ConfigMerger._get_datasource_configsc                 C   sT   g }t tjkrPtjt  }z| t |¡¡ W n" tk
rN   t td|¡ Y nX |S )Nz%Failed loading of env. config from %s)	r   r8   ÚenvironrS   r
   Ú	read_confr/   r5   r6   )r   Ze_cfgsZe_fnr   r   r   Ú_get_env_configsÒ   s    

zConfigMerger._get_env_configsc              	   C   s®   g }| j s|S dg}| jr.| d¡ | d¡ |D ]v}| j  |¡}|r2tj |¡r2z| t |¡¡ W q2 t	k
r†   t
 d|¡ Y q2 tk
r¦   t t
d|¡ Y q2X q2|S )NÚcloud_configÚvendor2_cloud_configÚvendor_cloud_configz5Skipped loading cloud-config from %s due to non-root.z&Failed loading of cloud-config from %s)rL   rP   rS   Úget_ipath_curr8   r;   Úisfiler
   rV   ÚPermissionErrorr6   rF   r/   r5   )r   Zi_cfgsZcc_pathsZcc_pZcc_fnr   r   r   Ú_get_instance_configsÜ   s0    

ý  ÿz"ConfigMerger._get_instance_configs)Úreturnc              	   C   s”   g }| j rN| j D ]<}z| t |¡¡ W q tk
rJ   t td|¡ Y qX q| |  ¡ ¡ | |  	¡ ¡ | |  
¡ ¡ | jrŠ| | j¡ t |¡S )Nz'Failed loading of configuration from %s)rN   rS   r
   rV   r/   r5   r6   ÚextendrW   r^   rT   rO   Zmergemanydict)r   ÚcfgsZc_fnr   r   r   Ú	_read_cfgü   s"    
  ÿzConfigMerger._read_cfgc                 C   s   | j d kr|  ¡ | _ | j S r   )rQ   rb   r   r   r   r   Úcfg  s    

zConfigMerger.cfg)NNNNT)r   r   r   r   rT   rW   r^   rH   rb   Úpropertyrc   r   r   r   r   rK   ²   s        ú

 rK   c                   @   sF   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Z	dS )ÚContentHandlersc                 C   s   i | _ g | _d S r   )Ú
registeredÚinitializedr   r   r   r   r     s    zContentHandlers.__init__c                 C   s
   |   |¡S r   )Úis_registered)r   Úitemr   r   r   Ú__contains__!  s    zContentHandlers.__contains__c                 C   s
   |   |¡S r   )Ú_get_handler)r   Úkeyr   r   r   Ú__getitem__$  s    zContentHandlers.__getitem__c                 C   s
   || j kS r   ©rf   ©r   Zcontent_typer   r   r   rh   '  s    zContentHandlers.is_registeredFTc                 C   sj   t ƒ }| ¡ D ](}|r"| |¡ q|  |¡s| |¡ q|D ]}|| j|< q<|rf|| jkrf| j |¡ |S r   )ÚsetZ
list_typesÚaddrh   rf   rg   rS   )r   Úmodrg   Z	overwriteÚtypesÚtr   r   r   Úregister*  s    
zContentHandlers.registerc                 C   s
   | j | S r   rn   ro   r   r   r   rk   8  s    zContentHandlers._get_handlerc                 C   s   t | j ¡ ƒS r   )Úlistrf   Úitemsr   r   r   r   rw   ;  s    zContentHandlers.itemsN)FT)
r   r   r   r   rj   rm   rh   ru   rk   rw   r   r   r   r   re     s   
re   c                   @   sr   e Zd ZdZdedœdd„Zeddœdd„Zdd	d
„Zddd„Z	ddd„Z
ddd„Zdedœdd„Zddd„ZdS )ÚPathsé   N)Ú	path_cfgsc                 C   s²   || _ | dd¡| _| dd¡| _tj | jd¡| _tj | jd¡| _tj | jd¡| _	| dd	¡}tj |d
¡| _
dddddddddddddddddddddd d!œ| _|| _d S )"NÚ	cloud_dirz/var/lib/cloudÚrun_dirz/run/cloud-initÚinstancezboot-finishedZseedZtemplates_dirz/etc/cloud/templates/z%s.tmplÚ	boothookszcloud-config.txtÚdataÚhandlersúinstance-data.jsonúinstance-data-sensitive.jsonúcombined-cloud-config.jsonz.instance-idzmanual-cleanzobj.pklÚscriptsrB   zuser-data.txt.izuser-data.txtzvendor-data.txt.izvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorÚwarnings)r~   rX   r   r€   Úinstance_dataÚinstance_data_sensitiveÚcombined_cloud_configZinstance_idZmanual_clean_markerZobj_pklr„   rB   ZuserdataZuserdata_rawZ
vendordataZvendordata2Zvendordata2_rawZvendordata_rawrY   rZ   Zvendor_scriptsr…   )ra   Úgetr{   r|   r8   r;   r>   Úinstance_linkZboot_finishedZseed_dirZtemplate_tplÚlookupsrR   )r   rz   ÚdsZtemplate_dirr   r   r   r   B  sL     ÿ ÿåzPaths.__init__)Úci_pkl_versionr_   c                 C   s^   t | dƒst| j| jdj| _d| jkr2d| jd< d| jkrFd| jd< d| jkrZd| jd< d	S )
z(Perform deserialization fixes for Paths.r|   )rz   rŒ   r†   r   r‡   r‚   rˆ   rƒ   N)Úhasattrrx   ra   rR   r|   r‹   )r   r   r   r   r   Ú	_unpickleq  s"    
 ÿ



þÿ
þÿzPaths._unpicklec                 C   s   |   | j|¡S r   )r2   rŠ   ©r   r*   r   r   r   r[   ˆ  s    zPaths.get_ipath_curc                 C   s   |   | j|¡S r   )r2   r{   r   r   r   r   rD     s    zPaths.get_cpathc                 C   sf   | j s
d S | j  ¡ }|d kr d S t|ƒ tjd¡}tj | jd|¡}| j	 
|¡}|rbtj ||¡}|S )Nr(   Z	instances)rR   Zget_instance_idÚstrr)   r8   Úsepr;   r>   r{   r‹   r‰   )r   r*   ZiidZpath_safe_iidÚipathZadd_onr   r   r   Ú
_get_ipath’  s    
zPaths._get_ipathc                 C   s$   |   |¡}|st d¡ d S |S d S )Nz?No per instance data available, is there an datasource/iid set?)r”   r6   r=   )r   r*   r“   r   r   r   rC   ¢  s    
ÿzPaths.get_ipath)Úbasec                 C   s    |d kr|S t j || j| ¡S r   )r8   r;   r>   r‹   )r   r•   r*   r   r   r   r2   ­  s    zPaths._get_pathc                 C   s   |   | j|¡S r   )r2   r|   r   r   r   r   Úget_runpath²  s    zPaths.get_runpath)N)N)N)N)N)N)N)r   r   r   Z_ci_pkl_versionrH   r   Úintr   r[   rD   r”   rC   r‘   r2   r–   r   r   r   r   rx   ?  s   /



rx   c                   @   sX   e Zd ZdZdZdZdZdd„ Zddd„Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zddd„ZdS )ÚDefaultingConfigParserr   g        FNc                 C   sD   | j }zt | ||¡}W n& tk
r,   Y n tk
r>   Y nX |S r   )ÚDEF_BASEr   r‰   r   r   ©r   ÚsectionÚoptionÚvaluer   r   r   r‰   Æ  s    zDefaultingConfigParser.getc                 C   s4   |   |¡s | ¡ dkr |  |¡ t | |||¡ d S )NÚdefault)Zhas_sectionÚlowerZadd_sectionr   rp   rš   r   r   r   rp   Ð  s    
zDefaultingConfigParser.setc                 C   s   |   ||¡rt | ||¡ d S r   )Ú
has_optionr   Úremove_option©r   r›   rœ   r   r   r   r¡   Õ  s    z$DefaultingConfigParser.remove_optionc                 C   s    |   ||¡s| jS t | ||¡S r   )r    ÚDEF_BOOLEANr   Ú
getbooleanr¢   r   r   r   r¤   Ù  s    z!DefaultingConfigParser.getbooleanc                 C   s    |   ||¡s| jS t | ||¡S r   )r    Ú	DEF_FLOATr   Úgetfloatr¢   r   r   r   r¦   Þ  s    zDefaultingConfigParser.getfloatc                 C   s    |   ||¡s| jS t | ||¡S r   )r    ÚDEF_INTr   Úgetintr¢   r   r   r   r¨   ã  s    zDefaultingConfigParser.getintc                 C   s<   d}t ƒ }|  |¡ | ¡  | ¡ }|r8d ||dg¡}|S )NÚ Ú
)r   ÚwriteÚflushÚgetvaluer>   )r   Úheaderr:   Zoutputstreamr   r   r   Ú	stringifyè  s    
z DefaultingConfigParser.stringify)N)N)r   r   r   r§   r¥   r£   r™   r‰   rp   r¡   r¤   r¦   r¨   r¯   r   r   r   r   r˜   À  s   

r˜   )$r"   r8   Úconfigparserr   r   r   Úior   r   Z	cloudinitr   Zloggingr   r	   r
   Zcloudinit.settingsr   r   r   r   Z	getLoggerr   r6   r/   r   r   r   r$   r+   r,   r?   rK   re   ZCloudInitPickleMixinrx   r˜   r   r   r   r   Ú<module>   s(   
J-j# 