HEX
Server: Apache/2.4.67 (Debian)
System: Linux vps-b2547eb4 6.1.0-41-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.158-1 (2025-11-09) x86_64
User: root (0)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/cloudinit/net/__pycache__/network_state.cpython-311.pyc
�

܍~c������UddlZddlZddlZddlmZmZmZmZddlm	Z	m
Z
ddlmZm
Z
mZmZmZmZmZmZmZerddlmZeje��ZdZdgd�iZgd�Zd	d
ddd
ddddddddddd�dddddddddd dd!�d"�Zeeeeeffed#<d$�Z d%�Z!Gd&�d'e"��Z#d(�Z$Gd)�d*e%��Z&Gd+�d,��Z'Gd-�d.e&�/��Z(d0�Z)d:d2�Z*d3�Z+d4�Z,		d;d6e-d7e.d8e'fd9�Z/dS)<�N)�
TYPE_CHECKING�Any�Dict�Optional)�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_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-raz	ad-selectzarp-intervalz
arp-ip-targetzarp-validatez
down-delayzfail-over-mac-policyz	lacp-ratezmii-monitor-intervalz	min-links�mode�gratuitous-arp�primaryzprimary-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)�
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_V2c�t�tj|��}t��}|�|��|S�N)r�	read_conf�NetworkStateInterpreter�load)�
state_file�state�nsis   �=/usr/lib/python3/dist-packages/cloudinit/net/network_state.py�from_state_filerDVs0���N�:�&�&�E�
!�
#�
#�C��H�H�U�O�O�O��J�c�X�t|��}|D]}|�|���|Sr<)�set�discard)�expected�actual�missing�keys    rC�	diff_keysrM]s6���(�m�m�G��������������NrEc��eZdZdS)�InvalidCommandN)�__name__�
__module__�__qualname__�rErCrOrOds�������DrErOc����fd�}|S)Nc�J���tj�����fd���}|S)Nc�p���r't�|��}|rtd|�d�������||g|�Ri|��S)NzCommand missing z of required keys )rMrO)�self�command�args�kwargs�missing_keys�func�
required_keyss     ��rC�	decoratorz7ensure_command_keys.<locals>.wrapper.<locals>.decoratorjsj����
�(���@�@����(�.�'�<�<���8�����4��g�7��7�7�7��7�7�7rE)�	functools�wraps)r\r^r]s` �rC�wrapperz$ensure_command_keys.<locals>.wrapperis?����	���	�	�	8�	8�	8�	8�	8�
�	�	8��rErS)r]ras` rC�ensure_command_keysrbhs#���������NrEc�"��eZdZdZ�fd�Z�xZS)�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.
    c� ��i}|���D]G\}}t|��r3|�d��r|td��d�}|r|||<�H||d<t	t
|���||||��S)N�handle_�command_handlers)�items�callable�
startswith�len�superrd�__new__)	�cls�name�parents�dctrg�	attr_name�attr�handles_what�	__class__s	        �rCrmzCommandHandlerMeta.__new__�s������"�y�y�{�{�	:�	:�O�I�t���~�~�
:�)�"6�"6�y�"A�"A�
:�(��Y���)9�)9�:���:�59�$�\�2��"2�����'��-�-�5�5�c�4��#�N�N�NrE)rPrQrR�__doc__rm�
__classcell__)rus@rCrdrdzsK���������O�O�O�O�O�O�O�O�OrErdc���eZdZefdedefd�Zedefd���Zed���Z	ed���Z
ed���Zed	���Zdd�Z
dd�Zd
�Zd�Zededdfd���Zd
S)�NetworkStaterrc��tj|��|_||_|�dd��|_d|_dS)N�use_ipv6F)�copy�deepcopy�_network_state�_version�getr{�_has_default_route)rWrrs   rC�__init__zNetworkState.__init__�sB��#�m�M�:�:�����
�%�)�)�*�e�<�<��
�"&����rE�returnc��|jdS)Nr)r~�rWs rCrzNetworkState.config�s���"�8�,�,rEc��|jSr<)rr�s rCrzNetworkState.version�s
���}�rEc�N�	|jddS#t$rgcYSwxYw)N�dnsr#�r~�KeyErrorr�s rC�dns_nameserverszNetworkState.dns_nameservers�s>��	��&�u�-�m�<�<���	�	�	��I�I�I�	������$�$c�N�	|jddS#t$rgcYSwxYw)Nr��searchr�r�s rC�dns_searchdomainszNetworkState.dns_searchdomains�s>��	��&�u�-�h�7�7���	�	�	��I�I�I�	���r�c�P�|j�|���|_|jSr<)r��_maybe_has_default_router�s rC�has_default_routezNetworkState.has_default_route�s(���"�*�&*�&C�&C�&E�&E�D�#��&�&rENc#�K�|j�di��}|���D]}|�|V��	||��r|V��dS)Nr )r~r��values)rW�filter_func�ifaces�ifaces    rC�iter_interfaceszNetworkState.iter_interfaces�sl�����$�(�(��r�:�:���]�]�_�_�	 �	 �E��"�������;�u�%�%� ��K�K�K��	 �	 rEc#�rK�|j�dg��D]}|�||��r|V��|V��dS�N�routes�r~r�)rWr��routes   rC�iter_routeszNetworkState.iter_routes�s_�����(�,�,�X�r�:�:�	�	�E��&��;�u�%�%� ��K�K�K�������	�	rEc�*�|���D]}|�|��rdS�|���D]N}|�dg��D]5}|�dg��D]}|�|��rdS��6�OdS)NT�subnetsr�F)r��_is_default_router�r�)rWr�r��subnets    rCr�z%NetworkState._maybe_has_default_route�s����%�%�'�'�	�	�E��%�%�e�,�,�
��t�t�
��)�)�+�+�	$�	$�E��)�)�I�r�2�2�
$�
$��#�Z�Z��"�5�5�$�$�E��-�-�e�4�4�$�#�t�t�t�t�$�$�
$��urEc�f�d}|�d��dko|�d��|vS)N)z::z0.0.0.0�prefixr�network)r�)rWr��default_netss   rCr�zNetworkState._is_default_route�s6��(���I�I�h���1�$�M����9�)=�)=��)M�	
rEc�:�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`.
        rrrS)rnrrZs   rC�to_passthroughzNetworkState.to_passthrough�s@�����
�%�%� -�i� 8�F�9���s�H�m�,�7�7��7�7�7rEr<)rPrQrR�NETWORK_STATE_VERSION�dict�intr��propertyrrr�r�r�r�r�r�r��classmethodr�rSrErCryry�sG������2G�'�'�!�'�,/�'�'�'�'��-��-�-�-��X�-�����X������X������X���'�'��X�'�
 � � � �����	�	�	�
�
�
��8�4�8�N�8�8�8��[�8�8�8rEryc�n�eZdZigggd�ddd�Zeddfd�Zedefd���Zed���Z	e	j
d	���Z	d
�Zd�Zd�Z
d
�Zd*d�Zd*d�Zd*d�Zedg��d���Zedg��d���Zegd���d���Zegd���d���Zeddg��d���Zedg��d���Zd�Zedg��d���Zedg��d���Zed g��d!���Zd"�Zd#�Zd$�Zd%�Z d&�Z!d+d'�Z"d,d(�Z#d)�Z$dS)-r>�r#r�FN)r r�r�r{rc��||_||_tj|j��|_||jd<d|_i|_||_dS)NrF)	r�_configr|r}�initial_network_stater~�_parsed�_interface_dns_map�	_renderer)rWrrr$s    rCr�z NetworkStateInterpreter.__init__�sN�� ��
����"�m�D�,F�G�G���(.���H�%����(*���!����rEr�c��ddlm}|jdkrNt|j|��r9t
�d��t�|j	��St|j
|j���S)Nrr�zPassthrough netplan v2 config�r)�cloudinit.net.netplanrr�
isinstancer��LOG�debugryr�r�r~)rW�NetplanRenderers  rCrz%NetworkStateInterpreter.network_state�ss��E�E�E�E�E�E��=�A���*�T�^�_�"M�"M���I�I�5�6�6�6��.�.�t�|�<�<�<��D�/���G�G�G�GrEc�6�|j�d��S�Nr{r�r�s rCr{z NetworkStateInterpreter.use_ipv6s���"�&�&�z�2�2�2rEc�>�|j�d|i��dSr�)r~�update)rW�vals  rCr{z NetworkStateInterpreter.use_ipv6s$����"�"�J��#4�5�5�5�5�5rEc�T�|j|j|jd�}tj|��S)Nr)rr�r~r�dumps)rWrAs  rC�dumpzNetworkStateInterpreter.dumps0���}��l�!�0�
�
��
�~�e�$�$�$rEc�R�d|vr)t�d��td���t|d}t	||��}|r.d|z}t�|��t|���d�|D��D]}t||||���dS)Nrz$Invalid state, missing version fieldzInvalid state, missing keys: %sc��g|]}|dv�|��	S)r�rS)�.0�ks  rC�
<listcomp>z0NetworkStateInterpreter.load.<locals>.<listcomp>$s"��E�E�E�!���0D�0D�A�0D�0D�0DrE)r��error�
ValueError�NETWORK_STATE_REQUIRED_KEYSrM�setattr)rWrAr]r[�msgrLs      rCr?zNetworkStateInterpreter.loads����E�!�!��I�I�<�=�=�=��C�D�D�D�3�E�)�4D�E�
� ���6�6���	"�3�|�D�C��I�I�c�N�N�N��S�/�/�!�F�E�}�E�E�E�	+�	+�C��D�#�u�S�z�*�*�*�*�	+�	+rEc�4�tj|j��Sr<)rr�r~r�s rC�dump_network_statez*NetworkStateInterpreter.dump_network_state's���~�d�1�2�2�2rEc� �|j|jd�S)N)rr)rr�r�s rC�as_dictzNetworkStateInterpreter.as_dict*s���=�D�L�A�A�ArETc��|jdkr|�|���d|_dS|jdkr|�|���d|_dSdS)Nr��skip_brokenTr�)r�parse_config_v1r��parse_config_v2)rWr�s  rC�parse_configz$NetworkStateInterpreter.parse_config-sh���=�A���� � �[� �9�9�9��D�L�L�L�
�]�a�
�
�� � �[� �9�9�9��D�L�L�L� �
rEc�X�|jD]�}|d}	|j|}n%#t$r}td|z��|�d}~wwxYw	|||���L#t$rO|s�t
�d|d���t
�|�����Y��wxYw|j	�
��D]`\}}d}	|jd|}n5#t$r(}td�
|����|�d}~wwxYw|r
|\}	}
|	|
d�|d	<�adS)
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!)rr�r�)r�rgr��RuntimeErrorrOr��warningr�r�r�rhr~r��format)rWr�rX�command_type�handler�e�	interfacer�r�r#r�s           rCr�z'NetworkStateInterpreter.parse_config_v15s����|�	9�	9�G�"�6�?�L�
��/��=�����
�
�
�"�8�<�G���������
����	
9����g�&�&�&�&��!�
9�
9�
9�"�9���K�K�6��$� �����I�I�d�5�5�7�7�8�8�8�8�8�
9����#�5�;�;�=�=�	�	�N�I�s��E�
��+�L�9�)�D�����
�
�
� �8�8>��y�8I�8I���������
����
�
�&)�#��V�!,�$� � ��e���	�	s=�
!�
A�>�A�A�AB-�,B-�C%�%
D�/#D�Dc���ddlm}t|j|��rdS|j���D]�\}}|dvr�
	|j|}n%#t$r}td|z��|�d}~wwxYw	|||��|�	|���a#t$rO|s�t�d|d���t�
|�����Y��wxYwdS)Nrr)rr$z!No handler found for command '%s'r�Tr�)r�rr�r�r�rhrgr�r��
_v2_commonrOr�r�r�r�)rWr�r�r�rXr�r�s       rCr�z'NetworkStateInterpreter.parse_config_v2XsR��E�E�E�E�E�E��d�n�o�6�6�	��F�%)�\�%7�%7�%9�%9�	9�	9�!�L�'��6�6�6��
��/��=�����
�
�
�"�7�,�F���������
����

9����g�&�&�&�����(�(�(�(��!�
9�
9�
9�"�9���K�K�6��$� �����I�I�d�5�5�7�7�8�8�8�8�8�
9����	9�	9s+�
A�
A2�A-�-A2�6!B�AC1�0C1roc�,�|�|��Sr<��handle_physical�rWrXs  rC�handle_loopbackz'NetworkStateInterpreter.handle_loopbackts���#�#�G�,�,�,rEc��|j�di��}|�|di��}|�di�����D]\}}|�||i���t	|�d����}|jsX|D]U}|�d���d��s"t|�d����r	d|_n�V|�d	d
��}|�tj	|��}|�dd
��}	|	�tj	|	��}	|�|�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'
        }
        r ro�paramsr�r��6�addressTr'Nr&�mac_address�inet�manualr")ror�r�r�r(r"r��gatewayr�r'r&)r~r�rhr��_normalize_subnetsr{�endswithrr�is_truer�)
rWrXr r��paramr�r�r��	accept_rar&s
          rCr�z'NetworkStateInterpreter.handle_physicalxs���(�,�,�\�2�>�>�
����w�v���3�3��!�+�+�h��3�3�9�9�;�;�	'�	'�J�E�3��L�L�%���&�&�&�&�%�W�[�[��%;�%;�<�<���}�	�!�
�
���:�:�f�%�%�.�.�s�3�3����J�J�y�)�)�8�8��%)�D�M��E�	��K�K��T�2�2�	�� ���Y�/�/�I��K�K��T�2�2�	�� ���Y�/�/�I�
������F�+�+����F�+�+�&�{�{�=�9�9�� ��{�{�5�)�)���"�&�&�
�
�	
�	
�	
�	
��L�)�0�0�'�+�+�f�2E�2E�u�1M�N�N�N����!�!�!�!�!rE)ro�vlan_id�	vlan_linkc�R�|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 ror�zvlan-raw-devicer�N)r~r�r�r�)rWrXr r�s    rC�handle_vlanz#NetworkStateInterpreter.handle_vlan�s����(�,�,�\�2�>�>�
����W�%�%�%����w�{�{�6�2�2�B�7�7��#*�;�;�{�#;�#;��� �"�;�;�y�1�1��i�����5��=�%�0�1�1�1�1�1rE)ro�bond_interfacesr�c��|�|��|j�d��}|�|�d��i��}|�d�����D]\}}|�||i���|�ddi��|jd�|d|i��|�d��D]�}||vr|dd�}|�|��|j�di��}|�|��}|�d��|d	<|�d�����D]\}}|�||i���|jd�||i����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 ror�zbond-slaves�noner�r8)ror�zbond-masterN)r�r~r�rhr�)	rWrXr r�r�r��ifname�cmd�bond_ifs	         rC�handle_bondz#NetworkStateInterpreter.handle_bond�s���6	
���W�%�%�%��(�,�,�\�:�:�
����w�{�{�6�2�2�B�7�7��!�+�+�h�/�/�5�5�7�7�	'�	'�J�E�3��L�L�%���&�&�&�&�
���m�V�,�-�-�-���L�)�0�0�%��-��1G�H�H�H��k�k�"3�4�4�	H�	H�F��Z�'�'�"�"����
�$�$�S�)�)�)��,�0�0��r�B�B�J� �n�n�V�,�,�G�%,�[�[��%8�%8�G�M�"�%�k�k�(�3�3�9�9�;�;�
-�
-�
��s�����s�|�,�,�,�,����-�4�4�f�g�5F�G�G�G�G�	H�	HrE�bridge_interfacesc�"�|j�di��}|�d��D] }||vr�d|i}|�|���!|j�di��}|�|��|�|�d��i��}|d|d<|�di�����D]\}}|�||i���|�d��}|�`t|��tkrH|dvrd	}n*|d
vrd}n#td�|�
�����|�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 rro�bridge_portsr�r6N)�on�1rT)�off�0rFz2Cannot convert bridge_stp value ({stp}) to boolean)r,)	r~r�r�rhr�r��boolr�r�)	rWrXr rrr�r�r�r6s	         rC�
handle_bridgez%NetworkStateInterpreter.handle_bridge�s���>�(�,�,�\�2�>�>�
��k�k�"5�6�6�	&�	&�F���#�#�����C�
� � ��%�%�%�%��(�,�,�\�2�>�>�
����W�%�%�%����w�{�{�6�2�2�B�7�7�� '�(;� <��n��!�+�+�h��3�3�9�9�;�;�	'�	'�J�E�3��L�L�%���&�&�&�&��Y�Y�|�,�,�
��!�d�:�&6�&6�$�&>�&>��^�+�+�!�
�
���.�.�"�
�
� ��%�v�*�v�5�5����
�L�L�,�
�3�4�4�4����5��=�%�0�1�1�1�1�1rEc�0�|�|��dSr<r�r�s  rC�handle_infinibandz)NetworkStateInterpreter.handle_infiniband6s�����W�%�%�%�%�%rEc��g}g}d|vr=|d}t|��tks|g}|D]}|�|���d|vr:|d}t|t��s|g}|D]}|�|���||fS)Nr�r�)r��list�appendr�)rWrXr#r��addrs�addr�paths�paths        rC�
_parse_dnsz"NetworkStateInterpreter._parse_dns:s������������I�&�E���;�;�$�&�&�����
)�
)���"�"�4�(�(�(�(��w����H�%�E��e�T�*�*�
 �����
$�
$���
�
�d�#�#�#�#��F�"�"rEr�c��|j�d��}|�|��\}}d|vr||f|j|d<dS|d�|��|d�|��dS)Nr�r�r#r�)r~r�rr��extend)rWrXr�r#r�s     rC�handle_nameserverz)NetworkStateInterpreter.handle_nameserverKs����!�%�%�e�,�,��"�o�o�g�6�6���V��'�!�!���=�D�#�G�K�$8�9�9�9�

�
��%�%�k�2�2�2���M� � ��(�(�(�(�(rEc��|j�d��}|�|��\}}||d�||d<dS)Nr r�r�)r~r�r)rWrXr��_ifacer#r�s      rC�_handle_individual_nameserverz5NetworkStateInterpreter._handle_individual_nameserverXsJ���$�(�(��6�6��"�o�o�g�6�6���V�/:�f�M�M��u�
�e���rE�destinationc�`�|jd�t|����dSr�)r~r�_normalize_router�s  rC�handle_routez$NetworkStateInterpreter.handle_route^s-����H�%�,�,�-=�g�-F�-F�G�G�G�G�GrEc�4�|�|d���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',
            }
        }

        r8��cmd_typeN��_handle_bond_bridger�s  rC�handle_bondsz$NetworkStateInterpreter.handle_bondscs#��:	
� � ��6� �:�:�:�:�:rEc�4�|�|d���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
            }
        }

        r9r#Nr%r�s  rC�handle_bridgesz&NetworkStateInterpreter.handle_bridges�s#��0	
� � ��8� �<�<�<�<�<rEc��t��}|���D�]T\}}ddi}|�di��}|�dd��}|s)t�d|t|����||d<|}|�d��}	|	r|	}n+|r)|r'|���}
t|
��}|r|}||d	<|�d
d��}|rd
|i|d<dD]}
|
|vr||
||
<�|�|��}t|��d
kr|�
d|i��t�d|��|�|����VdS)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'}
             ]
        }
        r��physicalr!�
macaddressNzHNetworkState Version2: missing "macaddress" info in config entry: %s: %sr�r%ro�driverr�)r"r!r&r'rr�z!v2(ethernets) -> v1(physical):
%s)r
rhr�r�r��str�lowerr	�_v2_to_v1_ipcfgrkr�r�)rWrX�
ifaces_by_mac�eth�cfg�phy_cmdr!r�ro�set_name�lcase_mac_address�macr-rLr�s               rC�handle_ethernetsz(NetworkStateInterpreter.handle_ethernets�s���Z.�/�/�
��
�
���+	*�+	*�H�C���
��G��G�G�G�R�(�(�E��)�)�L�$�7�7�K��
��	�	�.����H�H�	���&1�G�M�"��D��w�w�z�*�*�H��
�����
��
�$/�$5�$5�$7�$7�!�2�3D�E�E�����D�"�G�F�O��Y�Y�x��.�.�F��
7�%-�v�$6���!�A�
,�
,���#�:�:�#&�s�8�G�C�L���*�*�3�/�/�G��7�|�|�a������	�7�3�4�4�4��I�I�:�G�D�D�D�� � ��)�)�)�)�W+	*�+	*rEc��|���D]�\}}d||�d��|�d��d�}d|vr|d|d<|�|��}t|��dkr|�d|i��t
�d|��|�|����d	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�ror�r�r"rr�zv2(vlans) -> v1(vlan):
%sN)rhr�r0rkr�r�r�r�)rWrXr:r3�vlan_cmdr�s      rC�handle_vlansz$NetworkStateInterpreter.handle_vlans�s���$!�����
	'�
	'�I�D�#����7�7�4�=�=� �W�W�V�_�_�	��H���|�|�"%�e�*�����*�*�3�/�/�G��7�|�|�a�������G� 4�5�5�5��I�I�2�H�=�=�=����X�&�&�&�&�
	'�
	'rEc�:�t�d��dS)NzOWifi configuration is only available to distros with netplan rendering support.)r�r�r�s  rC�handle_wifisz$NetworkStateInterpreter.handle_wifiss'�����
*�	
�	
�	
�	
�	
rEc���t�d|��|���D�];\}}d|vr|�d��}|r|}d|v�r|�d���dg��}|�d���dg��}ddi}t	|��dkr|�d|i��t	|��dkr|�d	|i��|�|��|�d
i���d��}|rt|��}	|	r|	}|�||����=dS)Nzv2_common: handling config:
%sr%r#r�rr��
nameserverrr�r!r,)	r�r�rhr�rkr�rr	r)
rWr3r��dev_cfg�set_name_ifacer�r��name_cmdr��real_if_names
          rCr�z"NetworkStateInterpreter._v2_commons����	�	�3�S�9�9�9�!�i�i�k�k�	D�	D�N�E�7��W�$�$�!(���Z�!8�!8��!�+�*�E���'�'� ���]�3�3�7�7��"�E�E���k�k�-�0�0�4�4�[�"�E�E��"�L�1���v�;�;��?�?��O�O�X�v�$6�7�7�7��s�8�8�a�<�<��O�O�Y��$4�5�5�5��&�&�x�0�0�0�-4�[�[��"�-E�-E�-I�-I� �.�.���-�#?��#L�#L�L�#�-� ,���2�2�8�U�C�C�C��/	D�	DrEc
��
�td�t�|�����D�����
|���D�]u\}}td�|���D����}|�di��}|�dd��}|r||d<d|d||d	z|�d
��dt�
fd�|���D����i}d
|vr|d
|d
<|�|��}	t
|	��dkr|�d|	i��t�	d|||��|dkr|�
|����7|dkr|�|����Ttd�
|������dS)z(Common handler for bond and bridge typesc3�$K�|]\}}||fV��dSr<rS�r�r��vs   rC�	<genexpr>z>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>>s;����
�
��q�!�Q��F�
�
�
�
�
�
rEc3�6K�|]\}}|tv�||fV��dSr<)�NETWORK_V2_KEY_FILTER)r�rL�values   rCrKz>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>CsB������ �S�%��3�3�3��e��3�3�3�3��rE�
parameterszgratuitious-arpNr)r�ro�_interfacesr r�c3�2�K�|]\}}�||fV��dSr<rS)r�r�rJ�v2key_to_v1s   �rCrKz>NetworkStateInterpreter._handle_bond_bridge.<locals>.<genexpr>Ss0�����N�N�t�q�!��A���2�N�N�N�N�N�NrEr"rr�zv2(%s) -> v1(%s):
%sr9r8z Unknown command type: {cmd_type}r#)r�r:r�rh�popr0rkr�r�r�r
rr�r�)rWrXr$�	item_name�item_cfg�item_paramsr��
grat_value�v1_cmdr�rRs          @rCr&z+NetworkStateInterpreter._handle_bond_bridge:s����
�
�/�3�3�H�=�=�C�C�E�E�
�
�
�
�
��$+�=�=�?�?�#	�#	��I�x����$,�N�N�$4�$4������K�!�_�_�\�2�6�6�F����$5�t�<�<�J��
6�+5��'�(����	��=�(�(�,�,�|�*D�*D��$�N�N�N�N�v�|�|�~�~�N�N�N�N�N�	�F��� � � (����u�
��*�*�8�4�4�G��7�|�|�a����
�
�y�'�2�3�3�3��I�I�-�x��6�J�J�J��8�#�#��"�"�6�*�*�*�*��V�#�#�� � ��(�(�(�(� �6�=�=�!)�>������?#	�#	rEc	��d�}g}|�d��r9ddi}||�di��|��|�|��|�d��r@ddi}d|_||�di��|��|�|��d}d}i}|�d	g��D]�}d
|d�}d|vr3d
|vr.|�,|�d
��}|�d|i��n2d|vr.|�,|�d��}|�d|i��d|vru|ss|�d���d	��}	|	r|	|d<|�d���d��}
|
r|
|d<|�|��|�|����g}|�dg��D]M}|�t	|�d��|�d��d������Nt|��rt|��r||dd<|S)z7Common ipconfig extraction from v2 to v1 subnets array.c�(�d|vr
|d|d<dSdS)Nzroute-metric�metricrS)�	overridesr�s  rC�_add_dhcp_overrideszDNetworkStateInterpreter._v2_to_v1_ipcfg.<locals>._add_dhcp_overridesjs*����*�*�#,�^�#<��x� � � �+�*rErr�rrTrNr�static)r�r��:rr�rr#r�r��
dns_searchr��to�via)rr�r)r�rr{r�r rk)
rWr3r]r�r�rrr#r�rr�r�r�s
             rCr0z'NetworkStateInterpreter._v2_to_v1_ipcfggs���	=�	=�	=����7�7�7���	#��g�&�F������(9�2� >� >��G�G�G��N�N�6�"�"�"��7�7�7���	#��g�&�F� �D�M������(9�2� >� >��G�G�G��N�N�6�"�"�"��������w�w�{�B�/�/�	#�	#�G� �"���F�
�g�~�~���$�$��)9�"�w�w�z�2�2�H��M�M�9�h�"7�8�8�8����$�$��)9�"�w�w�z�2�2�H��M�M�9�h�"7�8�8�8���#�#�K�#��G�G�M�2�2�6�6�{�C�C�	��?�5>�K� 1�2�����/�/�3�3�H�=�=���7�06�K��-��
�
�k�*�*�*��N�N�6�"�"�"�"����W�W�X�r�*�*�	�	�E��M�M� �',�y�y����#(�9�9�U�#3�#3�����
�
�
�
��w�<�<�	*�C��K�K�	*�#)�G�A�J�x� ��rE)T)r�Nr<)%rPrQrRr�r�r�r�ryrr{�setterr�r?r�r�r�r�r�rbr�r�r�rr
rrrrr!r'r)r8r>r@r�r&r0rSrErCr>r>�sg����������
�
���	�	��&���	"�"�"�"��H�|�H�H�H��X�H��3�3��X�3��_�6�6��_�6�%�%�%�+�+�+� 3�3�3�B�B�B� � � � �!�!�!�!�F9�9�9�9�8��&��"�"�-�-�#�"�-���&��"�"�4"�4"�#�"�4"�l��9�9�9�:�:�2�2�;�:�2� ��>�>�>�?�?�2H�2H�@�?�2H�h��&�"5�6�7�7�>2�>2�8�7�>2�@��&��"�"�&�&�#�"�&�#�#�#�"��)��%�%�
)�
)�&�%�
)���)��%�%�N�N�&�%�N�
��-��)�)�H�H�*�)�H�;�;�;�>=�=�=�4Z*�Z*�Z*�x'�'�'�B
�
�
�D�D�D�D�6+�+�+�+�Z?�?�?�?�?rEr>)�	metaclassc�h�tj|��}td�|���D����}|�d��dvr$|�t
|d�����d�|�dg��D��|d<d�}d	D]}|||���|S)
Nc3�(K�|]
\}}|�||fV��dSr<rSrIs   rCrKz$_normalize_subnet.<locals>.<genexpr>�s/����@�@�D�A�q�a�@�!�Q��@�@�@�@�@�@rEr�)r^�static6)r��
ip_address��address_keysc�,�g|]}t|����SrS)r )r��rs  rCr�z%_normalize_subnet.<locals>.<listcomp>�s.����� !�������rEr�c��||vr:t||t��s!||���||<dSdSdSr<)r�r�split)�snetros  rC�listifyz"_normalize_subnet.<locals>.listify�sE���4�<�<�
�4��:�t� <� <�<��d��)�)�+�+�D��J�J�J��<�<�<rE)r`r�)r|r}r�rhr�r��_normalize_net_keys)r��
normal_subnetrpr�s    rC�_normalize_subnetrs�s���
�]�6�
"�
"�F��@�@�F�L�L�N�N�@�@�@�@�@�M�
�z�z�&���2�2�2�������
�
�
�	
�	
�	
���%+�Z�Z��"�%=�%=����M�(��,�,�,�/�"�"����
�q�!�!�!�!��rErSc��td�|���D����}d}|D]}|�|��r|}n�|sDdd�|���d|��}t�|��t
|���t|�|����}t|��s.t�d|��t
d|�d����t|��}t|��}|�d	��}	d
|vrp|�d
��\}
}}|
||<|rt|��}
n�|rt|��}
nvt�d|��t
d|�d����d|vrt|d��}
n.|	r|rt|	��}
n|	r|rt|	��}
n|rdnd
}
d|vrBt|d��t|
��krt�d|
|��|
|d<|rd	|vr|d	=n|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.
    c3�(K�|]
\}}|�||fV��dSr<rSrIs   rCrKz&_normalize_net_keys.<locals>.<genexpr>�s/����7�7�$�!�Q�Q�7��1�v�7�7�7�7�7�7rENz No config network address keys [�,z] found in 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�rhr��joinr�r�r�r.r
rr�	partitionrrr�r�r)r�rj�net�addr_keyrL�messager�ipv6�ipv4rw�	addr_part�_�maybe_prefixr�s              rCrqrq�s����7�7�'�-�-�/�/�7�7�7�
7�
7�C��H������7�7�3�<�<�	��H��E�	��"�"��H�H�\�"�"�"�"��G�
��	�	�	�'������!�!�!��s�w�w�x� � �!�!�D�����F��	�	�8�$�?�?�?��D�D�D�D�D�E�E�E��4� � �D��4� � �D��g�g�i� � �G�
�d�{�{�%)�^�^�C�%8�%8�"�	�1�l�!��H�
��
	J�,�\�:�:�F�F�
�	J�,�\�:�:�F�F�
�I�I�<�d�C�C�C��H��H�H�H�I�I�I�	�S����S��]�#�#���	�$�T�$�(��1�1���	�$�T�$�(��1�1����#������3���3�s�8�}�-�-��V���<�<����I���	
�	
�	
�
�C��M��@������I���	
�@�0��X��?�?��I���JrEc��td�|���D����}d|vr|d|d<|d=|�t|d�����|�d��}|rI	t|��|d<n5#t$r(}td�|����|�d}~wwxYw|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.
    c3�,K�|]\}}|dv�	||fV��dS))�NNrSrIs   rCrKz#_normalize_route.<locals>.<genexpr>s=�������1�a�A�Z�,?�,?��A��,?�,?�,?�,?��rErr�)r�rrir[z(Route config metric {} is not an integerN)	r�rhr�rqr�r�r��	TypeErrorr�)r��normal_router[r�s    rCr r s
����� �;�;�=�=������L���$�$�".�}�"=��Y����'������'A�	
�	
�	
�����
�
�h�
'�
'�F�
��	�%(��[�[�L��"�"���	�	�	��:�A�A�&�I�I����
�����	�����s�:B
�
B?�#B:�:B?c�"�|sg}d�|D��S)Nc�,�g|]}t|����SrS)rs)r��ss  rCr�z&_normalize_subnets.<locals>.<listcomp>7s!��2�2�2�Q��a� � �2�2�2rErS)r�s rCr�r�4s#������2�2�'�2�2�2�2rET�
net_configr�r�c��d}|�d��}|�d��}|dkr|}|r1|�/t|||���}|�|���|j}|st	d|�����|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:
)r�r>r�rr�)r�r�r$rArrrBs       rC�parse_net_config_datar�:s���
�E��n�n�Y�'�'�G�
�^�^�H�
%�
%�F��!�|�|����"�6�%�%��F�X�
�
�
��	���[��1�1�1��!���
��
��
�
�
�
�	
��LrE)rS)TN)0r|r_�logging�typingrrrr�	cloudinitrr�
cloudinit.netr	r
rrr
rrrr�cloudinit.net.rendererr�	getLoggerrPr�r�r�rMr:r.�__annotations__rDrM�	ExceptionrOrbr�rdryr>rsrqr r�r�rr�rSrErC�<module>r�sB���������������5�5�5�5�5�5�5�5�5�5�5�5�$�$�$�$�$�$�$�$�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
��0�/�/�/�/�/�/��g���!�!�����-�-�-�������(&�+�-�+�&�4�%�-�%��-�!�!:�"�!7�
�
�$'�'�$��$�"��&�*�����%/�/��$�s�D��c��N�*�+����D������	�	�	�	�	�Y�	�	�	����$O�O�O�O�O��O�O�O�&S8�S8�S8�S8�S8�S8�S8�S8�lC�C�C�C�C�(:�C�C�C�C�L���:I�I�I�I�X���D3�3�3��
��������	�����rE