U
    Ӈg@                     @   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 d dl	m	Z	 d dl
mZ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)persistencesettings
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+   r1   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!   r3   osgetpidr   r
   Z
write_filer4   r5   r6   r7   r%   )r   r+   r1   r8   contentsr   r   r   r/   S   s    zFileSemaphores._acquirec                 C   s0   |r|t krdS t|}| ||}tj|S r   )r   r,   r3   r9   pathexists)r   r+   r1   Zcnamer8   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   r9   r<   join)r   r+   r1   r.   r   r   r   r3   m   s    zFileSemaphores._get_pathN)F)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   r@   r   r   r   r   v   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   r1   r.   r   r   r   _get_semz   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!   r7   debugr   r   
isinstancedict)	r   r+   Zfunctorargsr1   r2   rB   ZlkZresultsr   r   r   run   s     

zRunners.run)NF)r   r   r   r   rE   rJ   r   r   r   r   r?   u   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   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   environrS   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)rL   rP   rS   get_ipath_curr9   r<   isfiler
   rV   PermissionErrorr7   rF   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)rN   rS   r
   rV   r0   r6   r7   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   (  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| _|dtj| _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#d$d%| _|| _d S )&N	cloud_dirz/var/lib/clouddocs_dirz/usr/share/doc/cloud-init/run_dir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network-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hotplug.enabled.skip-network)r   rX   r   r   instance_datainstance_data_sensitivecombined_cloud_configZnetwork_configZinstance_idZmanual_clean_markerZobj_pklr   rB   ZuserdataZuserdata_rawZ
vendordataZvendordata2Zvendordata2_rawZvendordata_rawrY   rZ   Zvendor_scriptsr   r   r   )ra   getr{   r|   r   ZDEFAULT_RUN_DIRr}   r9   r<   r>   instance_linkZboot_finishedZseed_dirZtemplate_tpllookupsrR   )r   rz   dsZtemplate_dirr   r   r   r   2  sZ       !zPaths.__init__)ci_pkl_versionr_   c                 C   sr   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	| jkrnd	| jd	< d
S )z(Perform deserialization fixes for Paths.r}   )rz   r   r   r   r   r   r   r   r   N)hasattrrx   ra   rR   r}   r   )r   r   r   r   r   	_unpickleg  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   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*   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   Zwarning)r   r+   r   r   r   r   rC     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_versionrH   r   intr   r[   rD   r   rC   r   r3   r   r   r   r   r   rx   /  s   5



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#   Zloggingr9   configparserr   r   r   ior   r   Z	cloudinitr   r   r	   r
   Zcloudinit.settingsr   r   r   r   Z	getLoggerr   r7   r0   r   r   r   r%   r,   r-   r?   rK   re   ZCloudInitPickleMixinrx   r   r   r   r   r   <module>   s(   
:-j# 
