U
    L¬÷dQ?  ã                   @   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	 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)Úatomic_helper)Ú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_subplatformk   s    z%DataSourceOpenNebula._get_subplatformc                 C   s   | j d k	r| j S d S d S ©N)r.   )r   r   r   r   Únetwork_configs   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   r6   z   s
    z!DataSourceOpenNebula.get_hostnameN)FFF)Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r   r2   r3   Úpropertyr5   r6   r   r   r   r   r	   !   s   =
r	   c                   @   s   e Zd ZdS )r)   N©r7   r8   r9   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                   @   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 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$rA   )ÚcontextÚget_physical_nics_by_macÚcollectionsÚOrderedDictÚsortedÚitemsÚifacesÚcontext_devnameÚreÚmatchÚgroupÚlower)r   rE   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\   i }|   |dd¡ ¡ }| | j dd¡ ¡ ¡ |r:||d< |   |dd¡ ¡ }|rX||d< |S )NÚdnsÚ ZDNSÚ	addressesÚsearch_domainÚsearch)Ú	get_fieldrZ   r"   rE   r!   )r   ÚdevÚnameserversr]   r`   r   r   r   Úget_nameservers¥   s    z!OpenNebulaNetwork.get_nameserversc                 C   s   |   |d¡S )NÚmtu©rb   ©r   rc   r   r   r   Úget_mtu°   s    zOpenNebulaNetwork.get_mtuc                 C   s   |   |d|  |¡¡S )NZip)rb   r\   )r   rc   r[   r   r   r   Úget_ip³   s    zOpenNebulaNetwork.get_ipc                 C   s<   g }|   |d¡}|r| |¡ |   |d¡}|r8| |¡ |S )NÚip6Úip6_ula)rb   Úappend)r   rc   Ú
addresses6rk   rl   r   r   r   Úget_ip6¶   s    

zOpenNebulaNetwork.get_ip6c                 C   s   |   |dd¡S )NZip6_prefix_lengthZ64rg   rh   r   r   r   Úget_ip6_prefixÀ   s    z OpenNebulaNetwork.get_ip6_prefixc                 C   s   |   |d¡S )NÚgatewayrg   rh   r   r   r   Úget_gatewayÃ   s    zOpenNebulaNetwork.get_gatewayc                 C   s   |   |d|   |d¡¡S )NZip6_gatewayÚgateway6rg   rh   r   r   r   Úget_gateway6Æ   s
      
ÿzOpenNebulaNetwork.get_gateway6c                 C   s   |   |dd¡S )NÚmaskz255.255.255.0rg   rh   r   r   r   Úget_maskÎ   s    zOpenNebulaNetwork.get_maskc                 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^   )rE   r!   r   Úupper)r   rc   ÚnameÚdefaultÚvalr   r   r   rb   Ñ   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 )NrY   ÚversionÚ	ethernetsZ
macaddressrN   r_   ú/c                    s   g | ]}|d  ˆ  ‘qS )r~   r   )r>   Úi©Zprefix6r   r   r@   þ   s     z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>Zgateway4rs   rd   rf   )rK   rJ   rP   rL   r!   rv   rU   r   Zipv4_mask_to_net_prefixrm   rj   ro   rp   r"   rr   rt   re   ri   )r   Znetconfr}   r[   rc   Zc_devZdevconfru   Úprefixrn   rq   rs   rd   rf   r   r€   r   Úgen_confá   sD    


ÿ




zOpenNebulaNetwork.gen_conf)N)N)r7   r8   r9   r   r\   re   ri   rj   ro   rp   rr   rt   rv   rb   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Úsortrm   )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@   <  s     z&parse_shell_config.<locals>.<listcomp>rw   Ú
)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   Ú
varprinterJ  s    ûÿz&parse_shell_config.<locals>.varprinterz
unset IFS
z{
%s

:
} > /dev/null
)Údata)ZEPOCHREALTIMEZEPOCHSECONDSZRANDOMZLINENOZSECONDSrw   ZSRANDOMZ__vr   éÿÿÿÿú ú=rA   Z_start_)Ú
isinstancerU   r‰   ÚstringZascii_lettersr   r"   r   rZ   r!   Ú
ValueError)ÚcontentZkeylistrŠ   r   Zswitch_user_cbZallvarsZ
keylist_inZsetuprŽ   ZbcmdÚcmdÚoutputZ_errorZexcludedZpresetZretÚtargetÚlinerD   r{   r   r   r   Úparse_shell_config.  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.*$)rM   rN   r=   r   r   r   r@   ñ  s      r   )ÚCONTEXT_DISK_FILESr   r   r   Úisfiler)   ÚpwdÚgetpwnamÚKeyErrorr*   Úformatr   Z	load_filer›   r   ZProcessExecutionErrorÚIOErrorr!   Ú
splitlinesr   Zb64dÚ	TypeErrorr+   r,   r<   r‚   )Z
source_dirr   r   ÚfoundZafÚfnrE   r0   Ú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>   rR   Ún©r   r   r   r@   ü  s      z,get_physical_nics_by_mac.<locals>.<listcomp>)r   Zget_interfaces_by_macÚdictrJ   )r   r…   r   r®   r   rF   ù  s    ÿrF   c                 C   s   t  | t¡S r4   )r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_list
  s    r±   )NNNN)N)#rG   r'   r   r¡   rM   r”   Z	cloudinitr   r   Zloggingr   r   r   r   Z	getLoggerr7   r+   r   r    rŸ   r
   r	   Ú	Exceptionr)   r*   r<   r#   r‰   r›   r%   rF   ZDataSourceOpenNebulaNetZDEP_FILESYSTEMr°   r±   r   r   r   r   Ú<module>   s<   
b        ÿ
k
`
ÿ