U
    L¬÷dä)  ã                   @   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 )ÚDataSourceOVFZOVFc                 C   sF   t j | |||¡ d | _tj |jd¡| _d | _i | _	d| _
d | _d S )NZovf)ú/zfile://)r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚenvironmentÚcfgÚsupported_seed_startsÚ_network_config©ÚselfZsys_cfgZ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|ƒ\}}}	|| _| |¡ nndt	fdt
fg}
d }|
D ]\}}|ƒ }|rv qŽqv|rÌt|dƒ\}}}	|| _d|krÂ|d rÂ|d | _| |¡ t|ƒdkrÜd	S d
|krp|d
 rp|d
 }d	}| jD ]}| |¡r|} q q|s8t d|| ¡ d	S tj|d d\}}}t d|¡ t ||g¡}| |¡ t ||g¡}d |¡| _|| _|| _|| _|	| _dS )NÚ úinstance-idz	iid-dsovfzcom.vmware.guestInfoZisoTúnetwork-configr   FÚseedfromz Seed from %s not supported by %s)Z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   Zread_seededZmergemanydictr   ÚmetadataZuserdata_rawZvendordata_rawr   )r   ÚfoundÚmdÚudZvdÚdefaultsZseedfileÚcontentsr   r   ZnpÚnameZ	transfuncr   Z	seedfoundÚprotoZmd_seedr   r   r   Ú	_get_data'   sd     ÿþ




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   s0   d| j krg S | j d }t|tƒr&|S |gS d S )Núpublic-keys)r*   Ú
isinstanceÚlist)r   Zpksr   r   r   Úget_public_ssh_keysl   s    


z!DataSourceOVF.get_public_ssh_keysc                 C   s   | j S ©N)r   r3   r   r   r   Úget_config_objx   s    zDataSourceOVF.get_config_objc                 C   s   | j S r9   )r   r3   r   r   r   Únetwork_config{   s    zDataSourceOVF.network_configN)Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r   r2   r4   r8   r:   Úpropertyr;   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)r<   r=   r>   r   r   r   r   r   r@   €   s   r@   Fc              	   C   s  t | ƒ}i }i }d }dg}ddddg}dg}| ¡ D ]Â\}	}
|	dkrHd}	|	|krZ|
||	< q4|	|krl|
||	< q4|	|kr¾|r¾z$t |
 ¡ ¡}t|ƒ d¡||	< W qö tk
rº   t 	d	¡ Y qöX q4|	d
kr4zt |
 ¡ ¡}W q4 tk
rô   |
 ¡ }Y q4X q4|||fS )NZpasswordr   zlocal-hostnamer5   r   r   ZhostnameZ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,   r   r-   Z	cfg_propsZmd_propsZnetwork_propsZpropÚvalr;   r   r   r   r"   ‰   s4    

r"   c              	   C   sh   d}|D ]Z}t j | |¡}t j |¡rzt |¡}||fW   S  tk
r`   t td|¡ Y qX 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   Z	load_filerG   Zlogexcr(   )ÚdirnameZ	env_namesÚfnameZfull_fnr/   r   r   r   r!   ¨   s    
r!   c                 C   s    | sdS t | tƒstd|  ƒ‚tj | ¡} |  d¡rB|  d¡d } |  d¡r\|  d¡d } n|  	d¡dkrndS | svdS d}tj
 d|¡}t |¡}| | ¡d	k	S )
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/éÿÿÿÿr	   r   z^(sr[0-9]+|hd[a-z]|xvd.*)ZCLOUD_INIT_CDROM_DEV_REGEXN)r6   ÚstrÚ
ValueErrorr   r   Únormpathr'   Ú	partitionÚsplitÚcountÚenvironrF   ÚreÚcompileÚmatch)ZdevnameZdefault_regexZdevname_regexZcdmatchr   r   r   Úmaybe_cdrom_deviceµ   s"    



rX   Tc           
   	   C   sê   t  ¡ }| ¡ D ]L\}}|d }|dkr.| r.qt|ƒs8q|d }t|ƒ\}}|dk	r|  S q| rhd}nd }dd„ t  |r‚d| nd ¡D ƒ}	|	D ]T}zt j|t|d\}}W n& t jk
rÒ   t 	d	|¡ Y qY nX |dk	r|  S qd S )
NÚfstypeZiso9660Z
mountpointFc                 S   s   g | ]}t |ƒr|‘qS r   )rX   )Ú.0Údevr   r   r   Ú
<listcomp>ó   s   þz%transport_iso9660.<locals>.<listcomp>zTYPE=%s)Úmtypez%s not mountable as iso9660)
r   ÚmountsrB   rX   r!   Zfind_devs_withZmount_cbZMountFailedErrorr(   r)   )
Zrequire_isor^   r[   ÚinforY   ZmpZ_fnamer/   r]   Zdevsr   r   r   r%   Þ   s4    
þ

r%   c               
   C   s–   d} d }t  | ¡s|S | dg}z*t   |¡\}}|r8|W S t d||¡ W nH t jk
r } z(|jdkr€t d| |j¡ t |¡ W 5 d }~X Y nX |S )Nzvmware-rpctoolzinfo-get guestinfo.ovfEnvz%cmd %s exited 0 with empty stdout: %sé   z%s exited with code %d)r   Zwhichr(   r)   ZProcessExecutionErrorZ	exit_codeZwarning)ZrpctoolZ	not_foundÚcmdÚoutZ_errÚer   r   r   r$     s    

r$   c                 C   s2   g }|   ¡ s|S | jD ]}||ƒr| |¡ q|S r9   )ÚhasChildNodesZ
childNodesr#   )ZnodeZfilter_funcZretZchildr   r   r   Ú
find_child  s    
re   c           	      C   s¤   t  | ¡}|jjdkrtdƒ‚|j ¡ s0tdƒ‚d}t|jdd„ ƒ}t|ƒdkrXtdƒ‚i }t|d d	d„ ƒ}|D ],}|j 	|d
¡j
}|j 	|d¡j
}|||< qr|S )NZEnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c                 S   s
   | j dkS )NZPropertySection©Ú	localName©Únr   r   r   Ú<lambda>/  ó    z get_properties.<locals>.<lambda>r   zNo 'PropertySection'sc                 S   s
   | j dkS )NZPropertyrf   rh   r   r   r   rj   7  rk   ÚkeyÚvalue)r   ZparseStringZdocumentElementrg   ÚXmlErrorrd   re   r&   Z
attributesZgetNamedItemNSrm   )	r/   ZdomZenvNsURIZpropSectionsrH   Z	propElemsÚelemrl   rI   r   r   r   rA   !  s,    

 ÿ ÿ
rA   c                   @   s   e Zd ZdS )rn   N)r<   r=   r>   r   r   r   r   rn   B  s   rn   c                 C   s   t  | t¡S r9   )r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_listN  s    rq   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   rE   R  s    rE   )F)T) rC   r   rU   Zxml.domr   Z	cloudinitr   Zloggingr   r   r   r   Z	getLoggerr<   r(   r
   r   r@   r"   r!   rX   r%   r$   re   rA   rG   rn   ZDEP_FILESYSTEMZDEP_NETWORKrp   rq   rE   r   r   r   r   Ú<module>   s*   
j	
)
'
!
þ