a '¡DgË2ã@sdZddlZddlZddlZddlZddlmZddlZddlm Z m Z m Z e  e ¡ZGdd„de jƒZGdd„deƒZd#d d „Zd d „Zdd„Zd$dd„Zdd„Zdd„Zdd„Zdd„Zdd„ZGdd„deƒZee 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)ÚsourcesÚsubpÚutilc@sLeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z e dd„ƒZ dS)Ú DataSourceOVFZOVFcCsFtj ||||¡d|_tj |jd¡|_d|_i|_ d|_ d|_ dS)NZovf)ú/zfile://) rÚ DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚ environmentÚcfgÚsupported_seed_startsÚ_network_config©ÚselfZsys_cfgZdistroÚpaths©rúC/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceOVF.pyr szDataSourceOVF.__init__cCstj |¡}d||jfS)Nz %s [seed=%s])rrÚ__str__r )rÚrootrrrr)s zDataSourceOVF.__str__cCs¨g}i}d}d}ddi}t|jjƒ\}}|r^tj |jj|¡}t|ƒ\}}} ||_| |¡nndt fdt fg} d} | D]\} } | ƒ}|rvqŽqv|rÌt|dƒ\}}} ||_d|vrÂ|drÂ|d|_ | | ¡t |ƒdkrÜd Sd |vrr|d rr|d } d }|j D]}|  |¡r|}q q|s8t d | |¡d Stj| dd \}}}}t d | ¡t ||g¡}| | ¡t ||g¡}d |¡|_||_||_||_| |_dS)NÚú instance-idz iid-dsovfzcom.vmware.guestInfoZisoTúnetwork-configrFÚseedfromz Seed from %s not supported by %s)ÚtimeoutzUsing seeded cache data from %sú,)Ú get_ovf_envrrr r r Úread_ovf_environmentrÚappendÚtransport_vmware_guestinfoÚtransport_iso9660rÚlenrÚ startswithÚLOGÚdebugrZ read_seededZ mergemanydictr ÚmetadataZ userdata_rawZvendordata_rawr)rÚfoundÚmdÚudZvdÚdefaultsZseedfileÚcontentsr rZnpÚnameZ transfuncrZ seedfoundÚprotoZmd_seedÚ_rrrÚ _get_data-sbÿ þ          zDataSourceOVF._get_datacCs d|jS)Nzovf (%s))r ©rrrrÚ_get_subplatformoszDataSourceOVF._get_subplatformcCs0d|jvrgS|jd}t|tƒr&|S|gSdS)Nú public-keys)r)Ú isinstanceÚlist)rZpksrrrÚget_public_ssh_keysrs    z!DataSourceOVF.get_public_ssh_keyscCs|jS©N)rr3rrrÚget_config_obj~szDataSourceOVF.get_config_objcCs|jSr9)rr3rrrÚnetwork_configszDataSourceOVF.network_configN) Ú__name__Ú __module__Ú __qualname__Zdsnamer rr2r4r8r:Úpropertyr;rrrrrs B rc@seZdZdd„ZdS)ÚDataSourceOVFNetcCs,t ||||¡tj |jd¡|_d|_dS)Nzovf-net)zhttp://zhttps://)rr r r r rrrrrrr ‡szDataSourceOVFNet.__init__N)r<r=r>r rrrrr@†sr@Fc Csút|ƒ}i}i}d}dg}gd¢}dg}| ¡D]¾\} } | dkrDd} | |vrV| || <q0| |vrh| || <q0| |vr¸|r¸z$t |  ¡¡} t| ƒ d¡|| <Wqîty´t  d¡Yqî0q0| dkr0zt |  ¡¡}Wq0tyì|  ¡}Yq00q0|||fS) NÚpassword)rúlocal-hostnamer5rrÚhostnamerBÚnetworkz%Ignore network-config in wrong formatz user-data) Úget_propertiesÚitemsÚbase64Z b64decodeÚencodeÚsafeload_yaml_or_dictÚgetÚ Exceptionr'r() r.Z read_networkÚpropsr+rr,Z cfg_propsZmd_propsZ network_propsZpropÚvalr;rrrr!s4     r!c Csfd}|D]X}tj ||¡}tj |¡rzt |¡}||fWSty^t td|¡Yq0qdS)N)z ovf-env.xmlz ovf_env.xmlz OVF_ENV.XMLz OVF-ENV.XMLzFailed loading ovf file %s)NF) r r r ÚisfilerZload_text_filerKÚlogexcr')ÚdirnameZ env_namesÚfnameZfull_fnr.rrrr ®s   r cCs |sdSt|tƒstd|ƒ‚tj |¡}| d¡rB| d¡d}| d¡r\| d¡d}n|  d¡dkrndS|svdSd}tj   d|¡}t   |¡}| |¡d uS) zûTest 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_REGEXN)r6ÚstrÚ ValueErrorr r Únormpathr&Ú partitionÚsplitÚcountÚenvironrJÚreÚcompileÚmatch)ZdevnameZ default_regexZ devname_regexZcdmatchrrrÚmaybe_cdrom_device»s"      r]Tc Csèt ¡}| ¡D]L\}}|d}|dkr.|r.qt|ƒs8q|d}t|ƒ\}}|dur|Sq|rhd}nd}dd„t |r‚d|nd¡Dƒ} | D]R}ztj|t|d\}}Wn$tjyÐt  d |¡YqYn0|dur|SqdS) NÚfstypeZiso9660Z mountpointFcSsg|]}t|ƒr|‘qSr)r])Ú.0ÚdevrrrÚ øsþz%transport_iso9660..zTYPE=%s)Úmtypez%s not mountable as iso9660) rÚmountsrFr]r Zfind_devs_withZmount_cbZMountFailedErrorr'r() Z require_isorcr`Úinfor^ZmpZ_fnamer.rbZdevsrrrr$äs4   þ   r$cCs ||g}t |¡\}}|||fSr9©r©ÚrpctoolÚargÚcmdÚstdoutÚstderrrrrÚexec_vmware_rpctool srlcCs"|d|g}t |¡\}}|||fS)Nz--cmdrerfrrrÚ exec_vmtoolsds rmc CsFd\}}t d¡}t d¡}|r6|t}}t d|¡|rT|sH|t}}t d|¡|sft d¡dSdd„}z |||ƒWStjy@}zª|r¶||kr¶t td |¡WYd}~dS|sÒt  d ¡WYd}~dSz"t  d ¡||tƒWWYd}~Stjy*}zt td |¡WYd}~n d}~00WYd}~n d}~00dS) N)NNÚvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc Ss‚t d|¡z,||dƒ\}}}|r(|WSt d|¡WdStjy|}z*|jdkrdt d||j¡|‚WYd}~n d}~00dS)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdoutéz%s exited with code %d)r'rdr(rÚProcessExecutionErrorZ exit_codeZwarning)rgÚ rpctool_fnrirjr1ÚerrorrrrÚquery_guestinfo-s   z3transport_vmware_guestinfo..query_guestinfoz+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd) rÚwhichrlr'r(rmrprrOrd)rgrqrnZvmware_rpctoolrsrrrrrr#sB          ÿ  ÿ0r#cCs2g}| ¡s|S|jD]}||ƒr| |¡q|Sr9)Ú hasChildNodesZ childNodesr")ZnodeZ filter_funcÚretÚchildrrrÚ find_child[s  rxc Cs¤t |¡}|jjdkrtdƒ‚|j ¡s0tdƒ‚d}t|jdd„ƒ}t|ƒdkrXtdƒ‚i}t|dd d„ƒ}|D],}|j  |d ¡j }|j  |d ¡j }|||<qr|S) NZ EnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1cSs |jdkS)NZPropertySection©Ú localName©ÚnrrrÚróz get_properties..rzNo 'PropertySection'scSs |jdkS)NZPropertyryr{rrrr}zr~ÚkeyÚvalue) rZ parseStringZdocumentElementrzÚXmlErrorrurxr%Z attributesZgetNamedItemNSr€) r.ZdomZenvNsURIZ propSectionsrLZ propElemsÚelemrrMrrrrEes(    ÿ  ÿ rEc@s eZdZdS)rN)r<r=r>rrrrr…srcCs t |t¡Sr9)rZlist_from_dependsÚ datasources)ZdependsrrrÚget_datasource_list‘sr„cCs|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. )ÚyamlZ safe_load)ÚdatarrrrI•srI)F)T)"Ú__doc__rGZloggingr rZZxml.domrr…Z cloudinitrrrZ getLoggerr<r'rrr@r!r r]r$rlrmr#rxrErKrZDEP_FILESYSTEMZ DEP_NETWORKrƒr„rIrrrrÚ s2  i  ) &E   þ