o x[h@@sddlZddlZddlZddlmZmZmZddlmZddl m Z ddl m Z m Z m Z mZddlmZmZmZmZeeZGdddeZGd d d ZGd d d ZGd ddZddZGdddZGdddZGdddZGdddZ Gddde j!Z"GdddeZ#dS)N) NoOptionErrorNoSectionErrorRawConfigParser)StringIO)time) persistencesettings type_utilsutil) CFG_ENV_NAME PER_ALWAYS PER_INSTANCEPER_ONCEc@ eZdZdS) LockFailureN__name__ __module__ __qualname__rr3/usr/lib/python3/dist-packages/cloudinit/helpers.pyrrc@r) DummyLockNrrrrrrrrc@s4eZdZddZejd ddZddZdd Zd S) DummySemaphorescCsdSNrselfrrr__init__!zDummySemaphores.__init__FccstVdSr)r)r_name_freq_clear_on_failrrrlock$s zDummySemaphores.lockcCdSNFrrrr rrrhas_run(rzDummySemaphores.has_runcCr#)NTrr%rrrclear+rzDummySemaphores.clearNF) rrrr contextlibcontextmanagerr"r&r'rrrrr s   rc@seZdZddZddZdS)FileLockcC ||_dSr)fn)rr-rrrr0 zFileLock.__init__cCsdt||jfS)Nz<%s using file %r>)r obj_namer-rrrr__str__3szFileLock.__str__N)rrrrr0rrrrr+/s r+cCs |ddS)N-_)replace)namerrrcanon_sem_name7s r5c@sDeZdZddZejdddZddZdd Zd d Z d d Z dS)FileSemaphorescCr,r)sem_path)rr7rrrr<r.zFileSemaphores.__init__Fccs@t|}z |||VWdSty|r|||wr)r5_acquire Exceptionr')rr4freq clear_on_failrrrr"?s  zFileSemaphores.lockc CsLt|}|||}zt|WdSttfy%ttd|YdSw)NzFailed deleting semaphore %sFT)r5 _get_pathr del_fileIOErrorOSErrorlogexcLOG)rr4r:sem_filerrrr'Is  zFileSemaphores.clearc Csl|||rdS|||}dttf}z t||Wt |Sttfy5t t d|YdSw)Nz%s: %s z Failed writing semaphore file %s) r&r<osgetpidrr write_filer>r?r@rAr+)rr4r:rBcontentsrrrr8Ss  zFileSemaphores._acquirecCs0|r|tkrdSt|}|||}tj|Sr$)r r5r<rCpathexists)rr4r:cnamerBrrrr&cs   zFileSemaphores.has_runcCs6|j}|r |tkrtj||Stj|d||fS)Nz%s.%s)r7r rCrGjoin)rr4r:r7rrrr<ms zFileSemaphores._get_pathNr() rrrrr)r*r"r'r8r&r<rrrrr6;s    r6c@s&eZdZddZddZd ddZdS) RunnerscCs||_i|_dSr)pathssems)rrLrrrrv zRunners.__init__cCsh|tks|sdSd}|tkr|jd}n |tkr|jd}|s#dS||jvr/t||j|<|j|S)Nsem)r r rL get_ipathr get_cpathrMr6)rr:r7rrr_get_semzs    zRunners._get_semNFc Cs||}|s t}|sg}|||rtd||dS||||,}|s-td|td||t|trA|di|}n||}d|fWdS1sSwYdS)Nz%s already ran (freq=%s))FNzFailed to acquire lock for %szRunning %s using lock (%s)Tr) rRrr&rAdebugr"r isinstancedict) rr4functorargsr:r;rOlkresultsrrrruns"    $z Runners.runr$)rrrrrRrZrrrrrKusrKc@sReZdZ     dddZddZddZd d Zd efd d Ze ddZ dS) ConfigMergerNTcCs(||_||_||_||_||_d|_dSr)_paths_ds_fns _base_cfg_include_vendor_cfg)rrL datasourceadditional_fnsbase_cfginclude_vendorrrrrs  zConfigMerger.__init__cCshg}|jr2z|j}|rt|tr||W|SW|SW|Sty1ttd|jY|Sw|S)Nz2Failed loading of datasource config object from %s) r]get_config_objrTrUappendr9r r@rA)rd_cfgsds_cfgrrr_get_datasource_configss(   z$ConfigMerger._get_datasource_configscCsVg}ttjvr)tjt}z |t|W|Sty(ttd|Y|Sw|S)Nz%Failed loading of env. config from %s) r rCenvironrgr read_confr9r@rA)re_cfgse_fnrrr_get_env_configss   zConfigMerger._get_env_configsc Csg}|js|Sdg}|jr|d|d|D]9}|j|}|rRtj|rRz |t|Wqt yBt d|Yqt yQt t d|Yqwq|S)N cloud_configvendor2_cloud_configvendor_cloud_configz5Skipped loading cloud-config from %s due to non-root.z&Failed loading of cloud-config from %s)r\r`rg get_ipath_currCrGisfiler rlPermissionErrorrArSr9r@)ri_cfgscc_pathscc_pcc_fnrrr_get_instance_configss0     z"ConfigMerger._get_instance_configsreturnc Csg}|jr%|jD]}z |t|Wqty$ttd|Yqw|||| || |j rC||j t |S)Nz'Failed loading of configuration from %s) r^rgr rlr9r@rAextendrorzrjr_ mergemanydict)rcfgsc_fnrrr _read_cfgs     zConfigMerger._read_cfgcCs|jdur ||_|jSr)rarrrrrcfgs  zConfigMerger.cfg)NNNNT) rrrrrjrorzrUrpropertyrrrrrr[s   r[c@sFeZdZddZddZddZddZdd d Zd dZddZ dS)ContentHandlerscCsi|_g|_dSr) registered initializedrrrrr rNzContentHandlers.__init__cC ||Sr) is_registered)ritemrrr __contains__r.zContentHandlers.__contains__cCrr) _get_handler)rkeyrrr __getitem__r.zContentHandlers.__getitem__cCs ||jvSrrr content_typerrrrr.zContentHandlers.is_registeredFTcCsjt}|D]}|r||q||s||q|D]}||j|<q|r3||jvr3|j||Sr)set list_typesaddrrrrg)rmodr overwritetypestrrrregisters      zContentHandlers.registercCs |j|Srrrrrrr(r.zContentHandlers._get_handlercCst|jSr)listritemsrrrrr+zContentHandlers.itemsN)FT) rrrrrrrrrrrrrrr s  rc@steZdZdZddefddZdeddfdd Zdd d Zdd d Z dddZ dddZ dde fddZ dddZdS)PathsN path_cfgsc Cs||_|dd|_|dd|_|dtj|_tj |jd|_ tj |j d|_ tj |jd|_ |d d }tj |d |_ id d d dddddddddddddddddddddd d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1|_||_dS)2N cloud_dirz/var/lib/clouddocs_dirz/usr/share/doc/cloud-init/run_dirinstancez boot-finishedseed templates_dirz/etc/cloud/templates/z%s.tmpl boothooksrpzcloud-config.txtdatahandlers instance_datainstance-data.jsoninstance_data_sensitiveinstance-data-sensitive.jsoncombined_cloud_configcombined-cloud-config.jsonnetwork_configznetwork-config.json instance_idz .instance-idmanual_clean_markerz manual-cleanobj_pklzobj.pklscriptsrOuserdatazuser-data.txt.i userdata_rawz user-data.txt vendordatazvendor-data.txt.i vendordata2zvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorwarningshotplug.enabled .skip-network)vendordata2_rawvendordata_rawrqrrvendor_scriptsrrr)r~getrrrDEFAULT_RUN_DIRrrCrGrJ instance_link boot_finishedseed_dir template_tpllookupsrb)rrds template_dirrrrr2sx    !zPaths.__init__ci_pkl_versionr{cCsvt|dst|j|jdj|_d|jvrd|jd<d|jvr#d|jd<d|jvr-d|jd<d |jvr9d |jd <d Sd S) z(Perform deserialization fixes for Paths.r)rrrrrrrrrN)hasattrrr~rbrr)rrrrr _unpicklegs"      zPaths._unpicklecC||j|Sr)r<rrr4rrrrsrzPaths.get_ipath_curcCrr)r<rrrrrrQrzPaths.get_cpathcCsf|jsdS|j}|durdSt|tjd}tj|jd|}|j |}|r1tj||}|S)Nr2 instances) rbget_instance_idstrr3rCseprGrJrrr)rr4iid path_safe_iidipathadd_onrrr _get_ipaths  zPaths._get_ipathcCs ||}|stddS|S)Nz?No per instance data available, is there an datasource/iid set?)rrAwarning)rr4rrrrrPs zPaths.get_ipathbasecCs |dur|Stj||j|Sr)rCrGrJr)rrr4rrrr<szPaths._get_pathcCrr)r<rrrrr get_runpathrzPaths.get_runpathr)rrr_ci_pkl_versionrUrintrrsrQrrPrr<rrrrrr/s5     rc@sXeZdZdZdZdZdZddZdddZd d Z d d Z d dZ ddZ dddZ dS)DefaultingConfigParserrgFNcCsB|j}z t|||}W|StyY|Sty Y|Swr)DEF_BASErrrrrsectionoptionvaluerrrrs  zDefaultingConfigParser.getcCs4||s|dkr||t||||dS)Ndefault) has_sectionlower add_sectionrrrrrrrs zDefaultingConfigParser.setcCs"|||rt|||dSdSr) has_optionr remove_optionrrrrrrrs z$DefaultingConfigParser.remove_optioncC |||s |jSt|||Sr)r DEF_BOOLEANr getbooleanrrrrr z!DefaultingConfigParser.getbooleancCrr)r DEF_FLOATrgetfloatrrrrrrzDefaultingConfigParser.getfloatcCrr)rDEF_INTrgetintrrrrrrzDefaultingConfigParser.getintcCs<d}t}||||}|rd||dg}|S)N )rwriteflushgetvaluerJ)rheaderrF outputstreamrrr stringifys z DefaultingConfigParser.stringifyr)rrrrrrrrrrrrrrrrrrrs r)$r)loggingrC configparserrrriorr cloudinitrrr r cloudinit.settingsr r r r getLoggerrrAr9rrrr+r5r6rKr[rCloudInitPickleMixinrrrrrrs*    :-j#