a '¡Dgßlã@s` ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZmZddlmZm Z ddl!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(dd l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6dd l7m8Z8ddl9Z9dd l:m;Z;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEdd lFmGZGdd lHmIZImJZJe+rÖddlKmLZLdaMe  NeO¡ZPe jQdiZRdejSejTZUdZVdZWdd„ZXe$ƒdd„ƒZYe$ƒdd„ƒZZdde5e[e\fe[dœdd„Z]dee5e[e\fe\dœdd„Z^e? _d ¡e\e\d!œd"d#„ƒZ`d$d%„ZaGd&d'„d'ƒZbGd(d)„d)ecƒZdGd*d+„d+ecƒZed,d-„Zfdfd.d/„Zgdgd0d1„Zhdhd2d3„Zidid5d6„Zjdjd7d8„Zkdd9œe/d:œd;d<„Zld=d>„Zmd?d@„ZndAdB„ZodkdDdE„ZpdFdG„Zqe[erdHœdIdJ„Zse$ƒdKdL„ƒZte$ƒdMdN„ƒZue$ƒdOdP„ƒZve$ƒdQdR„ƒZwe$ƒdSdT„ƒZxe$ƒdUdV„ƒZydldXdY„ZzdmdZd[„Z{dnd\d]„Z|dod^d_„Z}e$ƒd`da„ƒZ~dbdc„Ze$ƒddde„ƒZ€dpdfdg„Zdqdhdi„Z‚djdk„Zƒdrdldm„Z„dse4e2erdnœdodp„Z…ejdqdr„ƒZ†ejdsdt„ƒZ‡dudv„Zˆdwdx„Z‰dtd{d|„ZŠdud}d~„Z‹derffdd€„ZŒdvd‚dƒ„Zdd9œerd:œd„d…„ZŽdd9œerd:œd†d‡„Zdwdˆd‰„ZdxdŠd‹„Z‘dŒd„Z’edŽgd¢ƒZ“dydd‘„Z”dzd“d”„Z•e? _d•¡e–d:œd–d—„ƒZ—d˜d™„Z˜dšd›„Z™dœd„ZšdždŸ„Z›d{d¡d¢„Zœd|d£d¤„Zd}d¥d¦„Zžd~d§d¨„ZŸdd©dª„Z d€d«d¬„Z¡d­d®„Z¢ddWd¯œe5e[e j£fe3e-e¤gdfe–e\d°œd±d²„Z¥ddWd¯œe5e[e j£fe3e-e¤gdfe–e[d°œd³d´„Z¦e$ƒdµd¶„ƒZ§d·d¸„Z¨e–d:œd¹dº„Z©dd¼d½„Zªd‚d¾d¿„Z«dƒdÀdÁ„Z¬e/e[e,fe3e[e1e3e[dœdÃdÄ„Z­e/e[e,fdÅœdÆdÇ„Z®d„e[e[dÈœdÉdÊ„Z¯dËdÌ„Z°dÍd΄Z±dÏdЄZ²d…dÒdÓ„Z³e? _dÔ¡erffdÕdÖ„ƒZ´d×dØ„Zµd†dÙdÚ„Z¶ejdÛdÜ„ƒZ·dÝdÞ„Z¸d‡dßdà„Z¹dádâ„Zºdãdä„Z»dˆdådæ„Z¼dçdè„Z½dédê„Zdëdì„Z¾e$ƒdídZ¿dïdð„ZÀdñdò„ZÁd‰dWdôœe¤e–ddõœdöd÷„ZÂdødù„ZÃdúdû„ZÄe[e¤düœdýdþ„ZÅe[e¤dÿœdd„ZÆe[e[dÿœdd„ZÇe[e[dÿœdd„ZÈe[e1e[dœdd„ZÉe? _d ¡dŠdCddd œe–e–d œd d„ƒZÊdd„ZËd‹dd„ZÌdŒdd„ZÍddd„ZÎdd„ZÏdd„ZÐdd„ZÑdd „ZÒe$ƒd!d"„ƒZÓd#d$„ZÔdŽe[e[e/e[e[fd&œd'd(„ZÕd)d*„ZÖd+d,„Z×d-d.„ZØePdWfd/d0„ZÙd1d2„ZÚd3d4„ZÛd5d6„ZÜd7d8„ZÝdd9d:„ZÞePdWfd;d<„Zße[e–d=œd>d?„Zàd@dA„Zádde jâjQfdBdC„ZãddEdF„ZädGdH„Zåd‘dIdJ„ZædKdL„ZçdMdN„ZèdOdP„ZédQdR„Zêd’dSdT„Zëd“dVdW„ZìdXdY„ZídZd[„Zîd”d\d]„Zïd^erd_œd`da„Zðee0de,dfd:œdbdc„ƒZñdS(•éN)Ú b64decode)ÚdequeÚ namedtuple)ÚcontextmanagerÚsuppress)ÚENOENT)Ú lru_cache)ÚPath)Ú ModuleType) ÚIOÚ TYPE_CHECKINGÚAnyÚCallableÚDequeÚDictÚ GeneratorÚListÚMappingÚOptionalÚSequenceÚUnionÚcast)Úparse) ÚfeaturesÚimporterÚmergersÚnetÚ performanceÚsettingsÚsubpÚ temp_utilsÚ type_utilsÚ url_helperÚversion)Úlogexc)Ú CFG_BUILTINÚPER_ONCE)ÚPathsÚ_z_-.())ÚtrueÚ1ZonZyes)ZoffÚ0ÚnoZfalsecCs"tttt ¡j d¡dd…ƒƒS)NÚ.é)ÚtupleÚmapÚintÚosÚunameÚreleaseÚsplit©r6r6ú2/usr/lib/python3.9/site-packages/cloudinit/util.pyÚkernel_version_sr8cCstjddgdd}|j ¡S)z´Return the sanitized string output by `dpkg --print-architecture`. N.B. This function is wrapped in functools.lru_cache, so repeated calls won't shell out every time. Zdpkgz--print-architectureT©Úcapture)rÚstdoutÚstrip)Úoutr6r6r7Úget_dpkg_architecturecsr>c sÞdddddœ}i‰z~tjddgdd }|j ¡D],}| d ¡\}}}||vr0| ¡ˆ||<q0‡fd d „| ¡Dƒ}t|ƒrŽt d d  |¡¡WnHtj yØ}z.t d|¡t dd„| ¡Dƒƒ‰WYd}~n d}~00ˆS)NÚcodenameÚ descriptionÚidr4)ZCodenameZ DescriptionzDistributor IDZReleaseÚ lsb_releasez--allTr9ú:csg|]}|ˆvr|‘qSr6r6)Ú.0Úk©Údatar6r7Ú ~ózlsb_release..z.Missing fields in lsb_release --all output: %sú,z#Unable to get lsb_release --all: %scss|]}|dfVqdS)Z UNAVAILABLENr6©rDÚvr6r6r7Ú ‡rIzlsb_release..) rr;Ú splitlinesÚ partitionr<ÚvaluesÚlenÚLOGÚwarningÚjoinÚProcessExecutionErrorÚdict)Zfmapr=ÚlineÚfnamer(ÚvalÚmissingÚerrr6rFr7rBns,üþ ,rBúutf-8)ÚblobÚreturncCst|tƒr|S|j|dS©N)Úencoding)Ú isinstanceÚstrÚdecode)r]r`r6r6r7Ú decode_binaryŒsrd)Útextr^cCst|tƒr|S|j|dSr_)raÚbytesÚencode)rer`r6r6r7Ú encode_text‘srhzBase64 decoding)rGr^cCsFt|tƒstdt|ƒƒ‚zt|ddWStjy@|YS0dS)z¼base64 decode data If data is base64 encoded bytes, return b64decode(data). If not, return data unmodified. @param data: data as bytes. TypeError is raised if not bytes. zdata is '%s', expected bytesT)ZvalidateN)rarfÚ TypeErrorÚtyperÚbinasciiÚErrorrFr6r6r7Úmaybe_b64decode–s rmcCsP|jdd}| ¡dkrLt|tƒrL| ¡}|r<|jr<|j}nd}| |d¡S|S)NT)rcrer\Úsurrogateescape)Z get_payloadZget_content_maintyperarfZ get_charsetZ input_codecrc)ÚpartZ cte_payloadÚcharsetr`r6r6r7Úfully_decoded_payload§s ÿ  rqc@s&eZdZd dd„Zdd„Zdd„ZdS) Ú SeLinuxGuardFcCs>|zt d¡|_Wnty,d|_Yn0||_||_dS)NÚselinux)rÚ import_modulersÚ ImportErrorÚpathÚ recursive)Úselfrvrwr6r6r7Ú__init__»s  zSeLinuxGuard.__init__cCs|jr|j ¡rdSdSdS©NTF)rsÚis_selinux_enabled)rxr6r6r7Ú __enter__ÆszSeLinuxGuard.__enter__c CsÎ|jr|j ¡sdStj |j¡s&dStj |j¡}z"t |¡}|j ||tj ¡Wnt yjYdS0t   d||j ¡z|jj||j dWn6t yÈ}zt  d||j |¡WYd}~n d}~00dS)Nz,Restoring selinux mode for %s (recursive=%s)©rwz,restorecon failed on %s,%s maybe badness? %s)rsr{r2rvÚlexistsÚrealpathÚlstatZ matchpathconÚstatÚST_MODEÚOSErrorrRÚdebugrwZ restoreconrS)rxZ excp_typeZ excp_valueZexcp_tracebackrvZstatsÚer6r6r7Ú__exit__Ìs0  ýüzSeLinuxGuard.__exit__N)F)Ú__name__Ú __module__Ú __qualname__ryr|r†r6r6r6r7rrºs rrc@s eZdZdS)ÚMountFailedErrorN©r‡rˆr‰r6r6r6r7rŠésrŠc@s eZdZdS)ÚDecompressionErrorNr‹r6r6r6r7rŒísrŒc Osvt ¡}|dkr^z||i|¤Žt d¡WqrtyZttdt |¡ƒt d¡Yqr0nt d|t |¡¡dS)Nrz&Failed forking and calling callback %séz(Forked child %s who will run callback %s) r2ÚforkÚ_exitÚ Exceptionr$rRr!Úobj_namer„)Zchild_cbÚargsÚkwargsZfidr6r6r7Úfork_cbñs" ýýr”cCsBt|tƒr|duSt}|r&t|ƒ|}t|ƒ ¡ ¡|vr>dSdSrz)raÚboolÚ TRUE_STRINGSÚlistrbÚlowerr<©rYÚaddonsZ check_setr6r6r7Úis_trues  r›cCsBt|tƒr|duSt}|r&t|ƒ|}t|ƒ ¡ ¡|vr>dSdS)NFT)rar•Ú FALSE_STRINGSr—rbr˜r<r™r6r6r7Úis_falses  rcCs |sdSt|tƒr|St||ƒS)NF)rar•r›)rYršr6r6r7Útranslate_bools  ržé cs6t ¡‰ˆstjtj‰d ‡‡fdd„t|ƒDƒ¡S)NÚcsg|]}ˆ ˆ¡‘qSr6)Úchoice)rDZ_x©ÚrÚ select_fromr6r7rH+rIzrand_str..)ÚrandomZ SystemRandomÚstringÚ ascii_lettersÚdigitsrTÚrange)Ústrlenr¤r6r¢r7Úrand_str's r«cCs*|sd}tddd|}||vrq&q|S)Nr é)rªr()r«)Z dictionaryZpostfixZnewkeyr6r6r7Ú rand_dict_key.s r­©Úinstance_data_file)r^c Csðddlm}m}m}m}z t|ƒ}Wnty:iYS0|rätj  |¡räz||||ƒ}t   d||¡Wnx|yœ}zt   d||¡WYd}~nPd}~0|y¬Yn8|yâ}z t   d||t |ƒ¡WYd}~n d}~00t|idS)z>Read a yaml config with optional template, and convert to dictr)ÚJinjaLoadErrorÚJinjaSyntaxParsingExceptionÚ NotJinjaErrorÚrender_jinja_payload_from_filez?Applied instance data in '%s' to configuration loaded from '%s'z4Failed to render templated yaml config file '%s'. %sNz:Could not apply Jinja template '%s' to '%s'. Exception: %s©Údefault)Z!cloudinit.handlers.jinja_templater°r±r²r³Úload_text_fileÚFileNotFoundErrorr2rvÚexistsrRr„rSÚreprÚ load_yaml)rXr¯r°r±r²r³Z config_filer…r6r6r7Ú read_conf8sB   ýüý ûr»cGs tt|ŽƒS©N)ÚsortedÚ uniq_merge)Úlistsr6r6r7Úuniq_merge_sortedlsrÀcGsFg}|D]4}t|tƒr2| ¡ d¡}dd„|Dƒ}| |¡qt|ƒS)NrJcSsg|] }|r|‘qSr6r6)rDÚar6r6r7rH~rIzuniq_merge..)rarbr<r5ÚextendÚ uniq_list)r¿Z combined_listÚa_listr6r6r7r¾xs  r¾cCs`t ¡D]\}}| ||¡}qg}|D]}|tvr&| |¡q&|D]}| |d¡}qB| ¡}|S)Nr )ÚFN_REPLACEMENTSÚitemsÚreplaceÚ FN_ALLOWEDÚappendr<)ÚfnrErLZremovalsr6r6r7Úclean_filenameƒs rËTc Csz¶t t|ƒ¡”}t ddd|¡d}|rRt| ¡ƒWdƒWdƒWS| ¡WdƒWdƒWSWdƒn1sŒ0YWdƒn1sª0YWnHtyþ}z.|rÜ|WYd}~Stt |ƒƒ|‚WYd}~n d}~00dS)NÚrbr) ÚioÚBytesIOrhÚgzipZGzipFilerdÚreadrrŒrb)rGÚquietrcÚbufZghr…r6r6r7Ú decomp_gzipsÿ*frÓcCs~|sdS| dd¡}|d ¡}t|ƒdkr:|d ¡}nd}|rV|dksV| ¡dkrZd}|rr|dksr| ¡dkrvd}||fS)N)NNrCrrr.z-1Znone)r5r<rQr˜)Zug_pairZ ug_partedÚuÚgr6r6r7Úextract_usergroup s   rÖ)Úroot_dirr^cCshtƒ}t tj |d¡¡D]H}tj |¡s,qtj |¡dd…}| ¡}|r| d¡dkr|||<q|S)Nz*.pyréýÿÿÿr-éÿÿÿÿ) rVÚglobr2rvrTÚisfileÚbasenamer<Úfind)r×ÚentriesrXÚmodnamer6r6r7Úget_modules_from_dir°s  ràcCs dt ¡vS)adeprecated: prefer Distro object's `is_linux` property Multiple sources of truth is bad, and already know whether we are working with Linux from the Distro class. Using Distro offers greater code reusablity, cleaner code, and easier maintenance. ZLinux©ÚplatformÚsystemr6r6r6r7Úis_Linux¼sräcCs$dt ¡vrdSt ¡dkr dSdS)NZBSDTZ DragonFlyFrár6r6r6r7Úis_BSDÇs   råcCstƒddkS)NÚvariantÚfreebsd©Ú system_infor6r6r6r7Ú is_FreeBSDÐsrêcCstƒddkS)NræÚ dragonflyrèr6r6r6r7Úis_DragonFlyBSDÕsrìcCstƒddkS)NræÚnetbsdrèr6r6r6r7Ú is_NetBSDÚsrîcCstƒddkS)NræÚopenbsdrèr6r6r6r7Ú is_OpenBSDßsrðFcCs||vr |St||ƒSr¼)rž©ÚyobjÚkeyrµr6r6r7Úget_cfg_option_booläsrôcCs*||vr |S||}t|tƒs&t|ƒ}|Sr¼)rarb)ròrórµrYr6r6r7Úget_cfg_option_strês  rõcCstt|||dƒS)Nr´)r1rõrñr6r6r7Úget_cfg_option_intósröcCsª|sd}tj |¡siSt|ƒ}d}d|vr0d}t ||¡}|r¦| ¡}d|dvr`|d|d<|d ¡ d¡d|d<|dd krŽd |d<|d|d |dd œSiS) z¦Return a dictionary of distro info fields from /etc/redhat-release. Dict keys will align with /etc/os-release keys: ID, VERSION_ID, VERSION_CODENAME z/etc/redhat-releasezA(?P.+) release (?P[\d\.]+) \((?P[^)]+)\)Z Virtuozzoz)(?P.+) release (?P[\d\.]+)Únamer?z linuxrzred hat enterpriseÚredhatr#)ÚIDÚ VERSION_IDÚVERSION_CODENAME) r2rvr¸r¶ÚreÚmatchÚ groupdictr˜rO)Z release_fileZredhat_releaseZ redhat_regexrýÚgroupr6r6r7Ú_parse_redhat_release÷s, ÿ    ýrc Cs˜d}d}d}i}d}tj d¡r,ttdƒƒ}|s:d}tƒ}|rê| dd¡}| dd¡}d|vsfd|vrpt ¡}nl|d ks€|d krŽ| d d¡}nN|d kr¨|s¨| d d¡}n4| d d¡}|sÜt   d| dd¡¡}|rÜ|  ¡d}|dkrèd}n¤t ƒrt  ¡ ¡}t ¡}n†d}zPz t ¡}Wnty.Yn0Wd}|D]}|r:d}q:|sŠt d¡n,d}|D]}|rfd}qf|sˆt d¡0|S|||fS)Nr Fú/etc/os-releaseTrùrúÚslesÚsuseÚalpineÚphotonZ PRETTY_NAMEÚ virtuozzorûz[^ ]+ \((?P[^)]+)\)ZVERSIONr?Úrhelrø)r r r rzPUnable to determine distribution, template expansion may have unexpected results)r2rvr¸Úload_shell_contentr¶rÚgetrâÚmachinerürýrþrårãr˜r4ÚdistrrRrS) Z distro_nameZdistro_versionZflavorZ os_releaseZos_release_rhelrýr ÚfoundÚentryr6r6r7Úget_linux_distrosn        þ    ÿûÿrcCsv|d ¡}d}|dkrf|dd ¡}|dvr6|}qr|dvrDd}qr|d krRd }qr|d vr`d }qrd}n |d vrr|}|S)NrãÚunknownZlinuxr r)Z almalinuxrZaoscZarchZ azurelinuxZcentosZ cloudlinuxZdebianZ eurolinuxZfedoraZmarinerZ miraclelinuxZ openeulerZ opencloudosZ openmandrivarrZrockyrZ tencentosr)ÚubuntuZ linuxmintZmintrrør)Zopensusez opensuse-leapzopensuse-microoszopensuse-tumbleweedZsle_hpcz sle-microrr)ZwindowsÚdarwinrçrírïrë)r˜)ÚinforãræZ linux_distr6r6r7Ú _get_variant]s   rcCs<t ¡t ¡t ¡t ¡tt ¡ƒtƒdœ}t|ƒ|d<|S)N)rârãr4Zpythonr3r ræ)rârãr4Zpython_versionr—r3rr)rr6r6r7ré—s ú récCsX||vr |S||durgS||}t|tƒr@dd„|Dƒ}|St|tƒsRt|ƒ}|gS)aª Gets the C{key} config option from C{yobj} as a list of strings. If the key is present as a single string it will be returned as a list with one string arg. @param yobj: The configuration object. @param key: The configuration key to get. @param default: The default to return if key is not found. @return: The configuration option as a list of strings or default if key is not found. NcSsg|]}|‘qSr6r6rKr6r6r7rH·rIz'get_cfg_option_list..)rar—rb)ròrórµrYZcvalr6r6r7Úget_cfg_option_list¥s    rcCs>t|tƒr| d¡}|}|D]}||vr0|S||}q|S)aÓReturn the value of the item at path C{keyp} in C{yobj}. example: get_cfg_by_path({'a': {'b': {'num': 4}}}, 'a/b/num') == 4 get_cfg_by_path({'a': {'b': {'num': 4}}}, 'c/d') == None @param yobj: A dictionary. @param keyp: A path inside yobj. it can be a '/' delimited string, or an iterable. @param default: The default to return if the path does not exist. @return: The value of the item at keyp." is not found.ú/)rarbr5)ròZkeyprµZcurÚtokr6r6r7Úget_cfg_by_pathÀs   rcCs t||ƒ\}}t||ƒ||fSr¼)Úget_output_cfgÚredirect_output)ÚcfgÚmodeÚoutfmtÚerrfmtr6r6r7Ú fixup_outputØs rc Cs¼ttj d¡ƒrt d¡dS|s(tj}|s2tj}dd„}|r t d||¡|  dd¡\}}|dksn|d krŠd }|dkr~d }t ||ƒ}n:|d kr¸t j |d t j |d} ttt| jƒ}n td|ƒ‚|rÜt | ¡| ¡¡||kr t d||¡t | ¡| ¡¡dS|r¸t d||¡|  dd¡\}}|dksD|d krbd }|dkrVd }t ||ƒ}n<|d kr’t j |d t j |d} ttt| jƒ}n td|ƒ‚|r¸t | ¡| ¡¡dS)NZ_CLOUD_INIT_SAVE_STDOUTz5Not redirecting output due to _CLOUD_INIT_SAVE_STDOUTcSs<t d¡zt d¡j}Wnty,Yn 0t |¡dS)a«Reconfigure umask and group ID to create output files securely. This is passed to subprocess.Popen as preexec_fn, so it is executed in the context of the newly-created process. It: * sets the umask of the process so created files aren't world-readable * if an adm group exists in the system, sets that as the process' GID (so that the created file(s) are owned by root:adm) éZadmN)r2ÚumaskÚgrpÚgetgrnamÚgr_gidÚKeyErrorÚsetgid)Zgroup_idr6r6r7Úset_subprocess_umask_and_gidös  z5redirect_output..set_subprocess_umask_and_gidzRedirecting %s to %sú rú>ú>>ÚabÚwbú|T)ÚshellÚstdinZ preexec_fnz"Invalid type for output format: %sz!Invalid type for error format: %s)r›r2Úenvironr rRr„Úsysr;Ústderrr5ÚopenÚ subprocessÚPopenÚPIPErr r r.riÚdup2Úfileno) rrZo_outZo_errr&rÚargZowithZnew_fpÚprocr6r6r7rësd  ü     ü r)Úsourcesr^cCsR|rtt|ƒƒ}i}|D]4}|rt |¡}|s6t ¡}t |¡}| ||¡}q|S)aFMerge multiple dicts according to the dict merger rules. Dict merger rules can be found in cloud-init documentation. If no mergers have been specified, entries will be recursively added, but no values get replaced if they already exist. Functionally, this means that the highest priority keys must be specified first. Example: a = { "a": 1, "b": 2, "c": [1, 2, 3], "d": { "a": 1, "b": 2, }, } b = { "a": 10, "c": [4], "d": { "a": 3, "f": 10, }, "e": 20, } mergemanydict([a, b]) results in: { 'a': 1, 'b': 2, 'c': [1, 2, 3], 'd': { 'a': 1, 'b': 2, 'f': 10, }, 'e': 20, } )r—ÚreversedrZdict_extract_mergersZdefault_mergersZ constructÚmerge)r:ÚreverseZ merged_cfgrZmergers_to_applyZmergerr6r6r7Ú mergemanydict?s*   r>c cs8t ¡}zt |¡|VWt |¡n t |¡0dSr¼)r2ÚgetcwdÚchdir)ZndirZcurrr6r6r7r@ws  r@c cs0t |¡}z|VWt |¡n t |¡0dSr¼)r2r )Zn_mskÚoldr6r6r7r s r cCsdj||d|dS)Nz{0:{fill}{align}{size}}ú^)ÚfillZalignÚsize)Úformat)rerCZmax_lenr6r6r7ÚcenterŠsÿrFcCst d|¡t |¡dS)NzRecursively deleting %s)rRr„ÚshutilÚrmtree©rvr6r6r7Údel_dirs rJr éc Cs„z.zcert.pemzkey.pemÚ cert_fileÚkey_file)r2rvrTZ get_ipath_curÚ get_cpathr¾rÛ)ÚpathsZ ssl_detailsZssl_cert_pathsr]r\r^r6r6r7Úfetch_ssl_details¨s4þþ rac Cs"|}t|ƒ}z\t dt|ƒ|¡t |¡}|durBt d¡|}n t||ƒsbtd|t  |¡fƒ‚|}Wn´tj tt fy}z’d}d}t |dƒrªt |dƒrªt |dƒ}nt |dƒrÈt |dƒrÈt |dƒ}|rî|dj|jd|jd|d 7}n|d j|d 7}t |¡WYd}~n d}~00|S) NzKAttempting to load yaml from string of length %s with allowed root types %sz-loaded blob returned None, returning default.z2Yaml load allows %s root types, but got %s insteadzFailed loading yaml blobZ context_markZ problem_markz5. Invalid format at line {line} column {col}: "{err}"r)rWÚcolr[z. {err})r[)rdrRr„rQÚyamlZ safe_loadrarir!r‘Z YAMLErrorÚ ValueErrorÚhasattrÚgetattrrErWÚcolumnrS)r]rµÚallowedZloadedZ convertedr…ÚmsgZmarkr6r6r7rºÉsFü    ÿÿ  ÿÿ rºé c CsØ| d¡dkrP| dd|¡}| dd|¡}| dd|¡}| dd|¡}nbtjrz|ddkrzt |¡jd krz|d7}d |d|f}d |d|f}d |d|f}d |d|f}d}ztj|||d } Wn2tj yü} zt   d | ¡WYd} ~ nd} ~ 00|   ¡rt | jƒ}tj|||d } d} |   ¡r>t | jid } tj|||d } d}|   ¡rb| j}d}ztj|||d }Wn4tj y®} zt   d| ¡WYd} ~ n&d} ~ 00|  ¡rÂ|j}n t   d¡| |||fS)Nz%srrOrPrQrRrÙrr z%s%s%s)rNÚretrieszNo network config provided: %sr´z!Error in vendor-data response: %szError in vendor-data response)rÝrÇrZ%NOCLOUD_SEED_URL_APPEND_FORWARD_SLASHrÚurlparseÚqueryr"Zread_file_or_urlrTrRr„ÚokrºÚcontents)rLrMrNrkZud_urlZvd_urlZmd_urlZ network_urlrYZ network_respr…Zmd_resprVZud_resprWrXZvd_respr6r6r7rSñsXÿ "  ÿ ÿ ÿ "  rSc s¼tt ˆ¡dd}dd„|Dƒ}‡fdd„|Dƒ}g}|D]x}tj ˆ|¡}z| t||d¡Wq:ty€t  d|¡Yq:t y°}zt  d||¡WYd }~q:d }~00q:t |ƒS) zRead configuration directory.T©r=cSsg|]}| d¡r|‘qS)z.cfg)Úendswith©rDÚfr6r6r7rH.rIzread_conf_d..cs&g|]}tj tj ˆ|¡¡r|‘qSr6)r2rvrÛrTrr©Úconfdr6r7rH1rIr®ú1REDACTED config part %s, insufficient permissionsúError accessing file %s: [%s]N) r½r2ÚlistdirrvrTrÉr»ÚPermissionErrorrRrSrƒr>)rur¯ZconfsÚcfgsrÊrvr…r6rtr7Ú read_conf_d(s(þÿ ÿ&r{c Cstƒ}i}zt||d}WnNty8t d|¡Yn<tyh}zt d||¡WYd}~nd}~00| |¡d}d|vr¼|d}|rØt|tƒs®t d|t   |¡fƒ‚qØt|ƒ  ¡}nt j |›d¡rØ|›d}|rþt j |¡rþt||d}| |¡t|ƒS) aRead yaml file along with optional ".d" directory, return merged config Given a yaml file, load the file as a dictionary. Additionally, if there exists a same-named directory with .d extension, read all files from that directory in order and return the merged config. The template file is optional and will be applied to any applicable jinja file in the configs. For example, this function can read both /etc/cloud/cloud.cfg and all files in /etc/cloud/cloud.cfg.d and merge all configs into a single dict. r®rvrwNr Zconf_dz8Config file %s contains 'conf_d' with non-string type %sz.d)rr»ryrRrSrƒrÉrarbrir!r‘r<r2rvr[r{Ú appendleftr>)Zcfgfiler¯rzrr…ruZ confd_cfgr6r6r7Úread_conf_with_confdHs8  ÿ$   ÿÿ   r}cCstt|dƒS)N©Úcmdline)rºÚread_cc_from_cmdliner~r6r6r7Úread_conf_from_cmdlinewsrc Cs®|durtƒ}d|›}d}d}t|ƒ}t|ƒ}t|ƒ}g}| |¡}|dkr¤| |||¡}|dkrj|}| t ||||… ¡¡ dd¡¡| |||¡}qFd |¡S)Nr'z cc:Zend_ccrz\nÚ ) Ú get_cmdlinerQrÝrÉrÚunquoteÚlstriprÇrT) rZ tag_beginZtag_endZbegin_lZend_lZclenÚtokensZbeginÚendr6r6r7r€|s*   ÿÿr€cCs2| d¡}|dks"||ddkr&|S| dd¡S)Nr‚rrú z )rÝrÇ)roÚposr6r6r7Údos2unixŸs rŠÚHostnameFqdnInfo)ÚhostnameÚfqdnÚ is_defaultcCs¤d}d|vr,|d}t|d| d¡dƒ}nld|vrf|d d¡dkrf|d}|dd| d¡…}n2|jd|dj}d|vrˆ|d}n|j|d \}}t|||ƒS) a÷Get hostname and fqdn from config if present and fallback to cloud. @param cfg: Dictionary of merged user-data configuration (from init.cfg). @param cloud: Cloud instance from init.cloudify(). @param metadata_only: Boolean, set True to only query cloud meta-data, returning None if not present in meta-data. @return: a namedtuple of , , (str, str, bool). Values can be none when metadata_only is True and no cfg or metadata provides hostname info. is_default is a bool and it's true only if hostname is localhost and was returned by util.get_hostname() as a default. This is used to differentiate with a user-defined localhost hostname. FrrŒr-rNT)rÚ metadata_only)r)rõr5rÝÚ get_hostnamerŒr‹)rÚcloudrrŽrrŒr6r6r7Úget_hostname_fqdn­s ÿ ÿ r’ú /etc/hostscCsd}ztt|ƒ ¡D]b}| d¡}|dkr4|d|…}| ¡}|sBq| ¡}t|ƒdkrXq||dd…vr|d}qvqWntyŠYn0|S)a¤ For each host a single line should be present with the following information: IP_address canonical_hostname [aliases...] Fields of the entry are separated by any number of blanks and/or tab characters. Text from a "#" character until the end of the line is a comment, and is ignored. Host names may contain only alphanumeric characters, minus signs ("-"), and periods ("."). They must begin with an alphabetic character and end with an alphanumeric character. Optional aliases provide for name changes, alternate spellings, shorter hostnames, or generic hostnames (for example, localhost). Nú#rér.r)r¶rNrÝr<r5rQÚIOError)rŒÚfilenamerrWZhashposÚtoksr6r6r7Úget_fqdn_from_hostsØs$     r™z Resolving URLc CsXt |¡}|j}tdurÀtƒ}d}i}|D]€}z`t |dddtjtj¡}g||<|D]6\}} } } } ||  d| | df¡|  | d¡qTWq*tj tj fy¨Yq*0q*|a|rÀt  d|¡ztttƒ4t |j d¡¡rðWdƒWdSWdƒn1s0Yt |d¡}|ddd} | tvWStj tj fyRYd S0dS) aîdetermine if a url's network address is resolvable, return a boolean This also attempts to be resilent against dns redirection. Note, that normal nsswitch resolution is used here. So in order to avoid any utilization of 'search' entries in /etc/resolv.conf we have to append '.'. The top level 'invalid' domain is invalid per RFC. And example.com should also not exist. The '__cloud_init_expected_not_found__' entry will be resolved inside the search list. N)zdoes-not-exist.example.com.zexample.invalid.Z!__cloud_init_expected_not_found__rz%s: %szdetected dns redirection: %sz[]TéF)rrlrŒÚ_DNS_REDIRECT_IPÚsetÚsocketZ getaddrinfoZ SOCK_STREAMZ AI_CANONNAMErÉÚaddZgaierrorÚerrorrRr„rrdrZ is_ip_addressÚnetlocr<)ÚurlZ parsed_urlr÷ZbadipsZbadnamesZ badresultsZinameÚresultZ_famZ_stypeZ_protoZcnameZsockaddrÚaddrr6r6r7Ú is_resolvables: ÿ  2  r¤cCs t ¡}|Sr¼)rZ gethostname)rŒr6r6r7r4srcCs,zt |¡dWStjy&YdS0dS©Nr)rÚ gethostbyaddrZherror)Úipr6r6r7r¦9sr¦cCst|ƒS)z5determine if this url is resolvable (existing or ip).)r¤)r¡r6r6r7Úis_resolvable_url@sr¨c Cs\|dur dSt d|¡|D]:}z"t|ƒr@t d|¡|WSWqtyTYq0qdS)zc Search through a list of mirror urls for one that works This needs to return quickly. Nz%search for mirror in candidates: '%s'zfound working mirror: '%s')rRr„r¨r)Z candidatesZcandr6r6r7Úsearch_for_mirrorEs   r©ÚdevicecCsvg}|st d¡t d¡S| d¡rL| d¡}dd„d|d|fDƒ}n&|dkr`t d¡}n|d krrt d¡}|S) Nz/dev/msdosfs/*z/dev/iso9660/*úLABEL=cSsg|]}tj |¡r|‘qSr6©r2rvr¸)rDÚpr6r6r7rH`s þz*find_devs_with_freebsd..z /dev/msdosfs/z /dev/iso9660/ú TYPE=vfatú TYPE=iso9660)rÚÚ startswithr…)ÚcriteriaÚoformatÚtagÚno_cachervÚdevlistÚlabelr6r6r7Úfind_devs_with_freebsdXs  þ  r·c CsÊg}d}d}d}|r<| d¡r(| d¡}| d¡r<| d¡}tjgd¢dgd} | j ¡D]j} |sf|r€tjd| gddgd\}} |r’d ||vr’qZ|d kr¤d |vr¤qZ|d kr¶d |vr¶qZ| d | ¡qZ|S)Nr r«zTYPE=©Úsysctlú-nz hw.disknamesr©ZrcsZ mscdlabelrz label "%s"Úiso9660zISO filesystemÚvfatú/dev/)r°r…rr;r5rÉ) r±r²r³r´rvrµr¶Ú_typeZ mscdlabel_outr=Údevr(r6r6r7Úfind_devs_with_netbsdls*    rÁcCsˆtjgd¢dgd}g}|j ¡ d¡D]P}| d¡s8q(|dkrBq(| |dd…d¡| d ¡s(| |dd…d ¡q(d d „|DƒS) Nr¸rr»rJrCzfd0:rÙrÁÚcdÚicSsg|] }d|‘qS©r¾r6©rDrÃr6r6r7rH”rIz*find_devs_with_openbsd..)rr;Úrstripr5rqrÉr°)r±r²r³r´rvr=rµr r6r6r7Úfind_devs_with_openbsd†s  rÇcCs~tjgd¢dgd}dd„t|j ¡ddDƒ}|dkrHd d„|Dƒ}n(|d vr`d d„|Dƒ}n|rpt d |¡d d„|DƒS)N)r¹rºz kern.disksrr»cSs$g|]}| d¡s| d¡s|‘qS)rVZvn©r°rÅr6r6r7rH›sþz/find_devs_with_dragonflybsd..Trpr¯cSsg|]}| d¡r|‘qS©)rÂZacdrÈrÅr6r6r7rH¢rI)zLABEL=CONFIG-2r®cSsg|]}| d¡s|‘qSrÉrÈrÅr6r6r7rH¤rIzUnexpected criteria: %scSsg|] }d|‘qSrÄr6rÅr6r6r7rH§rI)rr½r;r5rRr„)r±r²r³r´rvr=rµr6r6r7Úfind_devs_with_dragonflybsd—sþ rÊc CsHtƒrt|||||ƒStƒr,t|||||ƒStƒrBt|||||ƒStƒrXt|||||ƒSdg}g}|rt| d|¡|r†| d|¡|r˜|  ddg¡|rª| d|¡|r¸| |¡||}zt j |ddgd \}} Wn<t j y} z | j t krd }n‚WYd } ~ n d } ~ 00g} | ¡D]} |  ¡} | r$|  | ¡q$| S) z– find devices matching given criteria (via blkid) criteria can be *one* of: TYPE= LABEL=