܍~c` ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZddlmZm Z ddl!m"Z"m#Z#ddl$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+ddl,m-Z-dd l,m.Z/dd l,m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6dd l7m8Z8da9e/j:e;Zd ej?zej@zZAdZBdZCdZDe"ddZEe"ddZFddZGddZHdZIdZJdZKGddZLGddeMZNGddeMZOdZPdd ZQdd!ZRdd"ZSdd$ZTdd%ZUdd&d'e'fd(ZVd)ZWd*ZXd+ZYdd-ZZd.Z[d/e\d'e]fd0Z^d1Z_d,d,de/j`d,fd2Zae"d3Zbe"d4Zce"d5Zde"d6Zee"d7Zfe"d8Zgdd:Zhdd;Zidd<Zjdd=Zke"d>Zld?Zme"d@ZnddAZoddBZpdCZqddDZrdd'e]fdEZsejtdFZuejtdGZvdHZwdIZxddLZyddMZzde]ffdNZ{ddPZ|dd&d'e]fdQZ}dd&d'e]fdRZ~ddSZddTZdUZedVgdWZddXZddZZd[Zd\Zd]Zd^Zd_Zd`Z ddbZ ddcZ dddZ ddeZ ddfZddgZdhZdiZddjZe"dkZdlZddnZddoZddpZdqZdrZdsZddtZduZdvZdwZddyZe]ffdzZd{Zd|Zdd}Zejtd~ZdZ ddZdZdZddZdZdZdZe"dZdZdZ dd9ddeded'dfdZdZdZde\d'efdZde\d'efdZde\d'e\fdZde\d'e\fdZde\d'e(e\fdZ dd,ddZdZddZdZddZddZdZdZdZdZe"dZdZddZdZdZdZezlsb_release..ds===q}}1}}}r/z.Missing fields in lsb_release --all output: %s,z#Unable to get lsb_release --all: %sc3K|]}|dfV dS) UNAVAILABLENr.rEvs r0 zlsb_release..ms'>>1Q &>>>>>>r/) rr7 splitlines partitionr8valueslenLOGwarningjoinProcessExecutionErrordict) r6fmapr9linefnamervalmissingerrrGs @r0rBrBTs^$   D D?i0$vNNNJ))++ 0 0D NN3//ME1c}}$'IIKKT%[!====dkkmm=== w<<  KK@!!     %??? 93???>> >>>>>? KsC CD8(AD33D8utf-8cZt|tr|S||SN) isinstancestrdecode)blobencodings r0 decode_binaryrfrs+$ ;;x  r/cZt|tr|S||Sr`)rabytesencode)textres r0 encode_textrkys+$ ;;x  r/cpt|} |dS#t$r|cYSwxYwNr^)rrcUnicodeDecodeError)sourcedecodeds r0b64drqsLG~~g&&& s & 55ct|ts|d}t|dSrm)rarhrirrc)ros r0b64erssC fe $ $(w'' V   # #G , ,,r/c|d}|dkrRt|tr=|}|r|jr|j}nd}||dS|S)NTrcrjr^surrogateescape) get_payloadget_content_maintyperarh get_charset input_codecrc)part cte_payloadcharsetres r0fully_decoded_payloadr~s ""$"//K   ""f,,U22,""$$  w* *HHH!!(,=>>> r/c"eZdZddZdZdZdS) SeLinuxGuardFc tjd|_n#t$r d|_YnwxYw||_||_dS)Nselinux)r import_moduler ImportErrorpath recursive)selfrrs r0__init__zSeLinuxGuard.__init__sS #1)<           s*.?B.. B<;B<!!D D;"D66D;NF)__name__ __module__ __qualname__rrrr.r/r0rrsF#### r/rceZdZdS)MountFailedErrorNrrrr.r/r0rrDr/rceZdZdS)DecompressionErrorNrr.r/r0rrrr/rcltj}|dkrl ||i|tjddS#t$r@t t dt j|tjdYdSwxYwt d|t j|dS)Nrz&Failed forking and calling callback %sz(Forked child %s who will run callback %s) r*fork_exit ExceptionlogexcrSrobj_namer)child_cbargskwargsfids r0fork_cbrs '))C axx  Hd %f % % % HQKKKKK    8#H--    HQKKKKKK   6    ) )     s9ABBct|tr|duSt}|rt||z}t ||vrdSdSr)rabool TRUE_STRINGSlistrblowerr8r[addons check_sets r0is_truersl#d{I -OOf,  3xx~~9,,t 5r/ct|tr|duSt}|rt||z}t ||vrdSdSNFT)rar FALSE_STRINGSrrbrr8rs r0is_falsersl#e|I -OOf,  3xx~~9,,t 5r/cX|sdSt|tr|St||SNF)rarr)r[rs r0translate_boolrs8 u# 3  r/ ctjstjtjzdfdt d|DS)Nc:g|]}Sr.)choice)rE_xr select_froms r0rHzrand_str..s%EEEbAHH[))EEEr/r)random SystemRandomstring ascii_lettersdigitsrUrange)strlenrrs `@r0rand_strrs]A ;*V]: 77EEEEEE!V4D4DEEE F FFr/cH|sd} tddz|z}||vrn|S)NrT)rr)r) dictionarypostfixnewkeys r0 rand_dict_keyrsH ###c)G3  # #  Mr/instance_data_filereturnc ddlm}m}m} t |}n*#t $r}|jtkricYd}~Sd}~wwxYw|rtj |rm ||||}t d||nB#|$rYn;|$r4}t d||t|Yd}~nd}~wwxYw|iSt|iS)z>Read a yaml config with optional template, and convert to dictr)JinjaLoadError NotJinjaErrorrender_jinja_payload_from_fileNz?Applied instance data in '%s' to configuration loaded from '%s'z:Could not apply Jinja template '%s' to '%s'. Exception: %sdefault)!cloudinit.handlers.jinja_templaterrr load_fileIOErrorerrnorr*rexistsrSrrTrepr load_yaml)rZrrrr config_filers r0 read_confr"s &&  7f  IIIIII   bgnn-?@@ 88"K II1"          D    KK "Q           [" - - --s9 A>A>A()BCC*C  Cc.tt|Sr`)sorted uniq_merge)listss r0uniq_merge_sortedrTs *e$ % %%r/cg}|D]_}t|tr3|d}d|D}||`t |S)NrIcg|]}||Sr.r.)rEas r0rHzuniq_merge..fs---A1-a---r/)rarbr8r-extend uniq_list)r combined_lista_lists r0rr`s{M%% fc " " .\\^^))#..F-----FV$$$$ ] # ##r/ctD]\}}|||}g}|D] }|tvr||!|D]}||d}|}|S)Nr)FN_REPLACEMENTSitemsreplace FN_ALLOWEDappendr8)fnrFrMremovalss r0clean_filenamerks!''))A ZZ1  H  J   OOA     ZZ2   B Ir/Tc tjt|}tjt jddd|5}|r-t|cdddS|cdddS#1swxYwYdS#t$r+}|r|cYd}~Stt||d}~wwxYw)Nrbr) ioBytesIOrk contextlibclosinggzipGzipFilerfreadrrrb)rGquietrcbufghrs r0 decomp_gziprxs> 4jT**++   dD!S A A B B !b !$RWWYY// ! ! ! ! ! ! ! ! wwyy  ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 444  4KKKKKK$SVV,,! 3 4sTA B) #B/ B)<B B)B  B)#B $B)) C3C6C<CCcZ|sdS|dd}|d}t|dkr|d}nd}|r|dks|dkrd}|r|dks|dkrd}||fS)NNNrCrrr&z-1none)r-r8rRr)ug_pair ug_partedugs r0extract_usergrouprs | c1%%I! A 9~~ aL     T QWWYY&00  T QWWYY&00  q6Mr/root_dirct}tjtj|dD]}}tj|s"tj|dd}|}|r|ddkr|||<~|S)Nz*.pyrr%) rWglobr*rrUisfilebasenamer8find)rentriesrZmodnames r0get_modules_from_dirr!sffG27<<&99::%%w~~e$$  '""5))!B$/--//  %w||C((B..$GEN Nr/ct|d5}|||ddddS#1swxYwYdS)Nw)openwriteflush)conpathrjwfhs r0write_to_consoler)s gs  s $ s*AA A c8|rtj||rd}d}tj|rj t ||d}nV#t$rId}tj|d|r | tj |YnwxYw|r!|stj||rD|ddkr | ||dddS| ||dSdS)Nz /dev/consoleFTzFailed to write to /dev/console r) sysstderrr%r*rrr)rr7rloggingWARNING) rjconsoler-r log_levelfallback_to_stdoutr'writing_to_console_worked console_errors r0 multi_logr5sO # $)! 7>>' " " < < $///,0)) < < < A    M!5!5!5666<GGGO];;;  <  #&? # J  T " " " % 8t   GGItCRCy ) ) ) ) ) GGIt $ $ $ $ $ %%sAAB.-B.c,dtjvS)NLinuxplatformsystemr.r/r0is_Linuxr;s ho'' ''r/cfdtjvrdStjdkrdSdS)NBSDT DragonFlyFr8r.r/r0is_BSDr?s7 !!!!tK''t 5r/c2tddkS)Nvariantfreebsd system_infor.r/r0 is_FreeBSDrE == #y 00r/c2tddkS)NrA dragonflyrCr.r/r0is_DragonFlyBSDrIs == #{ 22r/c2tddkS)NrAnetbsdrCr.r/r0 is_NetBSDrLs == #x //r/c2tddkS)NrAopenbsdrCr.r/r0 is_OpenBSDrOrFr/Fc8||vr|St||Sr`)ryobjkeyrs r0get_cfg_option_boolrTs" $ $s) $ $$r/cj||vr|S||}t|tst|}|Sr`)rarb)rRrSrr[s r0get_cfg_option_strrVs; $ s)C c3  #hh Jr/c@tt|||S)Nr)r)rVrQs r0get_cfg_option_intrXs !$W=== > >>r/c|sd}tj|siSt|}d}d|vrd}t j||}|r|}d|dvr |d|d<|ddd|d<|dd krd |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\.]+)namer<z linuxrzred hat enterpriseredhatr)ID VERSION_IDVERSION_CODENAME) r*rrrrematch groupdictrrP) release_fileredhat_release redhat_regexragroups r0_parse_redhat_releaserg s -, 7>>, ' ' |,,N # n$$C H\> 2 2E  !! %- ' ' %f E* f ++--77AA!Df =0 0 0$E&M- * %j 1   Ir/cd}d}d}i}d}tjdrtt d}|sd}t }|r|dd}|dd}d|vsd|vrtj}n|d kr|d d}n||d kr|s|d d}n]|d d}|sEtj d |dd}|r| d}|dkrd}ntr9tj }tj}n~d} tj}n#t"$rYnwxYwd}|D]}|rd}|st$dn-#d}|D]}|rd}|st$dwwxYw|S|||fS)NrF/etc/os-releaseTr]r^slessusephoton PRETTY_NAME virtuozzor_z[^ ]+ \((?P[^)]+)\)VERSIONr<rhelr\)rrrrzPUnable to determine distribution, template expansion may have unexpected results)r*rrload_shell_contentrrggetr9machiner`rarbr?r:rr,distrrSrT) distro_namedistro_versionflavor os_releaseos_release_rhelrartfoundentrys r0get_linux_distror|3sKN FJO w~~'((F' 2C(D(DEE -*,, - nnT2.. # b99 [ Fk$9$9 %''FF H $ $^^M266FF K ' ' '^^M266FF^^$6;;F ;4NN9b11;"__..z:F & "K o''--// !)++ =??DD    D E  E  < E  E  <    00s*F"!G" F/,G.F//G*Hc|d}d}|dkrA|dd}|dvr|}n |dvrd}n|d krd }n|d vrd }n d}n|d vr|}|S)Nr:unknownlinuxrtr) almalinuxalpinearchcentos cloudlinuxdebian eurolinuxfedoramariner miraclelinux openeuler openmandrivarlrprockyrkrn)ubuntu linuxmintmintrr\rp)opensusezopensuse-tumbleweedz opensuse-leaprjsle_hpcrk)windowsdarwinrBrKrNrH)r)infor:rA linux_dists r0 _get_variantrqs (^ ! ! # #FG &\!_**,,    &!GG : : :GG 8 # #GG    GGGG    Nr/ctjtjtjtjt tjt d}t||d<|S)N)r9r:r,pythonr+rtrA)r9r:r,python_versionrr+r|r)rs r0rDrDss%''/###%%)++hn&&'' ""   D#4((DO Kr/c||vr|S||gS||}t|trd|D}|St|tst|}|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. Ncg|]}|Sr.r.rLs r0rHz'get_cfg_option_list..sar/)rarrb)rRrSrr[cvals r0get_cfg_option_listrsx $ Cy s)C#3 c3  #hh 5Lr/ct|tr|d}|}|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./)rarbr-)rRkeyprcurtoks r0get_cfg_by_pathrs[$zz# C c>>NNN#h Jr/cPt||\}}t||||fSr`)get_output_cfgredirect_output)cfgmodeoutfmterrfmts r0 fixup_outputrs1%c400VVFF### F r/cttjdrtddS|s t j}|s t j}d}|r6td||| dd\}}|dks|dkrd }|dkrd }t||}nB|d kr*tj |d tj | } | j}ntd|z|r9tj||||krWtd||tj||dS|rtd||| dd\}}|dks|dkrd }|dkrd }t||}nB|d kr*tj |d tj | } | j}ntd|z|r=tj||dSdSdS)N_CLOUD_INIT_SAVE_STDOUTz5Not redirecting output due to _CLOUD_INIT_SAVE_STDOUTctjd tjdj}tj|dS#t $rYdSwxYw)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)r*umaskgrpgetgrnamgr_gidsetgidKeyError)group_ids r0set_subprocess_umask_and_gidz5redirect_output..set_subprocess_umask_and_gidsd  |E**1H Ih          DD sA AAzRedirecting %s to %s r>>>abwb|T)shellstdin preexec_fnz"Invalid type for output format: %sz!Invalid type for error format: %s)rr*environrrrSrr,r7r-r-r$ subprocessPopenPIPEr TypeErrordup2fileno) rro_outo_errrrargowithnew_fpprocs r0rrsrz~~78899 IJJJ       & (%888ll3** s 3;;$$,,Es{{#u%%FF S[[# o7 D ZFF@6IJJ J  5 GFMMOOU\\^^ 4 4 4 V   II,eV < < < GFMMOOU\\^^ 4 4 4 F 5 (%888ll3** s 3;;$$,,Es{{#u%%FF S[[# o7 D ZFF?&HII I  5 GFMMOOU\\^^ 4 4 4 4 4)55& 5 5r/c|rt|}i}|D]W}|rStj|}|stj}tj|}|||}X|Sr`)reversedrdict_extract_mergersdefault_mergers constructmerge)srcsreverse merged_cfgrmergers_to_applymergers r0 mergemanydictrJs~~J77  7&;C@@ # =#*#:#<#< &'788Fj#66J r/c#Ktj} tj||Vtj|dS#tj|wxYwr`)r*getcwdchdir)ndircurrs r0rrYsO 9;;D   s AAc#Ktj|} |Vtj|dS#tj|wxYwr`)r*r)n_mskolds r0rrcsD (5//C    s 2Ac4d||d|S)Nz{0:{fill}{align}{size}}^)fillalignsize)format)rjrmax_lens r0centerrls( $ + + 4s ,  r/cdtd|tj|dS)NzRecursively deleting %s)rSrshutilrmtreers r0del_dirrrs-II'... M$r/rc t|||\}}}||d<||d<||d<dS#tj$r!}|jtjkrYd}~dSd}~wwxYw)N user-data vendor-data meta-dataTF) read_seededrUrlErrorcode NOT_FOUND)rbaseexttimeoutmdudvdrs r0read_optional_seedr{s "4g66 R[ ][t   6Z) ) )55555 s$(AAAAci}|sddg}nftj|ddtj|ddg}t |}d|D}d}|D]a}tjtj|dr"tj|d}nbd}|D]a}tjtj|dr"tj|d}nb|r |r ||d<||d <n|r||d<|S) Nz/var/lib/cloud/data/sslz /var/lib/cloud/instance/data/sslrGsslcTg|]%}|tj|#|&Sr.)r*risdir)rEds r0rHz%fetch_ssl_details..s0JJJA1Jq9I9IJaJJJr/zcert.pemzkey.pem cert_filekey_file)r*rrU get_ipath_cur get_cpathrr)paths ssl_detailsssl_cert_pathsrrrs r0fetch_ssl_detailsr s}K   % .  GLL,,V44e < < GLL00% 8 8  //NJJJJJNI  7>>"',,q*55 6 6  Q 33I E H  7>>"',,q)44 5 5 w||Ay11H E -X-#, K "* J -#, K r/c6|}t|} tdt||t j|}|td|}n8t ||s(td|dtj |d|}n#tj ttf$r}d}d}t|dr!t|drt|d}n0t|dr t|drt|d}|r,|d |jd z|jd z| z }n|d | z }t|Yd}~nd}~wwxYw|S)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)rYcolr]z. {err})r])rfrSrrRrloadrarrr YAMLError ValueErrorhasattrgetattrrrYcolumnrT)rdrallowedloaded convertedrmsgmarks r0rrs F   D!  6 II     M$''   IIE F F FIIIw// )77J/ ::::<    : 6( 1n % % .'!^*D*D .1n--DD Q ' ' .GA~,F,F .1n--D  + GNNQDK!OO CC 9###** *C C MsBB**FCFF c|ddkr|d|zz}|d|zz}|d|zz}n|d|}|d|}|d|}tj|||}d} |r#t t |ji} tj|||} d} | r| j} d} tj|||} | r| j} nRtdn7#tj $r%}td |Yd}~nd}~wwxYw| | | fS) Nz%srrrr)rretriesrzError in vendor-data responsez!Error in vendor-data response: %s) rrread_file_or_urlokrrfcontentsrSrr)rrrr file_retriesud_urlvd_urlmd_urlmd_resprud_resprrvd_resprs r0rrs yy!s*+,-s*+!T;;4!T==##6!T;;4)G Bzz||D }W%566 C C C)G Bzz||   B 7- GW    ::<< 7!BB II5 6 6 6 6  ::: 5q99999999: B<sD E/EEc ttjd}d|D}fd|D}g}|D]} |t tj||F#t$r6}|jtkrt d|Yd}~d}~wwxYwt|S)zRead configuration directory.Trc<g|]}|d|S)z.cfg)endswithrEfs r0rHzread_conf_d..s) 4 4 41F!3!3 4Q 4 4 4r/cg|]A}tjtj|?|BSr.)r*rrrU)rEr/confds r0rHzread_conf_d..s< H H H1 UA0F0F!G!G HQ H H Hr/rz,REDACTED config part %s/%s for non-root userN) rr*listdirrrrrUrrrrSrTr)r1rconfscfgsrrs` r0 read_conf_dr5s 2:e$$d 3 3 3E 5 4 4 4 4E I H H H H H HE D    KKGLL++'9        w&   BE2    sAB  C ,CC ct}i} t||}||nB#t$r5}|jt krt d|Yd}~nd}~wwxYwd}d|vrh|d}|r]t|ts'td|dtj |t| }n'tj|dr|d}|rEtj|r&t#||}||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. rz)REDACTED config part %s for non-root userNrconf_dz Config file z( contains 'conf_d' with non-string type z.d)rrrrrrrSrTrarbrrrr8r*rrr5 appendleftr)cfgfilerr4rrr1 confd_cfgs r0read_conf_with_confdr;sDC4FGGG C NNN 7f   KKCW M M MN E3H   +eS)) +iww 3E : : :< E ((** '~~~ & & #u%%#:LMMM   """   s9 A8+A33A8c<tt|S)Ncmdline)rread_cc_from_cmdliner=s r0read_conf_from_cmdliner@Cs )'::: ; ;;r/c|t}d}d}t|}t|}t|}g}||}|dkr||||z}|dkr|}|t j|||z|dd||||z}|dkd|S)Nzcc:end_ccrz\nr+) get_cmdlinerRrrrunquotelstriprrU) r> tag_begintag_endbegin_lend_lclentokensbeginends r0r?r?Hs --IG)nnG LLE 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. FrTrSr%rNT)rT metadata_only)rW)rVr-r get_hostnamerSrR)rcloudrWrUrTrSs r0get_hostname_fqdnrZxs"J }}6{%c:tzz#q7IJJ   Z!5!5c!:!:Q!>!>z?D:'73'78HH%%& S  z?','9'9"/(:(($* HdJ 7 77r/ /etc/hostscjd} t|D]|}|d}|dkr |d|}|}|s>|}t |dkrf||ddvr |d}n}n#t $rYnwxYw|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#rr&r)rrOrr8r-rRr)rSfilenamerTrYhashpostokss r0get_fqdn_from_hostsrbs D h''2244  DiinnG!||AgI::<BB<;B<2DD43D4c,tj}|Sr`)ri gethostname)rSs r0rXrXs!##H Or/cd tj|dS#tj$rYdSwxYwNr)ri gethostbyaddrherror)ips r0rrsA#B''** =tts //c|ttjd|ztt j|jfS)z5determine if this url is resolvable (existing or ip).zResolving URL: )logfuncrfuncr)log_timerSrr{rurlparserS)urls r0is_resolvable_urlrs<   # nS!!* ,    r/c|dStd||D]A} t|rtd||cS2#t$rY>wxYwdS)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')rSrrr) candidatescands r0search_for_mirrorrs tII5zBBB  &&  6===      D  4s+A A! A!cLttjdrdSt tj5}tj|tj ddddS#1swxYwYdS)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) rr*rrrr$devnullrrr,r)fps r0 close_stdinr#srz~~67788 bj  1R  SY--//000111111111111111111sABB BdevicecHg}|s)tjdtjdzS|dr*|d}dd|zd|zfD}n5|dkrtjd}n|dkrtjd}|S) Nz/dev/msdosfs/*z/dev/iso9660/*LABEL=cPg|]#}tj|!|$Sr.r*rr)rEps r0rHz*find_devs_with_freebsd..9s<   w~~a      r/z /dev/msdosfs/z /dev/iso9660/ TYPE=vfat TYPE=iso9660)r startswithrE)criteriaoformattagno_cacherdevlistlabels r0find_devs_with_freebsdr1sG Iy)**TY7G-H-HHH8$$ .))  %-/FG    [ ),-- ^ # #),-- Nr/cg}d}d}|rT|dr|d}|dr|d}tjgddg}|jD][} |s|rtjd| gddg\} } |rd|z| vr-|d krd | vr8|d krd | vrC|d | z\|S) NrzTYPE=sysctl-nz hw.disknamesrrcs mscdlabelrz label "%s"iso9660zISO filesystemvfat/dev/)rrErr7r-r) rrrrrrr_typer9dev mscdlabel_outrs r0find_devs_with_netbsdrEs>G E E-   x ( ( .OOH--E   w ' ' -OOG,,E )4441# > > >Cz!! & &  IE I#y+s);!QHHH M1  ,.=@@  I  "2-"G"G  F??/=@@ w}%%%% Nr/ctjgddg}g}|jdD]t}|ds|dkr||dddz|d s ||ddd zud |DS) NrrrrIrCzfd0:rrcdicg|]}d|zSrr.rErs r0rHz*find_devs_with_openbsd..l ) ) )AGaK ) ) )r/)rr7rstripr-r-rr)rrrrrr9rr{s r0find_devs_with_openbsdr^s )4441# > > >CG""$$**3//--~~c""   F?? uSbSzC'(((%% - NN5":+ , , , ) ) ) ) ))r/c2tjgddg}dt|jdD}|dkr d|D}n.|d vr d |D}n|rtd |d |DS) N)rrz kern.disksrrcfg|].}|d|d,|/S)rvnrrs r0rHz/find_devs_with_dragonflybsd..ssP ||D!!+,,,t*<*< r/Tr+rcfg|].}|ds|d,|/Sracdrrs r0rHz/find_devs_with_dragonflybsd..zsM   !,,t"4"4 89 U8K8K    r/)zLABEL=CONFIG-2rcfg|].}|d|d,|/Srrrs r0rHz/find_devs_with_dragonflybsd..~sP   LL&& +,,,u*=*=    r/zUnexpected criteria: %scg|]}d|zSrr.rs r0rHz/find_devs_with_dragonflybsd..rr/)rrr7r-rSr)rrrrrr9rs r0find_devs_with_dragonflybsdros )222 < < !!      4 4 4      7 +X666 ) ) ) ) ))r/c@trt|||||Strt|||||St rt |||||St rt|||||Sdg}g}|r|d|z|r|d|z|r| ddg|r|d|z|r||||z} tj |ddg \}} n0#tj $r} | j tkrd }nYd } ~ nd } ~ wwxYwg} |D]-} | } | r| | .| S) z find devices matching given criteria (via blkid) criteria can be *one* of: TYPE= LABEL=