o
    w7e                      @   sh   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ ee	Z
dd Zdd	 ZdddZdd ZdS )    N)dmi)log)net)
url_helperc              
   C   s  dd }g }t  }td| | dD ]U}td| |d}||vr.td||f |d}||}td	||||d
 d||d}g }	|dD ]}
||
| d}|	| qQ|	|d< || q| drtd| d |d| dd d|dS )aC
  
    Convert the UpCloud network metadata description into
    Cloud-init's version 1 netconfig format.

    Example JSON:
    {
      "interfaces": [
        {
          "index": 1,
          "ip_addresses": [
            {
              "address": "94.237.105.53",
              "dhcp": true,
              "dns": [
                "94.237.127.9",
                "94.237.40.9"
              ],
              "family": "IPv4",
              "floating": false,
              "gateway": "94.237.104.1",
              "network": "94.237.104.0/22"
            },
            {
              "address": "94.237.105.50",
              "dhcp": false,
              "dns": [],
              "family": "IPv4",
              "floating": true,
              "gateway": "",
              "network": "94.237.105.50/32"
            }
          ],
          "mac": "32:d5:ba:4a:36:e7",
          "network_id": "031457f4-0f8c-483c-96f2-eccede02909c",
          "type": "public"
        },
        {
          "index": 2,
          "ip_addresses": [
            {
              "address": "10.6.3.27",
              "dhcp": true,
              "dns": [],
              "family": "IPv4",
              "floating": false,
              "gateway": "10.6.0.1",
              "network": "10.6.0.0/22"
            }
          ],
          "mac": "32:d5:ba:4a:84:cc",
          "network_id": "03d82553-5bea-4132-b29a-e1cf67ec2dd1",
          "type": "utility"
        },
        {
          "index": 3,
          "ip_addresses": [
            {
              "address": "2a04:3545:1000:720:38d6:baff:fe4a:63e7",
              "dhcp": true,
              "dns": [
                "2a04:3540:53::1",
                "2a04:3544:53::1"
              ],
              "family": "IPv6",
              "floating": false,
              "gateway": "2a04:3545:1000:720::1",
              "network": "2a04:3545:1000:720::/64"
            }
          ],
          "mac": "32:d5:ba:4a:63:e7",
          "network_id": "03000000-0000-4000-8046-000000000000",
          "type": "public"
        },
        {
          "index": 4,
          "ip_addresses": [
            {
              "address": "172.30.1.10",
              "dhcp": true,
              "dns": [],
              "family": "IPv4",
              "floating": false,
              "gateway": "172.30.1.1",
              "network": "172.30.1.0/24"
            }
          ],
          "mac": "32:d5:ba:4a:8a:e1",
          "network_id": "035a0a4a-77b4-4de5-820d-189fc8135714",
          "type": "private"
        }
      ],
      "dns": [
        "94.237.127.9",
        "94.237.40.9"
      ]
    }
    c                 S   s   |  drd}|  ddkrd}d|iS d}|  ddkrd}|d|  d	d
}|  dr4|  d|d< d|  dv rG|  ddd |d< ||  dkrZ|  drZ|  d|d< |S )NdhcpfamilyIPv6zipv6_dhcpv6-statelesstypestaticstatic6autoaddress)r	   controlr   gateway/network   netmaskdnsdns_nameservers)getsplit)ip_addrr   	dhcp_typestatic_typesubpart r   C/usr/lib/python3/dist-packages/cloudinit/sources/helpers/upcloud.py_get_subnet_configr   s&   

z8convert_to_network_config_v1.<locals>._get_subnet_configzNIC mapping: %s
interfaceszConsidering %smaczVDid not find network interface on system with mac '%s'. Cannot apply configuration: %sr	   z4Found %s interface '%s' with address '%s' (index %d)indexphysical)r	   namemac_addressip_addressesr   subnetszSetting DNS nameservers to %s
nameserver)r	   r   r   )versionconfig)cloudnetget_interfaces_by_macLOGdebugr   RuntimeErrorappend)r)   r   nic_configsmacs_to_interfaces	raw_ifacer$   
iface_type
sysfs_name	interfacer&   
ip_addresssub_partr   r   r   convert_to_network_config_v1   sL   c


	

r8   c                 C   s   t | S )N)r8   )r)   r   r   r   convert_network_config   s   r9         c                 C   s6   t j| |||d}| std|  t|j S )N)timeoutsec_betweenretrieszunable to read metadata at %s)r   readurlokr.   jsonloadscontentsdecode)urlr<   r=   r>   responser   r   r   read_metadata   s   rG   c                  C   sN   t d} | dkrdS t d}|rtd| d|fS d}t| t|)Nzsystem-manufacturerUpCloud)FNzsystem-uuidz2system identified via SMBIOS as UpCloud server: %szsystem identified via SMBIOS as a UpCloud server, but did not provide an ID. Please contact support viahttps://hub.upcloud.com or via email with support@upcloud.comT)r   read_dmi_datar,   r-   criticalr.   )vendor_nameserver_uuidmsgr   r   r   read_sysinfo   s   


rN   )r:   r:   r;   )rA   	cloudinitr   r   loggingr   r*   r   	getLogger__name__r,   r8   r9   rG   rN   r   r   r   r   <module>   s   
 2
	