o
    f2                     @   s  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eZG dd de	jZG dd deZd#d
dZdd Zdd Zd$ddZdd Zdd Zdd Zdd Zdd ZG dd deZee	jffee	je	jfffZdd  Z d!d" Z!dS )%zZCloud-Init DataSource for OVF

This module provides a cloud-init datasource for OVF data.
    N)minidom)sourcessubputilc                   @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )DataSourceOVFOVFc                 C   sF   t j| ||| d | _tj|jd| _d | _i | _	d| _
d | _d S )Novf)/zfile://)r   
DataSource__init__seedospathjoinseed_direnvironmentcfgsupported_seed_starts_network_configselfsys_cfgdistropaths r   A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOVF.pyr       s   
zDataSourceOVF.__init__c                 C   s   t j| }d|| jf S )Nz%s [seed=%s])r   r
   __str__r   )r   rootr   r   r   r   )   s   zDataSourceOVF.__str__c                 C   s  g }i }d}d}ddi}t | jj\}}|r/tj| jj|}t|\}}}	|| _|| n7dt	fdt
fg}
d }|
D ]\}}| }|rF nq;|rft|d\}}}	|| _d|v ra|d ra|d | _|| t|dkrnd	S d
|v r|d
 r|d
 }d	}| jD ]}||r|} nq|std||  d	S tj|d d\}}}}td| t||g}|| t||g}d|| _|| _|| _|| _|	| _dS )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_seed_r   r   r   	_get_data-   sf   




zDataSourceOVF._get_datac                 C   s
   d| j  S )Nzovf (%s))r   r   r   r   r   _get_subplatformo   s   
zDataSourceOVF._get_subplatformc                 C   s,   d| j vrg S | j d }t|tr|S |gS )Npublic-keys)r0   
isinstancelist)r   pksr   r   r   get_public_ssh_keysr   s   


z!DataSourceOVF.get_public_ssh_keysc                 C      | j S N)r   rB   r   r   r   get_config_obj~   s   zDataSourceOVF.get_config_objc                 C   rI   rJ   )r   rB   r   r   r   network_config   s   zDataSourceOVF.network_configN)__name__
__module____qualname__dsnamer   r   rA   rC   rH   rK   propertyrL   r   r   r   r   r      s    	Br   c                   @   s   e Zd Zdd ZdS )DataSourceOVFNetc                 C   s,   t | ||| tj|jd| _d| _d S )Nzovf-net)zhttp://zhttps://)r   r   r   r   r   r   r   r   r   r   r   r      s   
zDataSourceOVFNet.__init__N)rM   rN   rO   r   r   r   r   r   rR      s    rR   Fc              	   C   s   t | }i }i }d }dg}g d}dg}| D ]^\}	}
|	dkr"d}	|	|v r+|
||	< q|	|v r4|
||	< q|	|v r[|r[zt|
 }t|d||	< W q tyZ   t	d Y qw |	dkrvz	t|
 }W q tyu   |
 }Y qw q|||fS )	Npassword)r"   local-hostnamerD   r   r!   hostnamerT   networkz%Ignore network-config in wrong formatz	user-data)
get_propertiesitemsbase64	b64decodeencodesafeload_yaml_or_dictget	Exceptionr,   r-   )r9   read_networkpropsr4   r   r5   	cfg_propsmd_propsnetwork_propspropvalrL   r   r   r   r&      s:   


r&   c              	   C   sf   d}|D ],}t j| |}t j|r0zt|}||fW   S  ty/   ttd| Y qw qdS )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_filer^   logexcr,   )dirname	env_namesfnamefull_fnr9   r   r   r   r%      s   
r%   c                 C   s   | sdS t | tstd|  tj| } | dr!| dd } | dr.| dd } n	| 	ddkr7dS | s;dS d}tj
d|}t|}|| 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)rE   str
ValueErrorr   r   normpathr+   	partitionsplitcountenvironr]   recompilematch)devnamedefault_regexdevname_regexcdmatchr   r   r   maybe_cdrom_device   s"   



r}   Tc           
   	   C   s   t  }| D ]&\}}|d }|dkr| rqt|sq|d }t|\}}|dur.|  S q| r4d}nd }dd t |rAd| nd D }	|	D ]'}zt j|t|d\}}W n t jyf   t	d	| Y qHw |duro|  S qHd S )
Nfstypeiso9660
mountpointFc                 S   s   g | ]}t |r|qS r   )r}   ).0devr   r   r   
<listcomp>   s    z%transport_iso9660.<locals>.<listcomp>zTYPE=%s)mtypez%s not mountable as iso9660)
r   mountsrX   r}   r%   find_devs_withmount_cbMountFailedErrorr,   r-   )
require_isor   r   infor~   mp_fnamer9   r   devsr   r   r   r)      s:   r)   c                 C   s    | |g}t  |\}}|||fS rJ   r   rpctoolargcmdstdoutstderrr   r   r   exec_vmware_rpctool
  s   
r   c                 C   s"   | d|g}t  |\}}|||fS )Nz--cmdr   r   r   r   r   exec_vmtoolsd  s   

r   c                  C   s@  d\} }t d}t d}|r|t} }td| |r*|s$|t} }td| | s3td d S dd }z|| |W S  t jy } zU|rZ| |krZttd	| W Y d }~d S |sht	d
 W Y d }~d S zt	d ||tW W  Y d }~S  t jy } zttd	| W Y d }~nd }~ww W Y d }~d S d }~ww )N)NNvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc              
   S   sr   t d|  z|| d\}}}|r|W S t d| W d S  tjy8 } z|jdkr2t d| |j |d }~ww )Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdout   z%s exited with code %d)r,   r   r-   r   ProcessExecutionError	exit_codewarning)r   
rpctool_fnr   r   r@   errorr   r   r   query_guestinfo-  s   
z3transport_vmware_guestinfo.<locals>.query_guestinfoz+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd)
r   whichr   r,   r-   r   r   r   rh   r   )r   r   r   vmware_rpctoolr   r   r   r   r   r(     sL   







r(   c                 C   s2   g }|   s|S | jD ]}||r|| q|S rJ   )hasChildNodes
childNodesr'   )nodefilter_funcretchildr   r   r   
find_child[  s   

r   c           	      C   s   t | }|jjdkrtd|j stdd}t|jdd }t|dkr,tdi }t|d d	d }|D ]}|j	|d
j
}|j	|dj
}|||< q9|S )NEnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c                 S   
   | j dkS )NPropertySection	localNamenr   r   r   <lambda>r     
 z get_properties.<locals>.<lambda>r   zNo 'PropertySection'sc                 S   r   )NPropertyr   r   r   r   r   r   z  r   keyvalue)r   parseStringdocumentElementr   XmlErrorr   r   r*   
attributesgetNamedItemNSr   )	r9   domenvNsURIpropSectionsr`   	propElemselemr   re   r   r   r   rW   e  s(   



rW   c                   @   s   e Zd ZdS )r   N)rM   rN   rO   r   r   r   r   r     s    r   c                 C   s   t | tS rJ   )r   list_from_dependsdatasources)dependsr   r   r   get_datasource_list  s   r   c                 C   s   | si S t | 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)datar   r   r   r\     s   
r\   )F)T)"__doc__rY   loggingr   rv   xml.domr   r   	cloudinitr   r   r   	getLoggerrM   r,   r
   r   rR   r&   r%   r}   r)   r   r   r(   r   rW   r^   r   DEP_FILESYSTEMDEP_NETWORKr   r   r\   r   r   r   r   <module>   s4   

i
	
)&E
 
