o
    fu@                     @   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                   @      e Zd ZdS )LockFailureN__name__
__module____qualname__ r   r   3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr          r   c                   @   r   )	DummyLockNr   r   r   r   r   r      r   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__!      zDummySemaphores.__init__Fc                 c   s    t  V  d S r   )r   )r   _name_freq_clear_on_failr   r   r   lock$   s   zDummySemaphores.lockc                 C      dS NFr   r   r   r    r   r   r   has_run(   r   zDummySemaphores.has_runc                 C   r#   )NTr   r%   r   r   r   clear+   r   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   
   || _ d S r   )fn)r   r-   r   r   r   r   0      
zFileLock.__init__c                 C   s   dt | | jf S )Nz<%s using file %r>)r	   obj_namer-   r   r   r   r   __str__3   s   zFileLock.__str__N)r   r   r   r   r0   r   r   r   r   r+   /   s    r+   c                 C   s   |  ddS )N-_)replace)namer   r   r   canon_sem_name7   s   r5   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   r,   r   )sem_path)r   r7   r   r   r   r   <   r.   zFileSemaphores.__init__Fc                 c   s@    t |}z
| ||V  W d S  ty   |r| ||  w r   )r5   _acquire	Exceptionr'   )r   r4   freqclear_on_failr   r   r   r"   ?   s   zFileSemaphores.lockc              	   C   sL   t |}| ||}zt| W dS  ttfy%   ttd| Y dS w )NzFailed deleting semaphore %sFT)r5   	_get_pathr
   del_fileIOErrorOSErrorlogexcLOG)r   r4   r:   sem_filer   r   r   r'   I   s   zFileSemaphores.clearc              	   C   sl   |  ||rd S | ||}dt t f }zt|| W t|S  ttfy5   t	t
d| Y d S w )Nz%s: %s
z Failed writing semaphore file %s)r&   r<   osgetpidr   r
   
write_filer>   r?   r@   rA   r+   )r   r4   r:   rB   contentsr   r   r   r8   S   s   zFileSemaphores._acquirec                 C   s0   |r|t krdS t|}| ||}tj|S r$   )r   r5   r<   rC   pathexists)r   r4   r:   cnamerB   r   r   r   r&   c   s
   zFileSemaphores.has_runc                 C   s6   | j }|r	|tkrtj||S tj|d||f S )Nz%s.%s)r7   r   rC   rG   join)r   r4   r:   r7   r   r   r   r<   m   s   zFileSemaphores._get_pathNr(   )r   r   r   r   r)   r*   r"   r'   r8   r&   r<   r   r   r   r   r6   ;   s    	

r6   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   rL   r   r   r   r   v      
zRunners.__init__c                 C   sh   |t ks|sd S d }|tkr| jd}n
|tkr| jd}|s#d S || jvr/t|| j|< | j| S )Nsem)r   r   rL   	get_ipathr   	get_cpathrM   r6   )r   r:   r7   r   r   r   _get_semz   s   

zRunners._get_semNFc           	      C   s   |  |}|s
t }|sg }|||rtd|| dS ||||,}|s-td| td|| t|trA|di |}n|| }d|fW  d    S 1 sSw   Y  d S )Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr   )	rR   r   r&   rA   debugr"   r   
isinstancedict)	r   r4   functorargsr:   r;   rO   lkresultsr   r   r   run   s"   

$zRunners.runr$   )r   r   r   r   rR   rZ   r   r   r   r   rK   u   s    rK   c                   @   sR   e Zd Z					dddZdd Zdd Zd	d
 Zdef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   rL   
datasourceadditional_fnsbase_cfginclude_vendorr   r   r   r      s   
zConfigMerger.__init__c                 C   sh   g }| j r2z| j  }|rt|tr|| W |S W |S W |S  ty1   ttd| j  Y |S w |S )Nz2Failed loading of datasource config object from %s)	r]   get_config_objrT   rU   appendr9   r
   r@   rA   )r   d_cfgsds_cfgr   r   r   _get_datasource_configs   s(   
z$ConfigMerger._get_datasource_configsc                 C   sV   g }t tjv r)tjt  }z|t| W |S  ty(   ttd| Y |S w |S )Nz%Failed loading of env. config from %s)	r   rC   environrg   r
   	read_confr9   r@   rA   )r   e_cfgs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 ]9}| j |}|rRtj|rRz
|t| W q t	yB   t
d| Y q tyQ   tt
d| Y qw q|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)r\   r`   rg   get_ipath_currC   rG   isfiler
   rl   PermissionErrorrA   rS   r9   r@   )r   i_cfgscc_pathscc_pcc_fnr   r   r   _get_instance_configs   s0   

z"ConfigMerger._get_instance_configsreturnc              	   C   s   g }| j r%| j D ]}z
|t| W q ty$   ttd| Y qw ||   || 	  || 
  | jrC|| j t|S )Nz'Failed loading of configuration from %s)r^   rg   r
   rl   r9   r@   rA   extendro   rz   rj   r_   mergemanydict)r   cfgsc_fnr   r   r   	_read_cfg   s    

zConfigMerger._read_cfgc                 C   s   | j d u r
|  | _ | j S r   )ra   r   r   r   r   r   cfg  s   

zConfigMerger.cfg)NNNNT)r   r   r   r   rj   ro   rz   rU   r   propertyr   r   r   r   r   r[      s    

 r[   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     rN   zContentHandlers.__init__c                 C   
   |  |S r   )is_registered)r   itemr   r   r   __contains__  r.   zContentHandlers.__contains__c                 C   r   r   )_get_handler)r   keyr   r   r   __getitem__  r.   zContentHandlers.__getitem__c                 C   s
   || j v S r   r   r   content_typer   r   r   r     r.   zContentHandlers.is_registeredFTc                 C   sj   t  }| D ]}|r|| q| |s|| q|D ]}|| j|< q|r3|| jvr3| j| |S r   )set
list_typesaddr   r   r   rg   )r   modr   	overwritetypestr   r   r   register  s   

zContentHandlers.registerc                 C   s
   | j | S r   r   r   r   r   r   r   (  r.   zContentHandlers._get_handlerc                 C   s   t | j S r   )listr   itemsr   r   r   r   r   +     zContentHandlers.itemsN)FT)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    
r   c                   @   st   e Zd ZdZddefddZdeddfdd	Zdd
dZdddZ	dddZ
dddZddef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| _i 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"d#d$d%d&d'd(d)d*d+d,d-d.d/d0| _|| _d S )1N	cloud_dirz/var/lib/clouddocs_dirz/usr/share/doc/cloud-init/run_dirinstancezboot-finishedseedtemplates_dirz/etc/cloud/templates/z%s.tmpl	boothooksrp   zcloud-config.txtdatahandlersinstance_datainstance-data.jsoninstance_data_sensitiveinstance-data-sensitive.jsoncombined_cloud_configcombined-cloud-config.jsonnetwork_configznetwork-config.jsoninstance_idz.instance-idmanual_clean_markerzmanual-cleanobj_pklzobj.pklscriptsrO   userdatazuser-data.txt.iuserdata_rawzuser-data.txt
vendordatazvendor-data.txt.ivendordata2zvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorwarningshotplug.enabled)vendordata2_rawvendordata_rawrq   rr   vendor_scriptsr   r   )r~   getr   r   r   DEFAULT_RUN_DIRr   rC   rG   rJ   instance_linkboot_finishedseed_dirtemplate_tpllookupsrb   )r   r   dstemplate_dirr   r   r   r   2  sv   

 zPaths.__init__ci_pkl_versionr{   c                 C   sv   t | dst| j| jdj| _d| jvrd| jd< d| jvr#d| jd< d| jvr-d| jd< d	| jvr9d	| jd	< d
S d
S )z(Perform deserialization fixes for Paths.r   )r   r   r   r   r   r   r   r   r   N)hasattrr   r~   rb   r   r   )r   r   r   r   r   	_unpicklef  s"   





zPaths._unpicklec                 C      |  | j|S r   )r<   r   r   r4   r   r   r   rs     r   zPaths.get_ipath_curc                 C   r   r   )r<   r   r   r   r   r   rQ     r   zPaths.get_cpathc                 C   sf   | j sd S | j  }|d u rd S t|tjd}tj| jd|}| j	
|}|r1tj||}|S )Nr2   	instances)rb   get_instance_idstrr3   rC   seprG   rJ   r   r   r   )r   r4   iidpath_safe_iidipathadd_onr   r   r   
_get_ipath  s   
zPaths._get_ipathc                 C   s    |  |}|std d S |S )Nz?No per instance data available, is there an datasource/iid set?)r   rA   warning)r   r4   r   r   r   r   rP     s   
zPaths.get_ipathbasec                 C   s    |d u r|S t j|| j| S r   )rC   rG   rJ   r   )r   r   r4   r   r   r   r<     s   zPaths._get_pathc                 C   r   r   )r<   r   r   r   r   r   get_runpath  r   zPaths.get_runpathr   )r   r   r   _ci_pkl_versionrU   r   intr   rs   rQ   r   rP   r   r<   r   r   r   r   r   r   /  s    4



r   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   sB   | j }z
t| ||}W |S  ty   Y |S  ty    Y |S w 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)has_sectionloweradd_sectionr   r   r   r   r   r   r     s   
zDefaultingConfigParser.setc                 C   s"   |  ||rt| || d S d S r   )
has_optionr   remove_optionr   r   r   r   r   r   r     s   z$DefaultingConfigParser.remove_optionc                 C       |  ||s	| jS t| ||S r   )r   DEF_BOOLEANr   
getbooleanr   r   r   r   r        z!DefaultingConfigParser.getbooleanc                 C   r   r   )r   	DEF_FLOATr   getfloatr   r   r   r   r     r   zDefaultingConfigParser.getfloatc                 C   r   r   )r   DEF_INTr   getintr   r   r   r   r     r   zDefaultingConfigParser.getintc                 C   s<   d}t  }| | |  | }|rd||dg}|S )N 
)r   writeflushgetvaluerJ   )r   headerrF   outputstreamr   r   r   	stringify  s   
z DefaultingConfigParser.stringifyr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    

r   )$r)   loggingrC   configparserr   r   r   ior   r   	cloudinitr   r   r	   r
   cloudinit.settingsr   r   r   r   	getLoggerr   rA   r9   r   r   r   r+   r5   r6   rK   r[   r   CloudInitPickleMixinr   r   r   r   r   r   <module>   s*   

:-j# 	