f2^dZddlZddlZddlZddlZddlmZddlmZm Z m Z m Z eje ZGdde jZGddeZdd Zd Zd Zdd Zd ZdZdZdZdZGddeZee j:ffee j:e j<fffZdZ dZ!y)zZCloud-Init DataSource for OVF This module provides a cloud-init datasource for OVF data. N)minidom)safeyamlsourcessubputilcDeZdZdZdZdZdZdZdZdZ e dZ y ) DataSourceOVFOVFctjj||||d|_tj j |jd|_d|_i|_ d|_ d|_ y)Novf)/zfile://) r DataSource__init__seedospathjoinseed_dir environmentcfgsupported_seed_starts_network_configselfsys_cfgdistropathss A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOVF.pyrzDataSourceOVF.__init__s\##D'65A  U^^U; %5"#cdtjj|}|d|jdS)Nz [seed=])rr__str__r)rroots rr"zDataSourceOVF.__str__'s'!!))$/!%tyy11rcg}i}d}d}ddi}t|jj\}}|r\tjj |jj|}t |\}}} ||_|j|nddtfdtfg} d} | D]\} } | }|sn|r;t |d\}}} ||_d|vr|dr |d|_ |j| t|dk(ry d |vr|d r|d } d }|jD]}| j|s|}n|stj!d | |y t#j$| d \}}}tj!d | t#j&||g}|j| t#j&||g}dj ||_||_||_||_ |_y)N instance-idz iid-dsovfzcom.vmware.guestInfoisoTnetwork-configrFseedfromz Seed from %s not supported by %s)timeoutzUsing seeded cache data from %s,) get_ovf_envrrrrrread_ovf_environmentrappendtransport_vmware_guestinfotransport_iso9660rlenr startswithLOGdebugr read_seeded mergemanydictrmetadata userdata_rawvendordata_rawr)rfoundmdudvddefaultsseedfilecontentsrrnpname transfuncr) seedfoundprotomd_seeds r _get_datazDataSourceOVF._get_data+s     ;  +4::+>+>?8 77<< 3 3X>D0:MRS'D  LL ()CD)*BD#% i$;  4Xt D R#+ #r)b1A.B+-.>+?D( T" u:?  :*~HI33 &&u- %I  >' " H..w7x(( H  H C!=wG Hs A&&$B  B c|syt|tstd|ztjj |}|j dr|jdd}|j dr|jdd}n|jddkDry|syd}tjjd|}tj|}|j|d uS) zTest if devname matches known list of devices which may contain iso9660 filesystems. Be helpful in accepting either knames (with no leading /dev/) or full path names, but do not allow paths outside of /dev/, like /dev/foo/bar/xxx. Fz Unexpected input for devname: %sz/dev/r rz^(sr[0-9]+|hd[a-z]|xvd.*)CLOUD_INIT_CDROM_DEV_REGEXN)rMstr ValueErrorrrnormpathr2 partitionsplitcountenvironrjrecompilematch)devname default_regex devname_regexcdmatchs rmaybe_cdrom_devicers   %;gEFFggw'G'"##G,R0#--$R( s a  1MJJNN#?OMjj'G == ! --rctj}|jD]9\}}|d}|dk7r|rt|s|d}t |\}}|dus7|cS|rd}nd}tj |rd|zndDcgc]}t|r|} }| D]*} tj |t|\}}|dus(|cSycc}w#tj$rtjd|Y^wxYw)Nfstypeiso9660 mountpointFzTYPE=%s)mtypez%s not mountable as iso9660) rmountsrerr,find_devs_withmount_cbMountFailedErrorr3r4) require_isordevinformp_fnamer@rdevss rr0r0s% [[]F\\^  Th Y ; !#&  , (_ 5 O  &&Ey5'8tL   c "  D   !%sKu!M VX 5 O  $$  II3S 9  sC "C)C=<C=cD||g}tj|\}}|||fSrRrrpctoolargcmdstdoutstderrs rexec_vmware_rpctoolrs* C.Cyy~VV   rcF|d|g}tj|\}}|||fS)Nz--cmdrrs r exec_vmtoolsdrs- GS !Cyy~VV   rcd\}}tjd}tjd}|r|t}}tj d||r |s|t }}tj d||stj dyd} |||S#tj $r}|r%||k(r tjtd|Yd}~y|stjd Yd}~y tjd ||t cYd}~S#tj $r%}tjtd|Yd}~nd}~wwxYwYd}~yd}~wwxYw) N)NNvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredctjd| ||d\}}}|r|Stjd|y#tj$r7}|j dk7r!tj d||j |d}~wwxYw)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdoutz%s exited with code %d)r3rr4rProcessExecutionError exit_codewarning)r rpctool_fnrr_errors rquery_guestinfoz3transport_vmware_guestinfo..query_guestinfo+s 17; '1LMNC II93 ?)) !# 4guOK sAAB 2BB z+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd) rwhichrr3r4rrrrvr)rrrvmware_rpctoolrrs rr/r/s;$GZzz*%HZZ 01N,.A 1>B"*MZG +X6  )* w 33  % % 8+ KKBE  HH; <  HH+ ,"8]; ;))  KKBE     5sHBE*"EE.!DEE (EEE  EEcg}|js|S|jD]}||s |j||SrR) hasChildNodes childNodesr.)node filter_funcretchilds r find_childrYsF C      u  JJu  Jrctj|}|jjdk7r t d|jj s t dd}t |jd}t|dk(r t di}t |dd}|D]S}|jj|d j}|jj|d j}|||<U|S) N EnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c |jdk(S)NPropertySection localNamens rz get_properties..psq{{6G'GrrzNo 'PropertySection'sc |jdk(S)NPropertyrrs rrz get_properties..xsAKK:$=rkeyvalue) r parseStringdocumentElementrXmlErrorrrr1 attributesgetNamedItemNSr) r@domenvNsURI propSectionsrm propElemselemrrrs rrdrdcs   h 'C $$ 5,--    , , .'((:H GL <A.// EQ=Ioo,,Xu=CCoo,,Xw?EEc  Lrc eZdZy)rN)rVrWrXr[rrrrsrrc6tj|tSrR)rlist_from_depends datasources)dependss rget_datasource_listrs  $ $Wk ::rc4|siStj|S)z The meta data could be JSON or YAML. Since YAML is a strict superset of JSON, we will unmarshal the data as YAML. If data is None then a new dictionary is returned. )rload)datas rriris  == r)F)T)"__doc__rfloggingrrxml.domr cloudinitrrrr getLoggerrVr3rr r]r-r,rr0rrr/rrdrkrDEP_FILESYSTEM DEP_NETWORKrrrir[rrrs  33g!f$G&&f$R=}=> $.R#L! ! BJ@ y W++-...0C0CDE ;r