o
    x[hª>  ã                   @   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Zd dlm	Z	m
Z
mZmZmZ e e¡ZdZdZdgZd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„ 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-dsopennebulaÚnobodyú
context.sh)ÚEPOCHREALTIMEÚEPOCHSECONDSÚRANDOMÚLINENOÚSECONDSÚ_ÚSRANDOMÚ__vc                   @   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 )ÚDataSourceOpenNebulaÚ
OpenNebulac                 C   s4   t j | |||¡ d | _tj |jd¡| _d | _d S )NÚ
opennebula)	r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚnetwork)ÚselfÚ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"   5   s   zDataSourceOpenNebula.__str__c           
      C   sl  dt i}d }d }t}d| jv r| j d¡}| jg}| tƒ ¡ |D ]Z}z&tj 	| j¡r4t
|| j|d�}n| d¡rHtjt
|| jd�}t ||¡}W n% tyR   Y q! ty_ } z|‚d }~w tjyn   t d|¡ Y nw |r{|}t d|¡  nq!|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ÚmetadataÚDSMODEr#   únetwork-interfacesÚuserdataT) ÚDEFAULT_IIDÚDEFAULT_PARSEUSERÚds_cfgÚgetr   ÚextendÚfind_candidate_devsr   r   ÚisdirÚread_context_disk_dirr   Ú
startswithÚ	functoolsÚpartialr   Úmount_cbÚNonContextDiskDirÚBrokenContextDiskDirÚMountFailedErrorÚLOGÚwarningÚdebugÚmergemanydictÚ_determine_dsmoder#   r   ÚDSMODE_DISABLEDr   r   r(   Úuserdata_raw)
r   ÚdefaultsÚresultsr   r%   Ú
candidatesÚcdevÚpartially_applied_funcÚexcÚmdr    r    r!   Ú	_get_data9   sb   
ÿ
ý€€ÿýÿzDataSourceOpenNebula._get_datac                 C   s$   | j | jv 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   Úsubplatform_typer    r    r!   Ú_get_subplatformv   s   z%DataSourceOpenNebula._get_subplatformc                 C   s   | j d ur| j S d S ©N)r   )r   r    r    r!   Únetwork_config~   s   
z#DataSourceOpenNebula.network_configFc                 C   s.   |d u r| j tjkrd}nd}tj | ||¡S )NTF)r#   r   ÚDSMODE_NETWORKr   Úget_hostname)r   ÚfqdnÚ
resolve_ipÚmetadata_onlyr    r    r!   rO   …   s
   z!DataSourceOpenNebula.get_hostnameN)FFF)Ú__name__Ú
__module__Ú__qualname__Údsnamer   r"   rI   rK   ÚpropertyrM   rO   r    r    r    r!   r   +   s    =
r   c                   @   ó   e Zd ZdS )r8   N©rS   rT   rU   r    r    r    r!   r8   Ž   ó    r8   c                   @   rX   )r9   NrY   r    r    r    r!   r9   ’   rZ   r9   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 u rt|ƒ}t dd„ t| ¡ dd„ d�D ƒ¡| _i | _| ¡ D ]\}}t 	d|¡}|r;| 
d¡| j| ¡ < q%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  | d ¡S )Né   )r   Únatural_sort_key)r^   r    r    r!   Ú<lambda>    s    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   Ú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¡ ¡ }|r,||d< |S )NÚdnsÚ ÚDNSÚ	addressesÚsearch_domainÚsearch)Ú	get_fieldrz   r0   rd   r/   )r   ÚdevÚnameserversr}   r�   r    r    r!   Úget_nameservers°   s   z!OpenNebulaNetwork.get_nameserversc                 C   ó   |   |d¡S )NÚmtu©rƒ   ©r   r„   r    r    r!   Úget_mtu»   ó   zOpenNebulaNetwork.get_mtuc                 C   s   |   |d|  |¡¡S )NÚip)rƒ   r|   )r   r„   r{   r    r    r!   Úget_ip¾   s   zOpenNebulaNetwork.get_ipc                 C   s<   g }|   |d¡}|r| |¡ |   |d¡}|r| |¡ |S )NÚip6Úip6_ula)rƒ   Úappend)r   r„   Ú
addresses6r�   r�   r    r    r!   Úget_ip6Á   s   

zOpenNebulaNetwork.get_ip6c                 C   ó   |   |dd¡S )NÚip6_prefix_lengthÚ64r‰   rŠ   r    r    r!   Úget_ip6_prefixË   ó   z OpenNebulaNetwork.get_ip6_prefixc                 C   r‡   )NÚgatewayr‰   rŠ   r    r    r!   Úget_gatewayÎ   rŒ   zOpenNebulaNetwork.get_gatewayc                 C   s   |   |d|   |d¡¡S )NÚip6_gatewayÚgateway6r‰   rŠ   r    r    r!   Úget_gateway6Ñ   s   ÿzOpenNebulaNetwork.get_gateway6c                 C   r”   )NÚmaskz255.255.255.0r‰   rŠ   r    r    r!   Úget_maskÙ   r˜   zOpenNebulaNetwork.get_maskc                 C   s*   | j  d ||f¡ ¡ ¡}|dv 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.r   )Nr~   )rd   r/   r   Úupper)r   r„   ÚnameÚdefaultÚvalr    r    r!   rƒ   Ü   s   þÿú	zOpenNebulaNetwork.get_fieldc                    s0  i }d|d< i |d< i }| j  ¡ D ]€\}}| ¡ }| j ||¡}i }d|i|d< g |d< |  |¡}tt |¡ƒ}|d  	|  
||¡d | ¡ |  |¡}	|	ra|  |¡‰ |d  ‡ fdd	„|	D ƒ¡ |  |¡}
|
rl|
|d
< |  |¡}|rw||d< |  |¡}|r‚||d< |  |¡}|r�||d< |||< q||d< |S )Nry   ÚversionÚ	ethernetsÚ
macaddressrm   r€   ú/c                    s   g | ]}|d  ˆ  ‘qS )r§   r    )r]   Úi©Úprefix6r    r!   r_   	  s    z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>Úgateway4rœ   r…   rˆ   )rj   ri   ro   rk   r/   rŸ   ru   r   Úipv4_mask_to_net_prefixr‘   rŽ   r“   r—   r0   rš   r�   r†   r‹   )r   Únetconfr¥   r{   r„   Úc_devÚdevconfrž   Úprefixr’   r™   rœ   r…   rˆ   r    r©   r!   Úgen_confì   sD   


ÿ




zOpenNebulaNetwork.gen_confrL   )rS   rT   rU   r   r|   r†   r‹   rŽ   r“   r—   rš   r�   rŸ   rƒ   r±   r    r    r    r!   r[   –   s    


r[   c                  C   s@   g } dD ]}t  |¡}| ¡  |D ]}|| vr|  |¡ qq| S )zE
    Return a list of devices that may contain the context disk.
    )zLABEL=CONTEXTzLABEL=CDROMzTYPE=iso9660)r   Úfind_devs_withÚsortr‘   )ÚcombinedÚfÚdevsÚdr    r    r!   r1   &  s   

€þr1   c                 C   s
   dd| gS )NÚsudoz-ur    ©Úuserr    r    r!   Úswitch_user_cmd5  s   
r»   c                   C   s
   t  d¡S )zDprint the shell environment variables within delimiters to be parsedzŸ
        printf "%s\0" _start_
        [ $0 != 'sh' ] && set -o posix
        set
        [ $0 != 'sh' ] && set +o posix
        printf "%s\0" _start_
        )ÚtextwrapÚdedentr    r    r    r!   Ú
varprinter9  s   ÿr¾   c                 C   s  d|   ¡ v rt d¡ tƒ d|   tƒ  d }g }|dur!t|ƒ}| ddg¡ tj||d�j}i }| d	¡d
d… }|d |d }}t	dd„ t
 |¡D ƒƒ}	t	dd„ t
 |¡D ƒƒ}
t|	 ¡ ƒ t|
 ¡ ƒ¡D ]}|tv rpqi|
 |¡}|dur„||	 |¡kr„|||< qi|S )a<  run content and return environment variables which changed

    WARNING: the special variable _start_ is used to delimit content

    a context.sh that defines this variable might break in unexpected
    ways

    compatible with posix shells such as dash and ash and any shell
    which supports `set -o posix`
    s   _start_ zYUser defined _start_ variable in context.sh, this may breakcloud-init in unexpected ways.z{
%s

:
} > /dev/null
Ú
NÚshz-e)Údataz_start_ r`   r   ry   c                 s   ó   � | ]
}|j d dd�V  qdS ©ú=r`   )ÚmaxsplitN©rz   ©r]   Úvariabler    r    r!   Ú	<genexpr>}  ó   € 
ÿz%parse_shell_config.<locals>.<genexpr>c                 s   rÂ   rÃ   rÆ   rÇ   r    r    r!   rÉ   €  rÊ   )Úencoder;   r<   r¾   r»   r0   r   Ústdoutrz   ÚdictÚshlexÚsetÚkeysÚunionÚEXCLUDED_VARSr/   )Úcontentr'   ÚbcmdÚcmdÚoutputÚretÚsectionsÚbeforeÚafterÚpre_envÚpost_envrc   Úvaluer    r    r!   Úparse_shell_configF  sD   ÿÿþýÿÿÿ
€rÞ   c              
   C   sJ  i }t D ]}tj | |¡}tj |¡r|||< q|s"td| df ƒ‚i }di dœ}d|v r‰|durNzt |¡ W n tyM } z	t	dj
|d�ƒ|‚d}~ww ztj | d¡}	t |	¡}
t|
|d�}W n* tjyv } zt	d	| ƒ|‚d}~w tyˆ } ztd
| ƒ|‚d}~ww tdƒ‚|s‘|S ||d< d}d|v ržd}nd|v r¤d}|r¸| |¡ ¡ }dd„ |D ƒ|d d< dD ]}||v rÊ|| |d d<  nqºd|v rÖ|d |d< n
d|v rà|d |d< d|v �r| d| d¡¡}|dk�rzt |d ¡|d< W n t�y   t d¡ Y nw 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(   ÚSSH_KEYÚSSH_PUBLIC_KEYc                 S   s"   g | ]}t |ƒr| d ¡s|‘qS )ú#)Úlenr4   )r]   Úliner    r    r!   r_   Æ  s    ÿÿÿz)read_context_disk_dir.<locals>.<listcomp>zpublic-keys)ÚSET_HOSTNAMEÚHOSTNAMEÚ	PUBLIC_IPÚ	IP_PUBLICÚETH0_IPzlocal-hostnameÚ	USER_DATAr+   ÚUSERDATAÚUSERDATA_ENCODINGÚ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   Úisfiler8   ÚpwdÚgetpwnamÚKeyErrorr9   Úformatr   Úload_text_filerÞ   r   ÚProcessExecutionErrorÚIOErrorr/   Ú
splitlinesr   Úb64dÚ	TypeErrorr;   r<   r[   r±   )Ú
source_dirr   r'   ÚfoundÚafÚfnrd   rC   Úer   rÓ   Ússh_key_varÚlinesr^   ÚencodingÚipaddr_keysÚonetr    r    r!   r3   �  s¢   €
ÿÿü€ÿ
ÿþ€ÿþ€ÿÿþ

ÿ
ÿ
r3   c                    s"   t  ¡ }t‡ fdd„| ¡ D ƒƒS )Nc                    s$   g | ]\}}ˆ j  |¡r||f‘qS r    )Ú
networkingÚis_physical)r]   rr   Ún©r   r    r!   r_   ð  s   $ z,get_physical_nics_by_mac.<locals>.<listcomp>)r   Úget_interfaces_by_macrÍ   ri   )r   r¶   r    r  r!   re   í  s   ÿre   c                 C   s   t  | t¡S rL   )r   Úlist_from_dependsÚdatasources)Údependsr    r    r!   Úget_datasource_listþ  rŒ   r  rL   )%rf   r5   Úloggingr   rð   rl   rÎ   r¼   Ú	cloudinitr   r   r   r   r   Ú	getLoggerrS   r;   r,   r-   rî   rÒ   r   r   Ú	Exceptionr8   r9   r[   r1   r»   r¾   rÞ   r3   re   ÚDataSourceOpenNebulaNetÚDEP_FILESYSTEMr
  r  r    r    r    r!   Ú<module>   s:   
c 

G`
ÿ