U
    ¯Adê?  ã                   @   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mZ d dlm	Z	m
Z
mZmZ e 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)Úlog)ÚnetÚsourcesÚsubpÚutilziid-dsopennebulaZnobodyú
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 | |||¡ d | _tj |jd¡| _d S )NZ
opennebula)r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dir)ÚselfZsys_cfgÚdistroÚpaths© r   úH/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr
   $   s    zDataSourceOpenNebula.__init__c                 C   s   t 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 d¡}| jg}| tƒ ¡ |D ]È}zLtj 	| j¡rht
|| j|d}n(| d¡rtjt
|| jd}t ||¡}W n\ tk
rª   Y qBY nF tk
rÎ } z|‚W 5 d }~X Y n" tjk
rî   t d|¡ Y nX |rB|}t d|¡  qqB|sdS |d	 }	t |	|g¡}	|  | d
¡| j d¡g¡| _| jtjkr\dS || _| d¡| _|	| _| d¡| _dS )Nzinstance-idÚ	parseuser©Úasuserz/dev)r   r   z%s was not mountablezfound datasource in %sFÚmetadataZDSMODEr   ú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   ÚdefaultsÚresultsr   r   Z
candidatesZcdevZpartially_applied_funcÚexcZmdr   r   r   Ú	_get_data-   s^    
  ÿ
ýÿ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 | ||¡S )NTF)r   r   ZDSMODE_NETWORKr	   Úget_hostname)r   ZfqdnZ
resolve_ipZmetadata_onlyr   r   r   r5   y   s
    z!DataSourceOpenNebula.get_hostnameN)FFF)Ú__name__Ú
__module__Ú__qualname__Zdsnamer
   r   r1   r2   Úpropertyr4   r5   r   r   r   r   r       s   =
r   c                   @   s   e Zd ZdS )r(   N©r6   r7   r8   r   r   r   r   r(   ‚   s   r(   c                   @   s   e Zd ZdS )r)   Nr:   r   r   r   r   r)   †   s   r)   c                   @   s€   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„ Zdd„ Zddd„Zdd„ ZdS ) ÚOpenNebulaNetworkNc                 C   s|   || _ |d krt|ƒ}t dd„ t| ¡ dd„ dD ƒ¡| _i | _| ¡ D ],\}}t 	d|¡}|rJ| 
d¡| j| ¡ < qJd S )Nc                 S   s   g | ]}|‘qS r   r   ©Ú.0Úkr   r   r   Ú
<listcomp>   s   ÿz.OpenNebulaNetwork.__init__.<locals>.<listcomp>c                 S   s   t  | d ¡S )Né   )r   Znatural_sort_key)r>   r   r   r   Ú<lambda>”   ó    z,OpenNebulaNetwork.__init__.<locals>.<lambda>)Úkeyz
^(.+)_MAC$r@   )ÚcontextÚget_physical_nics_by_macÚcollectionsÚOrderedDictÚsortedÚitemsÚifacesÚcontext_devnameÚreÚmatchÚgroupÚlower)r   rD   r   Zsystem_nics_by_macr>   ÚvÚmr   r   r   r
   ‹   s     þþÿzOpenNebulaNetwork.__init__c                 C   s"   d  dd„ | d¡dd … D ƒ¡S )NÚ.c                 S   s   g | ]}t t|d ƒƒ‘qS )é   )ÚstrÚint)r=   Úcr   r   r   r?   ¢   s     z,OpenNebulaNetwork.mac2ip.<locals>.<listcomp>ú:é   )r   Úsplit©r   Úmacr   r   r   Úmac2ip¡   s    zOpenNebulaNetwork.mac2ipc                 C   s   |   |¡ d¡d d S )NrR   r   z.0)r\   Ú
rpartitionrZ   r   r   r   Úmac2network¤   s    zOpenNebulaNetwork.mac2networkc                 C   s\   i }|   |dd¡ ¡ }| | j dd¡ ¡ ¡ |r:||d< |   |dd¡ ¡ }|rX||d< |S )NÚdnsÚ ZDNSÚ	addressesÚsearch_domainÚsearch)Ú	get_fieldrY   r!   rD   r    )r   ÚdevÚnameserversr_   rb   r   r   r   Úget_nameservers§   s    z!OpenNebulaNetwork.get_nameserversc                 C   s   |   |d¡S )NÚmtu©rd   ©r   re   r   r   r   Úget_mtu²   s    zOpenNebulaNetwork.get_mtuc                 C   s   |   |d|  |¡¡S )NZip)rd   r\   ©r   re   r[   r   r   r   Úget_ipµ   s    zOpenNebulaNetwork.get_ipc                 C   s<   g }|   |d¡}|r| |¡ |   |d¡}|r8| |¡ |S )NÚip6Úip6_ula)rd   Úappend)r   re   Ú
addresses6rn   ro   r   r   r   Úget_ip6¸   s    

zOpenNebulaNetwork.get_ip6c                 C   s   |   |dd¡S )NZip6_prefix_lengthZ64ri   rj   r   r   r   Úget_ip6_prefixÂ   s    z OpenNebulaNetwork.get_ip6_prefixc                 C   s   |   |d¡S )NÚgatewayri   rj   r   r   r   Úget_gatewayÅ   s    zOpenNebulaNetwork.get_gatewayc                 C   s   |   |d|   |d¡¡S )NZip6_gatewayÚgateway6ri   rj   r   r   r   Úget_gateway6È   s
      
ÿzOpenNebulaNetwork.get_gateway6c                 C   s   |   |dd¡S )NÚmaskz255.255.255.0ri   rj   r   r   r   Úget_maskÐ   s    zOpenNebulaNetwork.get_maskc                 C   s   |   |d|  |¡¡S )Nr-   )rd   r^   rl   r   r   r   Úget_networkÓ   s    zOpenNebulaNetwork.get_networkc                 C   s*   | j  d ||f¡ ¡ ¡}|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.Ú_)Nr`   )rD   r    r   Úupper)r   re   ÚnameÚdefaultÚvalr   r   r   rd   Ö   s    þÿÿ	zOpenNebulaNetwork.get_fieldc                    s6  i }d|d< i |d< i }| j  ¡ D ]\}}| ¡ }| j ||¡}i }d|i|d< g |d< |  |¡}tt |¡ƒ}|d  	|  
||¡d | ¡ |  |¡}	|	rÄ|  |¡‰ |d  ‡ fdd	„|	D ƒ¡ |  |¡}
|
rÚ|
|d
< |  |¡}|rð||d< |  |¡}|r||d< |  |¡}|r ||d< |||< q"||d< |S )NrX   ÚversionÚ	ethernetsZ
macaddressrM   ra   ú/c                    s   g | ]}|d  ˆ  ‘qS )r‚   r   )r=   Úi©Zprefix6r   r   r?     s     z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>Zgateway4rv   rf   rh   )rJ   rI   rO   rK   r    ry   rT   r   Zipv4_mask_to_net_prefixrp   rm   rr   rs   r!   ru   rw   rg   rk   )r   Znetconfr   r[   re   Zc_devZdevconfrx   Úprefixrq   rt   rv   rf   rh   r   r„   r   Úgen_confæ   sD    


ÿ




zOpenNebulaNetwork.gen_conf)N)N)r6   r7   r8   r
   r\   r^   rg   rk   rm   rr   rs   ru   rw   ry   rz   rd   r†   r   r   r   r   r;   Š   s   


r;   c                  C   s@   g } dD ]2}t  |¡}| ¡  |D ]}|| kr"|  |¡ q"q| S )zE
    Return a list of devices that may contain the context disk.
    )zLABEL=CONTEXTzLABEL=CDROMzTYPE=iso9660)r   Zfind_devs_withÚsortrp   )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 d¡}dd	„ }d
| ||ƒ d|   d
 ||ƒ d }	g }
|d k	r¤||ƒ}
|
 |¡ tj|
|	d\}}d}i }i }d }|dd… }| d¡D ]š}zT| dd¡\}}||kr|||< n,||kr<||ks4| 	|¡|kr<|||< W qæ t
k
r~   |dkr\‚ |d krl|}n||krz|}Y qæX qæ|S )NÚbashz-ec                 S   s   g | ]}d | ‘qS )z${!%s*}r   )r=   Úxr   r   r   r?   A  s     z&parse_shell_config.<locals>.<listcomp>r{   Ú
)z__v="";r`   c                 S   s   d  ddd  | ¡ dddf¡S )Nr   zprintf "%s\0" _start_zfor __v in %s; doú z%   printf "%s=%s\0" "$__v" "${!__v}";Zdoner`   )r   )Zvlistr   r   r   Ú
varprinterO  s    ûÿz&parse_shell_config.<locals>.varprinterz
unset IFS
z{
%s

:
} > /dev/null
)Údata)ZEPOCHREALTIMEZEPOCHSECONDSZRANDOMZLINENOZSECONDSr{   ZSRANDOMZ__vr   éÿÿÿÿú ú=r@   Z_start_)Ú
isinstancerT   r   ÚstringZascii_lettersr   r!   r   rY   r    Ú
ValueError)ÚcontentZkeylistrŽ   r   Zswitch_user_cbZallvarsZ
keylist_inZsetupr’   ZbcmdÚcmdÚoutputZ_errorZexcludedZpresetZretÚtargetÚlinerC   r   r   r   r   Úparse_shell_config3  st    
ÿÿþýüûúÿ





ÿÿ


rŸ   c              
   C   s„  i }t D ]&}tj | |¡}tj |¡r|||< q|sDtd| df ƒ‚i }di dœ}d|kr8|dk	r¨zt |¡ W n4 tk
r¦ } zt	dj
|dƒ|‚W 5 d}~X Y nX z(tj | d¡}	t |	¡}
t|
|d}W nd tjk
r } zt	d	| ƒ|‚W 5 d}~X Y n2 tk
r4 } ztd
| ƒ|‚W 5 d}~X Y nX ntdƒ‚|sJ|S ||d< d}d|krfd}nd|krtd}|rž| |¡ ¡ }dd„ |D ƒ|d d< dD ]&}||kr¢|| |d d<  qÊq¢d|krâ|d |d< nd|krø|d |d< d|krV| d| d¡¡}|dkrVzt |d ¡|d< W n  tk
rT   t d¡ Y nX dd„ |D ƒ}|r€t||ƒ}| ¡ |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   r   z'configured user '{user}' does not existr‹   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| d ¡s|‘qS )ú#)Úlenr%   )r=   rž   r   r   r   r?   ×  s     
 z)read_context_disk_dir.<locals>.<listcomp>zpublic-keys)ZSET_HOSTNAMEZHOSTNAMEZ	PUBLIC_IPZ	IP_PUBLICZETH0_IPzlocal-hostnameZ	USER_DATAr   ZUSERDATAZUSERDATA_ENCODINGZUSER_DATA_ENCODINGÚbase64z"Failed base64 decoding of userdatac                 S   s   g | ]}t  d |¡r|‘qS )z^ETH\d+_IP.*$)rL   rM   r<   r   r   r   r?   ö  s      r   )ÚCONTEXT_DISK_FILESr   r   r   Úisfiler(   ÚpwdÚgetpwnamÚKeyErrorr)   Úformatr   Z	load_filerŸ   r   ZProcessExecutionErrorÚIOErrorr    Ú
splitlinesZb64dÚ	TypeErrorr*   r+   r;   r†   )Z
source_dirr   r   ÚfoundZafÚfnrD   r/   Úer   rš   Zssh_key_varÚlinesr>   ÚencodingZipaddr_keysZonetr   r   r   r$   ž  s”    


ÿÿü
ÿþÿþ

ÿ




 ÿ

r$   c                    s"   t  ¡ }t‡ fdd„| ¡ D ƒƒS )Nc                    s$   g | ]\}}ˆ j  |¡r||f‘qS r   )Z
networkingZis_physical)r=   rQ   Ún©r   r   r   r?     s      z,get_physical_nics_by_mac.<locals>.<listcomp>)r   Zget_interfaces_by_macÚdictrI   )r   r‰   r   r²   r   rE   þ  s    ÿrE   c                 C   s   t  | t¡S r3   )r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_list  s    rµ   )NNNN)N)"rF   r&   r   r¥   rL   r˜   Z	cloudinitr   Zloggingr   r   r   r   Z	getLoggerr6   r*   r   r   r£   r	   r   Ú	Exceptionr(   r)   r;   r"   r   rŸ   r$   rE   ZDataSourceOpenNebulaNetZDEP_FILESYSTEMr´   rµ   r   r   r   r   Ú<module>   s:   
b        ÿ
k
`
ÿ