o
    w7el                     @   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 )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)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_rawmetadata_fullr   r   vendordata_rawget_instance_idRuntimeError)r&   
on_hetznerserialmduder)   r)   r*   	_get_data4   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_idm   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_configr   s   

z DataSourceHetzner.network_configN)	__name__
__module____qualname__dsnamer   rE   rH   propertyrK   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   )FNrF   z#Running on Hetzner Cloud: serial=%sz+Hetzner Cloud detected, but no serial foundT)r   read_dmi_datar8   debugr?   )vendor_namerA   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   rW   )__doc__!cloudinit.sources.helpers.hetznerr   helpershetznerr5   	cloudinitr   r   loggingr   r   cloudinit.net.dhcpr   cloudinit.net.ephemeralr   	getLoggerrL   r8   r4   r   r   r    r!   r   r   r2   DEP_FILESYSTEMrU   rW   r)   r)   r)   r*   <module>   s(   
n
