
    x[hO3                     f   S r SSKrSSKrSSKrSSKrSSKJr  SSKrSSKJ	r	J
r
Jr  \R                  " \5      r " S S\	R                  5      r " S S\5      rSS	 jrS
 rS rSS jrS rS rS rS rS r " S S\5      r\\	R:                  44\\	R:                  \	R<                  444rS r S r!g)zZCloud-Init DataSource for OVF

This module provides a cloud-init datasource for OVF data.
    N)minidom)sourcessubputilc                   L    \ rS rSrSrS rS rS rS rS r	S r
\S	 5       rS
rg)DataSourceOVF   OVFc                     [         R                  R                  XX#5        S U l        [        R
                  R                  UR                  S5      U l        S U l        0 U l	        SU l
        S U l        g )Novf)/zfile://)r   
DataSource__init__seedospathjoinseed_direnvironmentcfgsupported_seed_starts_network_configselfsys_cfgdistropathss       A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOVF.pyr   DataSourceOVF.__init__    sX    ##D6A	U^^U;%5"#    c                 h    [         R                  R                  U 5      nU< SU R                  < S3$ )Nz [seed=])r   r   __str__r   )r   roots     r   r#   DataSourceOVF.__str__)   s'    !!))$/!%tyy11r    c                    / n0 nSnSnSS0n[        U R                  R                  5      u  pgU(       aZ  [        R                  R                  U R                  R                  U5      n[        U5      u  p#n	Xpl        UR                  U5        OtS[        4S[        4/n
S nU
 H  u  pU" 5       nU(       d  M    O   U(       a@  [        US5      u  p#n	Xpl        SU;   a  US   (       a
  US   U l        UR                  U5        U(       d  gS	U;   a  US	   (       a  US	   nSnU R                   H  nUR                  U5      (       d  M  Un  O   U(       d  [        R                  S
X5        g[         R"                  " US S9u  np4n[        R                  SU5        [         R$                  " UU/5      nUR                  U5        [         R$                  " X%/5      nSR                  U5      U l        X l        X0l        X@l        W	U l        g)N instance-idz	iid-dsovfzcom.vmware.guestInfoisoTnetwork-configFseedfromz Seed from %s not supported by %s)timeoutzUsing seeded cache data from %s,)get_ovf_envr   r   r   r   r   read_ovf_environmentr   appendtransport_vmware_guestinfotransport_iso9660r   r   
startswithLOGdebugr   read_seededmergemanydictr   metadatauserdata_rawvendordata_rawr   )r   foundmdudvddefaultsseedfilecontentsr   r   npname	transfuncr+   	seedfoundprotomd_seed_s                     r   	_get_dataDataSourceOVF._get_data-   s    ;
  +4::+>+>?77<<

 3 3X>D0:MRS'LL ()CD)*B D#%$;8 $&  4Xt D#+ #r)b1A.B+-.>+?D(T" :*~HI33&&u-- %I 4 		<hM#'#3#3Hd#K WbaII7B##RM2BLL" /HHUO	 r    c                      SU R                   -  $ )Nzovf (%s))r   r   s    r   _get_subplatformDataSourceOVF._get_subplatformo   s    DII%%r    c                 x    SU R                   ;  a  / $ U R                   S   n[        U[        5      (       a  U$ U/$ )Npublic-keys)r8   
isinstancelist)r   pkss     r   get_public_ssh_keys!DataSourceOVF.get_public_ssh_keysr   s:    -ImmM*cD""J5Lr    c                     U R                   $ N)r   rL   s    r   get_config_objDataSourceOVF.get_config_obj~   s    xxr    c                     U R                   $ rW   )r   rL   s    r   network_configDataSourceOVF.network_config   s    ###r    )	r   r   r   r8   r   r   r   r9   r:   N)__name__
__module____qualname____firstlineno__dsnamer   r#   rI   rM   rT   rX   propertyr[   __static_attributes__ r    r   r   r      s;    F$2@D& $ $r    r   c                       \ rS rSrS rSrg)DataSourceOVFNet   c                     [         R                  XX#5        [        R                  R	                  UR
                  S5      U l        SU l        g )Nzovf-net)zhttp://zhttps://)r   r   r   r   r   r   r   r   s       r   r   DataSourceOVFNet.__init__   s4    tf<U^^Y?%<"r    )r   r   N)r]   r^   r_   r`   r   rc   rd   r    r   rf   rf      s    =r    rf   c                 4   [        U 5      n0 n0 nS nS/n/ SQnS/nUR                  5        H  u  pU	S:X  a  Sn	X;   a  XU	'   M  X;   a  XU	'   M#  X;   aJ  U(       aC   [        R                  " U
R	                  5       5      n[        U5      R                  S5      X9'   Mr  U	S:X  d  Mz   [        R                  " U
R	                  5       5      nM     X5U4$ ! [         a    [        R                  S5         M  f = f! [         a    U
R	                  5       n M  f = f)	Npassword)r+   local-hostnamerP   r(   r*   hostnamerl   networkz%Ignore network-config in wrong formatz	user-data)
get_propertiesitemsbase64	b64decodeencodesafeload_yaml_or_dictget	Exceptionr4   r5   )rA   read_networkpropsr<   r   r=   	cfg_propsmd_propsnetwork_propspropvalr[   s               r   r/   r/      s   8$E	B
C	BIKH%&M[[]	:#DtHI"|C!'!1!1#**,!?0@DDYO [ "%%cjjl3 #$ C=  C		ABC
  "ZZ\"s%   A C'$C9C65C69DDc                 2   SnU Hb  n[         R                  R                  X5      n[         R                  R                  U5      (       d  MH   [        R
                  " U5      nX$4s  $    g! [         a     [        R                  " [        SU5         M  f = f)N)zovf-env.xmlzovf_env.xmlzOVF_ENV.XMLzOVF-ENV.XMLzFailed loading ovf file %s)NF)	r   r   r   isfiler   load_text_filerv   logexcr4   )dirname	env_namesfnamefull_fnrA   s        r   r.   r.      s~    LI'',,w.77>>'""H..w7((    HC!=wGHs   A,,&BBc                    U (       d  g[        U [        5      (       d  [        SU -  5      e[        R                  R                  U 5      n U R                  S5      (       a  U R                  S5      S   n U R                  S5      (       a  U R                  S5      S   n OU R                  S5      S:  a  gU (       d  gSn[        R                  R                  SU5      n[        R                  " U5      nUR                  U 5      S	L$ )
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   r   z^(sr[0-9]+|hd[a-z]|xvd.*)CLOUD_INIT_CDROM_DEV_REGEXN)rQ   str
ValueErrorr   r   normpathr3   	partitionsplitcountenvironru   recompilematch)devnamedefault_regexdevname_regexcdmatchs       r   maybe_cdrom_devicer      s     %%;gEFF ggw'G '""##G,R0 #--$R(	s	a	  1MJJNN#?OMjj'G==!--r    c                 L   [         R                  " 5       nUR                  5        HF  u  p#US   nUS:w  a	  U (       a  M  [        U5      (       d  M+  US   n[	        U5      u  pgUSLd  MD  Us  $    U (       a  SnOS n[         R
                  " U(       a  SU-  OS 5       Vs/ s H  n[        U5      (       d  M  UPM     n	nU	 H)  n [         R                  " U[        US9u  pgUSLd  M'  Us  $    g s  snf ! [         R                   a    [        R                  SU5         M`  f = f)Nfstypeiso9660
mountpointFzTYPE=%s)mtypez%s not mountable as iso9660)
r   mountsrp   r   r.   find_devs_withmount_cbMountFailedErrorr4   r5   )
require_isor   devinfor   mp_fnamerA   r   devss
             r   r2   r2      s   [[]F\\^	hY;!#&&,(_5 O $ 
 &&Ey5'8tLLCc" 	L 	 
 	!%sKu!MV
 5 O   $$ 	II3S9	s    C08C0C55*D#"D#c                 @    X/n[         R                   " U5      u  p4X#U4$ rW   r   rpctoolargcmdstdoutstderrs        r   exec_vmware_rpctoolr   
  s$    .Cyy~V  r    c                 D    U SU/n[         R                   " U5      u  p4X#U4$ )Nz--cmdr   r   s        r   exec_vmtoolsdr     s)    GS
!Cyy~V  r    c                  8   Su  p[         R                  " S5      n[         R                  " S5      nU(       a  U[        p[        R	                  SU5        U(       a$  U(       d  U[
        p[        R	                  SU5        U (       d  [        R	                  S5        g S n U" X5      $ ! [         R                   a  nU(       a6  X:X  a1  UR                  S:w  a  [        R                  " [        S	U5         S nAg U(       d  [        R                  S
5         S nAg  [        R                  S5        U" U[
        5      s S nA$ ! [         R                   a:  nUR                  S:w  a  [        R                  " [        S	U5         S nA S nAg S nAff = fS nAff = f)N)NNvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc                 $   [         R                  SU 5         U" U S5      u  p#nU(       a  U$ [         R                  SU5        g ! [        R                   a7  nUR
                  S:w  a   [         R                  SXR
                  5        UeS nAff = f)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdout   z%s exited with code %d)r4   r   r5   r   ProcessExecutionError	exit_codewarning)r   
rpctool_fnr   r   rH   errors         r   query_guestinfo3transport_vmware_guestinfo.<locals>.query_guestinfo-  s{    17;		'1LMNCII93?)) 	!#4gOK	s   A A B2B

Br   z+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd)r   whichr   r4   r5   r   r   r   r   r   r   )r   r   r   vmware_rpctoolr   r   s         r   r1   r1     s?   $Gzz*%HZZ 01N ,.A		1>B "*MZ		+X6 		)* w33%%  +!#F HH;<	HH+,"8];;)) 	!#F 	+sH   !B) )F=8F:F!E=FF,FFFFFc                     / nU R                  5       (       d  U$ U R                   H#  nU" U5      (       d  M  UR                  U5        M%     U$ rW   )hasChildNodes
childNodesr0   )nodefilter_funcretchilds       r   
find_childr   ]  sG    
C
uJJu ! Jr    c                    [         R                  " U 5      nUR                  R                  S:w  a  [	        S5      eUR                  R                  5       (       d  [	        S5      eSn[        UR                  S 5      nU(       d  [	        S5      e0 n[        US   S 5      nU HS  nUR                  R                  US	5      R                  nUR                  R                  US
5      R                  nXU'   MU     U$ )NEnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c                      U R                   S:H  $ )NPropertySection	localNamens    r   <lambda> get_properties.<locals>.<lambda>t  s    q{{6G'Gr    zNo 'PropertySection'sr   c                      U R                   S:H  $ )NPropertyr   r   s    r   r   r   |  s    AKK:$=r    keyvalue)
r   parseStringdocumentElementr   XmlErrorr   r   
attributesgetNamedItemNSr   )	rA   domenvNsURIpropSectionsrx   	propElemselemr   r}   s	            r   ro   ro   g  s    


h
'C
$$5,--,,..'((:H GL .//EQ=I oo,,Xu=CCoo,,Xw?EEc
 
 Lr    c                       \ rS rSrSrg)r   i  rd   N)r]   r^   r_   r`   rc   rd   r    r   r   r     s    r    r   c                 8    [         R                  " U [        5      $ rW   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr     s    $$Wk::r    c                 @    U (       d  0 $ [         R                  " U 5      $ )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)datas    r   rt   rt     s     	>>$r    )F)T)"__doc__rq   loggingr   r   xml.domr   r   	cloudinitr   r   r   	getLoggerr]   r4   r   r   rf   r/   r.   r   r2   r   r   r1   r   ro   rv   r   DEP_FILESYSTEMDEP_NETWORKr   r   rt   rd   r    r   <module>r      s   
   	 	   ) )!f$G&& f$R=} =>
$.R#L!!DN@	y 	 W++-...0C0CDE; r    