403Webshell
Server IP : 167.99.254.82  /  Your IP : 216.73.216.188
Web Server : Apache
System : Linux host.techisquad.com 5.15.0-190-generic #200-Ubuntu SMP Fri Aug 7 15:06:04 UTC 2026 x86_64
User : pawluxera ( 1011)
PHP Version : 8.1.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/lib/python3/dist-packages/cloudinit/net/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/lib/python3/dist-packages/cloudinit/net/__pycache__/network_state.cpython-310.pyc
o

��i���
@s�UddlZddlZddlZddlmZmZmZmZddlm	Z	m
Z
mZddlm
Z
mZmZmZmZmZmZmZmZmZerCddlmZe�e�ZdZdgd�iZgd�Zid	d
�dd�d
d�dd�dd�dd�dd�dd�dd�dd�dd�dd �d!d"�d#d$�d%d&�d'd(�d)d*�d+d,d-��d.d/d0dd1d2dd3d4d5dd6�d7�Zee ee effe!d8<d9e"d:dfd;d<�Z#d=d>�Z$Gd?d@�d@e%�Z&dAdB�Z'GdCdD�dD�Z(GdEdF�dF�Z)dGdH�Z*dUdJdK�Z+dLdM�Z,dNdO�Z-	P	dVdQe"dRe.d:e(fdSdT�Z/dS)W�N)�
TYPE_CHECKING�Any�Dict�Optional)�	lifecycle�safeyaml�util)
�find_interface_name_from_mac�get_interfaces_by_mac�ipv4_mask_to_net_prefix�ipv6_mask_to_net_prefix�
is_ip_network�is_ipv4_address�is_ipv4_network�is_ipv6_address�is_ipv6_network�net_prefix_to_ipv4_mask��Renderer���version�config�
network_state)�	addresses�dhcp4�dhcp4-overrides�dhcp6�dhcp6-overrides�gateway4�gateway6�
interfaces�match�mtu�nameservers�renderer�set-name�	wakeonlan�	accept-ra�optionalzbond-ad-selectz	ad-selectzbond-all-slaves-activezall-slaves-activezbond-arp-all-targetszarp-all-targetszbond-arp-intervalzarp-intervalzbond-arp-ip-targetz
arp-ip-targetzbond-arp-validatezarp-validatezbond-downdelayz
down-delayzbond-fail-over-maczfail-over-mac-policyzbond-lacp-ratez	lacp-ratezbond-learn-packet-intervalzlearn-packet-intervalzbond-miimonzmii-monitor-intervalzbond-min-linksz	min-linksz	bond-mode�modezbond-num-grat-arp�gratuitous-arpzbond-packets-per-slavezpackets-per-slavezbond-primary�primaryzbond-primary-reselectzprimary-reselect-policyzup-delayztransmit-hash-policy)zbond-updelayzbond-xmit-hash-policyzageing-time�priorityz
forward-delayz
hello-timezmax-agez	path-costz
port-priority�stp)�
bridge_ageing�bridge_bridgeprio�	bridge_fd�bridge_gcint�bridge_hello�
bridge_maxage�bridge_maxwait�bridge_pathcost�bridge_portprio�
bridge_stp�bridge_waitport)�bond�bridge�NET_CONFIG_TO_V2�dikt�returncCs(d|vsd|vrtjdddd�dSdS)z8Warn about deprecations of v2 properties for all devicesrr z$The use of `gateway4` and `gateway6`z22.4zbFor more info check out: https://docs.cloud-init.io/en/latest/topics/network-config-format-v2.html)�
deprecated�deprecated_version�
extra_messageN)r�	deprecate)r=�rC�=/usr/lib/python3/dist-packages/cloudinit/net/network_state.py�warn_deprecated_all_devices\s
��rEcCs t|�}|D]}|�|�q|S�N)�set�discard)�expected�actual�missing�keyrCrCrD�	diff_keysgsrMc@seZdZdS)�InvalidCommandN)�__name__�
__module__�__qualname__rCrCrCrDrNnsrNcs�fdd�}|S)Ncst�����fdd��}|S)Ncs:�rt�|�}|rtd|�f���||g|�Ri|��S)Nz&Command missing %s of required keys %s)rMrN)�self�command�args�kwargs�missing_keys)�func�
required_keysrCrD�	decoratorts
��z7ensure_command_keys.<locals>.wrapper.<locals>.decorator)�	functools�wraps)rWrY�rX)rWrD�wrapperss
z$ensure_command_keys.<locals>.wrapperrC)rXr]rCr\rD�ensure_command_keysrsr^c@s�eZdZefdedefdd�Zedefdd��Zedd	��Z	ed
d��Z
edd
��Zedd��Zddd�Z
ddd�Zdd�Zdd�Zededdfdd��ZdS)�NetworkStaterrcCs*t�|�|_||_|�dd�|_d|_dS)N�use_ipv6F)�copy�deepcopy�_network_state�_version�getr`�_has_default_route)rRrrrCrCrD�__init__�s
zNetworkState.__init__r>cCs
|jdS)Nr)rc�rRrCrCrDr��
zNetworkState.configcCs|jSrF)rdrhrCrCrDr�szNetworkState.versioncC�(z|jddWStygYSw)N�dnsr$�rc�KeyErrorrhrCrCrD�dns_nameservers��
�zNetworkState.dns_nameserverscCrj)Nrk�searchrlrhrCrCrD�dns_searchdomains�rozNetworkState.dns_searchdomainscCs|jdur
|��|_|jSrF)rf�_maybe_has_default_routerhrCrCrD�has_default_route�s

zNetworkState.has_default_routeNccs@�|j�di�}|��D]}|dur|Vq||�r|VqdS)Nr!)rcre�values)rR�filter_func�ifaces�ifacerCrCrD�iter_interfaces�s���zNetworkState.iter_interfacesccs8�|j�dg�D]}|dur||�r|Vq|VqdS�N�routes�rcre)rRru�routerCrCrD�iter_routes�s���zNetworkState.iter_routescCsh|��D]
}|�|�rdSq|��D]}|�dg�D]}|�dg�D]}|�|�r/dSq#qqdS)NT�subnetsrzF)r}�_is_default_routerxre)rRr|rw�subnetrCrCrDrr�s
�

���z%NetworkState._maybe_has_default_routecCs d}|�d�dko|�d�|vS)N)z::z0.0.0.0�prefixr�network)re)rRr|�default_netsrCrCrDr�s�zNetworkState._is_default_routecCs,i}d|vr|d|d<|d|ifi|��S)z�Instantiates a `NetworkState` without interpreting its data.

        That means only `config` and `version` are copied.

        :param network_state: Network state data.
        :return: Instance of `NetworkState`.
        rrrC)�clsrrUrCrCrD�to_passthrough�s	zNetworkState.to_passthroughrF)rOrPrQ�NETWORK_STATE_VERSION�dict�intrg�propertyrrrnrqrsrxr}rrr�classmethodr�rCrCrCrDr_�s.��
�





	r_c@s�eZdZigggd�ddd�Zeddf	dHdd�Zed	efd
d��Zedd
��Z	e	j
dd
��Z	dd�Zdd�Zdd�Z
dd�ZdIdd�ZdIdd�ZdIdd�Zedg�dd ��Zedg�d!d"��Zegd#��d$d%��Zegd&��d'd(��Zedd)g�d*d+��Zedg�d,d-��Zd.d/�Zed0g�d1d2��Zed0g�d3d4��Zed5g�d6d7��Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z d@dA�Z!dJdBdC�Z"dKdDdE�Z#dFdG�Z$dS)L�NetworkStateInterpreter�r$rpFN)r!rzrkr`rr%�Optional[Renderer]cCsv||_||_t�|j�|_||jd<d|_i|_||_|j	|j
|j|j|j
|j|j|j|j|j|j|j|jd�
|_dS)NrF)
r:�bondsr;�bridges�	ethernets�
infiniband�loopback�
nameserver�physicalr|�vlan�vlans�wifis)rd�_configrarb�initial_network_staterc�_parsed�_interface_dns_map�	_renderer�handle_bond�handle_bonds�
handle_bridge�handle_bridges�handle_ethernets�handle_infiniband�handle_loopback�handle_nameserver�handle_physical�handle_route�handle_vlan�handle_vlans�handle_wifis�command_handlers)rRrrr%rCrCrDrg�s*
�z NetworkStateInterpreter.__init__r>cCsHddlm}|jdkrt|j|�rt�d�t�|j	�St|j
|jd�S)Nrr�zPassthrough netplan v2 config�r)�cloudinit.net.netplanrrd�
isinstancer��LOG�debugr_r�r�rc)rR�NetplanRendererrCrCrDrs

z%NetworkStateInterpreter.network_statecCs|j�d�S�Nr`r{rhrCrCrDr`sz NetworkStateInterpreter.use_ipv6cCs|j�d|i�dSr�)rc�update)rR�valrCrCrDr`scCs|j|j|jd�}t�|�S)Nr)rdr�rcr�dumps)rR�staterCrCrD�dumps
�
zNetworkStateInterpreter.dumpcCsvd|vr
t�d�td��t|d}t||�}|r'd|}t�|�t|��dd�|D�D]
}t||||�q.dS)Nrz$Invalid state, missing version fieldzInvalid state, missing keys: %scSsg|]}|dvr|�qS)r�rC)�.0�krCrCrD�
<listcomp>)sz0NetworkStateInterpreter.load.<locals>.<listcomp>)r��error�
ValueError�NETWORK_STATE_REQUIRED_KEYSrM�setattr)rRr�rXrV�msgrLrCrCrD�loads


�zNetworkStateInterpreter.loadcCst�|j�SrF)rr�rcrhrCrCrD�dump_network_state,sz*NetworkStateInterpreter.dump_network_statecCs|j|jd�S)N)rr)rdr�rhrCrCrD�as_dict/szNetworkStateInterpreter.as_dictTcCsD|jdkr|j|d�d|_dS|jdkr |j|d�d|_dSdS)Nr��skip_brokenTr�)rd�parse_config_v1r��parse_config_v2)rRr�rCrCrD�parse_config2s



�z$NetworkStateInterpreter.parse_configcCs�|jD]B}|d}z|j|}Wnty#}ztd|�|�d}~wwz||�WqtyE|s4�tjd|dd�t�|���Yqw|j	�
�D]1\}}d}z	|jd|}Wntyn}ztd�
|��|�d}~ww|r||\}	}
|	|
d�|d	<qKdS)
N�typez"No handler found for  command '%s'�Skipping invalid command: %sT��exc_infor!zINameserver specified for interface {0}, but interface {0} does not exist!r�rk)r�r�rm�RuntimeErrorrNr��warningr�r�r��itemsrcr��format)rRr�rS�command_type�handler�e�	interfacerkrwr$rprCrCrDr�:sT
����������
���z'NetworkStateInterpreter.parse_config_v1cCs�ddlm}t|j|�rdS|j��D]J\}}|dvrqz|j|}Wnty6}ztd|�|�d}~wwz||�|�	|�Wqt
y]|sL�tjd|dd�t�
|���YqwdS)Nrr)rr%z!No handler found for command '%s'r�Tr�)r�rr�r�r�r�r�rmr��
_v2_commonrNr�r�r�r�)rRr�r�r�rSr�r�rCrCrDr�]s8�������z'NetworkStateInterpreter.parse_config_v2�namecCs
|�|�SrF�r��rRrSrCrCrDr�yriz'NetworkStateInterpreter.handle_loopbackcCs||j�di�}|�|di�}|�di���D]\}}|�||i�qt|�d��}|jsF|D]}|�d��d�s@t|�d��rEd|_nq/|�d	d
�}|d
urUt�	|�}|�dd
�}	|	d
urdt�	|	�}	|�dd
�}
|
d
urst�	|
�}
|�|�d
�|�d�|�d�|�d�dd|�d�d
d
|||	|
|�d�d��|dr�|d�
�|d<|�d
|�d��}|jd�||i�|��d
S)z�
        command = {
            'type': 'physical',
            'mac_address': 'c0:d6:9f:2c:e8:80',
            'name': 'eth0',
            'subnets': [
                {'type': 'dhcp4'}
             ],
            'accept-ra': 'true'
        }
        r!r��paramsr~r��6�addressTr(Nr'r)�	config_id�mac_address�inet�manualr#�keep_configuration)r�r�r�r�r�r*r#r��gatewayr~r(r'r)r�)rcrer�r��_normalize_subnetsr`�endswithrr�is_true�lowerr�)rRrSr!rw�paramr�r~r��	accept_rar'r)�	iface_keyrCrCrDr�}sX��


��z'NetworkStateInterpreter.handle_physical)r��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
        r!r�r�zvlan-raw-devicer�N)rcrer�r�)rRrSr!rwrCrCrDr��s

z#NetworkStateInterpreter.handle_vlan)r��bond_interfacesr�c	Cs|�|�|j�d�}|�|�d�i�}|�d���D]\}}|�||i�q|�ddi�|jd�|d|i�|�d�D]@}||vrO|dd�}|�|�|j�di�}|�|�}|�d�|d	<|�d���D]\}}|�||i�qi|jd�||i�q?d
S)aU
        #/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
        r!r�r�zbond-slaves�noner�r:)r�r�zbond-masterN)r�rcrer�r�)	rRrSr!rwr�r��ifname�cmd�bond_ifrCrCrDr��s(
�

�z#NetworkStateInterpreter.handle_bond�bridge_interfacesc	Cs|j�di�}|�d�D]}||vrqd|i}|�|�q|j�di�}|�|�|�|�d�i�}|d|d<|�di���D]\}}|�||i�q@|�d�}|durwt|t�sw|dvrad	}n|d
vrhd}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",
        ]
        r!r�r��bridge_portsr�r8N)�on�1rT)�off�0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r.)	rcrer�r�r�r��boolr�r�)	rRrSr!r�r�rwr�r�r8rCrCrDr�s4�

��z%NetworkStateInterpreter.handle_bridgecCs|�|�dSrFr�r�rCrCrDr�Fsz)NetworkStateInterpreter.handle_infinibandcCsxg}g}d|vr|d}t|t�s|g}|D]}|�|�qd|vr8|d}t|t�s.|g}|D]}|�|�q0||fS)Nr�rp)r��list�append)rRrSr$rp�addrs�addr�paths�pathrCrCrD�
_parse_dnsJs

z"NetworkStateInterpreter._parse_dnsr�cCsX|j�d�}|�|�\}}d|vr||f|j|d<dS|d�|�|d�|�dS)Nrkr�r$rp)rcrer�r��extend)rRrSrkr$rprCrCrDr�[s�z)NetworkStateInterpreter.handle_nameservercCs0|j�d�}|�|�\}}||d�||d<dS)Nr!r�rk)rcrer�)rRrSrw�_ifacer$rprCrCrD�_handle_individual_nameserverhsz5NetworkStateInterpreter._handle_individual_nameserver�destinationcCs|jd�t|��dSry)rcr��_normalize_router�rCrCrDr�nsz$NetworkStateInterpreter.handle_routecC�|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�rCrCrDr�ssz$NetworkStateInterpreter.handle_bondscCr)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
            }
        }

        r;rNrr�rCrCrDr��sz&NetworkStateInterpreter.handle_bridgescCst�}|��D]�\}}|dd�}|�di�}|�dd�}|s't�d|t|��||d<|}|�d�}	|	r7|	}n|rG|rG|��}
t|
�}|rG|}||d	<|�d
d�}|rYd
|i|d<dD]}
|
|vrg||
||
<q[t|�|�	|�}t
|�d
kr~|�d|i�t�d|�|�|�qdS)a�
        ethernets:
          eno1:
            match:
              macaddress: 00:11:22:33:44:55
              driver: hv_netvsc
            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'}
             ]
        }
        r�)r�r�r"�
macaddressNzHNetworkState Version2: missing "macaddress" info in config entry: %s: %sr�r&r��driverr�)r#r"r'r(r)rr~z!v2(ethernets) -> v1(physical):
%s)
r
r�rer�r��strr�r	rE�_v2_to_v1_ipcfg�lenr�r�)rRrS�
ifaces_by_mac�eth�cfg�phy_cmdr"r�r��set_name�lcase_mac_address�macrrLr~rCrCrDr��sL-��
�
�z(NetworkStateInterpreter.handle_ethernetscCs�|��D]@\}}d||�d�|�d�|�d�d�}d|vr#|d|d<t|�|�|�}t|�dkr9|�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'}],
        }
        r��id�linkr)r�r�r�r�r�r#rr~zv2(vlans) -> v1(vlan):
%sN)	r�rerEr
rr�r�r�r�)rRrSr�r�vlan_cmdr~rCrCrDr�
s �
�z$NetworkStateInterpreter.handle_vlanscCst�d�dS)NzOWifi configuration is only available to distros with netplan rendering support.)r�r�r�rCrCrDr�-s�z$NetworkStateInterpreter.handle_wifiscCsvt�d|�|��D].\}}d|vr8|�d��d�}|�d��d�}ddi}|r,||d<|r2||d<|�||�q
dS)Nzv2_common: handling config:
%sr$rprr�r�r�)r�r�r�rer�)rRrrw�dev_cfgrprk�name_cmdrCrCrDr�3s��z"NetworkStateInterpreter._v2_commonc
s:tdd�t�|���D���|��D]�\}}tdd�|��D��}|�di�}|�dd�}|r3||d<d|d	||d
|�d�dt�fd
d�|��D��i}d|vrW|d|d<d|vra|d|d<t|�|�|�}	t|	�dkrw|�d|	i�t	�
d|||�|dkr�|�|�q|dkr�|�|�qt
dj|d���dS)z(Common handler for bond and bridge typescss�|]	\}}||fVqdSrFrC�r�r��vrCrCrD�	<genexpr>Es�
�z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>css$�|]
\}}|tvr||fVqdSrF)�NETWORK_V2_KEY_FILTER)r�rL�valuerCrCrDrJs����
parameterszgratuitious-arpNr+r�r��_interfacesr!r�c3s �|]\}}�||fVqdSrFrCr��v2key_to_v1rCrDrZ��r#rr�rr~zv2(%s) -> v1(%s):
%sr;r:z Unknown command type: {cmd_type}r)r�r<rer��poprEr
rr�r�r�r�r�r�r�)
rRrSr�	item_name�item_cfg�item_paramsr��
grat_value�v1_cmdr~rCrrDrAsF���
���z+NetworkStateInterpreter._handle_bond_bridgec
Cs�dd�}g}|�d�rddi}||�di�|�|�|�|�d�r7ddi}d|_||�di�|�|�|�d	}d	}i}|�d
g�D]`}d|d�}d
|vrcd|vrb|d	urb|�d�}|�d|i�nd|vrw|d	urw|�d�}|�d|i�d|vr�|s�|�d��d
�}	|	r�|	|d<|�d��d�}
|
r�|
|d<|�|�|�|�qCg}|�dg�D]}|�t|�d�|�d�|�d�|�d�|�d�d���q�t|�r�t|�r�||dd<|S)z7Common ipconfig extraction from v2 to v1 subnets array.cSsd|vr|d|d<dSdS)Nzroute-metric�metricrC)�	overridesr�rCrCrD�_add_dhcp_overridesvs�zDNetworkStateInterpreter._v2_to_v1_ipcfg.<locals>._add_dhcp_overridesrr�rrTrNr�static)r�r��:r r�rr$rnrp�
dns_searchrz�to�viar(r#�table)rr�r(r#r0r)rer�r`r�rr)
rRrr*r~r�rr r$r�rrprzr|rCrCrDr
ssd



�
�

���z'NetworkStateInterpreter._v2_to_v1_ipcfg)r%r�)T)r>NrF)%rOrPrQr�r�rgr�r_rr`�setterr�r�r�r�r�r�r�r^r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr
rCrCrCrDr��sn��
�
�




#


A



4
@



_#

2r�cCszt�|�}tdd�|��D��}|�d�dvr |�t|dd��dd�|�d	g�D�|d	<d
d�}dD]}|||�q3|S)
Ncss �|]\}}|r||fVqdSrFrCrrCrCrDr�r!z$_normalize_subnet.<locals>.<genexpr>r�)r+�static6)r��
ip_address��address_keyscS�g|]}t|��qSrC)r)r��rrCrCrDr��s�z%_normalize_subnet.<locals>.<listcomp>rzcSs2||vrt||t�s||��||<dSdSdSrF)r�r��split)�snetr�rCrCrD�listify�s�z"_normalize_subnet.<locals>.listify)r-rn)rarbr�r�rer��_normalize_net_keys)r��
normal_subnetr:r�rCrCrD�_normalize_subnet�s 
��	

�r=rCcCsdd�|��D�}d}|D]}|�|�r|}nq
|s-dd�|�|f}t�|�t|��t|�|��}|dkrit|�d��}|sLd}t�|�t|��t|�rSd	}nt|�rZd
}nd|�d�}t�|�t|��t	|�s{t�d
|�td|�d���t
|�}t|�}	|�d�}
d|vr�|�d�\}}}
|||<|r�t
|
�}n8|	r�t|
�}n1t�d
|�td|�d���d|vr�t|d�}n|
r�|	r�t|
�}n|
r�|r�t
|
�}n|r�dnd}d|vr�t|d�t|�kr�t�d||�||d<|r�d|vr�|d=|S|	�rt|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"i|]
\}}|s|dkr||�qS)rrCrrCrCrD�
<dictcomp>�s"z'_normalize_net_keys.<locals>.<dictcomp>Nz/No config network address keys [%s] found in %s�,�defaultr�zGateway IP is emptyz	0.0.0.0/0z::/0zInvalid Gateway IP: '�'z$Address %s is not a valid ip networkzAddress z is not a valid ip address�netmask�/r��@�z;Overwriting existing 'prefix' with '%s' in network info: %s)r�re�joinr�r�r�r	rrr
rr�	partitionrrr�r�r)r�r5�net�addr_keyrL�messager��gw_ip�ipv6�ipv4rB�	addr_part�_�maybe_prefixr�rCrCrDr;�s�
��







��r;c
Cs�tdd�|��D��}d|vr|d|d<|d=|�t|dd��|�d�}|rFz	t|�|d<W|StyE}ztd�|��|�d	}~ww|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))�NNrCrrCrCrDr;s��z#_normalize_route.<locals>.<genexpr>rr�)r�rr4r(z(Route config metric {} is not an integerN)	r�r�r�r;rer�r��	TypeErrorr�)r|�normal_router(r�rCrCrDr1s2
���
�����rcCs|sg}dd�|D�S)NcSr6rC)r=)r��srCrCrDr�Vsz&_normalize_subnets.<locals>.<listcomp>rC)r~rCrCrDr�Ssr�T�
net_configr�cCsfd}|�d�}|�d�}|dkr|}|r(|dur(t|||d�}|j|d�|j}|s1td|����|S)zfParses the config, returns NetworkState object

    :param net_config: curtin network config dict
    Nrrr�)rrr%r�zpNo valid network_state object created from network config. Did you specify the correct version? Network config:
)rer�r�rr�)rUr�r%r�rr�nsirCrCrD�parse_net_config_dataYs$	

���rW)rC)TN)0rarZ�logging�typingrrrr�	cloudinitrrr�
cloudinit.netr	r
rrr
rrrrr�cloudinit.net.rendererr�	getLoggerrOr�r�r�rr<r	�__annotations__r�rErM�	ExceptionrNr^r_r�r=r;rr�r�rWrCrCrCrD�<module>s�
0

���������	�
���
��������&Vc
\"����

Youez - 2016 - github.com/yon3zu
LinuXploit