o
    x[hÌ  ã                   @   sô   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mZ d dlmZ d dlmZ e e¡Zeƒ 	d$dd„ƒZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zeƒ dd„ ƒZdd„ Zdd„ Zd%dd„Zdd„ Zd d!„ Z d"d#„ Z!dS )&é    N)Ú	lru_cache)Ú
exceptions)ÚdmiÚnetÚsubpÚ
url_helperÚutil)ÚNoDHCPLeaseError)ÚEphemeralDHCPv4c                 C   s¼   t dƒ}tƒ D ]T}z2t| |d|igd�� t|||||ƒ}	t |	¡}
t|
ƒ |
W  d   ƒ W   S 1 s5w   Y  W q ttj	t t
jfy[ } zt d|¡ |}W Y d }~qd }~ww |‚)NzFailed to DHCPÚurl)ÚifaceÚconnectivity_urls_datazDHCP Exception: %s)ÚRuntimeErrorÚget_interface_listr
   Úread_metadataÚjsonÚloadsÚrefactor_metadatar	   r   ÚProcessExecutionErrorr   ÚRequestExceptionÚLOGÚerror)Údistror   ÚtimeoutÚretriesÚsec_betweenÚagentÚtmp_dirÚ	exceptionr   Úv1ÚmetadataÚexc© r"   úA/usr/lib/python3/dist-packages/cloudinit/sources/helpers/vultr.pyÚget_metadata   s0   
ý
*öü€ùr$   c                 C   sL   | d | d< | d | d< | d d }d| d v r| d d }|  ¡ | d< d S )Nzinstance-v2-idzinstance-idÚhostnamezlocal-hostnameÚregionÚ
regioncodeÚcountrycode)Úlower)r    r&   r"   r"   r#   r   5   s   r   c               
   C   s²   g } z)d}t j |¡r*tj|ddd�}|j ¡ D ]}| ¡ }t|ƒdkr)|  |¡ qW n t	yC } zt
 d|¡ W Y d }~nd }~ww | sWt ¡ D ]}d|v rQqJ|  |¡ qJ| S )Nz!/opt/vultr/find_candidate_nics.shT)ÚcaptureÚshellr   z(find_candidate_nics script exception: %sÚdummy)ÚosÚpathÚexistsr   ÚstdoutÚ
splitlinesÚstripÚlenÚappendÚ	Exceptionr   r   r   Úfind_candidate_nics)ÚifacesÚ
nic_scriptÚoutÚliner   Úer"   r"   r#   r   ?   s(   
€€ÿr   c                   C   s   t  d¡t  d¡dœS )Nzsystem-manufacturerzsystem-serial-number)ÚmanufacturerÚsubid)r   Úread_dmi_datar"   r"   r"   r#   Úget_sysinfo\   s   þr?   c                   C   s   t ƒ d dkr	dS dS )Nr<   ÚVultrTF)r?   r"   r"   r"   r#   Úis_baremetald   s   rA   c                  C   s.   t ƒ } | d dkrdS dt ¡  ¡ v rdS dS )Nr<   r@   TÚvultrF)r?   r   Úget_cmdlineÚsplit)Úsysinfor"   r"   r#   Úis_vultrk   s   rF   c                 C   sH   d|  } d|dœ}t j| ||||d�}| ¡ std|  |jƒ‚|j ¡ S )Nz
%s/v1.jsonÚ	cloudinit)zMetadata-Tokenz
User-Agent)r   r   Úheadersr   z!Failed to connect to %s: Code: %s)r   ÚreadurlÚokr   ÚcodeÚcontentsÚdecode)r   r   r   r   r   rH   Úresponser"   r"   r#   r   z   s   
û
ÿ
r   c                   C   s   t  ¡ S ©N)r   Úget_interfaces_by_macr"   r"   r"   r#   Úget_interface_map’   s   rQ   c                 C   s   t ƒ }| |vr	d S | | ¡S rO   )rQ   Úget)ÚmacÚmacs_to_nicr"   r"   r#   Úget_interface_name˜   s   
rU   c                 C   s‚   ddddgdœgdœ}t | ƒdkr t| d dd	�}|d
  |¡ tdt | ƒƒD ]}| | }| d¡r3q't|ƒ}|d
  |¡ q'|S )Né   Ú
nameserverz108.61.10.10z2001:19f0:300:1704::6)ÚtypeÚaddress)ÚversionÚconfigr   T)Úprimaryr[   Úunconfigured)r3   Úgenerate_interfacer4   ÚrangerR   )Ú
interfacesÚnetworkÚpublicÚiÚ	interfaceÚprivater"   r"   r#   Úgenerate_network_config¢   s    þÿþ
rf   Fc                 C   s”   t | d ƒ}|std| d  ƒ‚|d| d dœ}|r*d|d< ddd	œd
dd	œg|d< |s>dd| d d | d d dœg|d< t| |ƒ t| |ƒ |S )NrS   ú.Interface: %s could not be found on the systemÚphysical)ÚnamerX   Úmac_addressrV   ú	accept-raÚdhcpÚauto)rX   ÚcontrolÚ
ipv6_slaacÚsubnetsÚstaticÚipv4rY   Únetmask©rX   rn   rY   rs   )rU   r   Úgenerate_interface_routesÚ'generate_interface_additional_addresses)rd   r\   Úinterface_nameÚnetcfgr"   r"   r#   r^   À   s0   
ÿýþ

üÿ
	
r^   c                 C   sL   d| v r
| d |d< d| v r| d |d< d| v r$| d |d d d< d S d S )NÚmturk   Úroutesrp   r   r"   )rd   rx   r"   r"   r#   ru   å   s   ÿru   c                 C   sæ   t | d d ƒ}d| v r5|dkr5| d d D ]}dd|d |d dœ}d	|v r-|d	 |d	< |d
  |¡ qt | d d ƒ}d| v rm|dkro| d d D ]%}ddd|d |d f dœ}d	|v re|d	 |d	< |d
  |¡ qKd S d S d S )Nrr   Ú
additionalr   rq   rm   rY   rs   rt   rz   rp   Úipv6Ústatic6z%s/%sra   Úprefix)rX   rn   rY   )r3   r4   )rd   rx   Úadditional_countr{   Úaddr"   r"   r#   rv   ñ   s2   üÿýôrv   c                 C   sH   | d D ]}|d dkrqt |d ƒ}|std|d  ƒ‚||d< qd S )Nr[   rX   rh   rj   rg   ri   )rU   r   )rx   rd   rw   r"   r"   r#   Úadd_interface_names  s   ÿÿ
÷r�   rO   )F)"r   Úloggingr-   Ú	functoolsr   Úrequestsr   rG   r   r   r   r   r   Úcloudinit.net.dhcpr	   Úcloudinit.net.ephemeralr
   Ú	getLoggerÚ__name__r   r$   r   r   r?   rA   rF   r   rQ   rU   rf   r^   ru   rv   r�   r"   r"   r"   r#   Ú<module>   s4   
ÿ 



%#