
    x[h@                        S SK r S SKrS SKrS SKJrJrJr  S SKJr  S SK	J	r	  S SK
JrJrJrJr  S SKJrJrJrJr  \R(                  " \5      r " S S\5      r " S	 S
5      r " S S5      r " S S5      rS r " S S5      r " S S5      r " S S5      r " S S5      r  " S S\RB                  5      r" " S S\5      r#g)    N)NoOptionErrorNoSectionErrorRawConfigParser)StringIO)time)persistencesettings
type_utilsutil)CFG_ENV_NAME
PER_ALWAYSPER_INSTANCEPER_ONCEc                       \ rS rSrSrg)LockFailure    N__name__
__module____qualname____firstlineno____static_attributes__r       3/usr/lib/python3/dist-packages/cloudinit/helpers.pyr   r          r   r   c                       \ rS rSrSrg)	DummyLock   r   Nr   r   r   r   r   r      r   r   r   c                   N    \ rS rSrS r\R                  SS j5       rS rS r	Sr
g)	DummySemaphores    c                     g Nr   selfs    r   __init__DummySemaphores.__init__!   s    r   c              #   $   #    [        5       v   g 7fr$   )r   )r&   _name_freq_clear_on_fails       r   lockDummySemaphores.lock$   s     ks   c                     gNFr   r&   r*   r+   s      r   has_runDummySemaphores.has_run(   s    r   c                     g)NTr   r1   s      r   clearDummySemaphores.clear+   s    r   r   NF)r   r   r   r   r'   
contextlibcontextmanagerr-   r2   r5   r   r   r   r   r!   r!       s+      r   r!   c                        \ rS rSrS rS rSrg)FileLock/   c                     Xl         g r$   fn)r&   r?   s     r   r'   FileLock.__init__0   s    r   c                 T    S[         R                  " U 5      < SU R                  < S3$ )N<z using file >)r
   obj_namer?   r%   s    r   __str__FileLock.__str__3   s    '1':':4'@$''JJr   r>   N)r   r   r   r   r'   rE   r   r   r   r   r;   r;   /   s    Kr   r;   c                 &    U R                  SS5      $ )N-_)replace)names    r   canon_sem_namerL   7   s    <<S!!r   c                   Z    \ rS rSrS r\R                  S
S j5       rS rS r	S r
S rSrg	)FileSemaphores;   c                     Xl         g r$   sem_path)r&   rR   s     r   r'   FileSemaphores.__init__<   s     r   c              #      #    [        U5      n U R                  X5      v   g ! [         a    U(       a  U R                  X5        e f = f7fr$   )rL   _acquire	Exceptionr5   )r&   rK   freqclear_on_fails       r   r-   FileSemaphores.lock?   sC     d#	--++ 	

4&	s   A
# A
$AA
c                     [        U5      nU R                  X5      n [        R                  " U5        g! [        [
        4 a    [        R                  " [        SU5         gf = f)NzFailed deleting semaphore %sFT)rL   	_get_pathr   del_fileIOErrorOSErrorlogexcLOG)r&   rK   rW   sem_files       r   r5   FileSemaphores.clearI   sZ    d#>>$-	MM(#  ! 	KK;XF	s   5 ,A$#A$c                 D   U R                  X5      (       a  g U R                  X5      n[        R                  " 5       < S[	        5       < S3n [
        R                  " X45        [        U5      $ ! [        [        4 a    [
        R                  " [        SU5         g f = f)Nz: 
z Failed writing semaphore file %s)r2   r[   osgetpidr   r   
write_filer]   r^   r_   r`   r;   )r&   rK   rW   ra   contentss        r   rU   FileSemaphores._acquireS   s~    <<## >>$-!#df5	OOH/ !! ! 	KK?J	s   A0 0,BBc                     U(       a
  U[         :X  a  g[        U5      nU R                  X25      n[        R                  R                  U5      $ r0   )r   rL   r[   re   pathexists)r&   rK   rW   cnamera   s        r   r2   FileSemaphores.has_runc   s<    tz)t$>>%. ww~~h''r   c                     U R                   nU(       a
  U[        :X  a  [        R                  R	                  X15      $ [        R                  R	                  X1< SU< 35      $ )N.)rR   r   re   rk   join)r&   rK   rW   rR   s       r   r[   FileSemaphores._get_pathm   sB    ==t|+77<<//77<<T4*@AAr   rQ   Nr7   )r   r   r   r   r'   r8   r9   r-   r5   rU   r2   r[   r   r   r   r   rN   rN   ;   s6    !  " (Br   rN   c                   *    \ rS rSrS rS rSS jrSrg)Runnersu   c                     Xl         0 U l        g r$   pathssems)r&   rx   s     r   r'   Runners.__init__v   s    
	r   c                 <   U[         :X  d  U(       d  g S nU[        :X  a  U R                  R                  S5      nO%U[        :X  a  U R                  R                  S5      nU(       d  g X R                  ;  a  [        U5      U R                  U'   U R                  U   $ )Nsem)r   r   rx   	get_ipathr   	get_cpathry   rN   )r&   rW   rR   s      r   _get_semRunners._get_semz   s    :T< zz++E2HXzz++E2H99$"0":DIIhyy""r   Nc                    U R                  U5      nU(       d
  [        5       nU(       d  / nUR                  X5      (       a  [        R	                  SX5        gUR                  XU5       nU(       d  [        SU-  5      e[        R	                  SX5        [        U[        5      (       a	  U" S0 UD6nOU" U6 nSU4sS S S 5        $ ! , (       d  f       g = f)Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr   )	r   r!   r2   r`   debugr-   r   
isinstancedict)	r&   rK   functorargsrW   rX   r|   lkresultss	            r   runRunners.run   s    mmD!!#CD;;t""II0$= XXd-0B!"AD"HII		6AdT++%ooG%tnGg 100s   +AC
Crw   r0   )r   r   r   r   r'   r   r   r   r   r   r   rt   rt   u   s    #&'r   rt   c                   X    \ rS rSr     SS jrS rS rS rS\4S jr	\
S	 5       rS
rg)ConfigMerger   Nc                 N    Xl         X l        X0l        X@l        XPl        S U l        g r$   )_paths_ds_fns	_base_cfg_include_vendor_cfg)r&   rx   
datasourceadditional_fnsbase_cfginclude_vendors         r   r'   ConfigMerger.__init__   s%     "	!-	r   c                 .   / nU R                   (       aJ   U R                   R                  5       nU(       a&  [        U[        5      (       a  UR	                  U5        U$ U$ ! [
         a*    [        R                  " [        SU R                   5         U$ f = f)Nz2Failed loading of datasource config object from %s)	r   get_config_objr   r   appendrV   r   r_   r`   )r&   d_cfgsds_cfgs      r   _get_datasource_configs$ConfigMerger._get_datasource_configs   s|    88	002j$88MM&) v  HHH
 s   AA   0BBc                    / n[         [        R                  ;   a?  [        R                  [            n UR                  [        R
                  " U5      5        U$ U$ ! [         a     [        R                  " [        SU5         U$ f = f)Nz%Failed loading of env. config from %s)	r   re   environr   r   	read_confrV   r_   r`   )r&   e_cfgse_fns      r   _get_env_configsConfigMerger._get_env_configs   sp    2::%::l+DPdnnT23 v  PC!H$OPs   %A &BBc                 ,   / nU R                   (       d  U$ S/nU R                  (       a"  UR                  S5        UR                  S5        U Hs  nU R                   R                  U5      nU(       d  M'  [        R
                  R                  U5      (       d  MM   UR                  [        R                  " U5      5        Mu     U$ ! [         a    [        R                  SU5         M  [         a     [        R                  " [        SU5         M  f = f)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   r   get_ipath_curre   rk   isfiler   r   PermissionErrorr`   r   rV   r_   )r&   i_cfgscc_pathscc_pcc_fns        r   _get_instance_configs"ConfigMerger._get_instance_configs   s     {{M"# OO23OO12DKK--d3Eu..MM$.."78	   ' II%
 ! KKEus   %C D*%DDreturnc                 2   / nU R                   (       a9  U R                    H)  n UR                  [        R                  " U5      5        M+     UR                  U R                  5       5        UR                  U R                  5       5        UR                  U R                  5       5        U R                  (       a  UR                  U R                  5        [        R                  " U5      $ ! [         a     [        R
                  " [        SU5         M  f = f)Nz'Failed loading of configuration from %s)r   r   r   r   rV   r_   r`   extendr   r   r   r   mergemanydict)r&   cfgsc_fns      r   	_read_cfgConfigMerger._read_cfg   s     99		KKt 45 " 	D))+,D..01D0023>>KK'!!$'' ! KKFs   %C,,&DDc                 ^    U R                   c  U R                  5       U l         U R                   $ r$   )r   r   r%   s    r   cfgConfigMerger.cfg  s&     99(DIyyr   )r   r   r   r   r   r   )NNNNT)r   r   r   r   r'   r   r   r   r   r   propertyr   r   r   r   r   r   r      sH      @(4 (0  r   r   c                   B    \ rS rSrS rS rS rS rSS jrS r	S r
S	rg
)ContentHandlersi  c                      0 U l         / U l        g r$   )
registeredinitializedr%   s    r   r'   ContentHandlers.__init__  s    r   c                 $    U R                  U5      $ r$   )is_registered)r&   items     r   __contains__ContentHandlers.__contains__  s    !!$''r   c                 $    U R                  U5      $ r$   )_get_handler)r&   keys     r   __getitem__ContentHandlers.__getitem__  s      %%r   c                     XR                   ;   $ r$   r   r&   content_types     r   r   ContentHandlers.is_registered  s    ..r   c                 ^   [        5       nUR                  5        HF  nU(       a  UR                  U5        M  U R                  U5      (       a  M5  UR                  U5        MH     U H  nXR                  U'   M     U(       a*  XR
                  ;  a  U R
                  R                  U5        U$ r$   )set
list_typesaddr   r   r   r   )r&   modr   	overwritetypests         r   registerContentHandlers.register  s    !A		!))!,,IIaL " A!$OOA 3&6&66##C(r   c                      U R                   U   $ r$   r   r   s     r   r   ContentHandlers._get_handler(  s    |,,r   c                 H    [        U R                  R                  5       5      $ r$   )listr   itemsr%   s    r   r   ContentHandlers.items+  s    DOO))+,,r   )r   r   N)FT)r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   r     s%    (&/--r   r   c                       \ rS rSrSrSS\4S jjrS\SS4S jrSS	 jr	SS
 jr
SS jrSS jrSS\4S jjrSS jrSrg)Pathsi/     N	path_cfgsc           
         Xl         UR                  SS5      U l        UR                  SS5      U l        UR                  S[        R
                  5      U l        [        R                  R                  U R                  S5      U l
        [        R                  R                  U R                  S5      U l        [        R                  R                  U R                  S5      U l        UR                  S	S
5      n[        R                  R                  US5      U l        0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S _S!S"_S#S$_S%S&_S'S(_S)S*S+S,S-S.S/S0S1.EU l        X l        g )2N	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	boothooksr   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scriptsr|   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.skip-network)vendordata2_rawvendordata_rawr   r   vendor_scriptsr  r  r  )r   getr   r   r	   DEFAULT_RUN_DIRr   re   rk   rq   instance_linkboot_finishedseed_dirtemplate_tpllookupsr   )r&   r   dstemplate_dirs       r   r'   Paths.__init__2  s   	'mmK9IJ&]]4
 &MM)X5M5MN"$'',,t~~z"J"$'',,#
  WW\\$..&A%MM4
 "$lI!F

.
 F
 
	
 1
 &'E
 $%A
 3
 >
 ">
  y!
" y#
$ 5%
& )'
( O)
* -+
, /-
.  2/$>#<."0,=
B r   ci_pkl_versionr   c                 z   [        U S5      (       d-  [        U R                  U R                  S9R                  U l        SU R
                  ;  a  SU R
                  S'   SU R
                  ;  a  SU R
                  S'   SU R
                  ;  a  SU R
                  S'   S	U R
                  ;  a  S	U R
                  S	'   g
g
)z(Perform deserialization fixes for Paths.r   )r   r  r   r   r   r   r   r   r  N)hasattrr   r   r   r   r  )r&   r  s     r   	_unpicklePaths._unpickleg  s    tY'' !))g L $,,.,@DLL)$DLL8. LL23 #$,,6, LL01 DLL0.?DLL*+ 1r   c                 :    U R                  U R                  U5      $ r$   )r[   r  r&   rK   s     r   r   Paths.get_ipath_cur  s    ~~d00$77r   c                 :    U R                  U R                  U5      $ r$   )r[   r   r  s     r   r~   Paths.get_cpath  s    ~~dnnd33r   c                    U R                   (       d  g U R                   R                  5       nUc  g [        U5      R                  [        R
                  S5      n[        R                  R                  U R                  SU5      nU R                  R                  U5      nU(       a  [        R                  R                  XE5      nU$ )NrI   	instances)r   get_instance_idstrrJ   re   seprk   rq   r   r  r	  )r&   rK   iidpath_safe_iidipathadd_ons         r   
_get_ipathPaths._get_ipath  s    oo--/;C((5T^^[-H!!$'GGLL/Er   c                 b    U R                  U5      nU(       d  [        R                  S5        g U$ )Nz?No per instance data available, is there an datasource/iid set?)r&  r`   warning)r&   rK   r$  s      r   r}   Paths.get_ipath  s.    %KK2 Lr   basec                 d    Uc  U$ [         R                  R                  XR                  U   5      $ r$   )re   rk   rq   r  )r&   r+  rK   s      r   r[   Paths._get_path  s(    <Kww||D,,t"455r   c                 :    U R                  U R                  U5      $ r$   )r[   r   r  s     r   get_runpathPaths.get_runpath  s    ~~dllD11r   )
r  r   r   r   r   r  r  r   r  r  r$   )r   r   r   r   _ci_pkl_versionr   r'   intr  r   r~   r&  r}   r   r[   r/  r   r   r   r   r   r   /  sO    O3$ 3j@ @ @28
4
 	6c 6
2r   r   c                   V    \ rS rSrSrSrSrSrS rSS jr	S r
S	 rS
 rS rSS jrSrg)DefaultingConfigParseri  r   g        FNc                     U R                   n [        R                  " XU5      nU$ ! [         a     U$ [         a     U$ f = fr$   )DEF_BASEr   r	  r   r   r&   sectionoptionvalues       r   r	  DefaultingConfigParser.get  sV    	#''v>E
 	  	   		s   ' 
A	A Ac                     U R                  U5      (       d%  UR                  5       S:w  a  U R                  U5        [        R                  " XX#5        g )Ndefault)has_sectionloweradd_sectionr   r   r7  s       r   r   DefaultingConfigParser.set  s>    ((W]]_	-IW%D69r   c                 `    U R                  X5      (       a  [        R                  " XU5        g g r$   )
has_optionr   remove_optionr&   r8  r9  s      r   rD  $DefaultingConfigParser.remove_option  s&    ??7++))$@ ,r   c                 t    U R                  X5      (       d  U R                  $ [        R                  " XU5      $ r$   )rC  DEF_BOOLEANr   
getbooleanrE  s      r   rI  !DefaultingConfigParser.getboolean  s0    w//###))$@@r   c                 t    U R                  X5      (       d  U R                  $ [        R                  " XU5      $ r$   )rC  	DEF_FLOATr   getfloatrE  s      r   rM  DefaultingConfigParser.getfloat  s.    w//>>!''v>>r   c                 t    U R                  X5      (       d  U R                  $ [        R                  " XU5      $ r$   )rC  DEF_INTr   getintrE  s      r   rQ  DefaultingConfigParser.getint  s.    w//<<%%dV<<r   c                     Sn[        5       nU R                  U5        UR                  5         UR                  5       nU(       a  SR	                  XS/5      nU$ )N rd   )r   writeflushgetvaluerq   )r&   headerrh   outputstreams       r   	stringify DefaultingConfigParser.stringify  sO    z

< ((*yy&B!78Hr   r   r$   )r   r   r   r   rP  rL  rH  r6  r	  r   rD  rI  rM  rQ  rZ  r   r   r   r   r4  r4    s;    GIKH:
AA
?
=
r   r4  )$r8   loggingre   configparserr   r   r   ior   r   	cloudinitr   r	   r
   r   cloudinit.settingsr   r   r   r   	getLoggerr   r`   rV   r   r   r!   r;   rL   rN   rt   r   r   CloudInitPickleMixinr   r4  r   r   r   <module>rc     s      	 G G   = = O O!	) 		 	 K K"7B 7Bt*' *'Zg gT -  -F|2K,, |2R0_ 0r   