
"·T`  ã               @   s˜   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 j e	 ƒ Z
 d d „  Z d d	 „  Z d
 d
 d d d „ Z d d „  Z d S)é    N)Údmi)Úlog)Únet)Ú
url_helperc             C   s—  d d „  } g  } t  j ƒ  } t j d | ƒ x|  j d ƒ D]û } t j d | ƒ | j d ƒ } | | k r… t d | | f ƒ ‚ | j d ƒ } | j | ƒ } t j d	 | | | | j d
 ƒ ƒ d d d | d | i } g  }	 x< | j d ƒ D]+ }
 | |
 |  j d ƒ ƒ } |	 j | ƒ qó W|	 | d <| j | ƒ q> W|  j d ƒ r‡t j d |  j d ƒ ƒ | j d d d |  j d ƒ i ƒ d d d | i 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  |  j  d ƒ r: d } |  j  d ƒ d k r0 d } d | i Sd } |  j  d ƒ d k r[ d } d | d d	 d
 |  j  d
 ƒ i } |  j  d ƒ rž |  j  d ƒ | d <d |  j  d ƒ k rÓ |  j  d ƒ j d ƒ d | d <| |  j  d ƒ k r
|  j  d ƒ r
|  j  d ƒ | d <| S)NZdhcpZfamilyZIPv6zipv6_dhcpv6-statelessÚtypeZstaticZstatic6ZcontrolZautoÚaddressZgatewayú/Znetworké   ZnetmaskÚdnsZdns_nameservers)ÚgetÚsplit)Zip_addrr
   Z	dhcp_typeZstatic_typeZ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: %sZ
interfaceszConsidering %sZmaczVDid not find network interface on system with mac '%s'. Cannot apply configuration: %sr   z4Found %s interface '%s' with address '%s' (index %d)ÚindexZphysicalÚnameÚmac_addressZip_addressesr
   ÚsubnetszSetting DNS nameservers to %sZ
nameserverr   Úversionr	   Úconfig)ÚcloudnetZget_interfaces_by_macÚLOGÚdebugr   ÚRuntimeErrorÚappend)r   r   Znic_configsZmacs_to_interfacesZ	raw_ifacer   Z
iface_typeZ
sysfs_nameZ	interfacer   Z
ip_addressZsub_partr   r   r   Úconvert_to_network_config_v1   sD    c
r   c             C   s
   t  |  ƒ S)N)r   )r   r   r   r   Úconvert_network_configÁ   s    r   é   é   c             C   sS   t  j |  d | d | d | ƒ} | j ƒ  s= t d |  ƒ ‚ t j | j j ƒ  ƒ S)NÚtimeoutÚsec_betweenÚretrieszunable to read metadata at %s)r   ZreadurlÚokr   ÚjsonÚloadsÚcontentsÚdecode)Zurlr   r    r!   Zresponser   r   r   Úread_metadataÅ   s
    r'   c              C   sp   t  j d ƒ }  |  d k r d St  j d ƒ } | rG t j d | ƒ n d } t j | ƒ t | ƒ ‚ d | f S)	Nzsystem-manufacturerZUpCloudFzsystem-uuidz2system identified via SMBIOS as UpCloud server: %sz¤system 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)FN)r   Zread_dmi_datar   r   Zcriticalr   )Zvendor_nameZserver_uuidÚmsgr   r   r   Úread_sysinfoÎ   s    
r)   )r#   Z	cloudinitr   r   Zloggingr   r   r   Z	getLoggerÚ__name__r   r   r   r'   r)   r   r   r   r   Ú<module>   s   ²	