
"T`                 @   s   d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l	 j j
 j Z e j e  Z d Z d	 e d
 d e d i Z d Z d Z d Z Gd 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/    )dmi)log)net)sources)utilNz!http://169.254.169.254/hetzner/v1metadata_urlz	/metadatauserdata_urlz	/userdata<      c               @   sL   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 j |  | | |  | |  _ t   |  _ t j t j | d d g i   t	 g  |  _
 |  j
 d |  _ |  j
 d |  _ |  j
 j d t  |  _ |  j
 j d t  |  _ |  j
 j d t  |  _ d  |  _ 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   _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   sE  t    \ } } | s d St j   } t j | d d d  _ t j |  j d |  j d |  j d |  j	 } t j
 |  j d |  j d |  j d |  j	 } Wd  QRXt j |  |  _ | |  _ | d |  j d <| d	 |  j d
 <| j d d   |  j d <| j d d   |  j d <| j d d   |  _ |  j   | k rAt d   d S)NFz169.254.0.1   z169.254.255.255r   Zsec_betweenr   zinstance-idZhostnamezlocal-hostnameznetwork-configzpublic-keysZvendor_dataz6SMBIOS serial does not match instance ID from metadataT)get_hcloud_datacloudnetZfind_fallback_nicZEphemeralIPv4Network	hc_helperZread_metadatar   r   r   r   Zread_userdatar   Zmaybe_b64decodeZuserdata_rawZmetadata_fullr   r   Zvendordata_rawget_instance_idRuntimeError)r   Z
on_hetznerserialZnicZmdZudr    r    r!   	_get_data2   s.    
			zDataSourceHetzner._get_datac             C   s   t  j |  j   d  S)Nzsystem-serial-number)r   Zinstance_id_matches_system_uuidr&   )r   r   r    r    r!   check_instance_id]   s    z#DataSourceHetzner.check_instance_idc             C   s?   |  j  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.
        znetwork-configz'Unable to get meta-data from server....)r   r   	Exception)r   Z_net_configr    r    r!   network_configa   s    		z DataSourceHetzner.network_configN)	__name__
__module____qualname__Zdsnamer   r)   r*   propertyr,   r    r    r    r!   r      s
   +r   c              C   s]   t  j d  }  |  d k r d St  j d  } | rG t j d |  n t d   d | f S)	Nzsystem-manufacturerr   Fzsystem-serial-numberz#Running on Hetzner Cloud: serial=%sz+Hetzner Cloud detected, but no serial foundT)FN)r   Zread_dmi_dataLOGdebugr'   )Zvendor_namer(   r    r    r!   r#   t   s    r#   c             C   s   t  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr    r    r!   get_datasource_list   s    r4   )__doc__Z	cloudinitr   r   Zloggingr   r$   r   r   Z!cloudinit.sources.helpers.hetznerZhelpersZhetznerr%   Z	getLoggerr-   r1   ZBASE_URL_V1r   r   r   r   r   r   r#   ZDEP_FILESYSTEMr3   r4   r    r    r    r!   <module>   s"   
U