f ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZ ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZmZddlm Z m!Z!ddl"m#Z#ddlm$Z$m%Z%ddl&m'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4dd l5m6Z6dd l7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAmBZBdd lCmDZDmEZEe)rdd lFmGZGdaHe jeJZKe jd iZMdejzejzZPdZQdZRdZSe$dZTe$dZUdde4eVeWfdeVfdZXdde4eVeWfdeWfdZYdeWdeWfdZZdZ[GddZ\Gdde]Z^Gd d!e]Z_d"Z`dd#Zadd$Zbdd%Zcdd&Zddd'Zedd(de-fd)Zfd*Zgd+Zhd,Zidd.Zjd/Zkd0eVdelfd1Zmd2Znd-d-de jd-fd3Zpe$d4Zqe$d5Zre$d6Zse$d7Zte$d8Zue$d9Zvdd;Zwdd<Zxdd=Zydd>Zze$d?Z{d@Z|e$dAZ}ddBZ~ddCZdDZddEZddFe2e0delfdGZej@dHZej@dIZdJZdKZddMZddNZdelffdOZddPZdd(delfdQZdd(delfdRZddSZddTZdUZedVgdWZddXZddYZdefdZZd[Zd\Zd]Zd^Zd_Z dd`Z ddaZ ddbZ ddcZ dddZddeZdfZdd:dgdhe4eVe jBfdie1e+egdfdjedeWfdkZdd:dgdhe4eVe jBfdie1e+egdfdjedeVfdlZe$dmZdnZdefdoZddpZddqZddrZdsZdtZduZddveVdeVfdwZdxe j^deWfdyZdzZd{Zd|Zdd}Zelffd~ZdZddZej@dZdZ ddZdZdZddZdZdZdZe$dZdZdZ dd:ddededdfdZdZdZdeVdefdZdeVdefdZdeVdeVfdZdeVdeVfdZdeVde/eVfdZ dd-ddddZdZddZddZddZdZdZdZdZe$dZdZddZdZdZdZeKd:fdZdZdZdZdZddZeKd:fdZdeVdefdZe3dZ dde+defdefdZdZdde jjfdZddZdZddZdZdZdZdZddZdd„ZdÄZdĄZddńZddƄZe%GdDŽdedgdɢZddLd:dʜdeVdeVde1eVdedef dЄZdLdќdeVdeVdefd҄ZdddelfdՄZe de.de*dffdքZy)N) b64decode)deque namedtuple)contextmanagersuppress)ENOENT) lru_cachetotal_ordering)Path) TYPE_CHECKINGAnyCallableDequeDict GeneratorListMappingOptionalSequenceTypeVarUnion)parse) featuresimportermergersnetsafeyamlsettingssubp temp_utils type_utils url_helperversion) CFG_BUILTINPER_ONCE)Paths_z_-.())true1onyes)off0nofalsecttttjj j dddS)N.)tuplemapintosunamereleasesplit0/usr/lib/python3/dist-packages/cloudinit/util.pykernel_versionr=[s2 S"((*,,2237;< ==r;chtjddgd}|jjS)zReturn 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. dpkgz--print-architectureTcapture)rstdoutstrip)outs r<get_dpkg_architecturerE_s- ))V34d CC ::   r;cFddddd}i} tjddgd }|jjD]2}|jd \}}}||vs|j |||<4|j Dcgc] }||vs| }}t |r%tjd d j||Scc}w#tj$rA} tjd | td|j D}Yd} ~ |Sd} ~ wwxYw)Ncodename descriptionidr8)Codename DescriptionzDistributor IDRelease lsb_releasez--allTr@:z.Missing fields in lsb_release --all output: %s,z#Unable to get lsb_release --all: %sc3$K|]}|df yw) UNAVAILABLENr:).0vs r< zlsb_release..s>1Q &>s) rrB splitlines partitionrCvalueslenLOGwarningjoinProcessExecutionErrordict) fmapdatarDlinefnamer'valkmissingerrs r<rMrMjs$  D D?ii0$?JJ))+ 0D NN3/ME1c}$'IIKT%[! 0#kkm=q}1== w< KK@!  K>  % %? 93?> >> K ?s6AC *C  CC2C C D 6DD blobreturncJt|tr|S|j|SN)encoding) isinstancestrdecode)rfrjs r< decode_binaryrns!dC(4Ldkk8k.LLr;textcJt|tr|S|j|Sri)rkbytesencode)rorjs r< encode_textrss!dE*4N X 0NNr;r_ct|tstdt|z t |dS#t j $r|cYSwxYw)zbase64 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)validate)rkrq TypeErrortyperbinasciiError)r_s r<maybe_b64decoderzsM dE "6dCDD-- >> s 6A Ac|jd}|jdk(rOt|tr?|j }|r|j r |j }nd}|j |dS|S)NT)rmroutf-8surrogateescape) get_payloadget_content_maintyperkrq get_charset input_codecrm)part cte_payloadcharsetrjs r<fully_decoded_payloadrsy ""$"/K   "f,U2""$ w****HH!!(,=>> r;c eZdZddZdZdZy) SeLinuxGuardc tjd|_||_||_y#t$r d|_Y!wxYw)Nselinux)r import_moduler ImportErrorpath recursive)selfrrs r<__init__zSeLinuxGuard.__init__sA #11)>cR|jr|jjryyNTF)ris_selinux_enabledrs r< __enter__zSeLinuxGuard.__enter__s <    s+Read a yaml config with optional template, and convert to dictr)JinjaLoadErrorJinjaSyntaxParsingException NotJinjaErrorrender_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: %sdefault)!cloudinit.handlers.jinja_templaterrrrload_text_fileFileNotFoundErrorr6rexistsrYrrZrepr load_yaml)rarrrrr config_filers r< read_confr2s$U+ bggnn-?@ 8"K II1"  0 [" --I   +  KKF       KK "Q    s: A-!A>- A;:A;>CBC)C-!CCc$tt|SN)sorted uniq_merge)listss r<uniq_merge_sortedrhs *e$ %%r;cg}|D]T}t|tr1|jjd}|Dcgc]}|s| }}|j |Vt |Scc}w)NrO)rkrlrCr9extend uniq_list)r combined_lista_listas r<rrtskM% fc "\\^))#.F!'-A1a-F-V$ % ] ##.s A'A'ctjD]\}}|j||}g}|D]}|tvs |j ||D]}|j|d}|j }|Sr)FN_REPLACEMENTSitemsreplace FN_ALLOWEDappendrC)fnrcrSremovalss r<clean_filenamers%%'1 ZZ1 H  J  OOA  ZZ2  B Ir;Tc tjt|}tjt j ddd|5}|r"t|jcdddS|jcdddS#1swYyxYw#t$r#}|r|cYd}~Stt||d}~wwxYw)Nrbr) ioBytesIOrs contextlibclosinggzipGzipFilernreadrrrl)r_quietrmbufghrs r< decomp_gziprs 4jjT*+    dD!S A B !b$RWWY/ ! ! wwy  ! ! ! 4 K$SV,! 3 4sNA B B & B0B ? B BBB CB<!C'B<<Cc|sy|jdd}|dj}t|dk(r|dj}nd}|r|dk(s|jdk(rd}|r|dk(s|jdk(rd}||fS)NNNrNrrr2z-1none)r9rCrXr)ug_pair ug_partedugs r<extract_usergrouprs  c1%I! A 9~ aL     T QWWY&0  T QWWY&0  q6Mr;root_dircht}tjtjj |dD]q}tjj |s#tjj |dd}|j}|sX|jddk(sm|||<s|S)Nz*.pyrr1) r]globr6rr[isfilebasenamerCfind)rentriesramodnames r<get_modules_from_dirr%sfG277<<&9:%ww~~e$ ''""5)!B/--/ w||C(B.$GEN % Nr;ct|d5}|j||jdddy#1swYyxYw)Nw)openwriteflush)conpathrowfhs r<write_to_consoler-s7 gs s $ s "8Ac|rtjj||rUd}d}tjj |r t ||d}|r!|stjj||r1|ddk(r|j||ddy|j||yy#t$rId}tjj|d|r |jtj|YwxYw)Nz /dev/consoleFTzFailed to write to /dev/console r) sysstderrr)r6rrr-rrBlogloggingWARNING) roconsoler1r2 log_levelfallback_to_stdoutr+writing_to_console_worked console_errors r< multi_logr:s  $)! 77>>' " < $/,0) &? JJ  T " 8t  GGItCRy ) GGIt $  ) < A    M?"!56GGGOO];  C?c.dtjvS)NLinuxplatformsystemr:r;r<is_Linuxr@s hoo' ''r;cbdtjvrytjdk(ryy)NBSDT DragonFlyFr=r:r;r<is_BSDrDs) !!K' r;c"tddk(S)Nvariantfreebsd system_infor:r;r< is_FreeBSDrJ = #y 00r;c"tddk(S)NrF dragonflyrHr:r;r<is_DragonFlyBSDrNs = #{ 22r;c"tddk(S)NrFnetbsdrHr:r;r< is_NetBSDrQs = #x //r;c"tddk(S)NrFopenbsdrHr:r;r< is_OpenBSDrTrKr;Fc*||vr|St||Sr)ryobjkeyrs r<get_cfg_option_boolrY s $ $s) $$r;cR||vr|S||}t|ts t|}|Sr)rkrl)rWrXrrbs r<get_cfg_option_strr[s/ $ s)C c3 #h Jr;c0tt|||S)Nr)r5r[rVs r<get_cfg_option_intr]s !$W= >>r;cl|sd}tjj|siSt|}d}d|vrd}t j ||}|rc|j }d|dvr|d|d<|djjdd|d<|dd k(rd |d<|d|d |dd SiS) zReturn 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[^)]+)\) Virtuozzoz)(?P.+) release (?P[\d\.]+)namerGz linuxrzred hat enterpriseredhatr#)ID VERSION_IDVERSION_CODENAME) r6rrrrematch groupdictrrV) release_fileredhat_release redhat_regexrfgroups r<_parse_redhat_releaserls , 77>>, ' #L1N # n$C HH\> 2E ! %- ' %f E* f ++-77A!Df =0 0$E&M- * %j 1  Ir;cd}d}d}i}d}tjjdrtt d}|s d}t }|r|j dd}|j dd}d|vsd|vrtj}n|d k(s|d k(r|j d d}ni|d k(r|s|j d d}nO|j d d}|s;tjd|j dd}|r|jd}|dk(rd}ntr7tjj}tj}n>d} tj }d}|D]}|sd} |st$j'd|S|||fS#t"$rY7wxYw#d}|D]}|sd} |st$j'dwwxYw)NrF/etc/os-releaseTrbrcslessusealpinephoton PRETTY_NAME virtuozzordz[^ ]+ \((?P[^)]+)\)VERSIONrGrhelra)rrrrzPUnable to determine distribution, template expansion may have unexpected results)r6rrload_shell_contentrrlgetr>machinererfrgrDr?rr8distrrYrZ) distro_namedistro_versionflavor os_releaseos_release_rhelrfrzfoundentrys r<get_linux_distrorGsKN FJO ww~~'('7H(IJ *,  nnT2. # b9 [ Fk$9 %%'F H $ x(?^^M26F K '^^M26F^^$6;F4NN9b1"__.z:F & "K oo'--/ !))+ ==?DE E  <  00   E E  <s*!F!! F-*F0,F--F00 G;Gc|dj}d}|dk(r;|ddj}|dvr|}|S|dvrd}|S|d k(rd }|S|d vrd }|Sd}|S|d vr|}|S)Nr?unknownlinuxrzr) almalinuxrqarchcentos cloudlinuxdebian eurolinuxfedoramariner miraclelinux openeuler opencloudos openmandrivarrrvrockyrp tencentosrt)ubuntu linuxmintmintrrarv)opensusez opensuse-leapzopensuse-microoszopensuse-tumbleweedsle_hpcz sle-micrororp)windowsdarwinrGrPrSrM)r)infor?rF linux_dists r< _get_variantrs (^ ! ! #FG &\!_**,   *!G6 N5: :G2 N18 #G. N-  G NG N   Nr;c tjtjtjtjt tj t d}t||d<|S)N)r>r?r8pythonr7rzrF)r>r?r8python_versionrr7rr)rs r<rIrIsc%%'//###%))+hnn&' "  D#4(DO Kr;c||vr|S||gS||}t|tr|Dcgc]}|}}|St|ts t|}|gScc}w)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. )rkrrl)rWrXrrbrScvals r<get_cfg_option_listrsi $ Cy s)C#a c3 #h 5L  s Actt|tr|jd}|}|D]}||vr|cS||}|S)aReturn 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./)rkrlr9)rWkeyprcurtoks r<get_cfg_by_pathrsK$zz# C c>N#h Jr;c@t||\}}t||||fSr)get_output_cfgredirect_output)cfgmodeoutfmterrfmts r< fixup_outputrs(%c40VVFF# F r;cttjjdrtj dy|st j}|st j}d}|rtj d|||jdd\}}|dk(s|dk(rd }|dk(rd }t||}nG|d k(r4tj|d tj| } | j}ntd|z|r2tj |j#|j#||k(rJtj d||tj |j#|j#y|rtj d|||jdd\}}|dk(s|dk(rd }|dk(rd }t||}nG|d k(r4tj|d tj| } | j}ntd|z|r3tj |j#|j#yyy)N_CLOUD_INIT_SAVE_STDOUTz5Not redirecting output due to _CLOUD_INIT_SAVE_STDOUTctjd tjdj}tj |y#t $rYywxYw)aReconfigure 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) admN)r6umaskgrpgetgrnamgr_gidsetgidKeyError)group_ids r<set_subprocess_umask_and_gidz5redirect_output..set_subprocess_umask_and_gidsJ  ||E*11H IIh     sA AAzRedirecting %s to %s r>>>abwb|T)shellstdin preexec_fnz"Invalid type for output format: %sz!Invalid type for error format: %s)rr6environrxrYrr0rBr1r9r( subprocessPopenPIPErrvdup2fileno) rro_outo_errrrargowithnew_fpprocs r<rrsrzz~~789 IJ     & (%8ll3* s 3;$$,Es{#u%F S[## oo7 D ZZF@6IJ J  GGFMMOU\\^ 4 V  II,eV < GGFMMOU\\^ 4   (%8ll3* s 3;$$,Es{#u%F S[## oo7 D ZZF?&HI I  GGFMMOU\\^ 4 'r;sourcesc|rtt|}i}|D]W}|stj|}|stj}tj |}|j ||}Y|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, } )rreversedrdict_extract_mergersdefault_mergers constructmerge)rreverse merged_cfgrmergers_to_applymergers r< mergemanydictraszTx()J7 &;;C@ ##*#:#:#< &&'78Fj#6J7 r;c#Ktj} tj||tj|y#tj|wxYwwr)r6getcwdchdir)ndircurrs r<rrs< 99;D   sA!AA!AA!c#Ktj|} |tj|y#tj|wxYwwr)r6r)n_mskolds r<rrs3 ((5/C    sA 3A A  A c,dj||d|S)Nz{0:{fill}{align}{size}}^)fillalignsize)format)rormax_lens r<centerrs# $ + + 4s , r;cZtjd|tj|y)NzRecursively deleting %s)rYrshutilrmtreers r<del_dirrsII'. MM$r;c t|||\}}}||d<||d<||d<y#tj$r(}|jtjk(rYd}~yd}~wwxYw)N user-data vendor-data meta-dataTF) read_seededr"UrlErrorcode NOT_FOUND)rbaseexttimeoutmdudvdrs r<read_optional_seedrsj "4g6 R[ ][    66Z)) ) s #AAAAc&i}|sddg}n^tjj|jddtjj|j ddg}t |}|Dcgc]'}|stjj |s&|)}}d}|D]a}tjjtjj|dsAtjj|d}nd}|D]a}tjjtjj|dsAtjj|d}n|r|r ||d<||d<|S|r||d<|Scc}w) Nz/var/lib/cloud/data/sslz /var/lib/cloud/instance/data/sslr_sslzcert.pemzkey.pem cert_filekey_file)r6rr[ get_ipath_cur get_cpathrisdirr )paths ssl_detailsssl_cert_pathsdrrs r<fetch_ssl_detailsrs\K  % .  GGLL,,V4e < GGLL0% 8  /N!/JA1q9IaJNJI  77>>"'',,q*5 6 Q 3I H  77>>"'',,q)4 5ww||Ay1H X#, K "* J  #, K !Ks7F?FFc|}t|} tjdt||t j |}|tjd|}n1t ||s%td|dtj|d|}|S#tjttf$r}d}d}t|drt|dr t|d}n$t|drt|dr t|d}|r2|d j|jd z|j d z| z }n|d j| z }tj#|Yd}~|Sd}~wwxYw)NzKAttempting to load yaml from string of length %s with allowed root types %sz-loaded blob returned None, returning default.zYaml load allows z root types, but got  insteadzFailed loading yaml blob context_mark problem_markz5. Invalid format at line {line} column {col}: "{err}"r)r`colrez. {err})re)rnrYrrXrloadrkrvr!r YAMLError ValueErrorhasattrgetattrrr`columnrZ)rfrallowedloaded convertedrmsgmarks r<rrs` F  D!  6 I   MM$'   IIE FIIw/J// :< " M!    : 6( 1n %'!^*D1n-D Q 'GA~,F1n-D  GNNQDKK!OO C 9###* *C C M!sBBE'1B+E""E'cj|jddk\r@|jdd|z}|jdd|z}|jdd|z}nWtjr/|ddk7r't j |j dk(r|dz }|d|}|d|}|d|}tj||| }d} |jr tt|ji } tj||| } d} | jr | j} d} tj||| } | jr | j} ntjd  | | | fS#tj$r }tjd |Yd}~3d}~wwxYw) Nz%srrrrrrr)rretriesrzError in vendor-data responsez!Error in vendor-data response: %s)r"rr%NOCLOUD_SEED_URL_APPEND_FORWARD_SLASHrurlparsequeryr"read_file_or_urlokrrncontentsrYrr)rrrr" file_retriesud_urlvd_urlmd_urlmd_resprud_resprrvd_resprs r<rrs yy!dK#$56dMC$78dK#$56  9 9Bx35>>$#7#=#=#C !;4!=#6!;4))G Bzz| }W%5%56 C))G Bzz|    B 7-- GW  ::<!!B II5 6 B<   : 5q99:s/E??F2F--F2c nttj|d}|Dcgc]}|jds|}}|Dcgc]B}tjj tjj ||sA|D}}g}|D]?}tjj ||} |jt||At|Scc}wcc}w#t$rtjd|Yxt$r!}tjd||Yd}~d}~wwxYw)zRead configuration directory.Trz.cfgr1REDACTED config part %s, insufficient permissionsError accessing file %s: [%s]N)rr6listdirendswithrr r[rrPermissionErrorrYrZrr)confdrconfsfcfgsrrrs r< read_conf_dr;<s 2::e$d 3E 41F!3Q 4E 4 H1 UA0F!GQ HE H DBww||E2& B KK'9 B  / 5 I  KKCT  B KK7q A A Bs5C C AC% C%7C**D4 D4D//D4ct}i} t||}|j|d}d|vrU|d}|rut|ts$td|dtj|t|j}n'tjj|d r|d }|r=tjj|rt!||}|j#|t%|S#t$rtj d|Yt $r"}tj d||Yd}~d}~wwxYw) 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. rr2r3Nrconf_dz Config file z( contains 'conf_d' with non-string type z.d)rrrr6rYrZrrkrlrvr!rrCr6rr r; appendleftr)cfgfilerr:rrr7 confd_cfgs r<read_conf_with_confdrA\s"DC 4FG C E3H  eS) 3 3E :< E ((* '"~ &)2 u%:LM   "  9   ?  A 3Wa@@As C88EE!D>>Ec,tt|S)Ncmdline)rread_cc_from_cmdlinerCs r<read_conf_from_cmdlinerFs )': ;;r;c| t}d|}d}d}t|}t|}t|}g}|j|}|dk\r|j|||z}|dkr|}|jt j |||z|j jdd|j|||z}|dk\rdj|S)Nrz cc:end_ccrz\nr/) get_cmdlinerXr"rrunquotelstriprr[) rD tag_begintag_endbegin_lend_lclentokensbeginends r<rErEs-'mGIG)nG LE w, , (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. FrZrYr1rNT)rZ metadata_only)r])r[r9r" get_hostnamerYrX)rcloudr]r[rZrYs r<get_hostname_fqdnr`s"J }6{%c:tzz#q7IJ  Z!5!5c!:Q!>z?D:'738H%%&h S z?','9'9"/(:($* HdJ 77r;c"d} t|jD]^}|jd}|dk\r|d|}|j}|s1|j }t |dkrP||ddvsX|d}|S |S#t $rY|SwxYw)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#rr2r)rrUr"rCr9rXIOError)rYfilenamerZr`hashpostokss r<get_fqdn_from_hostsrhs D "8,779 DiinG!|Ag::?  ? ##D$/ay|A+++OOV\\2     OOV\\ *sBA8E F 0E5F0F #E21E25E>:F#F'&F'c.tj}|Sr)rn gethostname)rYs r<r^r^Gs!!#H Or;cf tj|dS#tj$rYywxYwNr)rn gethostbyaddrherror)ips r<rrLs3##B'** ==s 00cLttjd|zt|fS)z5determine if this url is resolvable (existing or ip).zResolving URL: )logfuncrfuncr)log_timerYrr)rws r<is_resolvable_urlrSs&   # V  r;c|ytjd||D](} t|rtjd||cS*y#t$rY7wxYw)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')rYrrr) candidatescands r<search_for_mirrorr]sj II5zB  & 6= '    s"A AAc2ttjjdryt tj 5}tj |jtjjdddy#1swYyxYw)z reopen stdin as /dev/null so even subprocesses or other os level things get /dev/null as input. if _CLOUD_INIT_SAVE_STDIN is set in environment to a non empty and true value then input will not be closed (useful for debugging). _CLOUD_INIT_SAVE_STDINN) rr6rrxr(devnullrrr0r)fps r< close_stdinrpsarzz~~678 bjj 1R  SYY--/0111s AB  Bcg}|s+tjdtjdzS|jdrI|jd}d|zd|zfDcgc]#}tjj |r|%}}|S|dk(rtjd}|S|dk(rtjd}|Scc}w)Nz/dev/msdosfs/*z/dev/iso9660/*LABEL=z /dev/msdosfs/z /dev/iso9660/ TYPE=vfat TYPE=iso9660)r startswithrKr6rr)criteriaoformattagno_cacherdevlistlabelps r<find_devs_with_freebsdr~sG yy)*TYY7G-HHH8$)&-/FG ww~~a     N [ )),- N ^ #)),- N s(Ccg}d}d}d}|rD|jdr|jd}|jdr|jd}tjgddg} | jj D]V} |s|rtjd| gddg\}} |rd |z|vr/|d k(rd |vr9|d k(rd |vrC|j d | zX|S)NrrzTYPE=sysctl-nz hw.disknamesrrcs mscdlabelrz label "%s"iso9660zISO filesystemvfat/dev/)rrKrrBr9r) rrrrrrr_type mscdlabel_outrDdevr's r<find_devs_with_netbsdrsG E EM   x (OOH-E   w 'OOG,E ))41# >Czz! & E#yy+s);!QH M1 lU*=@  I "2-"G  F?/=@ w}% & Nr;cvtjgddg}g}|jjjdD]Z}|j ds|dk(r|j |dddz|j d rD|j |ddd z\|Dcgc]}d |z c}Scc}w) NrrrrOrNzfd0:rrcdir)rrBrstripr9r5rr) rrrrrrDrrrs r<find_devs_with_openbsdrs ))41# >CG""$**3/-~~c"  F? uSbzC'(% NN5":+ ,-") )AGaK )) )s' B6ctjgddg}t|jjdDcgc]&}|j ds|j ds|(}}|dk(r"|Dcgc]}|j d s|}}n>|d vr"|Dcgc]}|j d r|}}n|rt j d ||Dcgc]}d |z c}Scc}wcc}wcc}wcc}w) N)rrz kern.disksrrTr1rvnr)racd)zLABEL=CONFIG-2rzUnexpected criteria: %sr)rrrBr9rrYr)rrrrrrDrrs r<find_devs_with_dragonflybsdrs ))2 !%Em)D1EE 4 4%Kall=.I1KK  +X6!( )AGaK ))FK *s$+C'8C,C,C15C1 C6ctrt|||||Strt|||||St rt |||||St rt|||||Sdg}g}|r|jd|z|r|jd|z|r|jddg|r|jd|z|r|j|||z} tj|ddg \}} g} |jD]&} | j} | s| j| (| S#tj$r!} | jtk(rd }nYd } ~ ld } ~ wwxYw) z find devices matching given criteria (via blkid) criteria can be *one* of: TYPE= LABEL=