a '¡Dg£@ã@sddlZddlZddlZddlmZmZmZddlmZddl m Z ddl m Z m Z m Z mZddlmZmZmZmZe e¡ZGdd„deƒZGd d „d ƒZGd d „d ƒZGd d„dƒZdd„ZGdd„dƒZGdd„dƒZGdd„dƒZGdd„dƒZ Gdd„de j!ƒZ"Gdd„deƒZ#dS)éN)Ú NoOptionErrorÚNoSectionErrorÚRawConfigParser)ÚStringIO)Útime)Ú persistenceÚsettingsÚ type_utilsÚutil)Ú CFG_ENV_NAMEÚ PER_ALWAYSÚ PER_INSTANCEÚPER_ONCEc@s eZdZdS)Ú LockFailureN©Ú__name__Ú __module__Ú __qualname__©rrú5/usr/lib/python3.9/site-packages/cloudinit/helpers.pyrsrc@s eZdZdS)Ú DummyLockNrrrrrrsrc@s4eZdZdd„Zejd dd„ƒZdd„Zdd „Zd S) ÚDummySemaphorescCsdS©Nr©ÚselfrrrÚ__init__!szDummySemaphores.__init__Fccs tƒVdSr)r)rÚ_nameÚ_freqZ_clear_on_failrrrÚlock$szDummySemaphores.lockcCsdS©NFr©rrrrrrÚhas_run(szDummySemaphores.has_runcCsdS)NTrr rrrÚclear+szDummySemaphores.clearN)F) rrrrÚ contextlibÚcontextmanagerrr!r"rrrrr s  rc@seZdZdd„Zdd„ZdS)ÚFileLockcCs ||_dSr)Úfn)rr&rrrr0szFileLock.__init__cCsdt |¡|jfS)Nz<%s using file %r>)r Zobj_namer&rrrrÚ__str__3szFileLock.__str__N)rrrrr'rrrrr%/sr%cCs | dd¡S)Nú-Ú_)Úreplace)ÚnamerrrÚcanon_sem_name7sr,c@sDeZdZdd„Zejddd„ƒZdd„Zdd „Zd d „Z d d „Z dS)ÚFileSemaphorescCs ||_dSr)Úsem_path)rr.rrrr<szFileSemaphores.__init__FccsDt|ƒ}z| ||¡VWn$ty>|r8| ||¡‚Yn0dSr)r,Ú_acquireÚ Exceptionr")rr+ÚfreqÚ clear_on_failrrrr?s  zFileSemaphores.lockc CsNt|ƒ}| ||¡}zt |¡Wn&ttfyHt td|¡YdS0dS)NzFailed deleting semaphore %sFT)r,Ú _get_pathr Zdel_fileÚIOErrorÚOSErrorÚlogexcÚLOG)rr+r1Úsem_filerrrr"Is zFileSemaphores.clearc Csn| ||¡rdS| ||¡}dt ¡tƒf}zt ||¡Wn&ttfydt  t d|¡YdS0t |ƒS)Nz%s: %s z Failed writing semaphore file %s) r!r3ÚosÚgetpidrr Z write_filer4r5r6r7r%)rr+r1r8Úcontentsrrrr/Ss  zFileSemaphores._acquirecCs0|r |tkrdSt|ƒ}| ||¡}tj |¡Sr)r r,r3r9ÚpathÚexists)rr+r1Zcnamer8rrrr!cs   zFileSemaphores.has_runcCs:|j}|r|tkr tj ||¡Stj |d||f¡SdS)Nz%s.%s)r.r r9r<Újoin)rr+r1r.rrrr3ms zFileSemaphores._get_pathN)F) rrrrr#r$rr"r/r!r3rrrrr-;s   r-c@s&eZdZdd„Zdd„Zd dd„ZdS) ÚRunnerscCs||_i|_dSr)ÚpathsÚsems)rr@rrrrvszRunners.__init__cCsh|tks |sdSd}|tkr*|j d¡}n|tkr>|j d¡}|sFdS||jvr^t|ƒ|j|<|j|S)NÚsem)r r r@Ú get_ipathrÚ get_cpathrAr-)rr1r.rrrÚ_get_semzs   zRunners._get_semNFc CsÄ| |¡}|stƒ}|sg}| ||¡r:t d||¡dS| |||¡h}|s\td|ƒ‚nFt d||¡t|tƒr„|fi|¤Ž}n||Ž}d|fWdƒSWdƒn1s¶0YdS)Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)T) rErr!r7ÚdebugrrÚ isinstanceÚdict) rr+ZfunctorÚargsr1r2rBZlkÚresultsrrrÚruns    z Runners.run)NF)rrrrrErKrrrrr?usr?c@sHeZdZddd„Zdd„Zdd„Zd d „Zed œd d „Ze dd„ƒZ dS)Ú ConfigMergerNTcCs(||_||_||_||_||_d|_dSr)Ú_pathsÚ_dsÚ_fnsÚ _base_cfgÚ_include_vendorÚ_cfg)rr@Ú datasourceZadditional_fnsZbase_cfgZinclude_vendorrrrr£s zConfigMerger.__init__cCsXg}|jrTz&|j ¡}|r.t|tƒr.| |¡Wn"tyRt td|j¡Yn0|S)Nz2Failed loading of datasource config object from %s) rNZget_config_objrGrHÚappendr0r r6r7)rZd_cfgsZds_cfgrrrÚ_get_datasource_configs³s  ý z$ConfigMerger._get_datasource_configscCsRg}ttjvrNtjt}z| t |¡¡Wn tyLt td|¡Yn0|S)Nz%Failed loading of env. config from %s) r r9ÚenvironrTr Ú read_confr0r6r7)rZe_cfgsZe_fnrrrÚ_get_env_configsÂs   zConfigMerger._get_env_configsc Csªg}|js|Sdg}|jr.| d¡| d¡|D]r}|j |¡}|r2tj |¡r2z| t |¡¡Wq2t y„t   d|¡Yq2t y¢t  t d|¡Yq20q2|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)rMrQrTÚ get_ipath_curr9r<Úisfiler rWÚPermissionErrorr7rFr0r6)rZi_cfgsZcc_pathsZcc_pZcc_fnrrrÚ_get_instance_configsÌs,    ý ÿ z"ConfigMerger._get_instance_configs)Úreturnc Cs’g}|jrL|jD]:}z| t |¡¡WqtyHt td|¡Yq0q| | ¡¡| |  ¡¡| |  ¡¡|j rˆ| |j ¡t  |¡S)Nz'Failed loading of configuration from %s) rOrTr rWr0r6r7ÚextendrXr_rUrPZ mergemanydict)rÚcfgsZc_fnrrrÚ _read_cfgìs  ÿ  zConfigMerger._read_cfgcCs|jdur| ¡|_|jSr)rRrcrrrrÚcfgs  zConfigMerger.cfg)NNNNT) rrrrrUrXr_rHrcÚpropertyrdrrrrrL¢sú   rLc@sFeZdZdd„Zdd„Zdd„Zdd„Zdd d „Zd d„Zdd„Z dS)ÚContentHandlerscCsi|_g|_dSr)Ú registeredÚ initializedrrrrr szContentHandlers.__init__cCs | |¡Sr)Ú is_registered)rÚitemrrrÚ __contains__szContentHandlers.__contains__cCs | |¡Sr)Ú _get_handler)rÚkeyrrrÚ __getitem__szContentHandlers.__getitem__cCs ||jvSr©rg©rZ content_typerrrriszContentHandlers.is_registeredFTcCsjtƒ}| ¡D](}|r"| |¡q| |¡s| |¡q|D]}||j|<q<|rf||jvrf|j |¡|Sr)ÚsetZ list_typesÚaddrirgrhrT)rÚmodrhZ overwriteÚtypesÚtrrrÚregisters      zContentHandlers.registercCs |j|Srrorprrrrl(szContentHandlers._get_handlercCst|j ¡ƒSr)ÚlistrgÚitemsrrrrrx+szContentHandlers.itemsN)FT) rrrrrkrnrirvrlrxrrrrrf s rfc@sreZdZdZdedœdd„Zeddœdd„Zdd d „Zdd d „Z dd d„Z ddd„Z de dœdd„Z ddd„ZdS)ÚPathséN)Ú path_cfgscCsÈ||_| dd¡|_| dd¡|_| dtj¡|_tj  |jd¡|_ tj  |j d¡|_ tj  |jd¡|_ | d d ¡}tj  |d ¡|_ d d ddddddddddddddddddd d!d"d#d$d%œ|_||_dS)&NÚ cloud_dirz/var/lib/cloudÚdocs_dirz/usr/share/doc/cloud-init/Úrun_dirÚinstancez boot-finishedZseedZ templates_dirz/etc/cloud/templates/z%s.tmplÚ boothookszcloud-config.txtÚdataÚhandlersúinstance-data.jsonúinstance-data-sensitive.jsonúcombined-cloud-config.jsonznetwork-config.jsonz .instance-idz manual-cleanzobj.pklÚscriptsrBzuser-data.txt.iz user-data.txtzvendor-data.txt.izvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorÚwarningsúhotplug.enabledú .skip-network)r€rYrr‚Ú instance_dataÚinstance_data_sensitiveÚcombined_cloud_configZnetwork_configZ instance_idZmanual_clean_markerZobj_pklr†rBZuserdataZ userdata_rawZ vendordataZ vendordata2Zvendordata2_rawZvendordata_rawrZr[Zvendor_scriptsr‡rˆr‰)rbÚgetr|r}rZDEFAULT_RUN_DIRr~r9r<r>Ú instance_linkZ boot_finishedZseed_dirZ template_tplÚlookupsrS)rr{ÚdsZ template_dirrrrr2sTÿÿÿâ!zPaths.__init__)Úci_pkl_versionr`cCsrt|dƒst|j|jdj|_d|jvr2d|jd<d|jvrFd|jd<d|jvrZd|jd<d |jvrnd |jd <d S) z(Perform deserialization fixes for Paths.r~)r{rrŠrƒr‹r„rŒr…rˆN)ÚhasattrryrbrSr~r)rr‘rrrÚ _unpicklegs ÿ    ÿ ÿ zPaths._unpicklecCs| |j|¡Sr)r3rŽ©rr+rrrr\€szPaths.get_ipath_curcCs| |j|¡Sr)r3r|r”rrrrD…szPaths.get_cpathcCsf|js dS|j ¡}|dur dSt|ƒ tjd¡}tj |jd|¡}|j   |¡}|rbtj ||¡}|S)Nr)Z instances) rSZget_instance_idÚstrr*r9Úsepr<r>r|rr)rr+ZiidZ path_safe_iidÚipathZadd_onrrrÚ _get_ipathŠs  zPaths._get_ipathcCs$| |¡}|st d¡dS|SdS)Nz?No per instance data available, is there an datasource/iid set?)r˜r7Zwarning)rr+r—rrrrCšs ÿzPaths.get_ipath)ÚbasecCs |dur |Stj ||j|¡Sr)r9r<r>r)rr™r+rrrr3¥szPaths._get_pathcCs| |j|¡Sr)r3r~r”rrrÚ get_runpathªszPaths.get_runpath)N)N)N)N)N)N)N)rrrZ_ci_pkl_versionrHrÚintr“r\rDr˜rCr•r3ršrrrrry/s5    ryc@sXeZdZdZdZdZdZdd„Zddd„Zd d „Z d d „Z d d„Z dd„Z ddd„Z dS)ÚDefaultingConfigParserrgFNcCs@|j}zt |||¡}Wn"ty*Ynty:Yn0|Sr)ÚDEF_BASErrrr©rÚsectionÚoptionÚvaluerrrr¾s  zDefaultingConfigParser.getcCs4| |¡s | ¡dkr | |¡t ||||¡dS)NÚdefault)Z has_sectionÚlowerZ add_sectionrrqržrrrrqÈs zDefaultingConfigParser.setcCs| ||¡rt |||¡dSr)Ú has_optionrÚ remove_option©rrŸr rrrr¥Ís z$DefaultingConfigParser.remove_optioncCs | ||¡s|jSt |||¡Sr)r¤Ú DEF_BOOLEANrÚ getbooleanr¦rrrr¨Ñs z!DefaultingConfigParser.getbooleancCs | ||¡s|jSt |||¡Sr)r¤Ú DEF_FLOATrÚgetfloatr¦rrrrªÖs zDefaultingConfigParser.getfloatcCs | ||¡s|jSt |||¡Sr)r¤ÚDEF_INTrÚgetintr¦rrrr¬Ûs zDefaultingConfigParser.getintcCs<d}tƒ}| |¡| ¡| ¡}|r8d ||dg¡}|S)NÚÚ )rÚwriteÚflushÚgetvaluer>)rÚheaderr;Z outputstreamrrrÚ stringifyàs z DefaultingConfigParser.stringify)N)N)rrrr«r©r§rrrqr¥r¨rªr¬r³rrrrrœ¸s rœ)$r#Zloggingr9Z configparserrrrÚiorrZ cloudinitrrr r Zcloudinit.settingsr r r rZ getLoggerrr7r0rrrr%r,r-r?rLrfZCloudInitPickleMixinryrœrrrrÚ s(   :-j#