o
    thx$                     @   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
mZ ddlmZmZ ddlmZ ddlmZ eeZddd	d
ZdZdZdZdZdZdZd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
url_helperutil)
EventScope	EventType)NoDHCPLeaseError)EphemeralIPNetworkmetadatazmetadata/private-networksuserdata)metadata_pathmetadata_private_networks_pathuserdata_path<      x   zU
SUBSYSTEM=="net", ATTR{address}=="86:*", GOTO="cloudinit_hook"
GOTO="cloudinit_end"
c                   C   s   dt   ddfS )Nzhttp://[fe80::a9fe:a9fe%25z]/hetzner/v1/z"http://169.254.169.254/hetzner/v1/)r   find_fallback_nic r   r   E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceHetzner.pybase_urls_v1'   s   r   c                       sd   e Zd ZdZejejejej	hiZ
dd Zdeddf fddZd	d
 Zdd Zedd Z  ZS )DataSourceHetznerHetznerc                 C   s   t j| ||| || _i | _tt|ddgi tg| _	| j	d | _
| j	d | _| j	d | _| j	dt| _| j	dt| _| j	dt| _| j	d	t| _| j	d
t| _t j| _t j| _d | _t| _d S )N
datasourcer   r   r   r   retriestimeout
wait_retrymax_wait
sleep_time)r   
DataSource__init__distror   r   mergemanydictget_cfg_by_pathBUILTIN_DS_CONFIGds_cfgr   r   r   get
MD_RETRIESr   
MD_TIMEOUTr   MD_WAIT_RETRYr   MD_MAX_WAITr   MD_SLEEP_TIMEr   UNSET_network_configDSMODE_NETWORKdsmodemetadata_fullEXTRA_HOTPLUG_UDEV_RULESextra_hotplug_udev_rules)selfsys_cfgr!   pathsr   r   r   r    9   s,   
zDataSourceHetzner.__init__ci_pkl_versionreturnNc                    sj   t  | t| _| jdt| _| jdt| _	| jdt
| _| jd | _| jd | _| jd | _d S )Nr   r   r   r   r   r   )super	_unpickler1   r2   r%   r&   r)   r   r*   r   r+   r   r   r   r   )r3   r6   	__class__r   r   r9   S   s   zDataSourceHetzner._unpicklec           	   
      s  t  \}}|s	dS t }zt jt dd fdd|D dx tj fdd|D  j j	 j
d\}}td| tj| ttfd	}tj fd
d|D  j j	 j
d\}}td| tj| ttfd	|d< tj fdd|D  j j	 j
d\}}td| |std W d    n1 sw   Y  W n ty } ztd|  d }~ww t| _| _|d  jd< |d  jd< |dd  jd< |dd  jd< |dg  jd< |dd  _  |krtddS )NFTc                    s$   g | ]}d t | j diqS )urlz/instance-idr   combine_urlr   .0r<   r3   r   r   
<listcomp>l   s    z/DataSourceHetzner._get_data.<locals>.<listcomp>)	interfaceipv4ipv6connectivity_urls_datac                       g | ]	}t | jqS r   r=   r?   rA   r   r   rB   v       )r   r   r   zUsing metadata source: '%s')allowedc                    rG   r   )r   r>   r   r?   rA   r   r   rB      s    z#Using private_networks source: '%s'private-networksc                    rG   r   )r   r>   r   r?   rA   r   r   rB      rH   zUsing userdata source: '%s'zGot empty userdatazBailing, DHCP Exception: %szinstance-idhostnamezlocal-hostnamenetwork-configzpublic-keysvendor_dataz6SMBIOS serial does not match instance ID from metadata)get_hcloud_datar   r
   r!   r   r   	hc_helperget_metadatar   r   r   LOGdebugr   	load_yamldecodedictlistr	   errormaybe_b64decodeuserdata_rawr0   r   r&   vendordata_rawget_instance_idRuntimeError)	r3   
on_hetznerserial	base_urlsr<   contentsmduder   rA   r   	_get_data_   s   



	




	
4zDataSourceHetzner._get_datac                 C   s   t |  dS )Nsystem-serial-number)r   instance_id_matches_system_uuidr[   )r3   r4   r   r   r   check_instance_id   s   z#DataSourceHetzner.check_instance_idc              	   C   s   | j du rtdtj tj| _ | j tjkr| j S | jd }|s$td| jdg }g }|D ]}|d|d t	
|d dd	d
gd q/|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 %srL   z'Unable to get meta-data from server....rJ   physicalmac_addressTdhcp)rD   type)rk   ri   namesubnetsconfig)r-   rQ   warningr   r,   r   r\   r&   appendrO   get_interface_name_from_macextend)r3   
net_configprivate_networksprivate_networks_configprivate_networkr   r   r   network_config   s:   

z DataSourceHetzner.network_config)__name__
__module____qualname__dsnamer   NETWORKr   BOOT_NEW_INSTANCEBOOTHOTPLUGdefault_update_eventsr    intr9   rd   rg   propertyrw   __classcell__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_datarQ   rR   r\   )vendor_namer^   r   r   r   rN      s   

rN   c                 C   s   t | tS )N)r   list_from_dependsdatasources)dependsr   r   r   get_datasource_list  s   r   )$__doc__logging!cloudinit.sources.helpers.hetznerr   helpershetznerrO   	cloudinitr   r   r   r   cloudinit.eventr   r   cloudinit.net.dhcpr	   cloudinit.net.ephemeralr
   	getLoggerrx   rQ   r$   r'   r(   r)   r*   r+   r1   r   r   r   rN   DEP_FILESYSTEMr   r   r   r   r   r   <module>   s2   
 ?
