o x[hO3@sdZddlZddlZddlZddlZddlmZddlZddlm Z m Z m Z e e ZGddde jZGdddeZd#d d Zd d ZddZd$ddZddZddZddZddZddZGdddeZee jffee je jfffZdd Z d!d"Z!dS)%zZCloud-Init DataSource for OVF This module provides a cloud-init datasource for OVF data. N)minidom)sourcessubputilc@sLeZdZdZddZddZddZdd Zd d Zd d Z e ddZ dS) DataSourceOVFOVFcCsFtj||||d|_tj|jd|_d|_i|_ d|_ d|_ dS)Novf)/zfile://) r DataSource__init__seedospathjoinseed_dir environmentcfgsupported_seed_starts_network_configselfsys_cfgdistropathsrA/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOVF.pyr s zDataSourceOVF.__init__cCstj|}d||jfS)Nz %s [seed=%s])rr __str__r )rrootrrrr)s zDataSourceOVF.__str__cCsg}i}d}d}ddi}t|jj\}}|r/tj|jj|}t|\}}} ||_||n7dt fdt fg} d} | D] \} } | }|rFnq;|rft|d\}}} ||_d|vra|dra|d|_ || |sjdSd |vr|d r|d } d}|j D] }| |r|}nq{|std | |dStj| dd \}}}}td | t||g}|| t||g}d ||_||_||_||_| |_dS)N instance-idz iid-dsovfzcom.vmware.guestInfoisoTnetwork-configFseedfromz Seed from %s not supported by %s)timeoutzUsing seeded cache data from %s,) get_ovf_envrrr rrread_ovf_environmentrappendtransport_vmware_guestinfotransport_iso9660rr startswithLOGdebugr read_seeded mergemanydictr metadata userdata_rawvendordata_rawr)rfoundmdudvddefaultsseedfilecontentsr rnpname transfuncr" seedfoundprotomd_seed_rrr _get_data-sf         zDataSourceOVF._get_datacCs d|jS)Nzovf (%s))r rrrr_get_subplatformos zDataSourceOVF._get_subplatformcCs,d|jvrgS|jd}t|tr|S|gS)N public-keys)r/ isinstancelist)rpksrrrget_public_ssh_keysrs   z!DataSourceOVF.get_public_ssh_keyscC|jSN)rrArrrget_config_obj~szDataSourceOVF.get_config_objcCrHrI)rrArrrnetwork_configszDataSourceOVF.network_configN) __name__ __module__ __qualname__dsnamer rr@rBrGrJpropertyrKrrrrrs B rc@seZdZddZdS)DataSourceOVFNetcCs,t||||tj|jd|_d|_dS)Nzovf-net)zhttp://zhttps://)rr r rrrrrrrrr s zDataSourceOVFNet.__init__N)rLrMrNr rrrrrQs rQFc Cst|}i}i}d}dg}gd}dg}|D]^\} } | dkr"d} | |vr+| || <q| |vr4| || <q| |vr[|r[zt| } t| d|| <WqtyZt dYqw| dkrvz t| }Wqtyu| }Yqwq|||fS) Npassword)r"local-hostnamerCrr!hostnamerSnetworkz%Ignore network-config in wrong formatz user-data) get_propertiesitemsbase64 b64decodeencodesafeload_yaml_or_dictget Exceptionr+r,) r8 read_networkpropsr3rr4 cfg_propsmd_props network_propspropvalrKrrrr&s:       r&c Csfd}|D],}tj||}tj|r0z t|}||fWSty/ttd|YqwqdS)N)z ovf-env.xmlz ovf_env.xmlz OVF_ENV.XMLz OVF-ENV.XMLzFailed loading ovf file %s)NF) r rrisfilerload_text_filer]logexcr+)dirname env_namesfnamefull_fnr8rrrr%s   r%cCs|sdSt|tstd|tj|}|dr!|dd}|dr.|dd}n | ddkr7dS|s;dSd}tj d|}t |}||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)rDstr ValueErrorr rnormpathr* partitionsplitcountenvironr\recompilematch)devname default_regex devname_regexcdmatchrrrmaybe_cdrom_devices"      r|Tc Cst}|D]&\}}|d}|dkr|rqt|sq|d}t|\}}|dur.|Sq|r4d}nd}ddt|rAd|ndD} | D]'}z tj|t|d\}}Wntjyft d |YqHw|duro|SqHdS) Nfstypeiso9660 mountpointFcSsg|]}t|r|qSr)r|).0devrrr s z%transport_iso9660..zTYPE=%s)mtypez%s not mountable as iso9660) rmountsrWr|r%find_devs_withmount_cbMountFailedErrorr+r,) require_isorrinfor}mp_fnamer8rdevsrrrr)s:   r)cCs ||g}t|\}}|||fSrIrrpctoolargcmdstdoutstderrrrrexec_vmware_rpctool s rcCs"|d|g}t|\}}|||fS)Nz--cmdrrrrr exec_vmtoolsds  rc CsTd\}}td}td}|r|t}}td||r*|s$|t}}td||s3tddSdd}z|||WStjy}z_|r_||kr_|jd krXt td |WYd}~dS|smt d WYd}~dSzt d ||tWWYd}~Stjy}z|jd krt td |WYd}~nd}~wwWYd}~dSd}~ww) N)NNvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc Ssrtd|z||d\}}}|r|WStd|WdStjy8}z|jdkr2td||j|d}~ww)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdoutz%s exited with code %d)r+rr,rProcessExecutionError exit_codewarning)r rpctool_fnrrr?errorrrrquery_guestinfo-s   z3transport_vmware_guestinfo..query_guestinforz+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd) rwhichrr+r,rrrrrgr)rrrvmware_rpctoolrrrrrr(sP              r(cCs2g}|s|S|jD] }||r||q |SrI) hasChildNodes childNodesr')node filter_funcretchildrrr find_child]s  rc Cst|}|jjdkrtd|jstdd}t|jdd}|s(tdi}t|dd d}|D]}|j|d j }|j|d j }|||<q5|S) N EnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1cS |jdkS)NPropertySection localNamenrrrt z get_properties..zNo 'PropertySection'srcSr)NPropertyrrrrrr|rkeyvalue) r parseStringdocumentElementrXmlErrorrr attributesgetNamedItemNSr) r8domenvNsURI propSectionsr_ propElemselemrrdrrrrVgs(      rVc@s eZdZdS)rN)rLrMrNrrrrrsrcCs t|tSrI)rlist_from_depends datasources)dependsrrrget_datasource_lists rcCs|siSt|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. )yaml safe_load)datarrrr[s r[)F)T)"__doc__rXloggingr ruxml.domrr cloudinitrrr getLoggerrLr+r rrQr&r%r|r)rrr(rrVr]rDEP_FILESYSTEM DEP_NETWORKrrr[rrrrs4   i  )&G