3 \me2@sdZddlZddlZddlZddlZddlmZddlmZm Z m Z m Z ej 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)safeyamlsourcessubputilc@sLeZdZdZddZddZddZdd Zd d Zd d Z e ddZ dS) DataSourceOVFZOVFcCsFtjj||||d|_tjj|jd|_d|_i|_ d|_ d|_ dS)NZovf/file://)rr ) r DataSource__init__seedospathjoinseed_dir environmentcfgsupported_seed_starts_network_config)selfsys_cfgdistropathsr#/usr/lib/python3.6/DataSourceOVF.pyr szDataSourceOVF.__init__cCstjj|}d||jfS)Nz %s [seed=%s])rr __str__r )rrootrrrr's zDataSourceOVF.__str__cCsg}i}d}d}ddi}t|jj\}}|r^tjj|jj|}t|\}}} ||_|j|npdt fdt fg} d} x| D]\} } | }|rxPqxW|rt|d\}}} ||_d|kr|dr|d|_ |j| t |dkrd Sd |ko|d rp|d } d }x"|j D]}| j|r|}PqW|s8tjd | |d Stj| dd \}}}tjd | tj||g}|j| tj||g}dj||_||_||_||_| |_dS)Nz instance-idz iid-dsovfzcom.vmware.guestInfoZisoTznetwork-configrFseedfromz Seed from %s not supported by %s)ZtimeoutzUsing seeded cache data from %s,) get_ovf_envrrr rrread_ovf_environmentrappendtransport_vmware_guestinfotransport_iso9660rlenr startswithLOGdebugrZ read_seededZ mergemanydictr metadataZ userdata_rawZvendordata_rawr)rfoundmdudZvdZdefaultsZseedfilecontentsr rZnpnameZ transfuncrZ seedfoundprotoZmd_seedrrr _get_data+s^          zDataSourceOVF._get_datacCs d|jS)Nzovf (%s))r )rrrr_get_subplatformmszDataSourceOVF._get_subplatformcCs0d|jkrgS|jd}t|tr&|S|gSdS)Nz public-keys)r) isinstancelist)rZpksrrrget_public_ssh_keysps    z!DataSourceOVF.get_public_ssh_keyscCs|jS)N)r)rrrrget_config_obj|szDataSourceOVF.get_config_objcCs|jS)N)r)rrrrnetwork_configszDataSourceOVF.network_configN) __name__ __module__ __qualname__Zdsnamer rr0r1r4r5propertyr6rrrrrs B rc@seZdZddZdS)DataSourceOVFNetcCs,tj||||tjj|jd|_d|_dS)Nzovf-nethttp://https://)r<r=)rr r rrrr)rrrrrrrr szDataSourceOVFNet.__init__N)r7r8r9r rrrrr;sr;Fc Cst|}i}i}d}dg}ddddg}dg}x|jD]\} } | dkrJd} | |kr\| || <q6| |krn| || <q6| |kr|ry$tj| j} t| jd|| <Wqtk rtj d YqXq6| d kr6ytj| j}Wq6tk r| j}Yq6Xq6W|||fS) NZpasswordrzlocal-hostnamez public-keysz instance-idznetwork-configZhostnameZnetworkz%Ignore network-config in wrong formatz user-data) get_propertiesitemsbase64Z b64decodeencodesafeload_yaml_or_dictget Exceptionr'r() r-Z read_networkpropsr+rr,Z cfg_propsZmd_propsZ network_propsZpropvalr6rrrr!s4    r!c Csfd}x\|D]T}tjj||}tjj|r ytj|}||fStk r\tjtd|Yq Xq WdS) N ovf-env.xml ovf_env.xml OVF_ENV.XML OVF-ENV.XMLzFailed loading ovf file %sF)rGrHrIrJ)NF) r rrisfilerZ load_filerDlogexcr')dirnameZ env_namesZfnameZfull_fnr-rrrr s   r cCs|sdSt|tstd|tjj|}|jdrB|jdd }|jdr\|jdd }n|j ddkrndS|svdSd}tj j d|}t j |}|j|d k S) 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/rrz^(sr[0-9]+|hd[a-z]|xvd.*)ZCLOUD_INIT_CDROM_DEV_REGEXNrO)r2str ValueErrorr rnormpathr& partitionsplitcountenvironrCrecompilematch)ZdevnameZ default_regexZ devname_regexZcdmatchrrrmaybe_cdrom_devices"      rZTc Cstj}xT|jD]H\}}|d}|dkr0|r0qt|s:q|d}t|\}}|dk r|SqW|rhd}nd}ddtj|rd|ndD} xV| D]N}ytj|t|d\}}Wn$tjk rtj d |wYnX|dk r|SqWdS) NfstypeZiso9660Z mountpointFcSsg|]}t|r|qSr)rZ).0devrrr sz%transport_iso9660..zTYPE=%s)mtypez%s not mountable as iso9660) rmountsr?rZr Zfind_devs_withZmount_cbZMountFailedErrorr'r() Z require_isor`r]infor[ZmpZ_fnamer-r_Zdevsrrrr$s2    r$cCs ||g}tj|\}}|||fS)N)r)rpctoolargcmdstdoutstderrrrrexec_vmware_rpctoolsrgcCs"|d|g}tj|\}}|||fS)Nz--cmd)r)rbrcrdrerfrrr exec_vmtoolsds rhcCsd \}}tjd}tjd}|r6|t}}tjd||rT|sH|t}}tjd||sftjddSdd}y |||Stjk r}z|r||krtjtd|dS|stj d dSytj d ||tStjk r}ztjtd|WYdd}~XnXWYdd}~XnXdS) Nvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredcSs|tjd|y(||d\}}}|r&|Stjd|dStjk rv}z$|jdkrbtjd||j|WYdd}~XnXdS)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdoutrNz%s exited with code %d)r'rar(rProcessExecutionErrorZ exit_codeZwarning)rb rpctool_fnrdre_errorrrrquery_guestinfo+s   z3transport_vmware_guestinfo..query_guestinfoz+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd)NN) rZwhichrgr'r(rhrjrrLra)rbrkriZvmware_rpctoolrnrmrrrr#s>              .r#cCs6g}|js|Sx |jD]}||r|j|qW|S)N) hasChildNodesZ childNodesr")ZnodeZ filter_funcretZchildrrr find_childYs rqc Cstj|}|jjdkrtd|jjs0tdd}t|jdd}t|dkrXtdi}t|dd d}x4|D],}|jj |d j }|jj |d j }|||<qtW|S) NZ EnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1cSs |jdkS)NZPropertySection) localName)nrrrpsz get_properties..rzNo 'PropertySection'scSs |jdkS)NZProperty)rr)rsrrrrtxskeyvalue) rZ parseStringZdocumentElementrrXmlErrorrorqr%Z attributesZgetNamedItemNSrv) r-ZdomZenvNsURIZ propSectionsrEZ propElemselemrurFrrrr>cs$      r>c@s eZdZdS)rwN)r7r8r9rrrrrwsrwcCs tj|tS)N)rZlist_from_depends datasources)Zdependsrrrget_datasource_listsrzcCs|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)datarrrrBsrB)F)T)"__doc__r@Zloggingr rWZxml.domrZ cloudinitrrrrZ getLoggerr7r'r rr;r!r rZr$rgrhr#rqr>rDrwZDEP_FILESYSTEMZ DEP_NETWORKryrzrBrrrrs.  i  ) &E