509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me£2  ã               @   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mZm	Z	m
Z
mZ ej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)Ú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j| |||ƒ d | _tjj|jdƒ| _d | _i | _	d| _
d | _d S )NZovfú/úfile://)r   r	   )r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚenvironmentÚcfgÚsupported_seed_startsÚ_network_config)ÚselfÚsys_cfgÚdistroÚpaths© r   ú#/usr/lib/python3.6/DataSourceOVF.pyr      s    zDataSourceOVF.__init__c             C   s   t j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j|ƒ}t|ƒ\}}}	|| _|j|ƒ npdt	fdt
fg}
d }x|
D ]\}}|ƒ }|rxP qxW |rÎt|dƒ\}}}	|| _d|krÄ|d rÄ|d | _|j|ƒ t|ƒdkrÞd	S d
|koì|d
 �rp|d
 }d	}x"| jD ]}|j|ƒ�r|}P �qW |�s8tjd|| ƒ d	S tj|d d�\}}}tjd|ƒ tj||gƒ}|j|ƒ tj||gƒ}dj|ƒ| _|| _|| _|| _|	| _dS )NÚ zinstance-idz	iid-dsovfzcom.vmware.guestInfoZisoTz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vdZdefaultsZseedfileÚcontentsr   r   ZnpÚnameZ	transfuncr   Z	seedfoundÚprotoZmd_seedr   r   r   Ú	_get_data+   s^    



zDataSourceOVF._get_datac             C   s
   d| j  S )Nzovf (%s))r   )r   r   r   r   Ú_get_subplatformm   s    zDataSourceOVF._get_subplatformc             C   s0   d| j krg S | j d }t|tƒr&|S |gS d S )Nzpublic-keys)r)   Ú
isinstanceÚlist)r   Zpksr   r   r   Úget_public_ssh_keysp   s    


z!DataSourceOVF.get_public_ssh_keysc             C   s   | j S )N)r   )r   r   r   r   Úget_config_obj|   s    zDataSourceOVF.get_config_objc             C   s   | j S )N)r   )r   r   r   r   Únetwork_config   s    zDataSourceOVF.network_configN)Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r   r0   r1   r4   r5   Úpropertyr6   r   r   r   r   r      s   	Br   c               @   s   e Zd Zdd„ ZdS )ÚDataSourceOVFNetc             C   s,   t j| |||ƒ tjj|jdƒ| _d| _d S )Nzovf-netúhttp://úhttps://)r<   r=   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   …   s    zDataSourceOVFNet.__init__N)r7   r8   r9   r   r   r   r   r   r;   „   s   r;   Fc             C   s  t | ƒ}i }i }d }dg}ddddg}dg}xÎ|jƒ D ]Â\}	}
|	dkrJd}	|	|kr\|
||	< q6|	|krn|
||	< q6|	|krÀ|rÀy$tj|
jƒ ƒ}t|ƒjdƒ||	< W qø tk
r¼   tj	d	ƒ Y qøX q6|	d
kr6ytj|
jƒ ƒ}W q6 tk
rö   |
jƒ }Y q6X q6W |||fS )NZpasswordr   zlocal-hostnamezpublic-keyszinstance-idznetwork-configZ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Úvalr6   r   r   r   r!   �   s4    

r!   c             C   sf   d}x\|D ]T}t jj| |ƒ}t jj|ƒr
ytj|ƒ}||fS  tk
r\   tjtd|ƒ Y q
X q
W dS )	Núovf-env.xmlúovf_env.xmlúOVF_ENV.XMLúOVF-ENV.XMLzFailed loading ovf file %sF)rG   rH   rI   rJ   )NF)	r   r   r   Úisfiler   Z	load_filerD   Úlogexcr'   )ÚdirnameZ	env_namesZfnameZfull_fnr-   r   r   r   r    ¬   s    

r    c             C   s    | sdS t | tƒstd|  ƒ‚tjj| ƒ} | jdƒrB| jdƒd
 } | jdƒr\| jdƒd } n| j	dƒdkrndS | svdS d}tj
jd|ƒ}tj|ƒ}|j| ƒ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éÿÿÿÿrO   )r2   ÚstrÚ
ValueErrorr   r   Únormpathr&   Ú	partitionÚsplitÚcountÚenvironrC   ÚreÚcompileÚmatch)ZdevnameZdefault_regexZdevname_regexZcdmatchr   r   r   Úmaybe_cdrom_device¹   s"    



rZ   Tc       
      C   sè   t jƒ }xT|jƒ D ]H\}}|d }|dkr0| r0qt|ƒs:q|d }t|ƒ\}}|dk	r|S qW | rhd}nd }dd„ t j|r‚d| nd ƒD ƒ}	xV|	D ]N}yt j|t|d�\}}W n$ t jk
rÒ   tj	d	|ƒ w’Y nX |dk	r’|S q’W d S )
NÚfstypeZiso9660Z
mountpointFc             S   s   g | ]}t |ƒr|‘qS r   )rZ   )Ú.0Údevr   r   r   ú
<listcomp>÷   s   z%transport_iso9660.<locals>.<listcomp>zTYPE=%s)Úmtypez%s not mountable as iso9660)
r   Úmountsr?   rZ   r    Zfind_devs_withZmount_cbZMountFailedErrorr'   r(   )
Zrequire_isor`   r]   Úinfor[   ZmpZ_fnamer-   r_   Zdevsr   r   r   r$   â   s2    
r$   c             C   s    | |g}t j |ƒ\}}|||fS )N)r   )ÚrpctoolÚargÚcmdÚstdoutÚstderrr   r   r   Úexec_vmware_rpctool  s    rg   c             C   s"   | d|g}t j |ƒ\}}|||fS )Nz--cmd)r   )rb   rc   rd   re   rf   r   r   r   Úexec_vmtoolsd  s    
rh   c              C   s  d\} }t jdƒ}t jdƒ}|r6|t } }tjd|ƒ |rT|sH|t } }tjd|ƒ | sftjdƒ d S dd„ }y
|| |ƒS  t jk
�r } z€|r¬| |kr¬tjtd|ƒ d S |s¾tj	d	ƒ d S ytj	d
ƒ ||tƒS  t jk
�r } ztjtd|ƒ W Y d d }~X nX W Y d d }~X nX d S )NÚvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc             S   s|   t jd| ƒ y(|| dƒ\}}}|r&|S t jd|ƒ d S  tjk
rv } z$|jdkrbt jd| |jƒ |‚W Y d d }~X nX d S )Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdoutrN   z%s exited with code %d)r'   ra   r(   r   ÚProcessExecutionErrorZ	exit_codeZwarning)rb   Ú
rpctool_fnrd   re   Ú_Ú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)NN)
r   Zwhichrg   r'   r(   rh   rj   r   rL   ra   )rb   rk   ri   Zvmware_rpctoolrn   rm   r   r   r   r#     s>    









.r#   c             C   s6   g }| j ƒ s|S x | jD ]}||ƒr|j|ƒ qW |S )N)ÚhasChildNodesZ
childNodesr"   )ZnodeZfilter_funcÚretZchildr   r   r   Ú
find_childY  s    rq   c       	      C   s¨   t j| ƒ}|jjdkrtdƒ‚|jjƒ s0tdƒ‚d}t|jdd„ ƒ}t|ƒdkrXtdƒ‚i }t|d d	d„ ƒ}x4|D ],}|jj	|d
ƒj
}|jj	|dƒj
}|||< qtW |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>p  s    z get_properties.<locals>.<lambda>r   zNo 'PropertySection'sc             S   s
   | j dkS )NZProperty)rr   )rs   r   r   r   rt   x  s    ÚkeyÚvalue)r   ZparseStringZdocumentElementrr   ÚXmlErrorro   rq   r%   Z
attributesZgetNamedItemNSrv   )	r-   ZdomZenvNsURIZpropSectionsrE   Z	propElemsÚelemru   rF   r   r   r   r>   c  s$    


r>   c               @   s   e Zd ZdS )rw   N)r7   r8   r9   r   r   r   r   rw   ƒ  s   rw   c             C   s   t j| tƒS )N)r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_list�  s    rz   c             C   s   | 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.
    )r   Úload)Údatar   r   r   rB   “  s    rB   )F)T)"Ú__doc__r@   Zloggingr   rW   Zxml.domr   Z	cloudinitr   r   r   r   Z	getLoggerr7   r'   r
   r   r;   r!   r    rZ   r$   rg   rh   r#   rq   r>   rD   rw   ZDEP_FILESYSTEMZDEP_NETWORKry   rz   rB   r   r   r   r   Ú<module>   s.   
i	
)
&E
 
