3 \meA@sddlZddlZddlZddlmZmZmZddlmZddl m Z ddl m Z m Z m Z ddlmZmZmZmZejeZGdddeZGd d d ZGd d d ZGd ddZddZGdddZGdddZGdddZGdddZGddde j Z!GdddeZ"dS)N) NoOptionErrorNoSectionErrorRawConfigParser)StringIO)time) persistence type_utilsutil) CFG_ENV_NAME PER_ALWAYS PER_INSTANCEPER_ONCEc@s eZdZdS) LockFailureN)__name__ __module__ __qualname__rr/usr/lib/python3.6/helpers.pyrsrc@s eZdZdS) DummyLockN)rrrrrrrrsrc@s4eZdZddZejd ddZddZdd Zd S) DummySemaphorescCsdS)Nr)selfrrr__init__!szDummySemaphores.__init__Fccs tVdS)N)r)r_name_freqZ_clear_on_failrrrlock$szDummySemaphores.lockcCsdS)NFr)rrrrrrhas_run(szDummySemaphores.has_runcCsdS)NTr)rrrrrrclear+szDummySemaphores.clearN)F) rrrr contextlibcontextmanagerrrrrrrrr s  rc@seZdZddZddZdS)FileLockcCs ||_dS)N)fn)rr rrrr0szFileLock.__init__cCsdtj||jfS)Nz<%s using file %r>)rZobj_namer )rrrr__str__3szFileLock.__str__N)rrrrr!rrrrr/srcCs |jddS)N-_)replace)namerrrcanon_sem_name7sr&c@sDeZdZddZejdddZddZdd Zd d Z d d Z dS)FileSemaphorescCs ||_dS)N)sem_path)rr(rrrr<szFileSemaphores.__init__Fc csFt|}y|j||VWn&tk r@|r:|j||YnXdS)N)r&_acquire Exceptionr)rr%freq clear_on_failrrrr?s zFileSemaphores.lockc CsNt|}|j||}ytj|Wn&ttfk rHtjtd|dSXdS)NzFailed deleting semaphore %sFT)r& _get_pathr Zdel_fileIOErrorOSErrorlogexcLOG)rr%r+sem_filerrrrIs zFileSemaphores.clearc Csn|j||rdS|j||}dtjtf}ytj||Wn&ttfk rdtj t d|dSXt |S)Nz%s: %s z Failed writing semaphore file %s) rr-osgetpidrr Z write_filer.r/r0r1r)rr%r+r2contentsrrrr)Ss  zFileSemaphores._acquirecCsh| s|tkrdSt|}|j||}tjj|r6dS||krdtjj|j||rdtjd||dSdS)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 r&r-r3pathexistsr1warning)rr%r+Zcnamer2rrrrcs  zFileSemaphores.has_runcCs<|j}| s|tkr"tjj||Stjj|d||fSdS)Nz%s.%s)r(r r3r6join)rr%r+r(rrrr-}szFileSemaphores._get_pathN)F) rrrrrrrrr)rr-rrrrr';s  r'c@s&eZdZddZddZd ddZdS) RunnerscCs||_i|_dS)N)pathssems)rr;rrrrszRunners.__init__cCsj|tks| rdSd}|tkr,|jjd}n|tkr@|jjd}|sHdS||jkr`t||j|<|j|S)Nsem)r r r; get_ipathr get_cpathr<r')rr+r(rrr_get_sems  zRunners._get_semNFc Cs|j|}|st}|sg}|j||r:tjd||dS|j|||L}|s\td|n4tjd||t|tr|f|}n||}d|fSWdQRXdS)Nz%s already ran (freq=%s)FzFailed to acquire lock for %szRunning %s using lock (%s)T)FN) r@rrr1debugrr isinstancedict) rr%Zfunctorargsr+r,r=Zlkresultsrrrruns     z Runners.run)NF)rrrrr@rFrrrrr:sr:c@sHeZdZdddZddZddZd d Zed d d Ze ddZ dS) ConfigMergerNTcCs(||_||_||_||_||_d|_dS)N)_paths_ds_fns _base_cfg_include_vendor_cfg)rr; datasourceZadditional_fnsZbase_cfgZinclude_vendorrrrrs zConfigMerger.__init__c CsZg}|jrVy&|jj}|r.t|tr.|j|Wn$tk rTtjtd|jYnX|S)Nz2Failed loading of datasource config object from %s) rIZget_config_objrBrCappendr*r r0r1)rZd_cfgsZds_cfgrrr_get_datasource_configss z$ConfigMerger._get_datasource_configsc CsTg}ttjkrPtjt}y|jtj|Wn"tk rNtjtd|YnX|S)Nz%Failed loading of env. config from %s) r r3environrOr read_confr*r0r1)rZe_cfgsZe_fnrrr_get_env_configss  zConfigMerger._get_env_configsc Csg}|js|Sdg}|jr.|jd|jdx~|D]v}|jj|}|r4tjj|r4y|jtj|Wq4t k rt j d|Yq4t k rtj t d|Yq4Xq4W|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)rHrLrO get_ipath_curr3r6isfiler rRPermissionErrorr1rAr*r0)rZi_cfgsZcc_pathsZcc_pZcc_fnrrr_get_instance_configss(     z"ConfigMerger._get_instance_configs)returnc Csg}|jrRxF|jD]<}y|jtj|Wqtk rLtjtd|YqXqW|j|j|j|j |j|j |j r|j|j tj |S)Nz'Failed loading of configuration from %s) rJrOr rRr*r0r1extendrSrZrPrKZ mergemanydict)rcfgsZc_fnrrr _read_cfgs  zConfigMerger._read_cfgcCs|jdkr|j|_|jS)N)rMr^)rrrrcfgs  zConfigMerger.cfg)NNNNT) rrrrrPrSrZrCr^propertyr_rrrrrGs   rGc@sFeZdZddZddZddZddZdd d Zd dZddZ dS)ContentHandlerscCsi|_g|_dS)N) registered initialized)rrrrrszContentHandlers.__init__cCs |j|S)N) is_registered)ritemrrr __contains__!szContentHandlers.__contains__cCs |j|S)N) _get_handler)rkeyrrr __getitem__$szContentHandlers.__getitem__cCs ||jkS)N)rb)r content_typerrrrd'szContentHandlers.is_registeredFTcCsrt}x4|jD](}|r$|j|q|j|s|j|qWx|D]}||j|<qBW|rn||jkrn|jj||S)N)setZ list_typesaddrdrbrcrO)rmodrcZ overwritetypestrrrregister*s    zContentHandlers.registercCs |j|S)N)rb)rrjrrrrg8szContentHandlers._get_handlercCst|jjS)N)listrbitems)rrrrrr;szContentHandlers.itemsN)FT) rrrrrfrirdrprgrrrrrrras rac@sreZdZdZdedddZeddddZdd d Zdd d Z dd dZ dddZ de dddZ dddZdS)PathsN) path_cfgscCs||_|jdd|_|jdd|_tjj|jd|_tjj|jd|_tjj|jd|_ |jdd }tjj|d |_ d d d ddddddddddddddddddd d!d"|_ ||_ dS)#N cloud_dirz/var/lib/cloudrun_dirz/run/cloud-initinstancez boot-finishedZseedZ templates_dirz/etc/cloud/templates/z%s.tmpl boothookszcloud-config.txtdatahandlerszinstance-data.jsonzinstance-data-sensitive.jsonzcombined-cloud-config.jsonznetwork-config.jsonz .instance-idz manual-cleanzobj.pklscriptsr=zuser-data.txt.iz user-data.txtzvendor-data.txt.izvendor-data2.txt.izvendor-data2.txtzvendor-data.txtzvendor2-cloud-config.txtzvendor-cloud-config.txtzscripts/vendorwarnings)ryrTrzr{ instance_datainstance_data_sensitivecombined_cloud_configZnetwork_configZ instance_idZmanual_clean_markerZobj_pklr|r=ZuserdataZ userdata_rawZ vendordataZ vendordata2Zvendordata2_rawZvendordata_rawrUrVZvendor_scriptsr}) r]getrvrwr3r6r9 instance_linkZ boot_finishedZseed_dirZ template_tpllookupsrN)rrudsZ template_dirrrrrBsD  zPaths.__init__)ci_pkl_versionr[cCs^t|dst|j|jdj|_d|jkr2d|jd<d|jkrFd|jd<d|jkrZd|jd<d S) z(Perform deserialization fixes for Paths.rw)rurr~zinstance-data.jsonrzinstance-data-sensitive.jsonrzcombined-cloud-config.jsonN)hasattrrsr]rNrwr)rrrrr _unpicklers      zPaths._unpicklecCs|j|j|S)N)r-r)rr%rrrrWszPaths.get_ipath_curcCs|j|j|S)N)r-rv)rr%rrrr?szPaths.get_cpathcCsf|js dS|jj}|dkr dSt|jtjd}tjj|jd|}|j j |}|rbtjj||}|S)Nr#Z instances) rNZget_instance_idstrr$r3sepr6r9rvrr)rr%ZiidZ path_safe_iidipathZadd_onrrr _get_ipaths  zPaths._get_ipathcCs$|j|}|stjddS|SdS)Nz?No per instance data available, is there an datasource/iid set?)rr1r8)rr%rrrrr>s  zPaths.get_ipath)basecCs |dkr |Stjj||j|S)N)r3r6r9r)rrr%rrrr-szPaths._get_pathcCs|j|j|S)N)r-rw)rr%rrr get_runpathszPaths.get_runpath)N)N)N)N)N)N)N)rrrZ_ci_pkl_versionrCrintrrWr?rr>rr-rrrrrrs?s0    rsc@sXeZdZdZdZdZdZddZdddZd d Z d d Z d dZ ddZ dddZ dS)DefaultingConfigParserrgFNc CsD|j}ytj|||}Wn&tk r,Yntk r>YnX|S)N)DEF_BASErrrr)rsectionoptionvaluerrrrszDefaultingConfigParser.getcCs6|j| r"|jdkr"|j|tj||||dS)Ndefault)Z has_sectionlowerZ add_sectionrrk)rrrrrrrrks zDefaultingConfigParser.setcCs|j||rtj|||dS)N) has_optionr remove_option)rrrrrrrs z$DefaultingConfigParser.remove_optioncCs |j||s|jStj|||S)N)r DEF_BOOLEANr getboolean)rrrrrrrs z!DefaultingConfigParser.getbooleancCs |j||s|jStj|||S)N)r DEF_FLOATrgetfloat)rrrrrrrs zDefaultingConfigParser.getfloatcCs |j||s|jStj|||S)N)rDEF_INTrgetint)rrrrrrrs zDefaultingConfigParser.getintcCs<d}t}|j||j|j}|r8dj||dg}|S)N )rwriteflushgetvaluer9)rheaderr5Z outputstreamrrr stringifys z DefaultingConfigParser.stringify)N)N)rrrrrrrrrkrrrrrrrrrrs r)#rZloggingr3Z configparserrrriorrZ cloudinitrrr Zcloudinit.settingsr r r r Z getLoggerrr1r*rrrrr&r'r:rGraZCloudInitPickleMixinrsrrrrr s(   J-j#