
    ܍~cA                        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j        e          Z G d d	e          Z G d
 d          Z G d d          Z G d d          Zd Z G d d          Z G d d          Z G d d          Z G d d          Z  G d dej!                  Z" G 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                       e Zd ZdS )LockFailureN__name__
__module____qualname__     3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr   r              Dr   r   c                       e Zd ZdS )	DummyLockNr   r   r   r   r   r      r   r   r   c                   H    e Zd Zd Zej        dd            Zd Zd Zd Z	dS )	DummySemaphoresc                     d S Nr   selfs    r   __init__zDummySemaphores.__init__!       r   Fc              #   *   K   t                      V  d S r   )r   )r!   _name_freq_clear_on_fails       r   lockzDummySemaphores.lock$   s      kkr   c                     dS NFr   r!   r%   r&   s      r   has_runzDummySemaphores.has_run(   s    ur   c                     dS )NTr   r+   s      r   clearzDummySemaphores.clear+   s    tr   c                     d S r   r   r    s    r   	clear_allzDummySemaphores.clear_all.   r#   r   NF)
r   r   r   r"   
contextlibcontextmanagerr(   r,   r.   r0   r   r   r   r   r       st                      r   r   c                       e Zd Zd Zd ZdS )FileLockc                     || _         d S r   )fn)r!   r7   s     r   r"   zFileLock.__init__3   s    r   c                 B    dt          j        |           d| j        dS )N<z using file >)r
   obj_namer7   r    s    r   __str__zFileLock.__str__6   s&     '1':4'@'@'@'@$'''JJr   N)r   r   r   r"   r<   r   r   r   r5   r5   2   s7          K K K K Kr   r5   c                 .    |                      dd          S )N-_)replace)names    r   canon_sem_namerB   :   s    <<S!!!r   c                   T    e Zd Zd Zej        d
d            Zd Zd Zd Z	d Z
d Zd	S )FileSemaphoresc                     || _         d S r   )sem_path)r!   rF   s     r   r"   zFileSemaphores.__init__?   s     r   Fc              #      K   t          |          }	 |                     ||          V  d S # t          $ r |r|                     ||            w xY wr   )rB   _acquire	Exceptionr.   )r!   rA   freqclear_on_fails       r   r(   zFileSemaphores.lockB   sr      d##	--d+++++++ 	 	 	 '

4&&&	s	   - $Ac                     t          |          }|                     ||          }	 t          j        |           n3# t          t
          f$ r t          j        t          d|           Y dS w xY wdS )NzFailed deleting semaphore %sFT)rB   	_get_pathr   del_fileIOErrorOSErrorlogexcLOG)r!   rA   rJ   sem_files       r   r.   zFileSemaphores.clearL   s}    d##>>$--	M(####! 	 	 	K;XFFF55	 ts   < ,A,+A,c                     	 t          j        | j                   d S # t          t          f$ r$ t          j        t          d| j                   Y d S w xY w)Nz&Failed deleting semaphore directory %s)r   del_dirrF   rO   rP   rQ   rR   r    s    r   r0   zFileSemaphores.clear_allV   sl    	L'''''! 	 	 	K=t}     	s    1AAc                 Z   |                      ||          rd S |                     ||          }t          j                    dt	                      d}	 t          j        ||           n3# t          t          f$ r t          j	        t          d|           Y d S w xY wt          |          S )Nz: 
z Failed writing semaphore file %s)r,   rM   osgetpidr   r   
write_filerO   rP   rQ   rR   r5   )r!   rA   rJ   rS   contentss        r   rH   zFileSemaphores._acquire^   s    <<d## 	4 >>$--!#dffff5	OHh////! 	 	 	K?JJJ44	 !!!s   A+ +,BBc                 ^   |r|t           k    rdS t          |          }|                     ||          }t          j                            |          rdS ||k    rQt          j                            |                     ||                    rt                              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   rB   rM   rX   pathexistsrR   warning)r!   rA   rJ   cnamerS   s        r   r,   zFileSemaphores.has_runn   s     	tz))5t$$>>%.. 7>>(## 	4 D==RW^^DNN4,F,FGG=KKG    4ur   c                     | j         }|r|t          k    r t          j                            ||          S t          j                            ||d|          S )N.)rF   r   rX   r]   join)r!   rA   rJ   rF   s       r   rM   zFileSemaphores._get_path   sS    = 	Bt|++7<<$///7<<TTT44*@AAAr   Nr1   )r   r   r   r"   r2   r3   r(   r.   r0   rH   r,   rM   r   r   r   rD   rD   >   s        ! ! !        " " "   4B B B B Br   rD   c                   "    e Zd Zd Zd ZddZdS )Runnersc                 "    || _         i | _        d S r   )pathssems)r!   rg   s     r   r"   zRunners.__init__   s    
			r   c                    |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   rg   	get_ipathr   	get_cpathrh   rD   )r!   rJ   rF   s      r   _get_semzRunners._get_sem   s    :T4< z++E22HHXz++E22H 	449$$"0":":DIhy""r   NFc                    |                      |          }|st                      }|sg }|                    ||          rt                              d||           dS |                    |||          5 }|st          d|z            t                              d||           t          |t                    r	 |di |}n || }d|fcd d d            S # 1 swxY w Y   d S )Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr   )	rm   r   r,   rR   debugr(   r   
isinstancedict)	r!   rA   functorargsrJ   rK   rj   lkresultss	            r   runzRunners.run   sF   mmD!! 	$!##C 	D;;tT"" 	!II0$=== =XXdD-00 		'B '!"AD"HIII		6bAAAdT++ -%gooooGG%gtnGg		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		' 		's   5ACC Cr*   )r   r   r   r"   rm   rv   r   r   r   re   re      sF          # # #&' ' ' ' ' 'r   re   c                   T    e Zd Z	 	 	 	 	 d
dZd Zd Zd ZdefdZe	d	             Z
dS )ConfigMergerNTc                 Z    || _         || _        || _        || _        || _        d | _        d S r   )_paths_ds_fns	_base_cfg_include_vendor_cfg)r!   rg   
datasourceadditional_fnsbase_cfginclude_vendors         r   r"   zConfigMerger.__init__   s3     "	!-			r   c                    g }| j         rw	 | j                                         }|r*t          |t                    r|                    |           n0# t
          $ r# t          j        t          d| j                    Y nw xY w|S )Nz2Failed loading of datasource config object from %s)	r{   get_config_objrp   rq   appendrI   r   rQ   rR   )r!   d_cfgsds_cfgs      r   _get_datasource_configsz$ConfigMerger._get_datasource_configs   s    8 
		0022 *j$88 *MM&)))   HH     s   AA *A>=A>c                    g }t           t          j        v rkt          j        t                    }	 |                    t	          j        |                     n+# t          $ r t	          j        t          d|           Y nw xY w|S )Nz%Failed loading of env. config from %s)	r   rX   environr   r   	read_confrI   rQ   rR   )r!   e_cfgse_fns      r   _get_env_configszConfigMerger._get_env_configs   s    2:%%:l+DPdnT223333 P P PC!H$OOOOOPs   'A %A>=A>c                    g }| j         s|S dg}| j        r*|                    d           |                    d           |D ]}| j                             |          }|rt          j                            |          rz	 |                    t          j        |                     f# t          $ r t                              d|           Y t          $ r t          j        t          d|           Y w xY w|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)rz   r~   r   get_ipath_currX   r]   isfiler   r   PermissionErrorrR   ro   rI   rQ   )r!   i_cfgscc_pathscc_pcc_fns        r   _get_instance_configsz"ConfigMerger._get_instance_configs   s=    { 	M"# 	3 OO2333OO1222 	 	DK--d33E .. MM$."7"78888&   II%    
 !   KEu     s    'B((%C6$C65C6returnc                 "   g }| j         r]| j         D ]U}	 |                    t          j        |                     +# t          $ r t          j        t          d|           Y Rw xY w|                    |                                            |                    | 	                                           |                    | 
                                           | j        r|                    | j                   t          j        |          S )Nz'Failed loading of configuration from %s)r|   r   r   r   rI   rQ   rR   extendr   r   r   r}   mergemanydict)r!   cfgsc_fns      r   	_read_cfgzConfigMerger._read_cfg  s    9 		  KKt 4 45555    KF    
 	D))++,,,D..00111D0022333> 	(KK'''!$'''s   '<%A$#A$c                 P    | j         |                                 | _         | j         S r   )r   r   r    s    r   cfgzConfigMerger.cfg  s%     9((DIyr   )NNNNT)r   r   r   r"   r   r   r   rq   r   propertyr   r   r   r   rx   rx      s                   @(4 ( ( ( (0   X  r   rx   c                   :    e Zd Zd Zd Zd Zd ZddZd Zd	 Z	d
S )ContentHandlersc                 "    i | _         g | _        d S r   )
registeredinitializedr    s    r   r"   zContentHandlers.__init__(  s    r   c                 ,    |                      |          S r   )is_registered)r!   items     r   __contains__zContentHandlers.__contains__,  s    !!$'''r   c                 ,    |                      |          S r   )_get_handler)r!   keys     r   __getitem__zContentHandlers.__getitem__/  s      %%%r   c                     || j         v S r   r   r!   content_types     r   r   zContentHandlers.is_registered2  s    t..r   FTc                 <   t                      }|                                D ]D}|r|                    |           |                     |          s|                    |           E|D ]}|| j        |<   |r#|| j        vr| j                            |           |S r   )set
list_typesaddr   r   r   r   )r!   modr   	overwritetypests         r   registerzContentHandlers.register5  s    !! 	! 	!A !		!))!,, !IIaLLL 	% 	%A!$DOA 	)3d&666##C(((r   c                     | j         |         S r   r   r   s     r   r   zContentHandlers._get_handlerC  s    |,,r   c                 N    t          | j                                                  S r   )listr   itemsr    s    r   r   zContentHandlers.itemsF  s    DO))++,,,r   N)FT)
r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   '  s          ( ( (& & &/ / /   - - -- - - - -r   r   c                   f    e Zd ZdZddefdZdeddfdZddZdd	Z	dd
Z
ddZddefdZddZdS )Paths   N	path_cfgsc                    || _         |                    dd          | _        |                    dd          | _        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 S )-N	cloud_dirz/var/lib/cloudrun_dirz/run/cloud-initinstancezboot-finishedseedtemplates_dirz/etc/cloud/templates/z%s.tmpl	boothooksr   zcloud-config.txtdatahandlersinstance_datainstance-data.jsoninstance_data_sensitiveinstance-data-sensitive.jsoninstance_idz.instance-idmanual_clean_markerzmanual-cleanobj_pklzobj.pklscriptsrj   userdatazuser-data.txt.iuserdata_rawzuser-data.txt
vendordatazvendor-data.txt.ivendordata2zvendor-data2.txt.ivendordata2_rawzvendor-data2.txtvendordata_rawzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorwarnings)r   r   vendor_scriptsr   )r   getr   r   rX   r]   rc   instance_linkboot_finishedseed_dirtemplate_tpllookupsr   )r!   r   dstemplate_dirs       r   r"   zPaths.__init__M  s   	'mmK9IJJ%MM)5FGG"$',,t~z"J"J"$',,#
 #
  W\\$.&AA%MM4
 
 "$lI!F!F

.
 F
 
	
 1
 &'E
 >
 ">
 y
 y
  5!
" )#
$ O%
& -'
( /)
* 1+
, /-
. %?#<."5
 
 
: r   ci_pkl_versionr   c                     t          | d          s%t          | j        | j                  j        | _        d| j        vr
d| j        d<   d| j        vrd| j        d<   dS dS )z(Perform deserialization fixes for Paths.r   )r   r   r   r   r   r   N)hasattrr   r   r   r   r   )r!   r   s     r   	_unpicklezPaths._unpickle{  s    tY'' 	 !)   L $,..,@DL)$DL88 / L)   98r   c                 8    |                      | j        |          S r   )rM   r   r!   rA   s     r   r   zPaths.get_ipath_cur  s    ~~d0$777r   c                 8    |                      | j        |          S r   )rM   r   r   s     r   rl   zPaths.get_cpath  s    ~~dnd333r   c                 p   | j         sd S | j                                         }|d S t          |                              t          j        d          }t          j                            | j        d|          }| j	        
                    |          }|r t          j                            ||          }|S )Nr?   	instances)r   get_instance_idstrr@   rX   sepr]   rc   r   r   r   )r!   rA   iidpath_safe_iidipathadd_ons         r   
_get_ipathzPaths._get_ipath  s     	4o--//;4C((55T^[-HH!!$'' 	0GLL//Er   c                 l    |                      |          }|st                              d           d S |S )Nz?No per instance data available, is there an datasource/iid set?)r   rR   r_   )r!   rA   r   s      r   rk   zPaths.get_ipath  sB    %% 	KK2   4Lr   basec                 `    ||S t           j                            || j        |                   S r   )rX   r]   rc   r   )r!   r   rA   s      r   rM   zPaths._get_path  s)    <Kw||D$,t"4555r   c                 8    |                      | j        |          S r   )rM   r   r   s     r   get_runpathzPaths.get_runpath  s    ~~dlD111r   r   )r   r   r   _ci_pkl_versionrq   r"   intr   r   rl   r   rk   r   rM   r   r   r   r   r   r   J  s        O, ,$ , , , ,\/ / / / / /&8 8 8 8
4 4 4 4
    	 	 	 	6 6c 6 6 6 6
2 2 2 2 2 2r   r   c                   L    e Zd ZdZdZdZdZd ZddZd Z	d Z
d	 Zd
 ZddZdS )DefaultingConfigParserr   g        FNc                 z    | j         }	 t          j        | ||          }n# t          $ r Y nt          $ r Y nw xY w|S r   )DEF_BASEr   r   r   r   r!   sectionoptionvalues       r   r   zDefaultingConfigParser.get  s`    	#'gv>>EE 	 	 	D 	 	 	D	s     
8	88c                     |                      |          s-|                                dk    r|                     |           t          j        | |||           d S )Ndefault)has_sectionloweradd_sectionr   r   r  s       r   r   zDefaultingConfigParser.set  s[    (( 	&W]]__	-I-IW%%%D'6599999r   c                 b    |                      ||          rt          j        | ||           d S d S r   )
has_optionr   remove_optionr!   r  r  s      r   r  z$DefaultingConfigParser.remove_option  s@    ??7F++ 	A)$@@@@@	A 	Ar   c                 h    |                      ||          s| j        S t          j        | ||          S r   )r  DEF_BOOLEANr   
getbooleanr  s      r   r  z!DefaultingConfigParser.getboolean  s6    w// 	$##)$@@@r   c                 h    |                      ||          s| j        S t          j        | ||          S r   )r  	DEF_FLOATr   getfloatr  s      r   r  zDefaultingConfigParser.getfloat  s5    w// 	">!'gv>>>r   c                 h    |                      ||          s| j        S t          j        | ||          S r   )r  DEF_INTr   getintr  s      r   r  zDefaultingConfigParser.getint  s5    w// 	 <%dGV<<<r   c                     d}t                      }|                     |           |                                 |                                }|rd                    ||dg          }|S )N rW   )r   writeflushgetvaluerc   )r!   headerr[   outputstreams       r   	stringifyz DefaultingConfigParser.stringify  sj    zz

<   ((** 	9yy&(B!788Hr   r   )r   r   r   r  r  r  r  r   r   r  r  r  r  r"  r   r   r   r  r    s        GIKH  : : : :
A A AA A A
? ? ?
= = =
     r   r  )$r2   rX   configparserr   r   r   ior   r   	cloudinitr   loggingr	   r
   r   cloudinit.settingsr   r   r   r   	getLoggerr   rR   rI   r   r   r   r5   rB   rD   re   rx   r   CloudInitPickleMixinr   r  r   r   r   <module>r*     s       				 G G G G G G G G G G             $ $ $ $ $ $ 3 3 3 3 3 3 3 3 3 3 O O O O O O O O O O O Og!!	 	 	 	 	) 	 	 		 	 	 	 	 	 	 	       $K K K K K K K K" " "OB OB OB OB OB OB OB OBd*' *' *' *' *' *' *' *'Zg g g g g g g gT -  -  -  -  -  -  -  -Fo2 o2 o2 o2 o2K, o2 o2 o2x0 0 0 0 0_ 0 0 0 0 0r   