o
    x[h�  ã                   @   s´   d Z ddlZddlm  m  mZ ddlmZm	Z	mZm
Z
 ddlmZ ddlmZ e e¡ZdZed ed d	œZd
ZdZdZG dd„ dejƒZdd„ ZeejffgZdd„ ZdS )z;Hetzner Cloud API Documentation
https://docs.hetzner.cloud/é    N)ÚdmiÚnetÚsourcesÚutil)ÚNoDHCPLeaseError)ÚEphemeralDHCPv4z!http://169.254.169.254/hetzner/v1z	/metadataz	/userdata)Úmetadata_urlÚuserdata_urlé<   é   c                   @   s4   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZd
S )ÚDataSourceHetznerÚHetznerc                 C   s    t j | |||¡ || _tƒ | _t t |ddgi ¡t	g¡| _
| j
d | _| j
d | _| j
 dt¡| _| j
 dt¡| _| j
 dt¡| _t j| _t j| _d | _d S )NÚ
datasourcer   r   r	   ÚretriesÚtimeoutÚ
wait_retry)r   Ú
DataSourceÚ__init__ÚdistroÚdictÚmetadatar   ÚmergemanydictÚget_cfg_by_pathÚBUILTIN_DS_CONFIGÚds_cfgÚmetadata_addressÚuserdata_addressÚgetÚ
MD_RETRIESr   Ú
MD_TIMEOUTr   ÚMD_WAIT_RETRYr   ÚUNSETÚ_network_configÚDSMODE_NETWORKÚdsmodeÚmetadata_full)ÚselfÚsys_cfgr   Úpaths© r)   úE/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceHetzner.pyr   "   s    þÿ
zDataSourceHetzner.__init__c              
   C   s(  t ƒ \}}|s	dS z;t| jt ¡ dtd igd��" tj| j| j	| j
| jd�}tj| j| j	| j
| jd�}W d   ƒ n1 s>w   Y  W n tyW } zt d|¡ ‚ d }~ww t |¡| _|| _|d | jd< |d | jd	< | d
d ¡| jd
< | dd ¡| jd< | dd ¡| _|  ¡ |kr’tdƒ‚dS )NFÚurlz/metadata/instance-id)ÚifaceÚconnectivity_urls_data)r   Úsec_betweenr   zBailing, DHCP Exception: %szinstance-idÚhostnamezlocal-hostnameúnetwork-configzpublic-keysÚvendor_dataz6SMBIOS serial does not match instance ID from metadataT)Úget_hcloud_datar   r   r   Úfind_fallback_nicÚBASE_URL_V1Ú	hc_helperÚread_metadatar   r   r   r   Úread_userdatar   r   ÚLOGÚerrorr   Úmaybe_b64decodeÚuserdata_rawr%   r   r   Úvendordata_rawÚget_instance_idÚRuntimeError)r&   Ú
on_hetznerÚserialÚmdÚudÚer)   r)   r*   Ú	_get_data5   sT   
ÿÿý	üüñ€€þÿzDataSourceHetzner._get_datac                 C   s   t  |  ¡ d¡S )Núsystem-serial-number)r   Úinstance_id_matches_system_uuidr=   )r&   r'   r)   r)   r*   Úcheck_instance_idp   s   ÿz#DataSourceHetzner.check_instance_idc                 C   sT   | j du rt dtj¡ tj| _ | j tjkr| j S | jd }|s$tdƒ‚|| _ | j S )zŸConfigure the networking. This needs to be done each boot, since
        the IP information may have changed due to snapshot and/or
        migration.
        Nz5Found None as cached _network_config. Resetting to %sr0   z'Unable to get meta-data from server....)r"   r8   Úwarningr   r!   r   r>   )r&   Ú_net_configr)   r)   r*   Únetwork_configu   s   
þ
z DataSourceHetzner.network_configN)	Ú__name__Ú
__module__Ú__qualname__Údsnamer   rD   rG   ÚpropertyrJ   r)   r)   r)   r*   r      s    ;r   c                  C   s@   t  d¡} | dkrdS t  d¡}|rt d|¡ d|fS tdƒ‚)Nzsystem-manufacturerr   )FNrE   z#Running on Hetzner Cloud: serial=%sz+Hetzner Cloud detected, but no serial foundT)r   Úread_dmi_datar8   Údebugr>   )Úvendor_namer@   r)   r)   r*   r2   �   s   

þr2   c                 C   s   t  | t¡S )N)r   Úlist_from_dependsÚdatasources)Údependsr)   r)   r*   Úget_datasource_list¤   s   rV   )Ú__doc__ÚloggingÚ!cloudinit.sources.helpers.hetznerr   ÚhelpersÚhetznerr5   Ú	cloudinitr   r   r   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   Ú	getLoggerrK   r8   r4   r   r   r   r    r   r   r2   ÚDEP_FILESYSTEMrT   rV   r)   r)   r)   r*   Ú<module>   s&   
þq
ÿ