o
    f_                     @   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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yV } ztd|  d }~ww t|| _|| _|d | jd< |d | jd	< |d
d | jd
< |dd | jd< |dd | _|  |krtddS )NFurlz/metadata/instance-id)ifaceconnectivity_url_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   sR   
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_idn   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 )zConfigure 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_configs   s   

z DataSourceHetzner.network_configN)	__name__
__module____qualname__dsnamer   rD   rG   propertyrJ   r)   r)   r)   r*   r      s    9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&   
o
