HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/cloudinit/net/__pycache__/network_state.cpython-39.pyc
a

��`��@sxddlZddlZddlZddlZddlZddlmZddlmZe�e	�Z
dZgd�Zdgd�iZ
gd�Zdd	d
ddd
dddddddddd�dddddddddddd �d!�ZdMd#d$�ZdNd%d&�Zd'd(�Zd)d*�ZGd+d,�d,e�Zd-d.�ZGd/d0�d0e�ZGd1d2�d2e�ZGd3d4�d4ed5�Zd6d7�ZdOd9d:�Zd;d<�Zd=d>�Zd?d@�Z dAdB�Z!dCdD�Z"dEdF�Z#dGdH�Z$dIdJ�Z%dKdL�Z&dS)P�N)�safeyaml)�util�)�dhcp6Z
ipv6_slaaczipv6_dhcpv6-statelesszipv6_dhcpv6-stateful��version�config�
network_state)�	addresses�dhcp4�dhcp4-overridesr�dhcp6-overrides�gateway4�gateway6�
interfaces�match�mtu�nameservers�renderer�set-name�	wakeonlan�	accept-raz	ad-selectzarp-intervalz
arp-ip-targetzarp-validatez
down-delayzfail-over-mac-policyz	lacp-ratezmii-monitor-intervalz	min-links�mode�gratuitious-arpZprimaryzprimary-reselect-policyzup-delayztransmit-hash-policy)zbond-ad-selectzbond-arp-intervalzbond-arp-ip-targetzbond-arp-validatezbond-downdelayzbond-fail-over-maczbond-lacp-ratezbond-miimonzbond-min-linksz	bond-modezbond-num-grat-arpzbond-primaryzbond-primary-reselectzbond-updelayzbond-xmit-hash-policyzageing-time�priorityz
forward-delayz
hello-timezmax-agez	path-costz
port-priority�stp)Z
bridge_ageingZbridge_bridgeprioZ	bridge_fdZbridge_gcintZbridge_helloZ
bridge_maxageZbridge_maxwaitZbridge_pathcostZbridge_portprio�
bridge_stpZbridge_waitport)�bond�bridgeTcCsTd}|�d�}|�d�}|dkr$|}|rP|durPt||d�}|j|d�|��}|S)zfParses the config, returns NetworkState object

    :param net_config: curtin network config dict
    Nrr��rr��skip_broken)�get�NetworkStateInterpreter�parse_config�get_network_state)�
net_configr"�staterr�nsi�r*�=/usr/lib/python3/dist-packages/cloudinit/net/network_state.py�parse_net_config_data=s

r,cCs,d}t�|�}d|vr(t|�d�|d�}|S)zJParses a curtin network configuration file and
       return network stateN�networkr!)r�	read_confr,r#)�pathr"�nsr'r*r*r+�parse_net_configRs

�r1cCst�|�}t�}|�|�|S�N)rr.r$�load)Z
state_filer(r)r*r*r+�from_state_file]s

r4cCs t|�}|D]}|�|�q|Sr2)�set�discard)�expectedZactual�missing�keyr*r*r+�	diff_keysdsr:c@seZdZdS)�InvalidCommandN)�__name__�
__module__�__qualname__r*r*r*r+r;ksr;cs�fdd�}|S)Ncst�����fdd��}|S)Ncs:�r"t�|�}|r"td|�f���||g|�Ri|��S)Nz&Command missing %s of required keys %s)r:r;)�self�command�args�kwargs�missing_keys)�func�
required_keysr*r+�	decoratorss
��z7ensure_command_keys.<locals>.wrapper.<locals>.decorator)�	functools�wraps)rDrF�rE)rDr+�wrapperqs	z$ensure_command_keys.<locals>.wrapperr*)rErJr*rIr+�ensure_command_keysosrKcs eZdZdZ�fdd�Z�ZS)�CommandHandlerMetaaMetaclass that dynamically creates a 'command_handlers' attribute.

    This will scan the to-be-created class for methods that start with
    'handle_' and on finding those will populate a class attribute mapping
    so that those methods can be quickly located and called.
    csbi}|��D]6\}}t|�r|�d�r|td�d�}|r|||<q||d<tt|��||||�S)NZhandle_�command_handlers)�items�callable�
startswith�len�superrL�__new__)�cls�name�parents�dctrMZ	attr_name�attrZhandles_what��	__class__r*r+rS�s
�zCommandHandlerMeta.__new__)r<r=r>�__doc__rS�
__classcell__r*r*rYr+rL�srLc@sxeZdZefdd�Zedd��Zedd��Zedd��Zed	d
��Z	edd��Z
ddd�Zddd�Zdd�Z
dd�Zd
S)�NetworkStatecCs*t�|�|_||_|�dd�|_d|_dS)N�use_ipv6F)�copy�deepcopy�_network_state�_versionr#r^�_has_default_route)r?r	rr*r*r+�__init__�szNetworkState.__init__cCs
|jdS)Nr)ra�r?r*r*r+r�szNetworkState.configcCs|jSr2)rbrer*r*r+r�szNetworkState.versioncCs,z|jddWSty&gYS0dS)N�dnsr�ra�KeyErrorrer*r*r+�dns_nameservers�szNetworkState.dns_nameserverscCs,z|jddWSty&gYS0dS)Nrf�searchrgrer*r*r+�dns_searchdomains�szNetworkState.dns_searchdomainscCs|jdur|��|_|jSr2)rc�_maybe_has_default_routerer*r*r+�has_default_route�s

zNetworkState.has_default_routeNccs>|j�di�}|��D]"}|dur*|Vq||�r|VqdS)Nr)rar#�values)r?�filter_funcZifaces�ifacer*r*r+�iter_interfaces�szNetworkState.iter_interfacesccs6|j�dg�D]"}|dur*||�r0|Vq|VqdS�N�routes�rar#)r?ro�router*r*r+�iter_routes�s
zNetworkState.iter_routescCsh|��D]}|�|�rdSq|��D]<}|�dg�D]*}|�dg�D]}|�|�rFdSqFq6q&dS)NT�subnetsrsF)rv�_is_default_routerqr#)r?rurp�subnetr*r*r+rl�s

z%NetworkState._maybe_has_default_routecCs d}|�d�dko|�d�|vS)N)z::z0.0.0.0�prefixrr-)r#)r?ruZdefault_netsr*r*r+rx�s�zNetworkState._is_default_route)N)N)r<r=r>�NETWORK_STATE_VERSIONrd�propertyrrrirkrmrqrvrlrxr*r*r*r+r]�s





	
r]c@steZdZigggd�ddd�Zedfdd�Zedd��Zed	d
��Zej	dd
��Zdd
�Z
dd�Zdd�Zdd�Z
dd�ZdCdd�ZdDdd�ZdEdd�Zedg�dd��Zedg�d d!��Zegd"��d#d$��Zegd%��d&d'��Zedd(g�d)d*��Zedg�d+d,��Zed-g�d.d/��Zed0g�d1d2��Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Z dFd?d@�Z!dAdB�Z"dS)Gr$)rrjFN)rrsrfr^rcCs.||_||_t�|j�|_||jd<d|_dS)NrF)rb�_configr_r`�initial_network_statera�_parsed)r?rrr*r*r+rd�s

z NetworkStateInterpreter.__init__cCst|j|jd�S)N�r)r]rarbrer*r*r+r	�sz%NetworkStateInterpreter.network_statecCs|j�d�S�Nr^rtrer*r*r+r^�sz NetworkStateInterpreter.use_ipv6cCs|j�d|i�dSr�)ra�update)r?�valr*r*r+r^�scCs|j|j|jd�}t�|�S)Nr)rbr}rar�dumps)r?r(r*r*r+�dump�s
�zNetworkStateInterpreter.dumpcCsvd|vrt�d�td��t|d}t||�}|rNd|}t�|�t|��dd�|D�D]}t||||�q\dS)Nrz$Invalid state, missing version fieldzInvalid state, missing keys: %scSsg|]}|dvr|�qS)r�r*)�.0�kr*r*r+�
<listcomp>�z0NetworkStateInterpreter.load.<locals>.<listcomp>)�LOG�error�
ValueError�NETWORK_STATE_REQUIRED_KEYSr:�setattr)r?r(rErC�msgr9r*r*r+r3s


zNetworkStateInterpreter.loadcCst�|j�Sr2)rr�rarer*r*r+�dump_network_statesz*NetworkStateInterpreter.dump_network_statecCs|j|jd�S)Nr )rbr}rer*r*r+�as_dictszNetworkStateInterpreter.as_dictcCs
|j}|Sr2)r	)r?r0r*r*r+r&sz)NetworkStateInterpreter.get_network_stateTcCs>|jdkr|j|d�d|_n|jdkr:|j|d�d|_dS)Nrr!Tr)rb�parse_config_v1r�parse_config_v2)r?r"r*r*r+r%s

z$NetworkStateInterpreter.parse_configcCs�|jD]�}|d}z|j|}Wn2tyR}ztd|�|�WYd}~n
d}~00z|||�Wqty�|sx�ntjd|dd�t�|���Yq0qdS)N�typez"No handler found for  command '%s'�Skipping invalid command: %sT��exc_info)	r}rMrh�RuntimeErrorr;r��warning�debugr�)r?r"r@�command_type�handler�er*r*r+r�'s&
���z'NetworkStateInterpreter.parse_config_v1cCs�|j��D]�\}}|dvrq
z|j|}Wn2ty\}ztd|�|�WYd}~n
d}~00z|||�|�|�Wq
ty�|s��ntjd|dd�t�	|�
��Yq
0q
dS)N)rrz!No handler found for command '%s'r�Tr�)r}rNrMrhr��
_v2_commonr;r�r�r�r�)r?r"r�r@r�r�r*r*r+r�:s*��
�z'NetworkStateInterpreter.parse_config_v2rUcCs
|�|�Sr2��handle_physical�r?r@r*r*r+�handle_loopbackOsz'NetworkStateInterpreter.handle_loopbackc
Cs(|j�di�}|�|di�}|�di���D]\}}|�||i�q.t|�d��}|js�|D],}|�d��d�s�t|�d��r^d|_q�q^|�d	d
�}|d
ur�t�	|�}|�dd
�}	|	d
ur�t�	|	�}	|�|�d�|�d�|�d�d
d|�d�d
d
|||	d��|jd�|�d�|i�|�
�d
S)z�
        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ],
            'accept-ra': 'true'
        }
        rrU�paramsrwr��6�addressTrNr�mac_address�inetZmanualr)rUr�r�r�rrr��gatewayrwrr)rar#rNr��_normalize_subnetsr^�endswith�is_ipv6_addrr�is_truer�)
r?r@rrp�paramr�rwryZ	accept_rarr*r*r+r�SsB�

�
z'NetworkStateInterpreter.handle_physical)rU�vlan_id�	vlan_linkcCs\|j�di�}|�|�|�|�d�i�}|�d�|d<|�d�|d<|�|d|i�dS)z�
            auto eth0.222
            iface eth0.222 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    hwaddress ether BC:76:4E:06:96:B3
                    vlan-raw-device eth0
        rrUr�zvlan-raw-devicer�N)rar#r�r�)r?r@rrpr*r*r+�handle_vlan�s

z#NetworkStateInterpreter.handle_vlan)rU�bond_interfacesr�c	Cs|�|�|j�d�}|�|�d�i�}|�d���D]\}}|�||i�q6|�ddi�|jd�|d|i�|�d�D]�}||vr�|dd�}|�|�|j�di�}|�|�}|�d�|d	<|�d���D]\}}|�||i�q�|jd�||i�q~d
S)a
    #/etc/network/interfaces
    auto eth0
    iface eth0 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto eth1
    iface eth1 inet manual
        bond-master bond0
        bond-mode 802.3ad

    auto bond0
    iface bond0 inet static
         address 192.168.0.10
         gateway 192.168.0.1
         netmask 255.255.255.0
         bond-slaves none
         bond-mode 802.3ad
         bond-miimon 100
         bond-downdelay 200
         bond-updelay 200
         bond-lacp-rate 4
        rrUr�zbond-slaves�noner�r)rUr�zbond-masterN)r�rar#rNr�)	r?r@rrpr�r��ifname�cmdZbond_ifr*r*r+�handle_bond�s&
�

z#NetworkStateInterpreter.handle_bond�bridge_interfacesc	Cs|j�di�}|�d�D] }||vr&qd|i}|�|�q|j�di�}|�|�|�|�d�i�}|d|d<|�di���D]\}}|�||i�q�|�d�}|dur�t|�tkr�|dvr�d	}n|d
vr�d}ntdj|d
���|�d|i�|�|d|i�dS)a�
            auto br0
            iface br0 inet static
                    address 10.10.10.1
                    netmask 255.255.255.0
                    bridge_ports eth0 eth1
                    bridge_stp off
                    bridge_fd 0
                    bridge_maxwait 0

        bridge_params = [
            "bridge_ports",
            "bridge_ageing",
            "bridge_bridgeprio",
            "bridge_fd",
            "bridge_gcint",
            "bridge_hello",
            "bridge_hw",
            "bridge_maxage",
            "bridge_maxwait",
            "bridge_pathcost",
            "bridge_portprio",
            "bridge_stp",
            "bridge_waitport",
        ]
        rr�rUZbridge_portsr�rN)�on�1rT)�off�0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r)	rar#r�rNr�r��boolr��format)	r?r@rr�r�rpr�r�rr*r*r+�
handle_bridge�s4�

��z%NetworkStateInterpreter.handle_bridgecCs|�|�dSr2r�r�r*r*r+�handle_infiniband
sz)NetworkStateInterpreter.handle_infinibandr�cCs�|j�d�}d|vrF|d}t|�tks.|g}|D]}|d�|�q2d|vr~|d}t|t�sf|g}|D]}|d�|�qjdS)Nrfr�rrj)rar#r��list�append�
isinstance)r?r@rf�addrs�addr�pathsr/r*r*r+�handle_nameservers
z)NetworkStateInterpreter.handle_nameserver�destinationcCs|jd�t|��dSrr)rar��_normalize_router�r*r*r+�handle_route!sz$NetworkStateInterpreter.handle_routecCs|j|dd�dS)a�
        v2_command = {
          bond0: {
            'interfaces': ['interface0', 'interface1'],
            'parameters': {
               'mii-monitor-interval': 100,
               'mode': '802.3ad',
               'xmit_hash_policy': 'layer3+4'}},
          bond1: {
            'bond-slaves': ['interface2', 'interface7'],
            'parameters': {
                'mode': 1,
            }
          }
        }

        v1_command = {
            'type': 'bond'
            'name': 'bond0',
            'bond_interfaces': [interface0, interface1],
            'params': {
                'bond-mode': '802.3ad',
                'bond_miimon: 100,
                'bond_xmit_hash_policy': 'layer3+4',
            }
        }

        r��cmd_typeN��_handle_bond_bridger�r*r*r+�handle_bonds&sz$NetworkStateInterpreter.handle_bondscCs|j|dd�dS)a�
        v2_command = {
          br0: {
            'interfaces': ['interface0', 'interface1'],
            'forward-delay': 0,
            'stp': False,
            'maxwait': 0,
          }
        }

        v1_command = {
            'type': 'bridge'
            'name': 'br0',
            'bridge_interfaces': [interface0, interface1],
            'params': {
                'bridge_stp': 'off',
                'bridge_fd: 0,
                'bridge_maxwait': 0
            }
        }

        rr�Nr�r�r*r*r+�handle_bridgesEsz&NetworkStateInterpreter.handle_bridgesc
Cs�|��D]�\}}d|�d|�d�}|�di�}|�dd�}|sPt�d|t|��||d<|�d	d�}|rtd	|i|d
<dD]}||vrx||||<qx|�|�}	t|	�dkr�|�d
|	i�t�d|�|�|�qdS)a�
        ethernets:
          eno1:
            match:
              macaddress: 00:11:22:33:44:55
              driver: hv_netsvc
            wakeonlan: true
            dhcp4: true
            dhcp6: false
            addresses:
              - 192.168.14.2/24
              - 2001:1::1/64
            gateway4: 192.168.14.1
            gateway6: 2001:1::2
            nameservers:
              search: [foo.local, bar.local]
              addresses: [8.8.8.8, 8.8.4.4]
          lom:
            match:
              driver: ixgbe
            set-name: lom1
            dhcp6: true
            accept-ra: true
          switchports:
            match:
              name: enp2*
            mtu: 1280

        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ]
        }
        �physicalr)r�rUr�
macaddressNzHNetworkState Version2: missing "macaddress" info in config entry: %s: %sr��driverr�)rrrrrrwz!v2(ethernets) -> v1(physical):
%s)	rNr#r�r��str�_v2_to_v1_ipcfgrQr�r�)
r?r@Zeth�cfgZphy_cmdrr�r�r9rwr*r*r+�handle_ethernets_s,&
��
z(NetworkStateInterpreter.handle_ethernetscCs~|��D]p\}}d||�d�|�d�d�}d|vr>|d|d<|�|�}t|�dkrb|�d|i�t�d|�|�|�qd	S)
aq
        v2_vlans = {
            'eth0.123': {
                'id': 123,
                'link': 'eth0',
                'dhcp4': True,
            }
        }

        v1_command = {
            'type': 'vlan',
            'name': 'eth0.123',
            'vlan_link': 'eth0',
            'vlan_id': 123,
            'subnets': [{'type': 'dhcp4'}],
        }
        �vlan�id�link)r�rUr�r�rrrwzv2(vlans) -> v1(vlan):
%sN)rNr#r�rQr�r�r�r�)r?r@r�r�Zvlan_cmdrwr*r*r+�handle_vlans�s�
z$NetworkStateInterpreter.handle_vlanscCst�d�dS)NzOWifi configuration is only available to distros with netplan rendering support.)r�r�r�r*r*r+�handle_wifis�sz$NetworkStateInterpreter.handle_wifiscCs�t�d|�d|vr�|�d��dg�}|�d��dg�}ddi}t|�dkrZ|�d|i�t|�dkrt|�d|i�t�d|�|�|�dS)	Nzv2_common: handling config:
%srrjr
r�Z
nameserverrz$v2(nameserver) -> v1(nameserver):
%s)r�r�r#rQr�r�)r?r�rjrfZname_cmdr*r*r+r��sz"NetworkStateInterpreter._v2_commonc
s"tdd�t�|���D���|��D]�\}}tdd�|��D��}|�di�}|�dd�}|rf||d<d|d	||d
|�d�dt�fd
d�|��D��i}d|vr�|d|d<|�|�}	t|	�dkr�|�d|	i�t�	d|||�|dkr�|�
|�q$|dk�r|�|�q$tdj
|d���q$dS)z(Common handler for bond and bridge typescss|]\}}||fVqdSr2r*�r�r��vr*r*r+�	<genexpr>�r�z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>css"|]\}}|tvr||fVqdSr2)�NETWORK_V2_KEY_FILTER)r�r9�valuer*r*r+r��s
���
parameterszgratuitous-arpNrr�rUZ_interfacesrr�c3s|]\}}�||fVqdSr2r*r��Zv2key_to_v1r*r+r��r�rrrwzv2(%s) -> v1(%s):
%srrz Unknown command type: {cmd_type}r�)�dict�NET_CONFIG_TO_V2r#rN�popr�rQr�r�r�r�r�r�r�)
r?r@r�Z	item_nameZitem_cfgZitem_paramsr�Z
grat_valueZv1_cmdrwr*r�r+r��s:���

�z+NetworkStateInterpreter._handle_bond_bridgec
Cs�dd�}g}|�d�r:ddi}||�di�|�|�|�|�d�rnddi}d|_||�di�|�|�|�d	}d	}i}|�d
g�D]�}d|d�}d
|vr�d|vr�|d	ur�|�d�}|�d|i�n(d|vr�|d	ur�|�d�}|�d|i�d|v�rD|�sD|�d��d
�}	|	�r|	|d<|�d��d�}
|
�r:|
|d<|�|�|�|�q�g}|�dg�D]&}|�t|�d�|�d�d����q`t|��r�t|��r�||dd<|S)z7Common ipconfig extraction from v2 to v1 subnets array.cSsd|vr|d|d<dS)Nzroute-metric�metricr*)Z	overridesryr*r*r+�_add_dhcp_overrides�szDNetworkStateInterpreter._v2_to_v1_ipcfg.<locals>._add_dhcp_overridesrr�rrTr
Nr
�static)r�r��:rr�rrrirj�
dns_searchrs�to�via)r�r�r)r#r�r^r�r�rQ)
r?r�r�rwryrrrr�r
rjrsrur*r*r+r��sT



�


�
z'NetworkStateInterpreter._v2_to_v1_ipcfg)T)T)T)N)#r<r=r>r~r{rdr|r	r^�setterr�r3r�r�r&r%r�r�rKr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r*r*r*r+r$�s^��







3



4

?


?!
(r$)�	metaclasscCszt�|�}tdd�|��D��}|�d�dvr@|�t|dd��dd�|�d	g�D�|d	<d
d�}dD]}|||�qf|S)
Ncss|]\}}|r||fVqdSr2r*r�r*r*r+r�7r�z$_normalize_subnet.<locals>.<genexpr>r�)r�Zstatic6)r��
ip_address��address_keyscSsg|]}t|��qSr*)r�)r��rr*r*r+r�=s�z%_normalize_subnet.<locals>.<listcomp>rscSs*||vr&t||t�s&||��||<dSr2)r�r��split)ZsnetrUr*r*r+�listify@sz"_normalize_subnet.<locals>.listify)r�ri)r_r`r�rNr#r��_normalize_net_keys)ryZ
normal_subnetr�r�r*r*r+�_normalize_subnet4s

�
�
r�r*c
CsVtdd�|��D��}d}|D]}|�|�r|}q6q|s^dd�|�|f}t�|�t|��|�|�}t|�}|�d�}d|vr�|�d�\}	}
}|	||<zt	|�}Wq�ty�t
|�}Yq�0n0|r�t
|�}n"d|vr�t	|d�}n|r�d	nd
}d|v�r"t|d�t|�k�r"t�d||�||d<|�rBd|v�rR|d=nt
|d�|d<|S)a�Normalize dictionary network keys returning prefix and address keys.

    @param network: A dict of network-related definition containing prefix,
        netmask and address_keys.
    @param address_keys: A tuple of keys to search for representing the address
        or cidr. The first address_key discovered will be used for
        normalization.

    @returns: A dict containing normalized prefix and matching addr_key.
    css|]\}}|r||fVqdSr2r*r�r*r*r+r�Ur�z&_normalize_net_keys.<locals>.<genexpr>Nz/No config network address keys [%s] found in %s�,�netmask�/rz�@�z;Overwriting existing 'prefix' with '%s' in network info: %s)r�rNr#�joinr�r�r�r��	partition�int�mask_to_net_prefixr�r��net_prefix_to_ipv4_mask)
r-r��netZaddr_keyr9�messager��ipv6r�Z	addr_part�_Zmaybe_prefixrzr*r*r+r�JsL
��



 �
r�c
Cs�tdd�|��D��}d|vr0|d|d<|d=|�t|dd��|�d�}|r�zt|�|d<Wn4ty�}ztd�|��|�WYd	}~n
d	}~00|S)
a�normalize a route.
    return a dictionary with only:
       'type': 'route' (only present if it was present in input)
       'network': the network portion of the route as a string.
       'prefix': the network prefix for address as an integer.
       'metric': integer metric (only if present in input).
       'netmask': netmask (string) equivalent to prefix iff network is ipv4.
       css"|]\}}|dvr||fVqdS))�NNr*r�r*r*r+r��s
�z#_normalize_route.<locals>.<genexpr>r�r-)r-r�r�r�z(Route config metric {} is not an integerN)	r�rNr�r�r#r�r��	TypeErrorr�)ruZnormal_router�r�r*r*r+r��s(
��
��r�cCs|sg}dd�|D�S)NcSsg|]}t|��qSr*)r�)r��sr*r*r+r��r�z&_normalize_subnets.<locals>.<listcomp>r*)rwr*r*r+r��sr�cCs|sdSdt|�vS)NFr��r�)r�r*r*r+r��sr�cCs@|d�d�s|dtvrdS|ddkr<t|�d��r<dSdS)z:Common helper for checking network_state subnets for ipv6.r�r�Tr�r�F)r��IPV6_DYNAMIC_TYPESr�r#)ryr*r*r+�subnet_is_ipv6�s
r	c	Cs&t�t�dddt|�>d@��}|S)z�Convert a network prefix to an ipv4 netmask.

    This is the inverse of ipv4_mask_to_net_prefix.
        24 -> "255.255.255.0"
    Also supports input as a string.z>Il��� )�socket�	inet_ntoa�struct�packr�)rz�maskr*r*r+r��s�r�cCs�t|t�r|St|t�r8z
t|�WSty4Yq@0ntd��d|vrTtd|��|�d�}t|�dkr~td|t|�f��tdd�|D��S)aConvert an ipv4 netmask into a network prefix length.

    If the input is already an integer or a string representation of
    an integer, then int(mask) will be returned.
       "255.255.255.0" => 24
       str(24)         => 24
       "24"            => 24
    � mask '%s' is not a string or int�.z#netmask '%s' does not contain a '.'�znetmask '%s' had only %d partscSsg|]}tt|���d��qS)r�)�binr��count�r��xr*r*r+r��r�z+ipv4_mask_to_net_prefix.<locals>.<listcomp>)r�r�r�r�rr�rQ�sum)r�toksr*r*r+�ipv4_mask_to_net_prefix�s	



rcCs�t|t�r|St|t�r8z
t|�WSty4Yq@0ntd��d|vrPtd��gd�}d}|�d�D].}|r|t|d�dkr�q�||�t|d��7}qf|S)z�Convert an ipv6 netmask (very uncommon) or prefix (64) to prefix.

    If 'mask' is an integer or string representation of one then
    int(mask) will be returned.
    rr�zmask '%s' does not have a ':')ri�i�i�i�i�i�i�i�i��i��i�i�i��i��i��i��r�)r�r�r�r�rr��index)rZbitCountrz�wordr*r*r+�ipv6_mask_to_net_prefix�s"


rcCs:z
t|�WStyYn0t|�r.t|�St|�SdS)zXReturn the network prefix for the netmask provided.

    Supports ipv4 or ipv6 netmasks.N)r�r�r�rr)rr*r*r+r�s
r�csftd�dd�|�d�D��d�}t|�}|dd|dB�d��fdd�td	�d
d
d�D��}|S)zZCalculate the broadcast address from the subnet mask and ip addr.

    Supports ipv4 only.rcSs$g|]}tt|�d�dd��qS)��N)rr�rr*r*r+r�r�z/mask_and_ipv4_to_bcast_addr.<locals>.<listcomp>rrr
rcs g|]}t�|d>?d@��qS)r�r)r��i�Z	bcast_binr*r+r�s�rN���)r�r�r�r�range)r�ipZip_binZmask_decZ	bcast_strr*r"r+�mask_and_ipv4_to_bcast_addrs �r&)T)T)r*)'r_rG�loggingrr
�	cloudinitrr�	getLoggerr<r�r{rr�r�r�r,r1r4r:�	Exceptionr;rKr�rL�objectr]r$r�r�r�r�r�r	r�rrr�r&r*r*r*r+�<module>s�
����

H[
: