509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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ƒr’t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 )z¤return 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 qèX qèW |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	r¬y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 �q¨W 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 ƒ}|�r„t||ƒ}|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
`