
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me2                 @   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 |rt|d\}}}	|| _d|kr|d r|d | _|j| t|dkrd	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|ry$tj|
j }t|jd||	< W q tk
r   tj	d	 Y qX 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 )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.*)ZCLOUD_INIT_CDROM_DEV_REGEXNrO   )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|rd| nd D }	xV|	D ]N}yt j|t|d\}}W n$ t jk
r   tj	d	| wY nX |dk	r|S qW 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rtjtd| d S |st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
 
