o
    w7e)                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ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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 )!    N)minidom)log)safeyaml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_seedr   r   r   	_get_data'   sf   




zDataSourceOVF._get_datac                 C   s
   d| j  S )Nzovf (%s))r   r   r   r   r   _get_subplatformi   s   
zDataSourceOVF._get_subplatformc                 C   s,   d| j vrg S | j d }t|tr|S |gS )Npublic-keys)r2   
isinstancelist)r   pksr   r   r   get_public_ssh_keysl   s   


z!DataSourceOVF.get_public_ssh_keysc                 C      | j S N)r   rC   r   r   r   get_config_objx   s   zDataSourceOVF.get_config_objc                 C   rJ   rK   )r   rC   r   r   r   network_config{   s   zDataSourceOVF.network_configN)__name__
__module____qualname__dsnamer   r   rB   rD   rI   rL   propertyrM   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)rN   rO   rP   r   r   r   r   r   rS      s    rS   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-hostnamerE   r!   r#   hostnamerU   networkz%Ignore network-config in wrong formatz	user-data)
get_propertiesitemsbase64	b64decodeencodesafeload_yaml_or_dictget	Exceptionr.   r/   )r;   read_networkpropsr6   r   r7   	cfg_propsmd_propsnetwork_propspropvalrM   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_filer_   logexcr.   )dirname	env_namesfnamefull_fnr;   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)rF   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   mountsrY   r~   r'   find_devs_withmount_cbMountFailedErrorr.   r/   )
require_isor   r   infor   mp_fnamer;   r   devsr   r   r   r+      s:   r+   c               
   C   s   d} d }t | s|S | dg}zt  |\}}|r|W S td|| W |S  t jyR } z |jdkrGtd| |j t| W Y d }~|S W Y d }~|S d }~ww )Nzvmware-rpctoolzinfo-get guestinfo.ovfEnvz%cmd %s exited 0 with empty stdout: %s   z%s exited with code %d)r   whichr.   r/   ProcessExecutionError	exit_codewarning)rpctool	not_foundcmdout_errer   r   r   r*     s(   


r*   c                 C   s2   g }|   s|S | jD ]}||r|| q|S rK   )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>/     
 z get_properties.<locals>.<lambda>r   zNo 'PropertySection'sc                 S   r   )NPropertyr   r   r   r   r   r   7  r   keyvalue)r   parseStringdocumentElementr   XmlErrorr   r   r,   
attributesgetNamedItemNSr   )	r;   domenvNsURIpropSectionsra   	propElemselemr   rf   r   r   r   rX   !  s(   



rX   c                   @   s   e Zd ZdS )r   N)rN   rO   rP   r   r   r   r   r   B  s    r   c                 C   s   t | tS rK   )r   list_from_dependsdatasources)dependsr   r   r   get_datasource_listN  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.
    )r   load)datar   r   r   r]   R  s   
r]   )F)T) rZ   r   rw   xml.domr   	cloudinitr   loggingr   r   r   r   	getLoggerrN   r.   r   r   rS   r(   r'   r~   r+   r*   r   rX   r_   r   DEP_FILESYSTEMDEP_NETWORKr   r   r]   r   r   r   r   <module>   s,   

j
	
)'
!
