
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me?                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZmZ ejeZdZdZdgZG dd de
jZG dd	 d	eZG d
d deZG dd dZdd Zdd ZdddZdddZdd ZeZee
jffgZ dd Z!dS )    N)atomic_helpernetsourcessubputilziid-dsopennebulaZnobodyz
context.shc               @   sF   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dddZ
dS )DataSourceOpenNebulaZ
OpenNebulac             C   s.   t jj| ||| d | _tjj|jd| _d S )NZ
opennebula)r   
DataSource__init__seedospathjoinseed_dir)selfZsys_cfgdistropaths r   */usr/lib/python3.6/DataSourceOpenNebula.pyr	   $   s    zDataSourceOpenNebula.__init__c             C   s   t jj| }d|| j| jf S )Nz%s [seed=%s][dsmode=%s])r   r   __str__r
   dsmode)r   rootr   r   r   r   )   s    zDataSourceOpenNebula.__str__c       
      C   s  dt i}d }d }t}d| jkr*| jjd}| jg}|jt  x|D ]}yLtjj	| jrjt
|| j|d}n(|jdrtjt
|| jd}tj||}W nZ tk
r   wDY nF tk
r } z
|W Y d d }~X n" tjk
r   tjd| Y nX |rD|}tjd| P qDW |sdS |d	 }	tj|	|g}	| j|jd
| jjdg| _| jtjkrZdS || _|jd| _|	| _|jd| _dS )Nzinstance-id	parseuser)asuserz/dev)r   r   z%s was not mountablezfound datasource in %sFmetadataZDSMODEr   znetwork-interfacesuserdataT) DEFAULT_IIDDEFAULT_PARSEUSERZds_cfggetr   extendfind_candidate_devsr   r   isdirread_context_disk_dirr   
startswith	functoolspartialr   Zmount_cbNonContextDiskDirBrokenContextDiskDirZMountFailedErrorLOGwarningdebugZmergemanydictZ_determine_dsmoder   r   ZDSMODE_DISABLEDr
   networkr   Zuserdata_raw)
r   Zdefaultsresultsr
   r   Z
candidatesZcdevZpartially_applied_funcexcZmdr   r   r   	_get_data-   sT    



zDataSourceOpenNebula._get_datac             C   s$   | j | jkrd}nd}d|| jf S )z/Return the subplatform metadata source details.zseed-dirzconfig-diskz%s (%s))r   r
   )r   Zsubplatform_typer   r   r   _get_subplatformj   s    z%DataSourceOpenNebula._get_subplatformc             C   s   | j d k	r| j S d S d S )N)r*   )r   r   r   r   network_configr   s    
z#DataSourceOpenNebula.network_configFc             C   s.   |d kr| j tjkrd}nd}tjj| ||S )NTF)r   r   ZDSMODE_NETWORKr   get_hostname)r   ZfqdnZ
resolve_ipZmetadata_onlyr   r   r   r0   y   s
    z!DataSourceOpenNebula.get_hostnameN)FFF)__name__
__module____qualname__Zdsnamer	   r   r-   r.   propertyr/   r0   r   r   r   r   r       s   =r   c               @   s   e Zd ZdS )r%   N)r1   r2   r3   r   r   r   r   r%      s   r%   c               @   s   e Zd ZdS )r&   N)r1   r2   r3   r   r   r   r   r&      s   r&   c               @   sp   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd ZdddZdd ZdS )OpenNebulaNetworkNc             C   s   || _ |d krt|}tjdd t|j dd dD | _i | _x8|j D ],\}}tj	d|}|rL|j
d| j|j < qLW d S )Nc             S   s   g | ]}|qS r   r   ).0kr   r   r   
<listcomp>   s   z.OpenNebulaNetwork.__init__.<locals>.<listcomp>c             S   s   t j| d S )N   )r   Znatural_sort_key)r7   r   r   r   <lambda>   s    z,OpenNebulaNetwork.__init__.<locals>.<lambda>)keyz
^(.+)_MAC$r9   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   r<   r   Zsystem_nics_by_macr7   vmr   r   r   r	      s    zOpenNebulaNetwork.__init__c             C   s"   dj dd |jddd  D S )N.c             S   s   g | ]}t t|d qS )   )strint)r6   cr   r   r   r8      s    z,OpenNebulaNetwork.mac2ip.<locals>.<listcomp>:   )r   split)r   macr   r   r   mac2ip   s    zOpenNebulaNetwork.mac2ipc             C   s\   i }| j |ddj }|j| jjddj  |r:||d< | j |ddj }|rX||d< |S )Ndns ZDNS	addressessearch_domainsearch)	get_fieldrQ   r   r<   r   )r   devnameserversrT   rW   r   r   r   get_nameservers   s    z!OpenNebulaNetwork.get_nameserversc             C   s   | j |dS )Nmtu)rY   )r   rZ   r   r   r   get_mtu   s    zOpenNebulaNetwork.get_mtuc             C   s   | j |d| j|S )NZip)rY   rS   )r   rZ   rR   r   r   r   get_ip   s    zOpenNebulaNetwork.get_ipc             C   s<   g }| j |d}|r|j| | j |d}|r8|j| |S )Nip6ip6_ula)rY   append)r   rZ   
addresses6r`   ra   r   r   r   get_ip6   s    

zOpenNebulaNetwork.get_ip6c             C   s   | j |ddS )NZip6_prefix_lengthZ64)rY   )r   rZ   r   r   r   get_ip6_prefix   s    z OpenNebulaNetwork.get_ip6_prefixc             C   s   | j |dS )Ngateway)rY   )r   rZ   r   r   r   get_gateway   s    zOpenNebulaNetwork.get_gatewayc             C   s   | j |d| j |dS )NZip6_gatewaygateway6)rY   )r   rZ   r   r   r   get_gateway6   s    zOpenNebulaNetwork.get_gateway6c             C   s   | j |ddS )Nmaskz255.255.255.0)rY   )r   rZ   r   r   r   get_mask   s    zOpenNebulaNetwork.get_maskc             C   s*   | j jdj||fj }|dkr&|S |S )zreturn the field name in context for device dev.

        context stores <dev>_<NAME> (example: eth0_DOMAIN).
        an empty string for value will return default._NrU   )NrU   )r<   r   r   upper)r   rZ   namedefaultvalr   r   r   rY      s
    zOpenNebulaNetwork.get_fieldc                s<  i }d|d< i |d< i }x| j j D ]\}}|j }| jj||}i }d|i|d< g |d< | j|}ttj|}|d j	| j
||d |  | j|}	|	r| j| |d j fdd	|	D  | j|}
|
r|
|d
< | j|}|r||d< | j|}|r||d< | j|}|r$||d< |||< q&W ||d< |S )NrP   version	ethernetsZ
macaddressrE   rV   /c                s   g | ]}|d    qS )rs   r   )r6   i)prefix6r   r   r8      s    z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>Zgateway4rh   r[   r]   )rB   rA   rG   rC   r   rk   rL   r   Zipv4_mask_to_net_prefixrb   r_   rd   re   r   rg   ri   r\   r^   )r   Znetconfrr   rR   rZ   Zc_devZdevconfrj   prefixrc   rf   rh   r[   r]   r   )ru   r   gen_conf   sB    






zOpenNebulaNetwork.gen_conf)N)N)r1   r2   r3   r	   rS   r\   r^   r_   rd   re   rg   ri   rk   rY   rw   r   r   r   r   r5      s   


r5   c              C   sH   g } x>dD ]6}t j|}|j  x|D ]}|| kr&| j| q&W q
W | S )zE
    Return a list of devices that may contain the context disk.
    LABEL=CONTEXTLABEL=CDROMTYPE=iso9660)rx   ry   rz   )r   Zfind_devs_withsortrb   )Zcombinedfdevsdr   r   r   r     s    


r   c             C   s
   dd| gS )NZsudoz-ur   )userr   r   r   switch_user_cmd)  s    r   c             C   s  t |tr|g}n|d kr"ddg}|d kr.t}dd tjd D }|}|d krV|}g }djd}d	d
 }d| || d|   d || d }	g }
|d k	r||}
|
j| tj|
|	d\}}d}i }i }d }|dd }x|jdD ]}yT|jdd\}}||kr|||< n,||kr>||ks6|j	||kr>|||< W q t
k
r   |dkr^ |d krn|}n||kr||}Y qX qW |S )Nbashz-ec             S   s   g | ]}d | qS )z${!%s*}r   )r6   xr   r   r   r8   ;  s    z&parse_shell_config.<locals>.<listcomp>rl   
__v="";rU   c             S   s   dj dddj |  dddfS )Nr   zprintf "%s\0" _start_zfor __v in %s; do z%   printf "%s=%s\0" "$__v" "${!__v}";donerU   )r   )Zvlistr   r   r   
varprinterI  s    z&parse_shell_config.<locals>.varprinterz
unset IFS
z{
%s

:
} > /dev/null
)dataEPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDSSRANDOM__vr   r9    =Z_start_)r   rU   )r   r   r   r   r   rl   r   r   )
isinstancerL   r   stringZascii_lettersr   r   r   rQ   r   
ValueError)contentZkeylistr   r   Zswitch_user_cbZallvarsZ
keylist_inZsetupr   ZbcmdcmdoutputZ_errorZexcludedZpresetrettargetliner;   rp   r   r   r   parse_shell_config-  sb    
 (
       





r   c          '   C   s  i }x.t D ]&}tjj| |}tjj|r
|||< q
W |sHtd| df i }di d}d|kr<|dk	rytj| W n4 tk
r } zt	dj
|d|W Y dd}~X nX y(tjj| d}	tj|	}
t|
|d}W nd tjk
r } zt	d	| |W Y dd}~X n2 tk
r8 } ztd
| |W Y dd}~X nX ntd|sN|S ||d< d}d|krjd}nd|krxd}|r|j|j }dd |D |d d< x*d!D ]"}||kr|| |d d< P qW d|kr|d |d< nd|kr|d |d< d|krZ|jd|jd}|dkrZytj|d |d< W n  tk
rX   tjd Y nX dd |D }|rt||}|j |d < |S )"z
    read_context_disk_dir(source_dir):
    read source_dir and return a tuple with metadata dict and user-data
    string populated.  If not a valid dir, raise a NonContextDiskDir
    z%s: %szno files foundN)r   r   z
context.shz'configured user '{user}' does not exist)r   )r   zError processing context.sh: %szError reading context.sh: %szMissing context.shr   ZSSH_KEYZSSH_PUBLIC_KEYc             S   s$   g | ]}t |r|jd  r|qS )#)lenr"   )r6   r   r   r   r   r8     s    z)read_context_disk_dir.<locals>.<listcomp>zpublic-keysSET_HOSTNAMEHOSTNAME	PUBLIC_IP	IP_PUBLICETH0_IPzlocal-hostnameZ	USER_DATAr   ZUSERDATAZUSERDATA_ENCODINGZUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdatac             S   s   g | ]}t jd |r|qS )z^ETH\d+_IP.*$)rD   rE   )r6   r7   r   r   r   r8     s    znetwork-interfaces)r   r   r   r   r   )CONTEXT_DISK_FILESr   r   r   isfiler%   pwdgetpwnamKeyErrorr&   formatr   Z	load_filer   r   ZProcessExecutionErrorIOErrorr   
splitlinesr   Zb64d	TypeErrorr'   r(   r5   rw   )Z
source_dirr   r   foundZaffnr<   r+   er   r   Zssh_key_varlinesr7   encodingZipaddr_keysZonetr   r   r   r!     s~    












r!   c                s"   t j }t fdd|j D S )Nc                s$   g | ]\}} j j|r||fqS r   )Z
networkingZis_physical)r6   rI   n)r   r   r   r8     s    z,get_physical_nics_by_mac.<locals>.<listcomp>)r   Zget_interfaces_by_macdictrA   )r   r}   r   )r   r   r=     s    r=   c             C   s   t j| tS )N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list	  s    r   )NNNN)N)"r>   r#   Zloggingr   r   rD   r   Z	cloudinitr   r   r   r   r   Z	getLoggerr1   r'   r   r   r   r   r   	Exceptionr%   r&   r5   r   r   r   r!   r=   ZDataSourceOpenNebulaNetZDEP_FILESYSTEMr   r   r   r   r   r   <module>   s0   
b 
j
`