
    }f2                     b   d Z ddlZddlZddlZddlZddlmZ ddlZddlm	Z	m
Z
mZ  ej                  e      Z G d de	j                        Z G d de      Zdd	Zd
 Zd ZddZd Zd Zd Zd Zd Z G d de      Zee	j:                  ffee	j:                  e	j<                  fffZd Z d Z!y)zZCloud-Init DataSource for OVF

This module provides a cloud-init datasource for OVF data.
    N)minidom)sourcessubputilc                   D    e Zd ZdZd Zd Zd Zd Zd Zd Z	e
d        Zy	)
DataSourceOVFOVFc                     t         j                  j                  | |||       d | _        t        j
                  j                  |j                  d      | _        d | _        i | _	        d| _
        d | _        y )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   zDataSourceOVF.__init__    s\    ##D'65A	U^^U;%5"#    c                 d    t         j                  j                  |       }|d| j                  dS )Nz [seed=])r   r   __str__r   )r   roots     r   r!   zDataSourceOVF.__str__)   s'    !!))$/!%tyy11r   c                    g }i }d}d}ddi}t        | j                  j                        \  }}|r\t        j                  j                  | j                  j                  |      }t        |      \  }}}	|| _        |j                  |       nddt        fdt        fg}
d }|
D ]  \  }} |       }|s n |r;t        |d      \  }}}	|| _        d|v r|d   r
|d   | _        |j                  |       t        |      dk(  ry	d
|v r|d
   r|d
   }d	}| j                  D ]  }|j                  |      s|} n |st        j!                  d||        y	t#        j$                  |d       \  }}}t        j!                  d|       t#        j&                  ||g      }|j                  |       t#        j&                  ||g      }dj                  |      | _        || _        || _        || _        	| _        y)N instance-idz	iid-dsovfzcom.vmware.guestInfoisoTnetwork-configr   F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   lenr   
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_seeds                    r   	_get_datazDataSourceOVF._get_data-   s    ;
  +4::+>+>?877<<

 3 3X>D0:MRS'DLL ()CD)*B D#% i$;  4Xt DR#+ #r)b1A.B+-.>+?D(T" u:?:*~HI33 &&u- %I 		<hM $ 0 04 HWb"II7B##RM2BLL" X/HHUO	 r   c                      d| j                   z  S )Nzovf (%s))r   r   s    r   _get_subplatformzDataSourceOVF._get_subplatformo   s    DII%%r   c                 j    d| j                   vrg S | j                   d   }t        |t              r|S |gS )Npublic-keys)r6   
isinstancelist)r   pkss     r   get_public_ssh_keysz!DataSourceOVF.get_public_ssh_keysr   s7    -ImmM*cD"J5Lr   c                     | j                   S N)r   rH   s    r   get_config_objzDataSourceOVF.get_config_obj~   s    xxr   c                     | j                   S rQ   )r   rH   s    r   network_configzDataSourceOVF.network_config   s    ###r   N)__name__
__module____qualname__dsnamer   r!   rF   rI   rO   rR   propertyrT    r   r   r   r      s;    F$2@D& $ $r   r   c                       e Zd Zd Zy)DataSourceOVFNetc                     t         j                  | |||       t        j                  j	                  |j
                  d      | _        d| _        y )Nzovf-net)zhttp://zhttps://)r   r   r   r   r   r   r   r   s       r   r   zDataSourceOVFNet.__init__   s8    tWfe<U^^Y?%<"r   N)rU   rV   rW   r   rZ   r   r   r\   r\      s    =r   r\   c                    t        |       }i }i }d }dg}g d}dg}|j                         D ]  \  }	}
|	dk(  rd}	|	|v r|
||	<   |	|v r|
||	<   !|	|v rD|rB	 t        j                  |
j	                               }t        |      j                  d      ||	<   i|	dk(  so	 t        j                  |
j	                               } |||fS # t        $ r t        j                  d       Y w xY w# t        $ r |
j	                         }Y w xY w)	Npassword)r(   local-hostnamerK   r%   r'   hostnamer`   networkz%Ignore network-config in wrong formatz	user-data)
get_propertiesitemsbase64	b64decodeencodesafeload_yaml_or_dictget	Exceptionr2   r3   )r?   read_networkpropsr:   r   r;   	cfg_propsmd_propsnetwork_propspropvalrT   s               r   r,   r,      s$   8$E	B
C	BIKH%&M[[] "	c:#D8BtHYCI]"|C!'!1!1#**,!?0@DDYO4 [ "%%cjjl3"$ C=  C		ABC
  "ZZ\"s%   A C#C*C'&C'*DDc                     d}|D ]]  }t         j                  j                  | |      }t         j                  j                  |      sC	 t	        j
                  |      }||fc S  y# t        $ r t	        j                  t        d|       Y w xY w)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_filerj   logexcr2   )dirname	env_namesfnamefull_fnr?   s        r   r+   r+      s    LI H'',,w.77>>'"H..w7x((H   HC!=wGHs   	A&&$BBc                    | syt        | t              st        d| z        t        j                  j                  |       } | j                  d      r| j                  d      d   } | j                  d      r| j                  d      d   } n| j                  d      dkD  ry| syd}t        j                  j                  d|      }t        j                  |      }|j                  |       d	u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/r   r   z^(sr[0-9]+|hd[a-z]|xvd.*)CLOUD_INIT_CDROM_DEV_REGEXN)rL   str
ValueErrorr   r   normpathr1   	partitionsplitcountenvironri   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                     t        j                         }|j                         D ]9  \  }}|d   }|dk7  r| rt        |      s|d   }t	        |      \  }}|dus7|c S  | rd}nd }t        j
                  |rd|z  nd       D cg c]  }t        |      r| }	}|	D ]*  }	 t        j                  |t        |      \  }}|dus(|c S  y c c}w # t         j                  $ r t        j                  d|       Y ^w xY w)Nfstypeiso9660
mountpointFzTYPE=%s)mtypez%s not mountable as iso9660)
r   mountsrd   r   r+   find_devs_withmount_cbMountFailedErrorr2   r3   )
require_isor   devinfor   mp_fnamer?   r   devss
             r   r/   r/      s%   [[]F\\^ 		ThY;!#&,(_5 O	 
 &&Ey5'8tLc" 	D 
  	!%sKu!MVX
 5 O  $$ 	II3S9	s   C"C)C=<C=c                 D    | |g}t        j                   |      \  }}|||fS rQ   r   rpctoolargcmdstdoutstderrs        r   exec_vmware_rpctoolr   
  s*    C.Cyy~VV  r   c                 F    | d|g}t        j                   |      \  }}|||fS )Nz--cmdr   r   s        r   exec_vmtoolsdr     s-    GS
!Cyy~VV  r   c                     d\  } }t        j                  d      }t        j                  d      }|r|t        }} t        j	                  d|       |r |s|t
        }} t        j	                  d|       | st        j	                  d       y d }	  || |      S # t         j                  $ r}|r%| |k(  r t        j                  t        d|       Y d }~y |st        j                  d	       Y d }~y 	 t        j                  d
        ||t
              cY d }~S # t         j                  $ r%}t        j                  t        d|       Y d }~nd }~ww xY wY d }~y d }~ww xY w)N)NNvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc                    t         j                  d|        	  || d      \  }}}|r|S t         j                  d|       y # t        j                  $ r7}|j
                  dk7  r!t         j                  d| |j
                         |d }~ww xY w)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdout   z%s exited with code %d)r2   r   r3   r   ProcessExecutionError	exit_codewarning)r   
rpctool_fnr   r   _errors         r   query_guestinfoz3transport_vmware_guestinfo.<locals>.query_guestinfo-  s    17;		'1LMNCII93?)) 	!#4guOK	s   A  A   B
2BB
z+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd)
r   whichr   r2   r3   r   r   r   ru   r   )r   r   r   vmware_rpctoolr   r   s         r   r.   r.     s;   $GZzz*%HZZ 01N ,.A		1>B "*MZG		+X6 		)* w
33%%  8+KKBE HH;<	HH+,"8];;)) 	KKBE 	 5sH   B E*"EE.!DEE(EEEEEc                     g }| j                         s|S | j                  D ]  } ||      s|j                  |        |S rQ   )hasChildNodes
childNodesr-   )nodefilter_funcretchilds       r   
find_childr   [  sF    
C
 uJJu Jr   c                    t        j                  |       }|j                  j                  dk7  rt	        d      |j                  j                         st	        d      d}t        |j                  d       }t        |      dk(  rt	        d      i }t        |d   d       }|D ]S  }|j                  j                  |d	      j                  }|j                  j                  |d
      j                  }|||<   U |S )NEnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c                      | j                   dk(  S )NPropertySection	localNamens    r   <lambda>z get_properties.<locals>.<lambda>r  s    q{{6G'G r   r   zNo 'PropertySection'sc                      | j                   dk(  S )NPropertyr   r   s    r   r   z get_properties.<locals>.<lambda>z  s    AKK:$= r   keyvalue)r   parseStringdocumentElementr   XmlErrorr   r   r0   
attributesgetNamedItemNSr   )	r?   domenvNsURIpropSectionsrl   	propElemselemr   rq   s	            r   rc   rc   e  s    


h
'C
$$5,--,,.'((:H GL <A.//EQ=I  oo,,Xu=CCoo,,Xw?EEc

 Lr   c                       e Zd Zy)r   N)rU   rV   rW   rZ   r   r   r   r     s    r   r   c                 6    t        j                  | t              S rQ   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr     s    $$Wk::r   c                 4    | si S t        j                  |       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)datas    r   rh   rh     s     	>>$r   )F)T)"__doc__re   loggingr   r   xml.domr   r   	cloudinitr   r   r   	getLoggerrU   r2   r   r   r\   r,   r+   r   r/   r   r   r.   r   rc   rj   r   DEP_FILESYSTEMDEP_NETWORKr   r   rh   rZ   r   r   <module>r      s   
   	 	   ) )g!f$G&& f$R=} =>
$.R#L!!BJ@	y 	 W++-...0C0CDE; r   