U
    L¬÷dl  ã                   @   sÀ   d Z ddlm  m  mZ ddlmZ ddlmZ	 ddl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)Úlog)Ú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 S )NZ
datasourcer   r	   r
   ÚretriesÚtimeoutÚ
wait_retry)r   Ú
DataSourceÚ__init__ÚdistroÚdictÚmetadatar   ZmergemanydictZget_cfg_by_pathÚBUILTIN_DS_CONFIGZds_cfgÚmetadata_addressÚuserdata_addressÚgetÚ
MD_RETRIESr   Ú
MD_TIMEOUTr   ÚMD_WAIT_RETRYr   ÚUNSETÚ_network_configZDSMODE_NETWORKZdsmode)Ú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d: tj| j| j	| j
| jd}tj| j| j	| j
| jd}W 5 Q R X W n0 tk
r¢ } zt d|¡ ‚ W 5 d }~X Y nX t |¡| _|| _|d | jd< |d | jd	< | d
d ¡| jd
< | dd ¡| jd< | dd ¡| _|  ¡ |krtdƒ‚dS )NFZurlz/metadata/instance-id)ZifaceZconnectivity_url_data)r   Zsec_betweenr   zBailing, DHCP Exception: %szinstance-idZhostnamezlocal-hostnameúnetwork-configzpublic-keysZvendor_dataz6SMBIOS serial does not match instance ID from metadataT)Úget_hcloud_datar   r   r   Zfind_fallback_nicÚBASE_URL_V1Ú	hc_helperZread_metadatar   r   r   r   Zread_userdatar   r   ÚLOGÚerrorr   Zmaybe_b64decodeZuserdata_rawZmetadata_fullr   r   Zvendordata_rawÚget_instance_idÚRuntimeError)r    Z
on_hetznerÚserialZmdZudÚer#   r#   r$   Ú	_get_data4   sL    
 ÿýüü	ÿzDataSourceHetzner._get_datac                 C   s   t  |  ¡ d¡S )Núsystem-serial-number)r   Zinstance_id_matches_system_uuidr+   )r    r!   r#   r#   r$   Úcheck_instance_idm   s     ÿz#DataSourceHetzner.check_instance_idc                 C   sT   | j dkr t dtj¡ tj| _ | j tjkr2| j S | jd }|sHt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 %sr%   z'Unable to get meta-data from server....)r   r)   Zwarningr   r   r   r,   )r    Z_net_configr#   r#   r$   Únetwork_configr   s    
þ
z DataSourceHetzner.network_configN)	Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r/   r1   Úpropertyr2   r#   r#   r#   r$   r      s   9r   c                  C   sB   t  d¡} | dkrdS t  d¡}|r2t d|¡ ntdƒ‚d|fS )Nzsystem-manufacturerr   )FNr0   z#Running on Hetzner Cloud: serial=%sz+Hetzner Cloud detected, but no serial foundT)r   Zread_dmi_datar)   Údebugr,   )Zvendor_namer-   r#   r#   r$   r&   Œ   s    

r&   c                 C   s   t  | t¡S )N)r   Zlist_from_dependsÚdatasources)Zdependsr#   r#   r$   Úget_datasource_list¡   s    r9   )Ú__doc__Z!cloudinit.sources.helpers.hetznerr   ZhelpersZhetznerr(   Z	cloudinitr   r   Zloggingr   r   Zcloudinit.net.dhcpr   Zcloudinit.net.ephemeralr   Z	getLoggerr3   r)   r'   r   r   r   r   r   r   r&   ZDEP_FILESYSTEMr8   r9   r#   r#   r#   r$   Ú<module>   s&   
þn
ÿ