U
    ¯Ad¼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                   @   s<   e Zd Zdd„ Zejddd„ƒZ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.clearc                 C   s   d S r   r   r   r   r   r   Ú	clear_all.   s    zDummySemaphores.clear_allN)F)
r   r   r   r   Ú
contextlibÚcontextmanagerr   r    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   3   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__6   s    zFileLock.__str__N)r   r   r   r   r'   r   r   r   r   r%   2   s   r%   c                 C   s   |   dd¡S )Nú-Ú_)Úreplace)Únamer   r   r   Úcanon_sem_name:   s    r,   c                   @   sL   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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   B   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+   r1   Úsem_filer   r   r   r!   L   s    zFileSemaphores.clearc              	   C   s>   zt  | j¡ W n( ttfk
r8   t  td| j¡ Y nX d S )Nz&Failed deleting semaphore directory %s)r
   Zdel_dirr.   r4   r5   r6   r7   r   r   r   r   r"   V   s      ÿzFileSemaphores.clear_allc              	   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    r3   ÚosÚgetpidr   r
   Z
write_filer4   r5   r6   r7   r%   )r   r+   r1   r8   Úcontentsr   r   r   r/   ^   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,   r3   r9   ÚpathÚexistsr7   Úwarning)r   r+   r1   Zcnamer8   r   r   r   r    n   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   r9   r<   Újoin)r   r+   r1   r.   r   r   r   r3   ˆ   s    zFileSemaphores._get_pathN)F)r   r   r   r   r#   r$   r   r!   r"   r/   r    r3   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   rA   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   rA   Ú	get_ipathr   Ú	get_cpathrB   r-   )r   r1   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)	rF   r   r    r7   Údebugr   r   Ú
isinstanceÚdict)	r   r+   ZfunctorÚargsr1   r2   rC   ZlkZresultsr   r   r   Úrun¨   s     

zRunners.run)NF)r   r   r   r   rF   rK   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   rA   Ú
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)	rN   Zget_config_objrH   rI   Úappendr0   r
   r6   r7   )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   r9   ÚenvironrT   r
   Ú	read_confr0   r6   r7   )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)rM   rQ   rT   Úget_ipath_curr9   r<   Úisfiler
   rW   ÚPermissionErrorr7   rG   r0   r6   )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)rO   rT   r
   rW   r0   r6   r7   ÚextendrX   r_   rU   rP   Zmergemanydict)r   ÚcfgsZc_fnr   r   r   Ú	_read_cfg  s"    
  ÿzConfigMerger._read_cfgc                 C   s   | j d kr|  ¡ | _ | j S r   )rR   rc   r   r   r   r   Úcfg  s    

zConfigMerger.cfg)NNNNT)r   r   r   r   rU   rX   r_   rI   rc   Úpropertyrd   r   r   r   r   rL   ½   s        ú

 rL   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   ©rg   ©r   Zcontent_typer   r   r   ri   2  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Úaddri   rg   rh   rT   )r   Úmodrh   Z	overwriteÚtypesÚtr   r   r   Úregister5  s    
zContentHandlers.registerc                 C   s
   | j | S r   ro   rp   r   r   r   rl   C  s    zContentHandlers._get_handlerc                 C   s   t | j ¡ ƒS r   )Úlistrg   Úitemsr   r   r   r   rx   F  s    zContentHandlers.itemsN)FT)
r   r   r   r   rk   rn   ri   rv   rl   rx   r   r   r   r   rf   '  s   
rf   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 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.jsonz.instance-idzmanual-cleanzobj.pklÚscriptsrC   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   rY   r€   r   Úinstance_dataÚinstance_data_sensitiveZinstance_idZmanual_clean_markerZobj_pklr„   rC   ZuserdataZuserdata_rawZ
vendordataZvendordata2Zvendordata2_rawZvendordata_rawrZ   r[   Zvendor_scriptsr…   )rb   Úgetr|   r}   r9   r<   r?   Úinstance_linkZboot_finishedZseed_dirZtemplate_tplÚlookupsrS   )r   r{   ÚdsZtemplate_dirr   r   r   r   M  sJ     ÿ ÿæzPaths.__init__)Úci_pkl_versionr`   c                 C   sJ   t | dƒst| j| jdj| _d| jkr2d| jd< d| jkrFd| jd< dS )z(Perform deserialization fixes for Paths.r}   )r{   r‹   r†   r‚   r‡   rƒ   N)Úhasattrry   rb   rS   r}   rŠ   )r   rŒ   r   r   r   Ú	_unpickle{  s    
 ÿ



þÿzPaths._unpicklec                 C   s   |   | j|¡S r   )r3   r‰   ©r   r+   r   r   r   r\   Ž  s    zPaths.get_ipath_curc                 C   s   |   | j|¡S r   )r3   r|   r   r   r   r   rE   “  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)rS   Zget_instance_idÚstrr*   r9   Ú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“   r7   r>   )r   r+   r’   r   r   r   rD   ¨  s    
ÿzPaths.get_ipath)Úbasec                 C   s    |d kr|S t j || j| ¡S r   )r9   r<   r?   rŠ   )r   r”   r+   r   r   r   r3   ³  s    zPaths._get_pathc                 C   s   |   | j|¡S r   )r3   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_versionrI   r   ÚintrŽ   r\   rE   r“   rD   r   r3   r•   r   r   r   r   ry   J  s   .



ry   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   rq   r™   r   r   r   rq   Ö  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ˆ   rq   r    r£   r¥   r§   r®   r   r   r   r   r—   Æ  s   

r—   )$r#   r9   Úconfigparserr   r   r   Úior   r   Z	cloudinitr   Zloggingr   r	   r
   Zcloudinit.settingsr   r   r   r   Z	getLoggerr   r7   r0   r   r   r   r%   r,   r-   r@   rL   rf   ZCloudInitPickleMixinry   r—   r   r   r   r   Ú<module>   s&   
R-j#|